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.
- package/.claude-plugin/plugin.json +19 -0
- package/LICENSE +21 -0
- package/README.md +389 -2
- package/THIRD_PARTY_NOTICES +14 -0
- package/TROUBLESHOOTING.md +225 -0
- package/agents/codex/frontend-verifier.toml +352 -0
- package/agents/codex/task-checker.toml +345 -0
- package/agents/codex/task-executor.toml +157 -0
- package/agents/codex/test-writer.toml +149 -0
- package/agents/frontend-verifier.md +351 -0
- package/agents/task-checker.md +344 -0
- package/agents/task-executor.md +156 -0
- package/agents/test-writer.md +148 -0
- package/assets/playwriter-bridge/build-launcher.ps1 +32 -0
- package/assets/playwriter-bridge/doctor.ps1 +450 -0
- package/assets/playwriter-bridge/launcher-src.cs +131 -0
- package/assets/playwriter-bridge/opener.js +330 -0
- package/assets/playwriter-bridge/opener.ps1 +63 -0
- package/assets/playwriter-bridge/register-tasks.ps1 +328 -0
- package/assets/playwriter-bridge/relay.ps1 +50 -0
- package/assets/playwriter-bridge/stop.ps1 +125 -0
- package/assets/playwriter-bridge/sync.ps1 +271 -0
- package/assets/playwriter-bridge/tunnel.ps1 +325 -0
- package/assets/playwriter-bridge/vm-free-port.sh +166 -0
- package/assets/terminal-workspace/client-keybindings.md +87 -0
- package/assets/terminal-workspace/config.example.yaml +329 -0
- package/assets/terminal-workspace/setup.sh +4317 -0
- package/cli/README.md +47 -0
- package/cli/bin/acstack.js +3 -0
- package/cli/dist/index.js +25984 -0
- package/cli/dist/index.js.map +7 -0
- package/cli/package.json +59 -0
- package/docs/adr/0001-ste-writing-standard.md +16 -0
- package/docs/adr/0002-version-gate-not-auto-bump.md +35 -0
- package/docs/adr/0003-handoff-ack-command.md +19 -0
- package/docs/adr/0004-dev-setup-per-host.md +13 -0
- package/docs/adr/0005-two-orchestrators-per-host.md +25 -0
- package/docs/adr/0006-document-opener-service.md +89 -0
- package/docs/adr/0007-lead-check-reads-the-transcript.md +87 -0
- package/docs/adr/0008-cli-audits-skill-interviews.md +37 -0
- package/docs/adr/0009-verify-the-write-not-the-writer.md +51 -0
- package/docs/adr/0010-promote-dev-to-main-by-fast-forward.md +115 -0
- package/docs/adr/0011-node-header-is-the-edge-encoding.md +20 -0
- package/docs/adr/0012-node-kind-is-a-closed-set-of-five.md +31 -0
- package/docs/adr/0013-the-diagram-renderer-is-pure.md +23 -0
- package/docs/adr/0014-reading-a-node-hides-its-generated-diagram.md +29 -0
- package/docs/adr/0015-a-node-id-links-to-its-issue-through-an-anchor.md +37 -0
- package/docs/adr/0016-the-map-root-carries-no-status-of-its-own.md +21 -0
- package/docs/adr/0017-call-impeccable-copy-only-its-questions.md +13 -0
- package/docs/adr/index.md +17 -0
- package/docs/config-reference.md +572 -0
- package/docs/dev-setups.md +164 -0
- package/docs/migrate-0.8.md +28 -0
- package/docs/playwriter-bridge-windows.md +15 -0
- package/docs/terminal-workspace-keys.md +137 -0
- package/docs/terminal-workspace.md +1774 -0
- package/docs/workflows.md +309 -0
- package/hooks/ac-writing-style-reminder.sh +86 -0
- package/hooks/context-pressure.sh +583 -0
- package/hooks/hooks.json +50 -0
- package/hooks/session-start-handoff.sh +165 -0
- package/hooks/session-start.sh +214 -0
- package/orchestrator/AGENTS.md +532 -0
- package/output-styles/ac-writing-style.md +286 -0
- package/package.json +50 -4
- package/pi/agents/frontend-verifier.md +357 -0
- package/pi/agents/task-checker.md +348 -0
- package/pi/agents/task-executor.md +160 -0
- package/pi/agents/test-writer.md +154 -0
- package/pi/extension.ts +723 -0
- package/profiles/fullstack-python.yaml +29 -0
- package/profiles/node-typescript.yaml +23 -0
- package/profiles/python.yaml +24 -0
- package/skills/archive/SKILL.md +160 -0
- package/skills/bootstrap/SKILL.md +109 -0
- package/skills/bridge/HANDOFF.md +93 -0
- package/skills/bridge/SKILL-VM.md +292 -0
- package/skills/bridge/SKILL-WINDOWS.md +526 -0
- package/skills/bridge/SKILL.md +121 -0
- package/skills/browser-verify/SKILL.md +229 -0
- package/skills/code-review/SKILL.md +44 -0
- package/skills/commit/SKILL.md +106 -0
- package/skills/compact-and-continue/SKILL.md +241 -0
- package/skills/explore/SKILL.md +149 -0
- package/skills/grilling/SKILL.md +134 -0
- package/skills/handoff/SKILL.md +250 -0
- package/skills/handoff/launch-herdr.md +197 -0
- package/skills/handoff/launch-without-herdr.md +30 -0
- package/skills/handoff/lead-check.md +59 -0
- package/skills/handoff/outcomes.md +162 -0
- package/skills/handoff/running-agent.md +50 -0
- package/skills/handoff/watch.md +115 -0
- package/skills/host/SKILL.md +247 -0
- package/skills/host/detect-host.sh +297 -0
- package/skills/host/herdr.md +79 -0
- package/skills/host/install-herdr-block.sh +467 -0
- package/skills/host/install-orca.sh +512 -0
- package/skills/host/notes.md +97 -0
- package/skills/host/orca.md +160 -0
- package/skills/host/questions.md +163 -0
- package/skills/host/report.md +42 -0
- package/skills/implement/SKILL.md +230 -0
- package/skills/implement/decision-log.md +62 -0
- package/skills/implement/design-pass.md +32 -0
- package/skills/implement/relaxed-tdd.md +28 -0
- package/skills/map/SKILL.md +250 -0
- package/skills/map/frontend.md +227 -0
- package/skills/map/trackers/files.md +74 -0
- package/skills/map/trackers/github.md +180 -0
- package/skills/map/visuals.md +387 -0
- package/skills/new-worktree/SKILL.md +155 -0
- package/skills/new-worktree/detect-orchestrator.sh +328 -0
- package/skills/new-worktree/detect-orchestrator.test.sh +894 -0
- package/skills/new-worktree/herdr.md +84 -0
- package/skills/new-worktree/orca.md +101 -0
- package/skills/pre-commit-review/SKILL.md +242 -0
- package/skills/pre-commit-review/auto-fix.md +19 -0
- package/skills/pre-commit-review/interactive.md +35 -0
- package/skills/quick-fix/SKILL.md +125 -0
- package/skills/record-context/SKILL.md +106 -0
- package/skills/setup/SKILL.md +250 -0
- package/skills/setup/browser.md +123 -0
- package/skills/setup/design-review.md +97 -0
- package/skills/setup/first-run.md +114 -0
- package/skills/setup/report.md +68 -0
- package/skills/setup/row-fixes.md +196 -0
- package/skills/setup/terminal-workspace.md +153 -0
- package/skills/sync/SKILL.md +171 -0
- package/skills/teardown-worktree/SKILL.md +245 -0
- package/skills/teardown-worktree/detector.md +39 -0
- package/skills/teardown-worktree/herdr.md +113 -0
- package/skills/teardown-worktree/orca.md +61 -0
- package/skills/terminal-workspace/SKILL.md +249 -0
- package/skills/terminal-workspace/components.md +36 -0
- package/skills/terminal-workspace/config-choices.md +69 -0
- package/skills/terminal-workspace/emulator-keys.md +48 -0
- package/skills/terminal-workspace/headless-clipboard.md +175 -0
- package/skills/terminal-workspace/turn-off-and-update.md +104 -0
- package/skills/test-conventions/SKILL.md +59 -0
- package/skills/visual-docs/SKILL.md +246 -0
- package/skills/writing/SKILL.md +231 -0
- package/skills/writing/examples.md +153 -0
- 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.
|