acstack 0.0.0-stage → 0.47.0

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 +329 -0
  27. package/assets/terminal-workspace/setup.sh +4317 -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 +1774 -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,160 @@
1
+ # Orca follow-up
2
+
3
+ Read this file when the user declared Orca installed in Step 2.
4
+
5
+ - `plugin_root` and the detection output come from Step 1 in `SKILL.md`
6
+ - Step 5 in `SKILL.md` lists the exit codes both installers share
7
+
8
+ ### When you declared Orca installed
9
+
10
+ **Register this repository.** Orca's `worktree create` fails with
11
+ `repo_not_found` until you register the repository with Orca. Registration is a
12
+ separate step, and it comes after the install rather than inside it. Register it
13
+ now:
14
+
15
+ ```bash
16
+ orca_bin="<orchestrator.orca_binary from the Step 1 detection output>"
17
+ "$orca_bin" repo add --path "$(git rev-parse --show-toplevel)" --json
18
+ ```
19
+
20
+ Fill the placeholder in from the detection output's
21
+ `orchestrator.orca_binary`, an absolute path. Do not hardcode a name. The Linux
22
+ executable is `orca-ide`, with `orca` as an alternative on some installs, so a
23
+ hand-written name is right on only some machines.
24
+
25
+ A `null` in that field means
26
+ this machine has no Orca, so nothing needs registering. See "When Orca is not
27
+ installed here" below instead.
28
+
29
+ The command is idempotent, so it is safe to run when the repository is already
30
+ registered. All Orca `--json` output is an envelope of the form
31
+ `{id, ok, result|error, _meta}` – read `.ok` rather than assuming the command
32
+ worked. Tell the user that Orca has no `repo rm` command, so registration only
33
+ goes one way.
34
+
35
+ Skip this step when the current directory is not inside a git repository, and
36
+ say why rather than failing silently.
37
+
38
+ **State the Claude settings rewrite**, whether or not the user asks about it.
39
+ Word it plainly:
40
+
41
+ > The first time Orca starts, it rewrites `~/.claude/settings.json`. It adds its
42
+ > agent hook to 11 hook events: SessionStart, UserPromptSubmit, Stop,
43
+ > StopFailure, SubagentStart, SubagentStop, TeammateIdle, PreToolUse,
44
+ > PostToolUse, PostToolUseFailure and PermissionRequest. The hook does nothing
45
+ > unless the `ORCA_PANE_KEY` environment variable holds a value, so it is inert
46
+ > outside an Orca terminal. Orca keeps your original file at
47
+ > `~/.claude/settings.json.bak`. Orca also writes `~/.orca/agent-hooks/` and
48
+ > `~/.config/orca/`.
49
+
50
+ Use the detection output to say whether this looks to have happened on this
51
+ machine already (`claude_settings.orca_hooks_present`) and whether the backup
52
+ exists (`claude_settings.backup_exists`). Word the first as evidence rather than
53
+ as a finding. The check is a loose text search for the word "orca" anywhere in
54
+ the settings file, so something unrelated can set it.
55
+
56
+ Call out the combination worth a look: a settings file that mentions Orca with
57
+ no `~/.claude/settings.json.bak` beside it may mean the original settings were
58
+ never preserved. Tell the user to open the file and check before trusting it.
59
+ Do not tell them they lost their settings – the evidence does not carry that.
60
+
61
+ **When Orca is not installed here** – `orchestrator.orca_binary` is `null` –
62
+ say that Orca is missing, and offer to install it.
63
+
64
+ The installer is `install-orca.sh`, beside this file. Resolve its path the way
65
+ Step 1 in `SKILL.md` resolves `detect-host.sh`, through `plugin_root`.
66
+
67
+ Ask two things before you plan anything, in one call to the question tool (AskUserQuestion on Claude Code):
68
+
69
+ 1. The port the server listens on. Default it to 6768.
70
+ 2. The address a client pairs to. Pre-fill it from `tailscale ip -4` when Step 1
71
+ found Tailscale installed and logged in.
72
+
73
+ Say where a pre-filled address came from, so the user can recognise it. Leave
74
+ the pairing address out when Tailscale is missing or logged out.
75
+
76
+ Then plan the install. Build one option list here and use it twice:
77
+
78
+ ```bash
79
+ bash "$plugin_root/skills/host/install-orca.sh" --plan \
80
+ --port <port> --pairing-address <address> --mobile-pairing
81
+ ```
82
+
83
+ `--mobile-pairing` gets a mobile-scoped pairing offer, which is what a phone
84
+ needs. Run the plan and the apply with the same options.
85
+
86
+ The script builds the unit text from the options. Three steps read their status
87
+ from that text.
88
+
89
+ A flag added after the plan therefore changes what runs. The plan is what the
90
+ user approved.
91
+
92
+ `--plan` writes nothing. It prints one numbered line per step, and each line
93
+ ends in `[todo]` or `[skip: <reason>]`. Show that list to the user verbatim,
94
+ every line of it.
95
+
96
+ Then state the Claude settings rewrite, before the user approves anything.
97
+ Orca's first start rewrites `~/.claude/settings.json` and keeps the original at
98
+ `~/.claude/settings.json.bak`. Use the wording in the "State the Claude settings
99
+ rewrite" block above, rather than a second version of it.
100
+
101
+ Now put the whole step list in front of the user with the question tool, and let
102
+ them decline. Declining is a real answer. Nothing runs, and this skill carries
103
+ on to the report in Step 6 of `SKILL.md`.
104
+
105
+ On approval, run the identical command with `--apply` in place of `--plan`:
106
+
107
+ ```bash
108
+ bash "$plugin_root/skills/host/install-orca.sh" --apply \
109
+ --port <port> --pairing-address <address> --mobile-pairing
110
+ ```
111
+
112
+ An apply line ends in `[done]` or `[skipped: <reason>]`. Every step is
113
+ idempotent, so a second run repeats nothing it already did.
114
+
115
+ What the install puts on the machine:
116
+
117
+ - the AppImage – a single-file Linux application bundle – under
118
+ `~/.local/opt/orca/`
119
+
120
+ - `orca-ide` and `orca` symlinks in `~/.local/bin`, so either name works
121
+ - a systemd user unit at `~/.config/systemd/user/orca.service`, meaning a
122
+ background service owned by the user rather than by the system
123
+
124
+ - `ORCA_TELEMETRY_DISABLED=1`, set in that unit
125
+
126
+ The unit wraps the server in `/usr/bin/script -qec "..." /dev/null`. That is how
127
+ the readiness JSON the server prints reaches the system journal. The install
128
+ needs no root access for any of it.
129
+
130
+ Two options cover a machine that cannot reach the default download.
131
+ `--appimage-url URL` replaces that URL, which is
132
+ `https://github.com/stablyai/orca/releases/latest/download/orca-linux.AppImage`.
133
+ `--appimage-path PATH` takes a local file instead.
134
+
135
+ The last step of the apply reads the journal itself and prints the pairing URL.
136
+ The pairing URL is the link a client uses to connect to this Orca server. Give
137
+ it to the user.
138
+
139
+ That step skips in three cases.
140
+
141
+ It skips when the apply neither started nor restarted the server, because an
142
+ untouched server keeps the pairing URL it already had. It skips when the journal
143
+ holds no readiness line yet, which happens when the server has started and has
144
+ not printed its block. It skips when `journalctl` is missing, and prints this
145
+ command instead.
146
+
147
+ Run it yourself whenever a skip leaves the pairing URL unknown:
148
+
149
+ ```bash
150
+ journalctl --user -u orca.service -n 100 --no-pager
151
+ ```
152
+
153
+ `--mobile-pairing` stays in the unit. The script never removes it, so the server
154
+ offers mobile pairing on every restart. Removing it is the user's own step, and
155
+ it means editing the unit and restarting it:
156
+
157
+ ```bash
158
+ ${EDITOR:-nano} ~/.config/systemd/user/orca.service
159
+ systemctl --user restart orca
160
+ ```
@@ -0,0 +1,163 @@
1
+ # Host questions
2
+
3
+ `SKILL.md` decides when to read this file: before asking the first question.
4
+ It holds what each detection field is evidence for, and the exact wording of
5
+ every question in Steps 2 and 3. `SKILL.md` defines each step.
6
+
7
+ ## Detection fields (Step 1)
8
+
9
+ What it reports, and what each field is evidence for:
10
+
11
+ | Field | Evidence for |
12
+ | --- | --- |
13
+ | `orchestrator.herdr_binary` | herdr is installed here (absolute path, or `null`) |
14
+ | `orchestrator.orca_binary` | Orca is installed here – the executable is `orca-ide`, with `orca` as an alternative on some installs |
15
+ | `orchestrator.hosting_this_session` | Which orchestrator's terminal pane this very session is running in, read from the variable each one exports: `ORCA_PANE_KEY` for Orca, `HERDR_ENV` for herdr |
16
+ | `browser.agent_browser_binary` | The `agent-browser` command-line tool, which is what drives a browser during verification |
17
+ | `browser.bridge_port_answers` | Something answered on local port 19988, which is where the Playwriter bridge – a reverse-SSH setup that lets an agent on this machine drive a real Chrome browser on the developer's own machine – forwards that browser's debugging port |
18
+ | `browser.chromium_binaries` | Chromium-family browsers found on this machine, which is what headless verification launches |
19
+ | `browser.display` | A graphical session exists (`DISPLAY` or `WAYLAND_DISPLAY` is set), without which nobody can watch a visible browser |
20
+ | `preview.tailscale_binary`, `preview.tailscale_logged_in` | Tailscale is installed, and separately whether anyone has logged it in – an installed but logged-out Tailscale publishes nothing |
21
+ | `element_picker.stagewise_binary` | `stagewise` is installed – an element picker, meaning a tool that lets the user click an element in the running app and hand the reference to an agent |
22
+ | `orca_topology.serve_unit_active` | A user-level service named exactly `orca` is running, which is the shape of a machine serving Orca to a viewer elsewhere. The name is an assumption: whatever provisions the server picks it, and nothing pins it yet. A unit installed under any other name reads here as "no server". The topology recommendation below then comes out `local` when this machine has Orca, and stays empty when it does not |
23
+ | `claude_settings.orca_hooks_present` | `~/.claude/settings.json` mentions Orca somewhere. The match is a loose, case-insensitive search for that word anywhere in the file, so an unrelated path or permission entry containing it counts too – this is evidence that Orca has wired its hooks in, not proof |
24
+ | `claude_settings.backup_exists` | `~/.claude/settings.json.bak` exists |
25
+ | `project.root`, `project.has_frontend` | The git repository the current directory sits in, and whether its `acstack/project.yaml` configures a frontend |
26
+
27
+ Several sections also carry a `recommended` field. That is the script's
28
+ mechanical reading of the evidence above it and nothing more. It is a starting
29
+ point for a question, never an answer.
30
+
31
+ ## 2a. Orchestrators
32
+
33
+ ```json
34
+ {
35
+ "question": "Is herdr installed on this machine?",
36
+ "header": "herdr",
37
+ "options": [
38
+ {"label": "yes", "description": "herdr is installed here. It owns terminal panes and creates worktrees under ~/.herdr/worktrees. <detected evidence, if any>"},
39
+ {"label": "no", "description": "herdr is not installed here. <detected evidence, if any>"}
40
+ ]
41
+ }
42
+ ```
43
+
44
+ ```json
45
+ {
46
+ "question": "Is Orca installed on this machine?",
47
+ "header": "Orca",
48
+ "options": [
49
+ {"label": "yes", "description": "Orca (stablyai/orca) is installed here. It owns panes and creates worktrees under ~/orca/workspaces. <detected evidence, if any>"},
50
+ {"label": "no", "description": "Orca is not installed here. <detected evidence, if any>"}
51
+ ]
52
+ }
53
+ ```
54
+
55
+ Fill each `<detected evidence, if any>` placeholder from the Step 1 detection
56
+ output. Put the evidence into whichever option it supports, so the recommended
57
+ answer is the one carrying it. Judge each orchestrator on its own fields only –
58
+ herdr from `orchestrator.herdr_binary`, Orca from `orchestrator.orca_binary`,
59
+ and both from `orchestrator.hosting_this_session`, which names at most one of
60
+ them:
61
+
62
+ - `orchestrator.hosting_this_session` names this orchestrator – recommend yes:
63
+ "detected: this session is running in a herdr pane", or the same sentence
64
+ about Orca.
65
+
66
+ - Its binary is present – recommend yes: "detected: installed at `<path>`".
67
+ When the session is also running in its pane, say both facts.
68
+
69
+ - Neither is true for it – recommend no: "not installed on this machine".
70
+
71
+ Leave a placeholder out entirely when there is nothing to say about that option.
72
+
73
+ ## 2b. Browser-verification modes
74
+
75
+ ```json
76
+ {
77
+ "question": "Which browser-verification modes work on this machine?",
78
+ "header": "Browser",
79
+ "multiSelect": true,
80
+ "options": [
81
+ {"label": "remote", "description": "Drive a real browser on your own machine over the Playwriter bridge. <detected: something answers on port 19988 | nothing is answering on port 19988>"},
82
+ {"label": "headless", "description": "Launch headless Chromium here – no window, no display needed. <detected: Chromium found at <path> | no Chromium-family browser found>"},
83
+ {"label": "local", "description": "Launch a visible browser here – needs a graphical display. <detected: browser and display both present | no graphical display>"},
84
+ {"label": "none of these", "description": "No browser verification works on this machine at all. This is an answer, not a skip: it declares all three modes false."}
85
+ ]
86
+ }
87
+ ```
88
+
89
+ A selected mode is `true`. An unselected mode is `false`.
90
+
91
+ The fourth option exists because a multi-select gives the user no way to press
92
+ "nothing". Choosing "none of these" writes all three axes –
93
+ `host.browser.remote`, `host.browser.headless` and `host.browser.local` – as
94
+ `false`. That is a declaration, not a skip: the user has said this machine
95
+ cannot verify in a browser, and Step 4 writes it.
96
+
97
+ If it comes back selected alongside a real mode, that is a contradiction; take
98
+ the named modes as the answer and ignore it.
99
+
100
+ The no-frontend branch below adds a fifth option, "Decide later". If that comes
101
+ back selected alongside "none of these", those two are opposites: one writes all
102
+ three axes `false`, the other writes nothing at all. Take "Decide later" as the
103
+ answer and write nothing.
104
+
105
+ An unset axis is recoverable. The next run of this skill asks again, and the
106
+ health check says plainly that the axis is missing.
107
+
108
+ A `false` written by mistake is not recoverable in the same way. It reads as a
109
+ decision the user made, so nothing asks again and the machine quietly looks
110
+ incapable.
111
+
112
+ When to treat the question as required: the browser axes become required as soon
113
+ as *any* project on this machine has a frontend. Nothing available here can see
114
+ that.
115
+
116
+ The detection output's `project.has_frontend` looks only at the git repository
117
+ the current directory sits in. So it reports on that one project, and says
118
+ nothing about the other checkouts on this machine.
119
+
120
+ So read it as a floor, not as the whole answer:
121
+
122
+ - `project.has_frontend` is true – ask with no escape. The modes have to be
123
+ declared.
124
+
125
+ - It is false, or there is no ACStack project in the current directory at all –
126
+ still ask. The next project opened on this machine may well have a frontend,
127
+ and this skill runs once per machine.
128
+
129
+ Add a "Decide later" option, and state the consequence plainly. The three
130
+ `host.browser.*` axes stay unset. The health check
131
+ `~/.claude/acstack/bin/acstack config check` then fails the first time
132
+ anyone runs it in a project that has a frontend.
133
+
134
+ ## Step 3: The optional axes
135
+
136
+ 1. **Preview publishing** (`host.preview.tailscale_serve`) – whether
137
+ `tailscale serve` can publish this machine's dev server to the user's own
138
+ private network. Another device can then open it. Options: yes, no, skip.
139
+
140
+ Detection reports whether this machine has Tailscale
141
+ (`preview.tailscale_binary`). It reports separately whether anyone has
142
+ logged it in (`preview.tailscale_logged_in`). Put both facts in the option
143
+ descriptions, because an installed-but-logged-out Tailscale publishes
144
+ nothing.
145
+
146
+ 2. **Element picker** (`host.element_picker`) – the tool that lets the user
147
+ click an element in the running app. The user then hands that reference to
148
+ an agent. Options: `stagewise`, `orca-design-mode`, `none`, skip.
149
+
150
+ Say plainly that the config only records this axis. No skill changes its
151
+ behaviour on it yet, so a wrong answer costs nothing today.
152
+
153
+ Note that Orca's Design Mode needs the browser pane to render on the
154
+ developer's own machine. So it is only a real option when Orca runs there.
155
+
156
+ 3. **Orca topology** (`host.orca.topology`) – how Orca runs. Ask it only when
157
+ the user answered yes to Orca in Step 2 of `SKILL.md`. Gate it on that answer, not
158
+ on a config read, because nothing has written `host.orchestrators.orca` yet.
159
+
160
+ Local runs Orca as a desktop application on the developer's own machine.
161
+ Remote runs `orca serve` – Orca's headless server – on another machine, and
162
+ the user views it through a paired client application. Options: local,
163
+ remote, skip.
@@ -0,0 +1,42 @@
1
+ # Host report
2
+
3
+ Read this file at Step 6, once you have written every answer and run every follow-up.
4
+
5
+ Close with a block in this shape – aligned labels, one line per axis, skipped
6
+ axes shown as `(unset – skipped)`:
7
+
8
+ ```
9
+ ## Host Declared
10
+
11
+ Orchestrators: herdr [true|false], orca [true|false]
12
+ Browser: remote [true|false], headless [true|false], local [true|false]
13
+ Preview: [true | false | (unset – skipped)]
14
+ Picker: [stagewise | orca-design-mode | none | (unset – skipped)]
15
+ Orca topology: [local | remote | (unset – skipped) | not applicable]
16
+ Config: [the path `acstack config path` printed]
17
+
18
+ Not automated yet: [what still has to be done by hand – logging in to Tailscale,
19
+ connecting the Playwriter bridge, pairing a client to Orca, turning on "Show in
20
+ worktree list" – or "nothing".]
21
+
22
+ Next: [run /acstack:setup in a project, or `~/.claude/acstack/bin/acstack config
23
+ check` to health-check what was just declared against this machine and against
24
+ the project in the current directory.]
25
+ ```
26
+
27
+ The last item on that list is easy to miss. "Show in worktree list" is a
28
+ per-repository setting in the Orca desktop application.
29
+
30
+ Turning it on is what puts herdr checkouts on a phone. The user turns it on once
31
+ for each repository.
32
+
33
+ Get the `Config:` line by running the command, not by writing the usual path in:
34
+
35
+ ```bash
36
+ ~/.claude/acstack/bin/acstack config path
37
+ ```
38
+
39
+ `~/.config/acstack/config.json` is only where the file lands by default. Setting
40
+ the `XDG_CONFIG_HOME` environment variable moves it. On a machine that sets that
41
+ variable, a hardcoded path in the report would point at a file that does not
42
+ exist.
@@ -0,0 +1,230 @@
1
+ ---
2
+ name: implement
3
+ description: Execute implementation work via the TDD pipeline (test-writer -> task-executor -> task-checker). A map is a stored graph of question and work nodes. Claims afk nodes – away from keyboard, meaning nodes an agent settles alone – from the map frontier, the nodes ready to be worked now, when a map exists; runs the same discipline directly on the request when none does. A unit of work carries its own size – one node is a quick change, forty is a long effort, and nothing declares which. Invoke whenever the way is clear and something needs building, changing or extending, however small. Use quick-fix instead when something is broken and needs a root cause found, and map instead when decisions still need settling before anyone can build.
4
+ argument-hint: "[map name, or the request to implement]"
5
+ ---
6
+
7
+ ## User input
8
+
9
+ ```text
10
+ $ARGUMENTS
11
+ ```
12
+
13
+ ## What this skill does
14
+
15
+ Implements work under the TDD pipeline. The unit of work is a map node when a
16
+ map exists, and the request itself when none does – same discipline either
17
+ way. Progress lives on the tracker as claims and resolutions; there is no
18
+ checkbox file to maintain.
19
+
20
+ ## Steps
21
+
22
+ Before step 1, copy the eight step headings below into your todo list word
23
+ for word. They go ahead of any task-specific items. A step you skip stays in
24
+ the list, marked `skip: <reason>`.
25
+
26
+ When step 5 runs on a node, copy its eight numbered steps the same way.
27
+
28
+ ### 1. Find the work
29
+
30
+ Check the configured tracker for maps (`workflow.maps.tracker` in
31
+ `acstack/project.yaml`; the map skill's `trackers/` docs declare the
32
+ operations – files backend shown below).
33
+
34
+ **A map exists** (or `$ARGUMENTS` names one):
35
+
36
+ ```bash
37
+ ~/.claude/acstack/bin/acstack node frontier --map <name> --mode afk --json
38
+ ```
39
+
40
+ On the github backend `--map` refuses – pipe `gh issue list` into `node
41
+ frontier --stdin` instead (see the map skill's `trackers/github.md`).
42
+
43
+ These are the workable nodes: open, unblocked, and containing no decision.
44
+ Pull them regardless of depth – work can hang anywhere, including straight
45
+ off the root.
46
+
47
+ If the frontier holds only `hitl` nodes – human in the loop, meaning a
48
+ person must answer them – stop and point the user at `/acstack:map`. Those
49
+ need a human, not a pipeline.
50
+
51
+ **No map**: the request in `$ARGUMENTS` is the work item. Same discipline,
52
+ no tracker writes. This is the whole quick path – a small change is just a
53
+ small unit of work, and nothing has to declare it small.
54
+
55
+ ### 2. Read project configuration
56
+
57
+ Read `acstack/project.yaml` for build/test/lint commands and directory paths.
58
+
59
+ ### 3. Create feature branch
60
+
61
+ Branch from the default branch, named after the map (or a short slug of the
62
+ request). If the branch already exists, ask the user whether to continue on
63
+ it or start fresh.
64
+
65
+ ### 4. Orient, then claim
66
+
67
+ With a map, orient once per session before claiming:
68
+
69
+ ```bash
70
+ ~/.claude/acstack/bin/acstack node walk --map <name>
71
+ ```
72
+
73
+ On the github backend, pipe `gh issue list` into `node walk --stdin` instead
74
+ (see the map skill's `trackers/github.md`).
75
+
76
+ The walk prints the map in one pass: the root and pinned nodes in full,
77
+ everything else as a one-line gist.
78
+
79
+ The root holds the destination. Pinned nodes hold standing preferences –
80
+ style rules and constraints that apply to the whole effort.
81
+
82
+ The resolved chain above a work node – the already-answered questions it
83
+ hangs off, followed up to the root – carries its why. Read that chain before
84
+ touching code.
85
+
86
+ Also check `node list --map <name> --status claimed`. A claim marks a node
87
+ as work in progress. One left behind by a dead session hides its node from
88
+ the frontier forever.
89
+
90
+ If a claim exists and you know of no other session working it, ask the
91
+ user and release it (`--status open`).
92
+
93
+ Claim each node as you start it:
94
+
95
+ ```bash
96
+ ~/.claude/acstack/bin/acstack node update <id> --map <name> --status claimed
97
+ ```
98
+
99
+ Nodes describe behaviour, not paths. **Resolve paths at claim time**.
100
+
101
+ Before any code change, dispatch parallel explorer subagents over the
102
+ relevant code. Use as many as there are distinct places to look, not a fixed
103
+ count. Act on what they find.
104
+
105
+ ### 5. Execute within the claim
106
+
107
+ The pipeline's state lives inside the claim, not on the node. For each
108
+ claimed node (or the bare request), run the Implementation discipline to
109
+ completion:
110
+
111
+ 1. **test-writer subagent** – tests from the node's behaviour description.
112
+ Under strict they must all fail before step 2 runs. Skip step 1 for pure
113
+ config or setup work with no testable behaviour.
114
+
115
+ 2. **task-executor subagent** – make the tests pass. Executor CANNOT modify
116
+ test files.
117
+
118
+ 3. **Format** – run `commands.format` over the files the work touched. A
119
+ `null` value means this project has no format step.
120
+
121
+ Report a non-zero exit. It never counts as a failed implementation.
122
+
123
+ 4. **task-checker subagent** – verify the build compiles, lints, and
124
+ typechecks. Verify tests pass, the full suite passes, and test count >=
125
+ baseline. Also check the mock audit, TDD isolation, and integration
126
+ wired.
127
+
128
+ When `acstack/project.yaml` configures `frontend` and frontend files
129
+ changed, the checker also runs the frontend build, lint, and unit
130
+ tests.
131
+
132
+ 5. **`/impeccable audit`** – report design findings on the changed frontend
133
+ files. Steps 5 to 7 run only when three conditions hold: the design gate
134
+ is on, `acstack/project.yaml` configures `frontend`, and frontend files
135
+ changed.
136
+
137
+ 6. **`/impeccable polish`** – fix the same files, from the audit findings.
138
+
139
+ 7. **task-checker subagent, second run** – verify the code polish changed.
140
+
141
+ Read `design-pass.md` before steps 5 to 7. It holds who types the
142
+ commands, how to read the gate, and what polish must leave alone.
143
+
144
+ 8. **frontend-verifier subagent** – verify the UI in a browser. The
145
+ verifier runs after the second checker passes, only when
146
+ `acstack/project.yaml` configures `frontend`, frontend files changed,
147
+ and `workflow.frontend_verification` is true.
148
+
149
+ `workflow.tdd.strict: false`, relaxed TDD, runs step 2 before step 1 and
150
+ skips nothing. Read `relaxed-tdd.md` when the project sets it. It holds how
151
+ the test-writer and the checker's gate change.
152
+
153
+ If either checker run fails, route back to the executor with the feedback.
154
+ If the work stalls or the session must stop mid-node, release the claim
155
+ (`--status open`). The node is plainly open again, and you need no phase
156
+ breadcrumb.
157
+
158
+ **Decision log**: on afk nodes, append one row per decision point to
159
+ `<main checkout>/acstack/.decisions/<name>.tsv`. A decision point is a fork chosen, a
160
+ unit verified, a revert, or a blocker.
161
+
162
+ Read `decision-log.md` before the first row. It holds how to find the main
163
+ checkout, the columns, and the `.gitignore` the directory needs.
164
+
165
+ **Parallelism**: afk nodes run unlimited and in parallel. When 2+ frontier
166
+ nodes touch non-overlapping files, launch an agent team where each teammate
167
+ owns one node and its file set. Otherwise, or on a host without agent teams,
168
+ work them sequentially.
169
+
170
+ ### 6. Resolve
171
+
172
+ When the checker passes, resolve the node in one call:
173
+
174
+ ```bash
175
+ ~/.claude/acstack/bin/acstack node update <id> --map <name> --status resolved \
176
+ --append-body "## Answer
177
+
178
+ <what was built, which files, what the tests pin down>"
179
+ ```
180
+
181
+ Write the `## Answer` text per the `writing` skill.
182
+
183
+ With no map, skip the tracker write – still invoke `record-context` when a
184
+ decision landed. With a map, then:
185
+
186
+ - Invoke `record-context` – implementation decisions can earn ADRs too.
187
+ - Create nodes for anything the work surfaced (a question found mid-build is
188
+ `hitl`, `--answers <this node>`).
189
+
190
+ - Recompute the frontier – resolutions unblock nodes.
191
+
192
+ ### 7. Build verification
193
+
194
+ After each node (and before ending the session), run the commands from
195
+ `acstack/project.yaml`: build, full test suite, lint and typecheck. All must
196
+ pass before claiming the next node.
197
+
198
+ ### 8. Completion
199
+
200
+ Stop when the afk frontier is empty, or when only `hitl` nodes remain (hand
201
+ those to `/acstack:map`). With no map, stop when the checker passes and Step
202
+ 7 verification is green.
203
+
204
+ Report: nodes resolved, tests passing, lines added/removed. Remind the user:
205
+ `/acstack:commit` to commit – spec sync extracts the durable record from the
206
+ diff.
207
+
208
+ ## Key rules
209
+
210
+ - **TDD pipeline is mandatory** – test-writer -> task-executor ->
211
+ task-checker -> frontend-verifier (frontend only). Only pure config work
212
+ skips the test-writer.
213
+ `workflow.tdd.strict: false` reorders the first two and skips neither.
214
+
215
+ With the design gate on, the audit and polish pass and a second
216
+ task-checker run sit between the first checker and the verifier
217
+
218
+ - **Executors CANNOT modify test files** – if tests are wrong, report it.
219
+ - **The tracker is the progress record** – claim on start, resolve on pass,
220
+ release on stall. No checkbox files, no phase fields.
221
+
222
+ - **Explore before writing** – parallel explorer subagents over the relevant
223
+ code, sized to the node, before any edit.
224
+
225
+ - **Resume is a query** – picking up where you left off means asking the
226
+ tracker what is workable now, not reconstructing history. A fresh session
227
+ runs the frontier query and continues. Never re-read an effort end to end
228
+ to find where it stopped.
229
+
230
+ - **Do NOT commit or push** – the user manages git via `/acstack:commit`.
@@ -0,0 +1,62 @@
1
+ # The decision log
2
+
3
+ An afk run has no human watching it. The decision log is how that human later
4
+ sees what the agent chose, and why. Read this file before you write the first
5
+ row.
6
+
7
+ ## When to write a row
8
+
9
+ Write one row per decision point, never one per action:
10
+
11
+ - **A fork chosen** – two ways to build something, and you picked one
12
+ - **A unit verified** – a node's checker passed, or a build verification went green
13
+ - **A revert** – you undid work, and the row names what triggered it
14
+ - **A blocker** – something stopped the node, and the row names it
15
+
16
+ Running a test, reading a file, or dispatching a subagent is an action. It
17
+ gets no row.
18
+
19
+ ## Where the log lives
20
+
21
+ The log is one file per map, in the main checkout:
22
+ `<main checkout>/acstack/.decisions/<name>.tsv`. The `<name>` is the map name
23
+ you pass to `--map`.
24
+
25
+ Write it in the main checkout, never in a worktree. Removing a worktree
26
+ deletes its gitignored files, so a log there vanishes before `archive` reads
27
+ it. Find the main checkout from any worktree:
28
+
29
+ ```bash
30
+ main=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
31
+ ```
32
+
33
+ Nobody commits the log. When you first create the `acstack/.decisions/`
34
+ directory, write `.gitignore` inside it, containing a single line:
35
+
36
+ ```text
37
+ *
38
+ ```
39
+
40
+ ## What a row holds
41
+
42
+ A row is one tab-separated line with six columns, in this order:
43
+
44
+ | Column | Holds |
45
+ | --- | --- |
46
+ | `ts` | the time, in ISO 8601 |
47
+ | `node` | the node id |
48
+ | `decision` | what you chose, verified, reverted, or hit |
49
+ | `why` | the reason, in one short phrase |
50
+ | `evidence` | a pointer: a commit SHA, a `file:line`, or a path |
51
+ | `result` | what happened next |
52
+
53
+ - **Evidence is a pointer, never prose**, so a reader can follow it to the proof
54
+ - **Keep tabs and newlines out of every field**, because each one breaks the row
55
+
56
+ ## Append only
57
+
58
+ Never edit or delete a row. A wrong call gets a new row that supersedes it,
59
+ and its `why` names the row it replaces.
60
+
61
+ `/acstack:archive` reads the log before it closes the map. It hands lasting
62
+ decisions to `record-context`, then deletes the log file.