Conversation
Vendors Sugar-Coffee/stokowski as a git submodule and checks in a shared workflow.yaml + .ai/prompts/*.md - safe to commit since tracker.api_key is omitted entirely, so Stokowski resolves it from the LINEAR_API_KEY env var at runtime rather than anything in the file. Adds `mix stokowski` (root repo_tasks project), which for now only validates workflow.yaml is safe (exists, gitignored if it ever does carry a literal key, no bare api_key literal) - actually launching a session is a follow-up. Removes the `lc` escript target: it never worked once exqlite (a NIF-backed dep) was added, since NIFs can't load from inside an escript archive, and nothing in CI or docs ever exercised it. Documents `mix run` as the supported way to invoke `lc` locally in app/usage-rules.md, along with a standing rule to dogfood `lc` itself for Linear access rather than an MCP server or other integration skill.
There was a problem hiding this comment.
Pull request overview
This PR vendors the Stokowski agent-orchestration framework (as a submodule) and introduces a repo-level Stokowski workflow + prompt templates, along with a new mix stokowski task intended to validate that the checked-in workflow.yaml is safe (no literal Linear API key). It also removes the unused/broken lc escript target and updates repo guidance to dogfood lc via mix run instead of using external Linear integrations.
Changes:
- Add a checked-in
workflow.yamland.ai/prompts/*.mdtemplates to define a Linear-driven agent workflow. - Add
mix stokowski(repo_tasks) and a minimal test scaffold for it; add Python 3.14.1 tomise.tomlfor Stokowski. - Remove the
lcescript target and update documentation/comments to reflectmix run/release usage.
Reviewed changes
Copilot reviewed 16 out of 18 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| workflow.yaml | Adds the shared Stokowski workflow configuration for this repo. |
| .ai/prompts/global.md | Global prompt preamble for all agent stages. |
| .ai/prompts/investigate.md | Investigation-stage prompt template. |
| .ai/prompts/implement.md | Implementation-stage prompt template. |
| .ai/prompts/review.md | Code-review-stage prompt template. |
| .ai/prompts/merge.md | Merge-stage prompt template. |
| lib/mix/tasks/stokowski.ex | Introduces mix stokowski safety validation task for workflow.yaml. |
| test/mix/tasks/stokowski_test.exs | Adds initial ExUnit coverage for the new Mix task. |
| mise.toml | Pins Python to support running vendored Stokowski. |
| .gitmodules | Adds vendor/stokowski submodule entry. |
| app/mix.exs | Removes the escript target for lc. |
| app/.gitignore | Removes the ignore entry for the old lc escript artifact. |
| app/usage-rules.md | Documents dogfooding lc via mix run and avoiding Linear MCP/skills. |
| app/lib/linear_cli/application.ex | Updates comments to reflect Burrito release vs mix run (no escript). |
| app/lib/linear_cli/oban_repo.ex | Updates comments to remove escript references. |
| AGENTS.md | Indexes the new dogfooding rule from app/usage-rules.md. |
Suppressed comments (2)
lib/mix/tasks/stokowski.ex:38
mix stokowskicurrently requiresworkflow.yamlto be gitignored, but this PR also adds and tracksworkflow.yamlin the repo. That makesmix stokowskifail in the normal (tracked) case and contradicts the PR description/intent (checked-in workflow with no literal key). Drop the unconditional gitignore gate; the existingapi_keyliteral check already prevents committing a secret.
unless gitignored?(workflow) do
Mix.raise(
"#{workflow} is not gitignored - it can hold a live Linear API key, add it to .gitignore before continuing"
)
end
lib/mix/tasks/stokowski.ex:61
- After removing the unconditional gitignore check in
run/1,gitignored?/1becomes unused. Keeping an unused private function will introduce warnings and can hide real unused-code issues later; it should be removed (or only added back when it’s actually needed).
defp gitignored?(path) do
match?({_, 0}, System.cmd("git", ["check-ignore", "-q", path], stderr_to_stdout: true))
end
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
2 tasks
bougyman
added a commit
that referenced
this pull request
Aug 13, 2026
…ge-rules (#103) ## Summary - Adds `documents/motivation.adoc` - the accessibility need driving this whole project, in writing. - Adds an `## Accessibility` section to `app/usage-rules.md` with the concrete commitments it implies: plain linear text output stays first-class, no meaning conveyed by color alone, no TUI as the primary interface, line-based prompts, `--output json` as a fully-supported path for every command. - Indexes it from `AGENTS.md`'s Standards section, same pattern as Conventional Commits. - Closes #102. ## Test plan - [x] Reviewed `documents/motivation.adoc` content directly with the author before writing - [x] Confirmed `app/usage-rules.md`/`AGENTS.md` additions don't overlap with the still-unmerged dogfooding section in #101 - independent, non-conflicting appends to the same files 🤖 Generated with [Claude Code](https://claude.com/claude-code)
workflow.yaml is meant to be tracked in this repo, not gitignored - the moduledoc and error messages said otherwise, contradicting what this PR actually does. The task now only checks tracker.api_key isn't a bare literal (a best-effort guard against a leaked key), not that the file stays untracked.
- Fix four state definitions in workflow.yaml pointing at prompts/*.md - the committed prompts actually live at .ai/prompts/*.md, so Stokowski couldn't have loaded any of them as written. - Reword workflow.yaml's header comments: it's the repo's own checked-in config now, not a template to copy, and prompts live under .ai/prompts/, not prompts/. - Replace workspace.root's personal path with a neutral default shared contributors can use out of the box. - Add test coverage for the literal-api_key rejection path (previously only the missing-file case was covered). Not applying Copilot's suggestion to switch workflow.yaml's clone hook from SSH to HTTPS - SSH with a primed agent failing loudly is preferable to HTTPS quietly working via cached creds on disk.
This was referenced Aug 13, 2026
bougyman
added a commit
that referenced
this pull request
Aug 13, 2026
## Summary - `mix stokowski` now actually launches a session after its existing safety checks pass: `uv run --project vendor/stokowski --extra web --with-editable vendor/stokowski -- stokowski <workflow> <args...>`. Flags are passed straight through (`--dry-run`, `--port`, `--host`, `-v`). - `--with-editable` is required alongside `--project` - `vendor/stokowski`'s `pyproject.toml` has no `[build-system]` table, so a plain `uv run --project` only syncs dependencies and never installs the `stokowski` package/entry point itself. Confirmed directly: without it, `uv run --project vendor/stokowski -- stokowski --help` fails with `Failed to spawn: stokowski` even though the venv builds cleanly and installs all 23 dependency packages. - Closes #105. ## Follow-up (not in this PR) - The missing `[build-system]` table is an upstream packaging gap in `Sugar-Coffee/stokowski` itself. This PR works around it locally via `--with-editable`; fixing it upstream will be rolled into the same eventual PR as the `LINEAR_API_KEY` resolution fix from #100/#101's plan. ## Test plan - [x] `mix format --check-formatted` clean - [x] `mix test test/mix/tasks/stokowski_test.exs` - 2/2 passed - [x] Ran the actual task end-to-end against the real `workflow.yaml` and a real `LINEAR_API_KEY`: config validated, env-var-fallback key resolved correctly, real Linear API call succeeded (`200 OK`), correct neutral `workspace.root` from #101 picked up 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bougyman
pushed a commit
that referenced
this pull request
Aug 13, 2026
🤖 I have created a release *beep* *boop* --- ## [1.5.0](v1.4.1...v1.5.0) (2026-08-13) ### Features * launch stokowski sessions via mix stokowski ([#106](#106)) ([550ed26](550ed26)) * vendor stokowski for Linear-driven agent orchestration ([#101](#101)) ([b68fc57](b68fc57)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Sugar-Coffee/stokowskias a git submodule (vendor/stokowski) and checks in a sharedworkflow.yaml+.ai/prompts/*.md- safe to commit sincetracker.api_keyis omitted entirely, so Stokowski resolves it from theLINEAR_API_KEYenv var at runtime rather than anything in the file.mix stokowski(rootrepo_tasksproject) - for now it only validatesworkflow.yamlis safe (exists, gitignored if it ever does carry a literal key, no bareapi_keyliteral). Actually launching a session viauv run --project vendor/stokowskiis deliberately deferred to a follow-up.lcescript target - it never actually worked onceexqlite(a NIF-backed dep) was added, since NIFs can't load from inside an escript archive, and nothing in CI or docs ever exercised it.mix runas the supported way to invokelclocally, plus a standing rule to dogfoodlcitself for Linear access rather than an MCP server or other integration skill (app/usage-rules.md, indexed fromAGENTS.md).Follow-ups (not in this PR)
mix stokowskiup to actually start a session once theuv runinvocation has been tested end-to-end.Sugar-Coffee/stokowski:WorkflowConfig.agent_env()instokowski/config.pychecks the rawtracker.api_keystring instead of the resolved value (unlikeProjectConfig.agent_env()) - on a bad$VARreference it silently clobbers an otherwise-correctLINEAR_API_KEYenv var with an empty string. The README setup guide (step 3) and single-project config reference also only show the bare-literalapi_keypattern.Test plan
mix testinapp/- 227/227 passedmix format --check-formattedclean in bothapp/and the rootrepo_tasksprojectmix usage_rules.sync --checkclean inapp/workflow.yaml/.ai/prompts/*.mdcontain no literal secrets before committing (only commented$LINEAR_API_KEYexamples)lcitself (viamix run, no MCP) to create CRY-38 in Linear's "Linear CLI" project, confirming the documentedmix runinvocation actually works end-to-end🤖 Generated with Claude Code