@aperant/framework 0.6.4 → 0.6.6

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 (241) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +54 -234
  3. package/agents/apt-improver.md +99 -0
  4. package/agents/apt-planner.md +115 -10
  5. package/dist/__test-helpers/run-cmd.d.mts +4 -2
  6. package/dist/__test-helpers/run-cmd.d.mts.map +1 -1
  7. package/dist/__test-helpers/run-cmd.mjs +56 -15
  8. package/dist/__test-helpers/run-cmd.mjs.map +1 -1
  9. package/dist/cli/ci-watch/lock.d.mts +53 -0
  10. package/dist/cli/ci-watch/lock.d.mts.map +1 -0
  11. package/dist/cli/ci-watch/lock.mjs +172 -0
  12. package/dist/cli/ci-watch/lock.mjs.map +1 -0
  13. package/dist/cli/ci-watch/state.d.mts +36 -0
  14. package/dist/cli/ci-watch/state.d.mts.map +1 -0
  15. package/dist/cli/ci-watch/state.mjs +103 -0
  16. package/dist/cli/ci-watch/state.mjs.map +1 -0
  17. package/dist/cli/ci-watch/stop-matrix.d.mts +58 -0
  18. package/dist/cli/ci-watch/stop-matrix.d.mts.map +1 -0
  19. package/dist/cli/ci-watch/stop-matrix.mjs +164 -0
  20. package/dist/cli/ci-watch/stop-matrix.mjs.map +1 -0
  21. package/dist/cli/cli-wrappers/ci-watch.d.mts +2 -0
  22. package/dist/cli/cli-wrappers/ci-watch.d.mts.map +1 -0
  23. package/dist/cli/cli-wrappers/ci-watch.mjs +9 -0
  24. package/dist/cli/cli-wrappers/ci-watch.mjs.map +1 -0
  25. package/dist/cli/commands/adr.d.mts +5 -0
  26. package/dist/cli/commands/adr.d.mts.map +1 -0
  27. package/dist/cli/commands/adr.mjs +228 -0
  28. package/dist/cli/commands/adr.mjs.map +1 -0
  29. package/dist/cli/commands/ci-watch.d.mts +7 -0
  30. package/dist/cli/commands/ci-watch.d.mts.map +1 -0
  31. package/dist/cli/commands/ci-watch.mjs +465 -0
  32. package/dist/cli/commands/ci-watch.mjs.map +1 -0
  33. package/dist/cli/commands/commit.d.mts.map +1 -1
  34. package/dist/cli/commands/commit.mjs +25 -8
  35. package/dist/cli/commands/commit.mjs.map +1 -1
  36. package/dist/cli/commands/context.d.mts +7 -0
  37. package/dist/cli/commands/context.d.mts.map +1 -0
  38. package/dist/cli/commands/context.mjs +224 -0
  39. package/dist/cli/commands/context.mjs.map +1 -0
  40. package/dist/cli/commands/event.d.mts.map +1 -1
  41. package/dist/cli/commands/event.mjs +125 -24
  42. package/dist/cli/commands/event.mjs.map +1 -1
  43. package/dist/cli/commands/host-detect.d.mts +1 -1
  44. package/dist/cli/commands/host-detect.d.mts.map +1 -1
  45. package/dist/cli/commands/host-detect.mjs +30 -3
  46. package/dist/cli/commands/host-detect.mjs.map +1 -1
  47. package/dist/cli/commands/modes.d.mts +13 -0
  48. package/dist/cli/commands/modes.d.mts.map +1 -0
  49. package/dist/cli/commands/modes.mjs +221 -0
  50. package/dist/cli/commands/modes.mjs.map +1 -0
  51. package/dist/cli/commands/route.mjs +1 -1
  52. package/dist/cli/commands/route.mjs.map +1 -1
  53. package/dist/cli/commands/task.d.mts.map +1 -1
  54. package/dist/cli/commands/task.mjs +393 -145
  55. package/dist/cli/commands/task.mjs.map +1 -1
  56. package/dist/cli/commands/tokens.d.mts.map +1 -1
  57. package/dist/cli/commands/tokens.mjs +150 -6
  58. package/dist/cli/commands/tokens.mjs.map +1 -1
  59. package/dist/cli/commands/triage.d.mts +8 -0
  60. package/dist/cli/commands/triage.d.mts.map +1 -0
  61. package/dist/cli/commands/triage.mjs +263 -0
  62. package/dist/cli/commands/triage.mjs.map +1 -0
  63. package/dist/cli/config/post-merge-sweep.d.mts +18 -0
  64. package/dist/cli/config/post-merge-sweep.d.mts.map +1 -1
  65. package/dist/cli/config/post-merge-sweep.mjs +48 -3
  66. package/dist/cli/config/post-merge-sweep.mjs.map +1 -1
  67. package/dist/cli/consistency/registry.d.mts +11 -0
  68. package/dist/cli/consistency/registry.d.mts.map +1 -1
  69. package/dist/cli/consistency/registry.mjs +13 -0
  70. package/dist/cli/consistency/registry.mjs.map +1 -1
  71. package/dist/cli/coordination/agent-identity.d.mts +9 -0
  72. package/dist/cli/coordination/agent-identity.d.mts.map +1 -1
  73. package/dist/cli/coordination/agent-identity.mjs +11 -0
  74. package/dist/cli/coordination/agent-identity.mjs.map +1 -1
  75. package/dist/cli/coordination/auto-emit-artifact-ready.d.mts +16 -0
  76. package/dist/cli/coordination/auto-emit-artifact-ready.d.mts.map +1 -0
  77. package/dist/cli/coordination/auto-emit-artifact-ready.mjs +88 -0
  78. package/dist/cli/coordination/auto-emit-artifact-ready.mjs.map +1 -0
  79. package/dist/cli/coordination/event-log.d.mts +27 -0
  80. package/dist/cli/coordination/event-log.d.mts.map +1 -1
  81. package/dist/cli/coordination/event-log.mjs +72 -2
  82. package/dist/cli/coordination/event-log.mjs.map +1 -1
  83. package/dist/cli/coordination/event-schema.d.mts +16 -0
  84. package/dist/cli/coordination/event-schema.d.mts.map +1 -0
  85. package/dist/cli/coordination/event-schema.mjs +161 -0
  86. package/dist/cli/coordination/event-schema.mjs.map +1 -0
  87. package/dist/cli/coordination/store.d.mts +6 -0
  88. package/dist/cli/coordination/store.d.mts.map +1 -1
  89. package/dist/cli/coordination/store.mjs +14 -0
  90. package/dist/cli/coordination/store.mjs.map +1 -1
  91. package/dist/cli/dispatch.d.mts.map +1 -1
  92. package/dist/cli/dispatch.mjs +14 -1
  93. package/dist/cli/dispatch.mjs.map +1 -1
  94. package/dist/cli/gate/registry.d.mts +11 -0
  95. package/dist/cli/gate/registry.d.mts.map +1 -1
  96. package/dist/cli/gate/registry.mjs +13 -0
  97. package/dist/cli/gate/registry.mjs.map +1 -1
  98. package/dist/cli/help.d.mts.map +1 -1
  99. package/dist/cli/help.mjs +3 -2
  100. package/dist/cli/help.mjs.map +1 -1
  101. package/dist/cli/host/detect.d.mts +1 -0
  102. package/dist/cli/host/detect.d.mts.map +1 -1
  103. package/dist/cli/host/detect.mjs +5 -0
  104. package/dist/cli/host/detect.mjs.map +1 -1
  105. package/dist/cli/roadmap/conductor-view.d.mts +13 -0
  106. package/dist/cli/roadmap/conductor-view.d.mts.map +1 -0
  107. package/dist/cli/roadmap/conductor-view.mjs +31 -0
  108. package/dist/cli/roadmap/conductor-view.mjs.map +1 -0
  109. package/dist/cli/route/envelope.d.mts +68 -4
  110. package/dist/cli/route/envelope.d.mts.map +1 -1
  111. package/dist/cli/route/envelope.mjs +140 -103
  112. package/dist/cli/route/envelope.mjs.map +1 -1
  113. package/dist/cli/route/skill-discover.d.mts +9 -0
  114. package/dist/cli/route/skill-discover.d.mts.map +1 -1
  115. package/dist/cli/route/skill-discover.mjs +13 -1
  116. package/dist/cli/route/skill-discover.mjs.map +1 -1
  117. package/dist/cli/skill-author/contract.d.mts +1 -0
  118. package/dist/cli/skill-author/contract.d.mts.map +1 -1
  119. package/dist/cli/skill-author/contract.mjs +7 -0
  120. package/dist/cli/skill-author/contract.mjs.map +1 -1
  121. package/dist/cli/task/ids.d.mts +7 -4
  122. package/dist/cli/task/ids.d.mts.map +1 -1
  123. package/dist/cli/task/ids.mjs +11 -10
  124. package/dist/cli/task/ids.mjs.map +1 -1
  125. package/dist/cli/task/worktree-cleanup.d.mts +9 -1
  126. package/dist/cli/task/worktree-cleanup.d.mts.map +1 -1
  127. package/dist/cli/task/worktree-cleanup.mjs +190 -9
  128. package/dist/cli/task/worktree-cleanup.mjs.map +1 -1
  129. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  130. package/dist/plugin/agents/apt-planner.md +1 -1
  131. package/dist/plugin/skills/apt/SKILL.md +111 -5
  132. package/dist/plugin/skills/apt-author-skill/SKILL.md +11 -0
  133. package/dist/plugin/skills/apt-bootstrap/SKILL.md +1 -0
  134. package/dist/plugin/skills/apt-classify/SKILL.md +1 -0
  135. package/dist/plugin/skills/apt-close-task/SKILL.md +1 -0
  136. package/dist/plugin/skills/apt-create-docs/SKILL.md +1 -0
  137. package/dist/plugin/skills/apt-debug/SKILL.md +2 -0
  138. package/dist/plugin/skills/apt-design/SKILL.md +2 -0
  139. package/dist/plugin/skills/apt-discuss/SKILL.md +2 -0
  140. package/dist/plugin/skills/apt-docs/SKILL.md +2 -0
  141. package/dist/plugin/skills/apt-execute/SKILL.md +1 -0
  142. package/dist/plugin/skills/apt-mockup/SKILL.md +2 -0
  143. package/dist/plugin/skills/apt-pause/SKILL.md +1 -0
  144. package/dist/plugin/skills/apt-personas/SKILL.md +1 -0
  145. package/dist/plugin/skills/apt-plan/SKILL.md +2 -0
  146. package/dist/plugin/skills/apt-pr-review/SKILL.md +1 -0
  147. package/dist/plugin/skills/apt-quick/SKILL.md +2 -0
  148. package/dist/plugin/skills/apt-resume/SKILL.md +1 -0
  149. package/dist/plugin/skills/apt-review/SKILL.md +1 -0
  150. package/dist/plugin/skills/apt-roadmap/SKILL.md +1 -0
  151. package/dist/plugin/skills/apt-roundtable/SKILL.md +2 -0
  152. package/dist/plugin/skills/apt-run/SKILL.md +1 -0
  153. package/dist/plugin/skills/apt-scan/SKILL.md +1 -0
  154. package/dist/plugin/skills/apt-setup/SKILL.md +1 -0
  155. package/dist/plugin/skills/apt-ship/SKILL.md +6 -5
  156. package/dist/plugin/skills/apt-stress-test/SKILL.md +1 -0
  157. package/dist/plugin/skills/apt-terminal/SKILL.md +1 -0
  158. package/dist/plugin/skills/apt-update/SKILL.md +5 -0
  159. package/dist/plugin/skills/apt-verify/SKILL.md +1 -0
  160. package/dist/plugin/skills/apt-verify-proof/SKILL.md +1 -0
  161. package/dist/types/config.d.ts +85 -0
  162. package/dist/types/config.d.ts.map +1 -1
  163. package/package.json +9 -1
  164. package/prompts/coder.md +2 -0
  165. package/prompts/conductor-status-check.md +23 -0
  166. package/prompts/conductor-sub-agent.md +57 -0
  167. package/prompts/conductor-system.md +172 -0
  168. package/prompts/planner.md +12 -0
  169. package/prompts/spec_writer.md +9 -0
  170. package/skills/apt/SKILL.md +1 -0
  171. package/skills/apt-close-task/SKILL.md +32 -1
  172. package/skills/apt-debug/SKILL.md +39 -6
  173. package/skills/apt-debug/appendices/diagnose-discipline.md +119 -0
  174. package/skills/apt-diagram/SKILL.md +342 -0
  175. package/skills/apt-diagram/appendices/design-discipline.md +97 -0
  176. package/skills/apt-discuss/SKILL.md +25 -0
  177. package/skills/apt-discuss/appendices/grill-discipline.md +104 -0
  178. package/skills/apt-discuss/appendices/zoom-out-helper.md +79 -0
  179. package/skills/apt-execute/SKILL.md +48 -5
  180. package/skills/apt-execute/appendices/tdd-mode.md +107 -0
  181. package/skills/apt-improve/DEEPENING.md +84 -0
  182. package/skills/apt-improve/INTERFACE-DESIGN.md +97 -0
  183. package/skills/apt-improve/LANGUAGE.md +104 -0
  184. package/skills/apt-improve/SKILL.md +141 -0
  185. package/skills/apt-plan/SKILL.md +159 -4
  186. package/skills/apt-plan/adapters/conductor.md +98 -0
  187. package/skills/apt-planner.md +42 -1
  188. package/skills/apt-pr-review/SKILL.md +46 -16
  189. package/skills/apt-prototype/LOGIC.md +109 -0
  190. package/skills/apt-prototype/SKILL.md +143 -0
  191. package/skills/apt-prototype/UI.md +90 -0
  192. package/skills/apt-quick/SKILL.md +30 -0
  193. package/skills/apt-review/SKILL.md +2 -0
  194. package/skills/apt-run/SKILL.md +32 -4
  195. package/skills/apt-setup/SKILL.md +130 -2
  196. package/skills/apt-ship/SKILL.md +63 -1
  197. package/skills/apt-spar/SKILL.md +290 -0
  198. package/skills/apt-triage/AGENT-BRIEF.md +84 -0
  199. package/skills/apt-triage/OUT-OF-SCOPE.md +75 -0
  200. package/skills/apt-triage/SKILL.md +169 -0
  201. package/skills/apt-verify/SKILL.md +3 -0
  202. package/skills/apt-verify-proof/SKILL.md +3 -0
  203. package/skills/apt-watch-ci/SKILL.md +163 -0
  204. package/skills/apt-zoom-out/SKILL.md +130 -0
  205. package/src/cli/ci-watch/lock.mjs +178 -0
  206. package/src/cli/ci-watch/state.mjs +103 -0
  207. package/src/cli/ci-watch/stop-matrix.mjs +181 -0
  208. package/src/cli/cli-wrappers/ci-watch.mjs +9 -0
  209. package/src/cli/commands/adr.mjs +243 -0
  210. package/src/cli/commands/ci-watch.mjs +503 -0
  211. package/src/cli/commands/commit.mjs +27 -8
  212. package/src/cli/commands/context.mjs +244 -0
  213. package/src/cli/commands/event.mjs +131 -24
  214. package/src/cli/commands/host-detect.mjs +33 -7
  215. package/src/cli/commands/modes.mjs +216 -0
  216. package/src/cli/commands/route.mjs +1 -1
  217. package/src/cli/commands/task.mjs +430 -170
  218. package/src/cli/commands/tokens.mjs +157 -6
  219. package/src/cli/commands/triage.mjs +286 -0
  220. package/src/cli/config/post-merge-sweep.mjs +49 -3
  221. package/src/cli/consistency/registry.mjs +14 -0
  222. package/src/cli/coordination/agent-identity.mjs +12 -0
  223. package/src/cli/coordination/auto-emit-artifact-ready.mjs +96 -0
  224. package/src/cli/coordination/event-log.mjs +73 -2
  225. package/src/cli/coordination/event-schema.d.ts +13 -0
  226. package/src/cli/coordination/event-schema.mjs +174 -0
  227. package/src/cli/coordination/store.mjs +14 -0
  228. package/src/cli/dispatch.mjs +15 -1
  229. package/src/cli/gate/registry.mjs +14 -0
  230. package/src/cli/help.mjs +3 -2
  231. package/src/cli/host/detect.mjs +5 -0
  232. package/src/cli/roadmap/conductor-view.d.ts +10 -0
  233. package/src/cli/roadmap/conductor-view.mjs +31 -0
  234. package/src/cli/route/envelope.mjs +140 -106
  235. package/src/cli/route/skill-discover.mjs +14 -1
  236. package/src/cli/skill-author/contract.mjs +7 -0
  237. package/src/cli/task/ids.mjs +15 -13
  238. package/src/cli/task/worktree-cleanup.mjs +191 -9
  239. package/templates/adr-format.md +56 -0
  240. package/templates/config.json +4 -0
  241. package/templates/context-format.md +34 -0
