acstack 0.0.0-stage → 0.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/.claude-plugin/plugin.json +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +389 -2
  4. package/THIRD_PARTY_NOTICES +14 -0
  5. package/TROUBLESHOOTING.md +225 -0
  6. package/agents/codex/frontend-verifier.toml +352 -0
  7. package/agents/codex/task-checker.toml +345 -0
  8. package/agents/codex/task-executor.toml +157 -0
  9. package/agents/codex/test-writer.toml +149 -0
  10. package/agents/frontend-verifier.md +351 -0
  11. package/agents/task-checker.md +344 -0
  12. package/agents/task-executor.md +156 -0
  13. package/agents/test-writer.md +148 -0
  14. package/assets/playwriter-bridge/build-launcher.ps1 +32 -0
  15. package/assets/playwriter-bridge/doctor.ps1 +450 -0
  16. package/assets/playwriter-bridge/launcher-src.cs +131 -0
  17. package/assets/playwriter-bridge/opener.js +330 -0
  18. package/assets/playwriter-bridge/opener.ps1 +63 -0
  19. package/assets/playwriter-bridge/register-tasks.ps1 +328 -0
  20. package/assets/playwriter-bridge/relay.ps1 +50 -0
  21. package/assets/playwriter-bridge/stop.ps1 +125 -0
  22. package/assets/playwriter-bridge/sync.ps1 +271 -0
  23. package/assets/playwriter-bridge/tunnel.ps1 +325 -0
  24. package/assets/playwriter-bridge/vm-free-port.sh +166 -0
  25. package/assets/terminal-workspace/client-keybindings.md +87 -0
  26. package/assets/terminal-workspace/config.example.yaml +334 -0
  27. package/assets/terminal-workspace/setup.sh +4404 -0
  28. package/cli/README.md +47 -0
  29. package/cli/bin/acstack.js +3 -0
  30. package/cli/dist/index.js +25984 -0
  31. package/cli/dist/index.js.map +7 -0
  32. package/cli/package.json +59 -0
  33. package/docs/adr/0001-ste-writing-standard.md +16 -0
  34. package/docs/adr/0002-version-gate-not-auto-bump.md +35 -0
  35. package/docs/adr/0003-handoff-ack-command.md +19 -0
  36. package/docs/adr/0004-dev-setup-per-host.md +13 -0
  37. package/docs/adr/0005-two-orchestrators-per-host.md +25 -0
  38. package/docs/adr/0006-document-opener-service.md +89 -0
  39. package/docs/adr/0007-lead-check-reads-the-transcript.md +87 -0
  40. package/docs/adr/0008-cli-audits-skill-interviews.md +37 -0
  41. package/docs/adr/0009-verify-the-write-not-the-writer.md +51 -0
  42. package/docs/adr/0010-promote-dev-to-main-by-fast-forward.md +115 -0
  43. package/docs/adr/0011-node-header-is-the-edge-encoding.md +20 -0
  44. package/docs/adr/0012-node-kind-is-a-closed-set-of-five.md +31 -0
  45. package/docs/adr/0013-the-diagram-renderer-is-pure.md +23 -0
  46. package/docs/adr/0014-reading-a-node-hides-its-generated-diagram.md +29 -0
  47. package/docs/adr/0015-a-node-id-links-to-its-issue-through-an-anchor.md +37 -0
  48. package/docs/adr/0016-the-map-root-carries-no-status-of-its-own.md +21 -0
  49. package/docs/adr/0017-call-impeccable-copy-only-its-questions.md +13 -0
  50. package/docs/adr/index.md +17 -0
  51. package/docs/config-reference.md +572 -0
  52. package/docs/dev-setups.md +164 -0
  53. package/docs/migrate-0.8.md +28 -0
  54. package/docs/playwriter-bridge-windows.md +15 -0
  55. package/docs/terminal-workspace-keys.md +137 -0
  56. package/docs/terminal-workspace.md +1780 -0
  57. package/docs/workflows.md +309 -0
  58. package/hooks/ac-writing-style-reminder.sh +86 -0
  59. package/hooks/context-pressure.sh +583 -0
  60. package/hooks/hooks.json +50 -0
  61. package/hooks/session-start-handoff.sh +165 -0
  62. package/hooks/session-start.sh +214 -0
  63. package/orchestrator/AGENTS.md +532 -0
  64. package/output-styles/ac-writing-style.md +286 -0
  65. package/package.json +50 -4
  66. package/pi/agents/frontend-verifier.md +357 -0
  67. package/pi/agents/task-checker.md +348 -0
  68. package/pi/agents/task-executor.md +160 -0
  69. package/pi/agents/test-writer.md +154 -0
  70. package/pi/extension.ts +723 -0
  71. package/profiles/fullstack-python.yaml +29 -0
  72. package/profiles/node-typescript.yaml +23 -0
  73. package/profiles/python.yaml +24 -0
  74. package/skills/archive/SKILL.md +160 -0
  75. package/skills/bootstrap/SKILL.md +109 -0
  76. package/skills/bridge/HANDOFF.md +93 -0
  77. package/skills/bridge/SKILL-VM.md +292 -0
  78. package/skills/bridge/SKILL-WINDOWS.md +526 -0
  79. package/skills/bridge/SKILL.md +121 -0
  80. package/skills/browser-verify/SKILL.md +229 -0
  81. package/skills/code-review/SKILL.md +44 -0
  82. package/skills/commit/SKILL.md +106 -0
  83. package/skills/compact-and-continue/SKILL.md +241 -0
  84. package/skills/explore/SKILL.md +149 -0
  85. package/skills/grilling/SKILL.md +134 -0
  86. package/skills/handoff/SKILL.md +250 -0
  87. package/skills/handoff/launch-herdr.md +197 -0
  88. package/skills/handoff/launch-without-herdr.md +30 -0
  89. package/skills/handoff/lead-check.md +59 -0
  90. package/skills/handoff/outcomes.md +162 -0
  91. package/skills/handoff/running-agent.md +50 -0
  92. package/skills/handoff/watch.md +115 -0
  93. package/skills/host/SKILL.md +247 -0
  94. package/skills/host/detect-host.sh +297 -0
  95. package/skills/host/herdr.md +79 -0
  96. package/skills/host/install-herdr-block.sh +467 -0
  97. package/skills/host/install-orca.sh +512 -0
  98. package/skills/host/notes.md +97 -0
  99. package/skills/host/orca.md +160 -0
  100. package/skills/host/questions.md +163 -0
  101. package/skills/host/report.md +42 -0
  102. package/skills/implement/SKILL.md +230 -0
  103. package/skills/implement/decision-log.md +62 -0
  104. package/skills/implement/design-pass.md +32 -0
  105. package/skills/implement/relaxed-tdd.md +28 -0
  106. package/skills/map/SKILL.md +250 -0
  107. package/skills/map/frontend.md +227 -0
  108. package/skills/map/trackers/files.md +74 -0
  109. package/skills/map/trackers/github.md +180 -0
  110. package/skills/map/visuals.md +387 -0
  111. package/skills/new-worktree/SKILL.md +155 -0
  112. package/skills/new-worktree/detect-orchestrator.sh +328 -0
  113. package/skills/new-worktree/detect-orchestrator.test.sh +894 -0
  114. package/skills/new-worktree/herdr.md +84 -0
  115. package/skills/new-worktree/orca.md +101 -0
  116. package/skills/pre-commit-review/SKILL.md +242 -0
  117. package/skills/pre-commit-review/auto-fix.md +19 -0
  118. package/skills/pre-commit-review/interactive.md +35 -0
  119. package/skills/quick-fix/SKILL.md +125 -0
  120. package/skills/record-context/SKILL.md +106 -0
  121. package/skills/setup/SKILL.md +250 -0
  122. package/skills/setup/browser.md +123 -0
  123. package/skills/setup/design-review.md +97 -0
  124. package/skills/setup/first-run.md +114 -0
  125. package/skills/setup/report.md +68 -0
  126. package/skills/setup/row-fixes.md +196 -0
  127. package/skills/setup/terminal-workspace.md +153 -0
  128. package/skills/sync/SKILL.md +171 -0
  129. package/skills/teardown-worktree/SKILL.md +245 -0
  130. package/skills/teardown-worktree/detector.md +39 -0
  131. package/skills/teardown-worktree/herdr.md +113 -0
  132. package/skills/teardown-worktree/orca.md +61 -0
  133. package/skills/terminal-workspace/SKILL.md +249 -0
  134. package/skills/terminal-workspace/components.md +36 -0
  135. package/skills/terminal-workspace/config-choices.md +69 -0
  136. package/skills/terminal-workspace/emulator-keys.md +48 -0
  137. package/skills/terminal-workspace/headless-clipboard.md +175 -0
  138. package/skills/terminal-workspace/turn-off-and-update.md +104 -0
  139. package/skills/test-conventions/SKILL.md +59 -0
  140. package/skills/visual-docs/SKILL.md +246 -0
  141. package/skills/writing/SKILL.md +231 -0
  142. package/skills/writing/examples.md +153 -0
  143. package/skills/writing/vocabulary.md +96 -0
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "acstack",
3
+ "description": "Agentic coding stack where planning grows only as far as needed: a map of decisions, tasks, checks, and handoffs behind a pluggable tracker.",
4
+ "version": "0.47.1",
5
+ "author": {
6
+ "name": "ac8318740"
7
+ },
8
+ "repository": "https://github.com/ac8318740/spechub",
9
+ "license": "MIT",
10
+ "keywords": [
11
+ "tdd",
12
+ "acstack",
13
+ "agentic-coding",
14
+ "testing",
15
+ "orchestrator",
16
+ "workflow",
17
+ "modular"
18
+ ]
19
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ac8318740
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,390 @@
1
- # Temporary Holding Version
1
+ # ACStack
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ ACStack is an agentic coding stack. It makes coding agents plan before they code, write tests before implementation, and keep docs matching the code.
4
+
5
+ - **ACStack aims to solve two common failure modes coding agents introduce**
6
+ - The agent starts building before the requirements are clear
7
+ - The agent writes code, then creates tests that pass against that code
8
+ - **ACStack has first-class support for Claude Code and pi**
9
+ - Claude Code installs it as a plugin
10
+ - pi installs it as an npm package
11
+ - **ACStack introduces structure around how your agent works**
12
+ - Every change goes through a test-writer, an implementer, and a checker
13
+ - Every commit updates your specs from the diff
14
+ - **Downside: this structure may make your agent take longer on small tweaks than necessary**
15
+
16
+ ```mermaid
17
+ flowchart TD
18
+ Q{"What kind of<br/>request is this?"} -->|"clear enough to build"| IM["Build it<br/>(/acstack:implement)"]
19
+ Q -->|"something stopped working"| QF["Find the root cause first<br/>(/acstack:quick-fix)"]
20
+ Q -->|"still has open questions"| MP["Answer them first<br/>(/acstack:map)"]
21
+ MP -->|"once the questions are answered"| IM
22
+ IM --> C["Commit, and update the docs<br/>(/acstack:commit)"]
23
+ QF --> C
24
+ ```
25
+
26
+ Every box above is section 2. The rest of this file is reference.
27
+
28
+ | What you want | Where |
29
+ | ------------- | ----- |
30
+ | Quickstart | section 1 |
31
+ | The three commands, and which one to use | section 2 |
32
+ | Configure a project and a machine | section 3 |
33
+ | The CLI | section 4 |
34
+ | Every skill | section 5 |
35
+ | Every agent | section 6 |
36
+ | Output style | section 7 |
37
+ | Terminal workspace | section 8 |
38
+ | Design principles | section 9 |
39
+ | Licence and credits | section 10 |
40
+
41
+ ## 1. Quickstart
42
+
43
+ ACStack has first-class support for [Claude Code](https://claude.com/claude-code) and [pi](https://pi.dev).
44
+
45
+ ### 1.1. Install on Claude Code
46
+
47
+ You need the Claude Code CLI and Node.js 20 or later.
48
+
49
+ Install the plugin:
50
+
51
+ ```
52
+ /plugin marketplace add ac8318740/spechub
53
+ /plugin install acstack@spechub
54
+ ```
55
+
56
+ Then, in your project:
57
+
58
+ ```
59
+ /acstack:setup
60
+ ```
61
+
62
+ - `/acstack:setup` detects the project type, then writes `acstack/project.yaml` with workflow settings
63
+ - The SessionStart hook loads the orchestrator instructions whenever it detects an ACStack project
64
+ - Your CLAUDE.md stays clean for project-specific content
65
+ - Upgrading from a version before 0.8.0 means deleting one stale `@import` line (see [docs/migrate-0.8.md](docs/migrate-0.8.md))
66
+
67
+ ### 1.2. Install on pi
68
+
69
+ *The same project installs as a [pi](https://pi.dev) package. Subagents come from the `pi-subagents` package.*
70
+
71
+ ```
72
+ pi install npm:pi-subagents
73
+ pi install npm:acstack
74
+ ```
75
+
76
+ Then, in your project, run `/acstack:setup`.
77
+
78
+ - Every skill runs under the same name as on Claude Code, e.g. `/acstack:map`
79
+ - `/acstack map` does the same
80
+ - Both always run the ACStack skill, even when another pi package has a skill called `map`
81
+ - ACStack's skills deliberately don't appear as `/skill:<name>` commands
82
+ - The package gives pi no skills, so `/skill:map` never runs ACStack's map
83
+ - The extension lists the skills in the system prompt instead, so the model still reads one when the task matches
84
+ - `pi/extension.ts` does what the Claude Code hooks do
85
+ - It links the CLI at `~/.claude/acstack/bin/acstack`
86
+ - It adds the orchestrator instructions to the system prompt in an ACStack project
87
+ - It lists ACStack's skills in the system prompt in every session
88
+ - It re-injects a handoff after a compaction
89
+ - It nudges with a continuity-versus-freshness checkpoint as the context fills
90
+ - Continuity keeps useful working context in the same session, using billion-context or host ACP compression when available
91
+ - Freshness uses `/acstack:handoff` when a fresh window or independent read helps more
92
+ - With no thresholds set, the first nudge comes at 200k tokens or half the window, whichever is lower
93
+ - The urgent nudge comes at 500k tokens or 80% of the window, whichever is lower
94
+ - `pi-subagents` finds the four agents through the `pi.subagents` field in `package.json`
95
+ - The agents use your `pi-subagents` default model
96
+ - ACStack warns at session start when `pi-subagents` is missing
97
+ - Allow delegation in `~/.pi/agent/AGENTS.md` – `pi-subagents` only delegates when your request or your instructions allow it:
98
+
99
+ ```
100
+ When an ACStack skill or the ACStack orchestrator says to launch a subagent, you may delegate to it.
101
+ ```
102
+
103
+ - Set `"toolActivation": "eager"` in `~/.pi/agent/extensions/subagent/config.json` to offer the `subagent` tool from the first turn (restart pi after)
104
+ - pi has no output styles, so the writing style is a toggle
105
+ - Run `/acstack-writing-style on` to add it to every pi session
106
+ - Run `/acstack-writing-style off` to remove it
107
+
108
+ ## 2. The three commands, and which one to use
109
+
110
+ *Pick by what is in your way: nothing, a bug, or an unanswered question.*
111
+
112
+ Two words first, because the third command below uses them.
113
+
114
+ - **A map** is a to-do graph ACStack keeps for one piece of work
115
+ - **A node** is one entry on that graph: one question to answer, or one piece of work to do
116
+
117
+ The three commands:
118
+
119
+ - **The request is clear enough to build** – run `/acstack:implement`
120
+ - It runs the four agents of section 6 on your request
121
+ - A one-line change stays a one-line change
122
+ - **Something already built stopped working** – run `/acstack:quick-fix`
123
+ - It makes the agent find the root cause before it edits anything
124
+ - **The request still has open questions** – run `/acstack:map`
125
+ - The agent interviews you one round at a time
126
+ - Each round asks every question it can answer next
127
+ - Each question comes with the agent's recommended answer
128
+ - You provide feedback on the agent's recommended answer instead of prompting from scratch
129
+ - Some requests only need one question
130
+ - The agent writes that decision down as a short note under `docs/adr/`
131
+ - A big feature may need dozens of questions
132
+ - The agent stores those questions as a **map**
133
+ - You work through the map across several sessions
134
+
135
+ ### 2.1. What a map holds
136
+
137
+ *`/acstack:map` builds a map only when a single conversation cannot settle every question.*
138
+
139
+ Each node carries one of five statuses.
140
+
141
+ | Status | Meaning |
142
+ | ------ | ------- |
143
+ | `fog` | anything you cannot yet articulate clearly |
144
+ | `open` | ready to answer or build |
145
+ | `claimed` | someone is working on it now |
146
+ | `resolved` | done |
147
+ | `out-of-scope` | dropped on purpose |
148
+
149
+ Each node also records six things.
150
+
151
+ - **Which earlier answer led to this question**
152
+ - You can read the decisions back in the order you made them
153
+ - **Which other nodes have to finish before this one starts**
154
+ - ACStack uses that to tell you what is ready to start
155
+ - **Who answers it**: you, or the agent working alone
156
+ - **What kind it is**: a destination, a standing note, a decision, research, or work
157
+ - **A short name**, which labels the node in a diagram
158
+ - **Where it lives**: a GitHub issue by default, or a markdown file under `acstack/maps/` with no GitHub remote
159
+
160
+ Almost every node explains itself with a diagram.
161
+
162
+ - The entry node draws the whole map, and collapses the parts you have finished
163
+ - Every other node draws its own question or its own change
164
+ - A legend sits under each diagram, showing only the symbols that diagram uses
165
+ - On GitHub you click a node in the diagram to open its issue
166
+
167
+ Two things ACStack does with a finished map.
168
+
169
+ - **It works through the nodes that are ready to start**, meaning the open ones with nothing unfinished blocking them
170
+ - ACStack calls that set the **frontier**
171
+ - **It packs the whole map into a single brief**
172
+ - A fresh agent session picks up where the last one stopped
173
+
174
+ Every rule in ACStack exists because something went wrong without it, over months of real product development with coding agents.
175
+
176
+ For the full picture of each step and how they connect, read [docs/workflows.md](docs/workflows.md).
177
+
178
+ ## 3. Configure a project and a machine
179
+
180
+ *The project states what to run. The machine states what it can do.*
181
+
182
+ - `acstack/project.yaml` holds every project-scoped setting
183
+ - [docs/config-reference.md](docs/config-reference.md) gives each key, its values, its default and what changes
184
+ - `~/.config/acstack/config.json` holds the nine `host.*` axes
185
+ - `/acstack:host` writes eight of them once per machine, and `/acstack:setup` writes the ninth
186
+ - [docs/dev-setups.md](docs/dev-setups.md) gives every axis, what reads it, and how to describe a fresh machine
187
+ - `/acstack:setup` copies the commands and directories from one of three language profiles
188
+ - **python** – pytest, ruff, mypy
189
+ - **node-typescript** – npm test, eslint, tsc
190
+ - **fullstack-python** – Python backend, plus a Node or TypeScript frontend
191
+ - `acstack config check` audits the project and the machine
192
+ - It exits 2 when a required host axis has no value
193
+
194
+ ## 4. The CLI
195
+
196
+ *Four storage operations carry the whole map. One fixed path makes the CLI reachable from any agent session.*
197
+
198
+ ACStack ships a Node.js CLI: `acstack config`, `acstack list`, `acstack node ...`, and `acstack archive`.
199
+
200
+ - The storage behind a map provides four operations and nothing more: create, read, update, list
201
+ - GitHub issues are the default
202
+ - The first line of every issue body carries all of that node's edges
203
+ - One call therefore reads the whole map
204
+ - A sub-issue and an issue dependency mirror those edges, so GitHub's own interface draws the map
205
+ - Markdown files are the fallback, one per node under `acstack/maps/<name>/`
206
+ - The CLI builds everything else on those four operations
207
+ - `acstack node frontier` lists what is ready to start now, closest to the original goal first
208
+ - `acstack node walk` packs the whole map into one brief for a fresh session, in the order the decisions happened
209
+ - The brief always includes the original goal, plus any node you marked as worth carrying along
210
+ - `acstack node diagram` draws a map, or any part of one, as a mermaid diagram with a legend under it
211
+ - The skills claim and resolve a node with `update` calls
212
+
213
+ Two symlinks reach the CLI. The SessionStart hook maintains both.
214
+
215
+ - `~/.claude/acstack/bin/acstack` is the fixed path every skill and agent calls
216
+ - Agents therefore do not depend on your shell `PATH`
217
+ - The CLI keeps working across plugin version bumps, non-interactive subshells and fresh agent contexts
218
+ - `~/.local/bin/acstack` is for typing `acstack` at a terminal yourself
219
+ - Add `~/.local/bin` to your `PATH` to use it
220
+ - The hook prints a one-line reminder when it is absent
221
+ - Nothing in the plugin breaks without it
222
+
223
+ If `acstack` does not run after a Claude Code install, read [TROUBLESHOOTING.md](TROUBLESHOOTING.md). A Claude Code session can read it and apply the fix directly.
224
+
225
+ ## 5. Every skill
226
+
227
+ *Four groups, ordered by when you reach for them.*
228
+
229
+ ### 5.1. Implementation
230
+
231
+ | Skill | Description |
232
+ |-------|-------------|
233
+ | `/acstack:implement` | Build what is ready to start, running the four agents of section 6, whether or not a map exists |
234
+
235
+ For work with open decisions, chart it with `/acstack:map` first.
236
+
237
+ ### 5.2. Planning
238
+
239
+ | Skill | Description |
240
+ |-------|-------------|
241
+ | `/acstack:map` | Answer the open questions first, building the to-do graph on the first run and working through it after |
242
+ | `grilling` | The interview itself, asking every question it can answer next per round, each with a recommended answer (the agent invokes it) |
243
+ | `record-context` | Writes a decision down when one lands: a short note, a glossary term, both, or neither (the agent invokes it) |
244
+
245
+ ### 5.3. Operations
246
+
247
+ | Skill | Description |
248
+ |-------|-------------|
249
+ | `/acstack:commit` | Commit, and update the specs under `acstack/specs/` from the diff first |
250
+ | `/acstack:archive` | Close a finished map, after checking the decisions reached your specs and notes, then delete the nodes |
251
+ | `/acstack:sync` | Update the specs from code changes, outside a commit |
252
+ | `/acstack:handoff` | Hand work to a visible agent, a new one in its own pane or one already running, with acknowledgement |
253
+ | `/acstack:compact-and-continue` | Anchor the session's load-bearing state to survive compaction, then continue in place |
254
+
255
+ What an effort leaves behind is what matters: updated specs, decision notes, and glossary entries. ACStack throws the nodes away.
256
+
257
+ ### 5.4. Setup and supporting
258
+
259
+ | Skill | Description |
260
+ |-------|-------------|
261
+ | `/acstack:setup` | Set up ACStack in a project, and change how a project already set up is configured |
262
+ | `/acstack:host` | Declare this machine's dev setup once, as the `host.*` axes |
263
+ | `/acstack:bootstrap` | Write the first set of specs by reading your existing code |
264
+ | `/acstack:explore` | Thinking partner mode, read-only |
265
+ | `/acstack:quick-fix` | Structured bug fix workflow with root cause analysis |
266
+ | `/acstack:pre-commit-review` | Deep quality review of all changes since last commit |
267
+ | `/acstack:test-conventions` | Test placement rules and naming conventions |
268
+ | `/acstack:code-review` | Linus Torvalds code philosophy for reviews |
269
+ | `/acstack:browser-verify` | agent-browser command reference, CDP troubleshooting, and selector strategy |
270
+ | `/acstack:bridge` | Set up and operate the Playwriter cross-device browser bridge |
271
+ | `/acstack:visual-docs` | Write docs that lead with a diagram and derive structure from it (Minto pyramid) |
272
+ | `/acstack:new-worktree` | Create a git worktree off the remote base branch and continue the task inside it |
273
+ | `/acstack:teardown-worktree` | Retire finished worktrees and delete their merged local and remote branches |
274
+ | `/acstack:terminal-workspace` | Set up a keyboard-only terminal for driving agents on a dev machine |
275
+
276
+ ## 6. Every agent
277
+
278
+ *Four agents run in order. The one rule that matters: the test-writer never sees the implementation.*
279
+
280
+ | Agent | Role |
281
+ |-------|------|
282
+ | `test-writer` | Writes tests from requirements only, before the code under strict TDD and after it under relaxed |
283
+ | `task-executor` | TDD phase 2, making tests pass, and it cannot modify tests |
284
+ | `task-checker` | TDD phase 3, verifying everything: mock skepticism, test baseline, regressions, TDD isolation audit |
285
+ | `frontend-verifier` | TDD phase 4, real browser verification via agent-browser CLI, when `project.yaml` configures a frontend |
286
+
287
+ - The agent session you talk to coordinates
288
+ - It hands every piece of research and code to these agents
289
+ - A fail from the task-checker sends the work back to the task-executor with the reason
290
+ - The frontend-verifier runs under three conditions: a configured frontend, changed frontend files, and verification switched on
291
+
292
+ ## 7. Output style
293
+
294
+ *The plugin ships one output style. It applies the house standard to every chat reply.*
295
+
296
+ - Claude Code shows the style as `acstack:ac-writing-style`
297
+ - It applies the `writing` skill's plain-language rules and the `visual-docs` skill's Minto pyramid and bullet discipline
298
+ - A reply leads with the answer and puts 90% or more of what follows in bullets
299
+ - Each bullet holds one sentence and ends without a period
300
+ - Sub-bullets nest as far as the point needs, indented four spaces per level
301
+ - Every word has to earn its place: no em dash, no emoji, no puffery, and no contrast clause that does no work
302
+
303
+ How to turn it on:
304
+
305
+ - `/acstack:setup` offers the style on both paths
306
+ - On a new project it comes late
307
+ - It is optional there
308
+ - On a project already set up it is a health-check row
309
+ - The skill writes `outputStyle` for you
310
+ - It asks first
311
+ - Use `~/.claude/settings.json` for every project, or `.claude/settings.local.json` for this one
312
+ - A project value overrides the global one
313
+ - The style applies after `/clear`, or in a new session
314
+ - The plugin never forces it on
315
+
316
+ The style also ships a per-turn reminder:
317
+
318
+ - `hooks/ac-writing-style-reminder.sh` runs on every prompt and re-injects the style's own words
319
+ - A built-in style carries a `turnReminder` field, and a file-based style cannot, so the hook supplies the equivalent
320
+ - It emits two sections lifted straight out of `output-styles/ac-writing-style.md`
321
+ - "Who you are", top-level lines only, which is the persona
322
+ - "Before you send", in full, which is the nine-item checklist
323
+ - It reads those sections at run time, so the reminder can never drift from the style
324
+ - It stays silent under any other output style, and it writes nothing to the transcript
325
+
326
+ ## 8. Terminal workspace for driving several agents
327
+
328
+ *An optional keyboard-only setup for running several agents on a remote machine. ACStack works fine without it.*
329
+
330
+ - `/acstack:terminal-workspace` installs every tool and writes every config
331
+ - [docs/terminal-workspace.md](docs/terminal-workspace.md) gives the exact config, every key, and the traps worth knowing
332
+ - The setup builds on herdr, a terminal multiplexer that keeps each agent's terminal running after you disconnect
333
+ - You attach from your own machine with `herdr --remote`
334
+ - Your own clipboard and browser then reach the session
335
+ - Each agent can get its own git worktree, meaning its own checkout on its own branch
336
+ - gh-dash then triages pull requests and diffnav reads diffs, both without leaving the terminal
337
+
338
+ ## 9. Design principles
339
+
340
+ *Five rules explain why every default is what it is.*
341
+
342
+ - **Strict TDD holds because of the order the agents run in** – relaxed TDD holds only because the instructions say so
343
+ - Either way the task-executor cannot edit a test file
344
+ - Under strict TDD the test-writer runs first
345
+ - There is no implementation for it to copy
346
+ - Under relaxed TDD it runs second
347
+ - Only its instructions stop it reading the code it is testing
348
+ - The two are not equally safe
349
+ - That is why strict is the default
350
+ - **Your docs never drift from the code** – `/acstack:commit` reads the diff and updates the specs under `acstack/specs/` in the same commit
351
+ - Any agent that spots a spec contradicting the code fixes the spec there and then
352
+ - A spec describes what the code does today
353
+ - It never describes what someone plans to build
354
+ - **Build no more process than the job needs** – a to-do graph appears only when one conversation cannot hold the questions
355
+ - A typo fix gets no machinery
356
+ - A month-long feature gets a map
357
+ - You type the same command either way
358
+ - ACStack works out which it is
359
+ - **Planning gets more effort than coding** – three agents read the relevant code before anyone writes a line
360
+ - Mock audits, regression suites and integration checks follow the implementation
361
+ - **Strict defaults, easy to relax** – run `acstack config set` to change how strict the TDD is, how much the agent does itself, or how it asks you questions
362
+
363
+ ## 10. Licence and credits
364
+
365
+ *[MIT](LICENSE). Four projects shaped the design.*
366
+
367
+ - **[OpenSpec](https://github.com/Fission-AI/OpenSpec)** – ACStack forks its CLI from OpenSpec
368
+ - OpenSpec was the core spec engine under the original workflow
369
+ - The map-based concepts all originate there: proposals, designs, tasks, living specs, change management, and archiving
370
+ - **[Taskmaster AI](https://github.com/eyaltoledano/claude-task-master)** – Taskmaster's task management model inspired the orchestrator pattern and the agent coordination approach
371
+ - **[Skills for Real Engineers](https://github.com/mattpocock/skills)** by Matt Pocock – the Wayfinder map, the round-by-round interview, and the durability rule for agent briefs
372
+ - ACStack's node graph is a direct adaptation of Wayfinder
373
+ - MIT licensed, and recorded in [THIRD_PARTY_NOTICES](THIRD_PARTY_NOTICES)
374
+ - Additional inspiration comes from [Superpowers](https://github.com/obra/superpowers), [GSD](https://github.com/gsd-build/get-shit-done) and [Spec Kit](https://github.com/github/spec-kit)
375
+
376
+ The optional terminal workspace installs, but does not bundle, the five tools you drive and the five behind them. Each one keeps its own licence.
377
+
378
+ - [herdr](https://herdr.dev)
379
+ - [tuicr](https://github.com/agavra/tuicr) by agavra, which reviews a pull request inside the terminal
380
+ - [gh-dash](https://github.com/dlvhdr/gh-dash) and [diffnav](https://github.com/dlvhdr/diffnav) by dlvhdr
381
+ - [delta](https://github.com/dandavison/delta) by dandavison
382
+ - [lazygit](https://github.com/jesseduffield/lazygit) by jesseduffield, which stages, commits and pushes on one key
383
+ - [harlequin](https://github.com/tconbeer/harlequin) by tconbeer, the SQL editor this setup opens on one key
384
+ - [yazi](https://github.com/sxyazi/yazi) by sxyazi, the file manager that previews whatever the cursor sits on
385
+ - [mermaid-ascii](https://github.com/AlexanderGrooff/mermaid-ascii) by AlexanderGrooff
386
+ - [glow](https://github.com/charmbracelet/glow) by charmbracelet
387
+
388
+ The optional fork build of tuicr compiles [agavra/tuicr#607](https://github.com/agavra/tuicr/pull/607) by [antonio2368](https://github.com/antonio2368). It also compiles [agavra/tuicr#633](https://github.com/agavra/tuicr/pull/633) and one counts fix not yet submitted upstream, both written for this fork. That build is off by default and temporary.
389
+
390
+ See [docs/terminal-workspace.md](docs/terminal-workspace.md).
@@ -0,0 +1,14 @@
1
+ This project includes code derived from OpenSpec CLI, which is licensed under the MIT License.
2
+
3
+ OpenSpec CLI
4
+ Copyright (c) 2024 OpenSpec Contributors
5
+ https://github.com/Fission-AI/OpenSpec
6
+ License: MIT (https://opensource.org/licenses/MIT)
7
+
8
+ This project includes concepts and text adapted from Skills for Real Engineers,
9
+ which is licensed under the MIT License.
10
+
11
+ Skills for Real Engineers
12
+ Copyright (c) 2026 Matt Pocock
13
+ https://github.com/mattpocock/skills
14
+ License: MIT (https://opensource.org/licenses/MIT)
@@ -0,0 +1,225 @@
1
+ # ACStack troubleshooting
2
+
3
+ *This page covers the Claude Code install path. pi installs ACStack as `npm:acstack`, and uses pi's package tools instead.*
4
+
5
+ **A coding agent can act on this file.** Find the symptom the user reported, run the diagnostic, then apply the fix.
6
+
7
+ - **Claude Code's SessionStart hook maintains everything here**
8
+ - Almost every symptom below is that hook not having run
9
+ - **Restarting Claude Code fixes most of them**
10
+ - The hook runs again on the new session
11
+ - **Each section below is one symptom**, with the command to confirm it and the command to fix it
12
+
13
+ ```mermaid
14
+ flowchart LR
15
+ H["SessionStart hook<br/>(hooks/hooks.json)"] --> A["Agent path<br/>(~/.claude/acstack/bin/acstack)"]
16
+ H --> U["Human path<br/>(~/.local/bin/acstack)"]
17
+ A --> C["The bundled CLI<br/>(cli/dist/index.js in the plugin cache)"]
18
+ U --> C
19
+ H --> O["Orchestrator instructions<br/>(orchestrator/AGENTS.md, via python3)"]
20
+ ```
21
+
22
+ | The broken link | Sections |
23
+ | --- | --- |
24
+ | Agent path | 1, 4 |
25
+ | Human path | 2 |
26
+ | The bundled CLI | 3 |
27
+ | SessionStart hook | 5 |
28
+ | Orchestrator instructions | 6 |
29
+
30
+ Where the plugin lives, and what points at it:
31
+
32
+ - The plugin lives at `${CLAUDE_PLUGIN_ROOT}` once the user installs it via the marketplace
33
+ - On most installs that resolves to `~/.claude/plugins/cache/spechub/acstack/<version>/`
34
+ - `~/.claude/acstack/bin/acstack` is the **agent-facing** invariant path
35
+ - Every skill and agent in this plugin invokes the CLI through this exact path
36
+ - It does not depend on the user's `PATH`
37
+ - `~/.local/bin/acstack` is the **human convenience** symlink
38
+ - It is useful only when `~/.local/bin` is on `PATH`
39
+ - No plugin functionality rests on it
40
+ - Both symlinks refresh on every SessionStart and point at the current plugin cache version
41
+ - Fix the agent-facing path first
42
+ - Nothing in the plugin works without it
43
+
44
+ ---
45
+
46
+ ## 1. Agents report `~/.claude/acstack/bin/acstack: No such file or directory`
47
+
48
+ **Symptom**: a skill or agent fails because it cannot find the CLI at `~/.claude/acstack/bin/acstack`.
49
+
50
+ **Diagnose**:
51
+
52
+ ```bash
53
+ ls -l ~/.claude/acstack/bin/acstack 2>&1
54
+ ls -d ~/.claude/plugins/cache/spechub/acstack/*/ 2>&1
55
+ ```
56
+
57
+ **Possible causes and fixes**:
58
+
59
+ - **Symlink missing** (`No such file or directory`): the SessionStart hook never ran
60
+ - The user has not started Claude Code on this device since they installed the plugin, or the hook silently failed
61
+ - Fix: ask the user to restart Claude Code so the SessionStart hook fires
62
+ - The hook creates the symlink and prints `acstack: linked agent CLI at ...`
63
+ - Create it by hand if that does not work:
64
+ ```bash
65
+ ACSTACK_VERSION=$(ls ~/.claude/plugins/cache/spechub/acstack/ | sort -V | tail -1)
66
+ mkdir -p ~/.claude/acstack/bin
67
+ ln -sfn ~/.claude/plugins/cache/spechub/acstack/$ACSTACK_VERSION/cli/bin/acstack.js ~/.claude/acstack/bin/acstack
68
+ ```
69
+
70
+ - **Plugin cache missing entirely**: the second `ls` returned nothing
71
+ - Fix: the user has not installed the plugin
72
+ - Run `/plugin marketplace add ac8318740/spechub`, then `/plugin install acstack@spechub` in Claude Code
73
+
74
+ ---
75
+
76
+ ## 2. `acstack: command not found` (human typed it at a terminal)
77
+
78
+ **Symptom**: the user runs `acstack --help` at the terminal and the shell reports `command not found`, while agents continue to work.
79
+
80
+ This is a **human-ergonomics issue, not a plugin issue.** Agents use `~/.claude/acstack/bin/acstack` directly. This does not affect them. Fix it only if the user types `acstack` at terminals.
81
+
82
+ **Diagnose**:
83
+
84
+ ```bash
85
+ ls -l ~/.local/bin/acstack 2>&1
86
+ echo "PATH=$PATH" | tr ':' '\n' | grep -F "$HOME/.local/bin" || echo "MISSING"
87
+ ```
88
+
89
+ **Possible causes and fixes**:
90
+
91
+ - **Symlink missing**: the SessionStart hook never ran, or ran and could not write
92
+ - Fix: ask the user to restart Claude Code
93
+ - The hook recreates the human symlink on every session start
94
+ - **PATH missing** (the symlink exists but `MISSING` printed): `~/.local/bin` is not on `$PATH`
95
+ - Fix: add this line to the user's shell rc, then ask them to restart their shell:
96
+ ```bash
97
+ export PATH="$HOME/.local/bin:$PATH"
98
+ ```
99
+ - The shell rc by shell:
100
+ - zsh: `~/.zshrc`
101
+ - bash on Linux: `~/.bashrc`
102
+ - bash on macOS: `~/.bash_profile`
103
+ - fish: `~/.config/fish/config.fish`, and use `set -gx PATH $HOME/.local/bin $PATH`
104
+
105
+ ---
106
+
107
+ ## 3. `Error [ERR_MODULE_NOT_FOUND]: Cannot find module '.../cli/dist/index.js'`
108
+
109
+ **Symptom**: the CLI runs but Node throws `ERR_MODULE_NOT_FOUND` for `dist/index.js`.
110
+
111
+ **Diagnose**:
112
+
113
+ ```bash
114
+ ACSTACK_VERSION=$(ls ~/.claude/plugins/cache/spechub/acstack/ | sort -V | tail -1)
115
+ ls ~/.claude/plugins/cache/spechub/acstack/$ACSTACK_VERSION/cli/dist/index.js 2>&1
116
+ ```
117
+
118
+ **Cause**: the plugin cache holds a version from before the CLI shipped bundled in the repo, meaning before 0.9.2. This should not happen on 0.9.2 or later.
119
+
120
+ **Fix**:
121
+
122
+ - Bump or refresh the plugin cache
123
+ - Run `/plugin` in Claude Code and reinstall the plugin
124
+ - Or delete the cache directory and let Claude Code repull:
125
+ ```bash
126
+ rm -rf ~/.claude/plugins/cache/spechub/acstack/<old-version>
127
+ ```
128
+
129
+ - Confirm the user is on plugin version 0.9.2 or later:
130
+ ```bash
131
+ cat ~/.claude/plugins/cache/spechub/acstack/*/.claude-plugin/plugin.json | grep version
132
+ ```
133
+
134
+ - Build the CLI in place as a one-shot, if the user is offline or cannot repull:
135
+ ```bash
136
+ cd ~/.claude/plugins/cache/spechub/acstack/<version>/cli
137
+ npm install
138
+ npm run build
139
+ ```
140
+
141
+ ---
142
+
143
+ ## 4. Stale symlink, pointing at an old version
144
+
145
+ **Symptom**: `~/.claude/acstack/bin/acstack --version` prints an older number than expected, or commands behave like an older release.
146
+
147
+ **Diagnose**:
148
+
149
+ ```bash
150
+ readlink ~/.claude/acstack/bin/acstack
151
+ ls ~/.claude/plugins/cache/spechub/acstack/
152
+ ```
153
+
154
+ **Cause**: an older session set the symlink target. The plugin cache now holds a newer version. The SessionStart hook has not relinked it yet.
155
+
156
+ **Fix**:
157
+
158
+ - Start a new Claude Code session
159
+ - The SessionStart hook detects a stale symlink and relinks it, printing `acstack: updated agent CLI at ...`
160
+ - Or relink by hand:
161
+ ```bash
162
+ NEW=$(ls ~/.claude/plugins/cache/spechub/acstack/ | sort -V | tail -1)
163
+ ln -sfn ~/.claude/plugins/cache/spechub/acstack/$NEW/cli/bin/acstack.js ~/.claude/acstack/bin/acstack
164
+ ln -sfn ~/.claude/plugins/cache/spechub/acstack/$NEW/cli/bin/acstack.js ~/.local/bin/acstack
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 5. The SessionStart hook did not run
170
+
171
+ **Symptom**: no `acstack:` lines appear in Claude Code's startup logs. `~/.claude/acstack/bin/acstack` is missing.
172
+
173
+ **Diagnose**:
174
+
175
+ ```bash
176
+ cat ~/.claude/plugins/cache/spechub/acstack/*/hooks/hooks.json
177
+ ```
178
+
179
+ **Cause**: the user has not enabled the plugin, or they have disabled hook execution in their Claude Code settings.
180
+
181
+ **Fix**:
182
+
183
+ - Confirm the user has enabled the plugin, with `/plugin list`
184
+ - Check that the user has not disabled hooks in `~/.claude/settings.json`, meaning no `"hooks": false` and no per-event suppression
185
+ - Install the symlinks by hand as a fallback, using the commands in section 1 and section 4
186
+
187
+ ---
188
+
189
+ ## 6. `python3 not found` warning at session start
190
+
191
+ **Symptom**: the hook prints `acstack: python3 not found; skipping orchestrator injection`.
192
+
193
+ **Cause**: the hook uses `python3` to emit `orchestrator/AGENTS.md` as JSON for `additionalContext` injection.
194
+
195
+ - Without `python3` the orchestrator instructions do not load at all
196
+ - Nothing else reads that file
197
+ - Claude Code does not auto-load instructions from a plugin's own directory
198
+ - Injection is the only path
199
+ - This does not affect the CLI symlinks
200
+ - The `acstack` command keeps working
201
+
202
+ **Fix**: install Python 3. Most systems already have it.
203
+
204
+ ```bash
205
+ # Debian/Ubuntu
206
+ sudo apt install python3
207
+ # macOS
208
+ brew install python3
209
+ ```
210
+
211
+ ---
212
+
213
+ ## 7. When none of the above matches
214
+
215
+ *This section describes the document, not the plugin. No box in the diagram holds it.*
216
+
217
+ The CLI is a normal Node.js ESM package. To validate the install end to end:
218
+
219
+ ```bash
220
+ ACSTACK_VERSION=$(ls ~/.claude/plugins/cache/spechub/acstack/ | sort -V | tail -1)
221
+ node ~/.claude/plugins/cache/spechub/acstack/$ACSTACK_VERSION/cli/bin/acstack.js --help
222
+ ```
223
+
224
+ - If that prints help, the CLI is fine and the issue is the symlink
225
+ - If that errors, the issue is the cache contents (see section 3)