@@ -0,0 +1,465 @@
1
+ /**
2
+ * commands/ci-watch.mjs — Layer 1 cmd for `/apt:watch-ci` (C28).
3
+ *
4
+ * Subcommands: start | stop | status | tick
5
+ *
6
+ * Layer 1 rule: cmdCiWatch returns `{envelope, exitCode}` and MUST NOT call
7
+ * output() / process.exit() / fail() directly. The Layer 2 wrapper in
8
+ * dispatch.mjs is responsible for transport.
9
+ *
10
+ * `tick` is single-execution per invocation (D-01). The recurring beat is
11
+ * delivered externally — by CC's CronCreate, Pi's pi-schedule-prompt, or by
12
+ * the user re-invoking `--tick` on non-cron hosts. The cmd MUST NOT enter a
13
+ * polling loop.
14
+ *
15
+ * Test seam: when `APT_TEST_GH_STUB` is set to a path on disk, the tick path
16
+ * reads the gh payload from that file instead of shelling out. The stub
17
+ * shape is `{ checks: [...], prMetadata: {...} }` — matches the classifier
18
+ * input contract in stop-matrix.mjs.
19
+ */
20
+ import { randomBytes } from 'node:crypto';
21
+ import { existsSync, readFileSync } from 'node:fs';
22
+ import { resolve } from 'node:path';
23
+ import { acquireLock, releaseLock } from '../ci-watch/lock.mjs';
24
+ import { deleteState, listWatches, readState, writeState } from '../ci-watch/state.mjs';
25
+ import { classify, isFailing } from '../ci-watch/stop-matrix.mjs';
26
+ import { parseFlags } from '../util/args.mjs';
27
+ import { err, exitWith, ok } from '../util/result.mjs';
28
+ const DEFAULT_TICK_INTERVAL_MS = 300_000; // 5 minutes
29
+ const MAX_TICK_INTERVAL_MS = 30 * 60 * 1000; // 30 min
30
+ const WALL_BUDGET_MS = 4 * 60 * 60 * 1000; // 4 hours
31
+ function newSessionId() {
32
+ return randomBytes(8).toString('hex');
33
+ }
34
+ function nowIso() {
35
+ return new Date().toISOString();
36
+ }
37
+ /**
38
+ * Validate `--pr` is a positive-integer string before it gets interpolated
39
+ * into a filesystem path. Without this guard, a value like `--pr ../escape`
40
+ * would write the per-PR state/lock file outside `.aperant/ci-watches/`
41
+ * (path traversal via `join(..., '../escape.json')`). PR numbers on GitHub
42
+ * are positive integers, so digits-only is the correct shape.
43
+ *
44
+ * Returns the validated PR string on success, or an err() CommandResult on
45
+ * failure — the caller returns it directly.
46
+ *
47
+ * @param {string|undefined} pr
48
+ * @returns {string | import('../util/result.mjs').CommandResult}
49
+ */
50
+ function validatePr(pr) {
51
+ if (!pr)
52
+ return err('Required: --pr <N>');
53
+ if (!/^[1-9]\d*$/.test(pr)) {
54
+ return err(`Invalid --pr value: ${JSON.stringify(pr)}. Expected a positive integer.`);
55
+ }
56
+ return pr;
57
+ }
58
+ /**
59
+ * @param {string} subcommand
60
+ * @param {string} projectDir
61
+ * @param {string[]} extraArgs
62
+ */
63
+ export function cmdCiWatch(subcommand, projectDir, extraArgs) {
64
+ if (!subcommand) {
65
+ return err('Usage: apt-tools ci-watch <start|stop|status|tick> <project-dir> [flags]');
66
+ }
67
+ if (!projectDir) {
68
+ return err(`Usage: apt-tools ci-watch ${subcommand} <project-dir> [flags]`);
69
+ }
70
+ const root = resolve(projectDir);
71
+ const flags = parseFlags(extraArgs);
72
+ switch (subcommand) {
73
+ case 'start':
74
+ return doStart(root, flags);
75
+ case 'stop':
76
+ return doStop(root, flags);
77
+ case 'status':
78
+ return doStatus(root, flags);
79
+ case 'tick':
80
+ return doTick(root, flags);
81
+ default:
82
+ return err(`Unknown ci-watch subcommand: ${subcommand}. Expected: start, stop, status, tick`);
83
+ }
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // start
87
+ // ---------------------------------------------------------------------------
88
+ function doStart(root, flags) {
89
+ const prCheck = validatePr(flags.get('pr'));
90
+ if (typeof prCheck !== 'string')
91
+ return prCheck;
92
+ const pr = prCheck;
93
+ const taskId = flags.get('task-id');
94
+ if (!taskId)
95
+ return err('Required: --task-id <id>');
96
+ const host = flags.get('host') || 'unknown';
97
+ // Refuse to start a second watcher for the same PR — exit 2 with a
98
+ // busy envelope so the caller knows the PR is already armed. The
99
+ // orchestrator skill prints the holder's session and exits.
100
+ const existingState = readState(root, pr);
101
+ if (existingState && !existingState.error) {
102
+ return exitWith({
103
+ status: 'busy',
104
+ command: 'ci-watch-start',
105
+ pr: Number(pr),
106
+ reason: 'already-armed',
107
+ existing: {
108
+ task_id: existingState.task_id,
109
+ host: existingState.host,
110
+ attempts: existingState.attempts,
111
+ started_at: existingState.started_at,
112
+ deadline: existingState.deadline,
113
+ },
114
+ }, 2);
115
+ }
116
+ const sessionId = newSessionId();
117
+ const lockResult = acquireLock(root, pr, sessionId);
118
+ if (lockResult.status !== 'ok') {
119
+ return exitWith({
120
+ status: 'busy',
121
+ command: 'ci-watch-start',
122
+ pr: Number(pr),
123
+ reason: 'lock-held',
124
+ holder: lockResult.holder,
125
+ }, 2);
126
+ }
127
+ try {
128
+ const existing = readState(root, pr);
129
+ const existingObj = existing && !existing.error ? existing : {};
130
+ const startedAt = existingObj.started_at || nowIso();
131
+ const deadline = existingObj.deadline || new Date(Date.now() + WALL_BUDGET_MS).toISOString();
132
+ // Snapshot auto_merge from config at start so config changes mid-watch don't
133
+ // surprise the orchestrator (spec.md §8).
134
+ const autoMergeFromConfig = readAutoMergeFromConfig(root);
135
+ const state = {
136
+ pr: Number(pr),
137
+ task_id: taskId,
138
+ host,
139
+ scheduler_handle: existingObj.scheduler_handle ?? null,
140
+ attempts: existingObj.attempts || 0,
141
+ started_at: startedAt,
142
+ deadline,
143
+ last_poll: existingObj.last_poll || nowIso(),
144
+ last_status: existingObj.last_status ?? null,
145
+ next_tick_interval_ms: existingObj.next_tick_interval_ms || DEFAULT_TICK_INTERVAL_MS,
146
+ paused: existingObj.paused || false,
147
+ auto_merge_on_green: autoMergeFromConfig,
148
+ };
149
+ writeState(root, pr, state);
150
+ return ok({
151
+ status: 'ok',
152
+ command: 'ci-watch-start',
153
+ pr: Number(pr),
154
+ host,
155
+ scheduler_handle: state.scheduler_handle,
156
+ deadline: state.deadline,
157
+ });
158
+ }
159
+ finally {
160
+ releaseLock(root, pr, sessionId);
161
+ }
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // stop
165
+ // ---------------------------------------------------------------------------
166
+ function doStop(root, flags) {
167
+ const prCheck = validatePr(flags.get('pr'));
168
+ if (typeof prCheck !== 'string')
169
+ return prCheck;
170
+ const pr = prCheck;
171
+ const reason = flags.get('reason') || 'user-stop';
172
+ const existing = readState(root, pr);
173
+ if (!existing || existing.error) {
174
+ // Idempotent — stopping a non-existent watch is a no-op.
175
+ return ok({
176
+ status: 'ok',
177
+ command: 'ci-watch-stop',
178
+ pr: Number(pr),
179
+ scheduler_handle_removed: false,
180
+ reason,
181
+ });
182
+ }
183
+ const schedulerHandle = existing.scheduler_handle ?? null;
184
+ deleteState(root, pr);
185
+ // Also remove any leftover lock file in case the watcher crashed mid-tick.
186
+ const stopSessionId = newSessionId();
187
+ const acq = acquireLock(root, pr, stopSessionId);
188
+ if (acq.status === 'ok') {
189
+ releaseLock(root, pr, stopSessionId);
190
+ }
191
+ return ok({
192
+ status: 'ok',
193
+ command: 'ci-watch-stop',
194
+ pr: Number(pr),
195
+ scheduler_handle_removed: schedulerHandle !== null,
196
+ reason,
197
+ });
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // status
201
+ // ---------------------------------------------------------------------------
202
+ function doStatus(root, flags) {
203
+ if (flags.has('pr')) {
204
+ const prCheck = validatePr(flags.get('pr'));
205
+ if (typeof prCheck !== 'string')
206
+ return prCheck;
207
+ const pr = prCheck;
208
+ const s = readState(root, pr);
209
+ if (!s || s.error) {
210
+ return ok({ status: 'ok', command: 'ci-watch-status', watches: [] });
211
+ }
212
+ return ok({
213
+ status: 'ok',
214
+ command: 'ci-watch-status',
215
+ watches: [summarize(s)],
216
+ });
217
+ }
218
+ const watches = listWatches(root).map(summarize);
219
+ return ok({ status: 'ok', command: 'ci-watch-status', watches });
220
+ }
221
+ function summarize(s) {
222
+ return {
223
+ pr: s.pr,
224
+ attempts: s.attempts,
225
+ last_status: s.last_status,
226
+ deadline: s.deadline,
227
+ last_poll: s.last_poll,
228
+ paused: s.paused,
229
+ };
230
+ }
231
+ // ---------------------------------------------------------------------------
232
+ // tick
233
+ // ---------------------------------------------------------------------------
234
+ function doTick(root, flags) {
235
+ const prCheck = validatePr(flags.get('pr'));
236
+ if (typeof prCheck !== 'string')
237
+ return prCheck;
238
+ const pr = prCheck;
239
+ const sessionId = newSessionId();
240
+ const lockResult = acquireLock(root, pr, sessionId);
241
+ if (lockResult.status !== 'ok') {
242
+ return exitWith({
243
+ status: 'busy',
244
+ command: 'ci-watch-tick',
245
+ pr: Number(pr),
246
+ reason: 'lock-held',
247
+ holder: lockResult.holder,
248
+ }, 2);
249
+ }
250
+ try {
251
+ const state = readState(root, pr);
252
+ if (!state || state.error) {
253
+ return err(`No active watch for PR ${pr} — run \`ci-watch start\` first`);
254
+ }
255
+ if (state.paused) {
256
+ return ok({
257
+ status: 'stopped',
258
+ command: 'ci-watch-tick',
259
+ pr: Number(pr),
260
+ action: 'reviewer-pause',
261
+ attempts_used: state.attempts,
262
+ reason: 'watch is paused (reviewer-pause); resume with /apt:watch-ci --resume',
263
+ });
264
+ }
265
+ const payload = fetchGhPayload(pr);
266
+ if (payload.error) {
267
+ // gh CLI not available / auth failed → infra-backoff. Don't count it,
268
+ // double the next-tick interval (capped at MAX_TICK_INTERVAL_MS), and reschedule.
269
+ state.last_poll = nowIso();
270
+ state.next_tick_interval_ms = Math.min((state.next_tick_interval_ms || DEFAULT_TICK_INTERVAL_MS) * 2, MAX_TICK_INTERVAL_MS);
271
+ writeState(root, pr, state);
272
+ return ok({
273
+ status: 'ok',
274
+ command: 'ci-watch-tick',
275
+ pr: Number(pr),
276
+ action: 'infra-backoff',
277
+ attempts_used: state.attempts,
278
+ next_tick_at: nextTickAt(state),
279
+ reason: `gh payload fetch failed: ${payload.error}`,
280
+ });
281
+ }
282
+ const result = classify({
283
+ checks: payload.checks,
284
+ state,
285
+ prMetadata: payload.prMetadata,
286
+ });
287
+ const { action, counts_toward_budget, reason } = result;
288
+ // Apply action-specific state mutation.
289
+ if (action === 'green' || action === 'merged' || action === 'closed') {
290
+ // Terminal — delete state before releasing lock so no concurrent tick
291
+ // can slip in between the release and the delete.
292
+ deleteState(root, pr);
293
+ releaseLock(root, pr, sessionId);
294
+ return ok({
295
+ status: 'stopped',
296
+ command: 'ci-watch-tick',
297
+ pr: Number(pr),
298
+ action,
299
+ attempts_used: state.attempts,
300
+ reason,
301
+ });
302
+ }
303
+ if (action === 'attempts-cap' || action === 'wall-cap' || action === 'identical-log') {
304
+ deleteState(root, pr);
305
+ releaseLock(root, pr, sessionId);
306
+ return ok({
307
+ status: 'stopped',
308
+ command: 'ci-watch-tick',
309
+ pr: Number(pr),
310
+ action,
311
+ attempts_used: state.attempts,
312
+ reason,
313
+ });
314
+ }
315
+ if (action === 'reviewer-pause') {
316
+ state.paused = true;
317
+ state.last_poll = nowIso();
318
+ writeState(root, pr, state);
319
+ return ok({
320
+ status: 'stopped',
321
+ command: 'ci-watch-tick',
322
+ pr: Number(pr),
323
+ action,
324
+ attempts_used: state.attempts,
325
+ reason,
326
+ });
327
+ }
328
+ if (action === 'flake-skip') {
329
+ state.last_poll = nowIso();
330
+ // Reset interval on a clean (non-infra) tick.
331
+ state.next_tick_interval_ms = DEFAULT_TICK_INTERVAL_MS;
332
+ writeState(root, pr, state);
333
+ return ok({
334
+ status: 'ok',
335
+ command: 'ci-watch-tick',
336
+ pr: Number(pr),
337
+ action,
338
+ attempts_used: state.attempts,
339
+ next_tick_at: nextTickAt(state),
340
+ reason,
341
+ });
342
+ }
343
+ if (action === 'infra-backoff') {
344
+ state.last_poll = nowIso();
345
+ state.next_tick_interval_ms = Math.min((state.next_tick_interval_ms || DEFAULT_TICK_INTERVAL_MS) * 2, MAX_TICK_INTERVAL_MS);
346
+ writeState(root, pr, state);
347
+ return ok({
348
+ status: 'ok',
349
+ command: 'ci-watch-tick',
350
+ pr: Number(pr),
351
+ action,
352
+ attempts_used: state.attempts,
353
+ next_tick_at: nextTickAt(state),
354
+ reason,
355
+ });
356
+ }
357
+ if (action === 'wait') {
358
+ state.last_poll = nowIso();
359
+ state.next_tick_interval_ms = DEFAULT_TICK_INTERVAL_MS;
360
+ writeState(root, pr, state);
361
+ return ok({
362
+ status: 'ok',
363
+ command: 'ci-watch-tick',
364
+ pr: Number(pr),
365
+ action,
366
+ attempts_used: state.attempts,
367
+ next_tick_at: nextTickAt(state),
368
+ reason,
369
+ });
370
+ }
371
+ // fix / diverged-rebased / diverged-bailed — all count toward budget.
372
+ if (counts_toward_budget) {
373
+ state.attempts = (state.attempts || 0) + 1;
374
+ }
375
+ state.last_poll = nowIso();
376
+ state.next_tick_interval_ms = DEFAULT_TICK_INTERVAL_MS;
377
+ // Track the failed-check fingerprint aggregate for next-tick identical-log detection.
378
+ const failed = (payload.checks || []).filter(isFailing);
379
+ state.last_status =
380
+ failed.length === 0
381
+ ? null
382
+ : failed
383
+ .map((f) => `${f.name}:${f.log_fingerprint ?? ''}`)
384
+ .sort()
385
+ .join('|');
386
+ writeState(root, pr, state);
387
+ return ok({
388
+ status: 'ok',
389
+ command: 'ci-watch-tick',
390
+ pr: Number(pr),
391
+ action,
392
+ attempts_used: state.attempts,
393
+ next_tick_at: nextTickAt(state),
394
+ reason,
395
+ });
396
+ }
397
+ finally {
398
+ // `try/finally` so every branch releases the lock — even thrown errors.
399
+ // The terminal branches above release explicitly before deleting state
400
+ // (releaseLock no-ops on a missing file, so calling it twice is safe).
401
+ releaseLock(root, pr, sessionId);
402
+ }
403
+ }
404
+ // ---------------------------------------------------------------------------
405
+ // helpers
406
+ // ---------------------------------------------------------------------------
407
+ function nextTickAt(state) {
408
+ return new Date(Date.now() + (state.next_tick_interval_ms || DEFAULT_TICK_INTERVAL_MS)).toISOString();
409
+ }
410
+ /**
411
+ * Fetch the gh CLI payload OR read the test-stub JSON. Returns
412
+ * { checks, prMetadata } on success
413
+ * { error: '<message>' } when gh / stub failed.
414
+ *
415
+ * Note: this is a thin wrapper — the orchestrator skill is responsible for
416
+ * the actual `gh run view --log` + fix-CLI shell-out (spec.md §5.5). The
417
+ * cmd's tick only reads checks + classifies + updates state; the heavy
418
+ * fix-loop work happens in the skill body.
419
+ */
420
+ function fetchGhPayload(_pr) {
421
+ const isTestRuntime = process.env.NODE_ENV === 'test' ||
422
+ process.env.VITEST != null ||
423
+ process.env.APT_INTERNAL_TEST != null;
424
+ const stub = isTestRuntime ? process.env.APT_TEST_GH_STUB : undefined;
425
+ if (stub) {
426
+ try {
427
+ if (!existsSync(stub)) {
428
+ return { error: 'APT_TEST_GH_STUB path not found' };
429
+ }
430
+ const data = JSON.parse(readFileSync(stub, 'utf-8'));
431
+ return {
432
+ checks: data.checks || [],
433
+ prMetadata: data.prMetadata || { state: 'OPEN' },
434
+ };
435
+ }
436
+ catch (_e) {
437
+ return { error: 'stub parse error' };
438
+ }
439
+ }
440
+ // Real gh shell-out lives in the skill body. The cmd's tick treats
441
+ // "no stub + no payload" as infra-backoff so unit tests can exercise the
442
+ // path without a live gh binary. The orchestrator skill is responsible
443
+ // for pre-fetching and re-invoking with APT_TEST_GH_STUB set, OR for
444
+ // passing real data via a future --payload-file flag (out of scope here).
445
+ return {
446
+ error: 'gh shell-out is the skill orchestrator boundary — set APT_TEST_GH_STUB for unit tests',
447
+ };
448
+ }
449
+ /**
450
+ * Read `ci_watch.auto_merge_on_green` from `.aperant/config.json` (default
451
+ * false). Best-effort — missing file or unparsable JSON returns false.
452
+ */
453
+ function readAutoMergeFromConfig(root) {
454
+ try {
455
+ const path = resolve(root, '.aperant', 'config.json');
456
+ if (!existsSync(path))
457
+ return false;
458
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
459
+ return parsed?.ci_watch?.auto_merge_on_green === true;
460
+ }
461
+ catch {
462
+ return false;
463
+ }
464
+ }
465
+ //# sourceMappingURL=ci-watch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-watch.mjs","sourceRoot":"","sources":["../../../src/cli/commands/ci-watch.mjs"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"commit.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/commit.mjs"],"names":[],"mappings":"AAUA,iFA4EC"}
1
+ {"version":3,"file":"commit.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/commit.mjs"],"names":[],"mappings":"AAWA,iFA8FC"}
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Layer 1 (post-CLI-layering refactor, subtask 14).
5
5
  */
6
- import { execSync } from 'node:child_process';
6
+ import { execFileSync } from 'node:child_process';
7
+ import { maybeAutoEmitPlanReady } from '../coordination/auto-emit-artifact-ready.mjs';
7
8
  import { evaluatePostcondition } from '../risk/postcondition.mjs';
8
9
  import { err, ok } from '../util/result.mjs';
9
10
  export function cmdCommit(args) {
@@ -30,19 +31,35 @@ export function cmdCommit(args) {
30
31
  let sha = null;
31
32
  try {
32
33
  // Stage specified files
33
- execSync(`git add ${files.map((f) => `"${f}"`).join(' ')}`, {
34
- encoding: 'utf-8',
35
- stdio: 'pipe',
36
- });
34
+ execFileSync('git', ['add', '--', ...files], { encoding: 'utf-8', stdio: 'pipe' });
37
35
  // Commit with co-author
38
36
  const fullMessage = `${message}\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>`;
39
- execSync(`git commit -m ${JSON.stringify(fullMessage)}`, { encoding: 'utf-8', stdio: 'pipe' });
37
+ execFileSync('git', ['commit', '-m', fullMessage], { encoding: 'utf-8', stdio: 'pipe' });
40
38
  // Get the commit sha
41
- sha = execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim();
39
+ sha = execFileSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf-8' }).trim();
42
40
  }
43
41
  catch (e) {
44
42
  return err(`Commit failed: ${e.message}`);
45
43
  }
44
+ // Conductor v2 (post live verification 2026-05-15) — auto-emit
45
+ // `artifact.ready{kind:'plan'}` when the commit landed a fresh
46
+ // `implementation_plan.json` under .aperant/tasks/{id}/ AND the
47
+ // process runs under a Conductor PTY (APERANT_TERMINAL_ID set).
48
+ // Code-enforced replacement for the markdown-discipline emit step
49
+ // that QUICK-track tasks correctly skipped per Fast Path Guarantee.
50
+ // Best-effort: emit failures do NOT roll back the commit.
51
+ try {
52
+ const emitResult = maybeAutoEmitPlanReady({ files, projectRoot: process.cwd() });
53
+ if (emitResult.emitted) {
54
+ // Surface via stderr so apt-tools' structured JSON stdout stays
55
+ // machine-parseable for the caller.
56
+ process.stderr.write(`[apt-tools commit] auto-emitted artifact.ready for task ${emitResult.envelope.task}\n`);
57
+ }
58
+ }
59
+ catch {
60
+ // Non-fatal — the commit succeeded. The Conductor will fall back
61
+ // to filesystem polling (slightly higher latency, same outcome).
62
+ }
46
63
  // R3: Postcondition gate — atomic with the commit. If the predicate fails,
47
64
  // we roll back the commit (--soft preserves working tree so the executor
48
65
  // can fix-and-retry without losing work).
@@ -58,7 +75,7 @@ export function cmdCommit(args) {
58
75
  const result = evaluatePostcondition(pc, process.cwd());
59
76
  if (!result.ok) {
60
77
  try {
61
- execSync('git reset --soft HEAD~1', { stdio: 'pipe' });
78
+ execFileSync('git', ['reset', '--soft', 'HEAD~1'], { stdio: 'pipe' });
62
79
  }
63
80
  catch {
64
81
  /* rollback best-effort */
@@ -1 +1 @@
1
- {"version":3,"file":"commit.mjs","sourceRoot":"","sources":["../../../src/cli/commands/commit.mjs"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commit.mjs","sourceRoot":"","sources":["../../../src/cli/commands/commit.mjs"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI entry: `apt-tools context <subcommand> <project-dir> [flags]`.
3
+ *
4
+ * Only `write` is supported in v1; other subcommands return a usage error.
5
+ */
6
+ export function cmdContext(subcommand: any, projectDir: any, extraArgs: any): import("../util/result.mjs").CommandResult;
7
+ //# sourceMappingURL=context.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/context.mjs"],"names":[],"mappings":"AAmJA;;;;GAIG;AACH,yHA2FC"}