@noclaf/cli 0.7.0 → 0.9.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 (294) hide show
  1. package/README.md +26 -84
  2. package/dist/app.js +13 -0
  3. package/dist/app.js.map +1 -0
  4. package/dist/brand.js +9 -49
  5. package/dist/brand.js.map +1 -1
  6. package/dist/cli.js +3 -37
  7. package/dist/cli.js.map +1 -1
  8. package/dist/mcp-server.js +3 -187
  9. package/dist/mcp-server.js.map +1 -1
  10. package/package.json +8 -17
  11. package/dist/adapters/supabase/allocation-gateway.js +0 -291
  12. package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
  13. package/dist/adapters/supabase/analytics-gateway.js +0 -18
  14. package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
  15. package/dist/adapters/supabase/calendar-gateway.js +0 -48
  16. package/dist/adapters/supabase/calendar-gateway.js.map +0 -1
  17. package/dist/adapters/supabase/calendar-write-gateway.js +0 -35
  18. package/dist/adapters/supabase/calendar-write-gateway.js.map +0 -1
  19. package/dist/adapters/supabase/client.js +0 -136
  20. package/dist/adapters/supabase/client.js.map +0 -1
  21. package/dist/adapters/supabase/context-gateway.js +0 -23
  22. package/dist/adapters/supabase/context-gateway.js.map +0 -1
  23. package/dist/adapters/supabase/gateway.js +0 -26
  24. package/dist/adapters/supabase/gateway.js.map +0 -1
  25. package/dist/adapters/supabase/release-gateway.js +0 -61
  26. package/dist/adapters/supabase/release-gateway.js.map +0 -1
  27. package/dist/adapters/supabase/sprint-gateway.js +0 -59
  28. package/dist/adapters/supabase/sprint-gateway.js.map +0 -1
  29. package/dist/adapters/supabase/task-gateway.js +0 -533
  30. package/dist/adapters/supabase/task-gateway.js.map +0 -1
  31. package/dist/auth.js +0 -141
  32. package/dist/auth.js.map +0 -1
  33. package/dist/cli/commands/auth.js +0 -127
  34. package/dist/cli/commands/auth.js.map +0 -1
  35. package/dist/cli/commands/clean.js +0 -120
  36. package/dist/cli/commands/clean.js.map +0 -1
  37. package/dist/cli/commands/completion.js +0 -114
  38. package/dist/cli/commands/completion.js.map +0 -1
  39. package/dist/cli/commands/exec.js +0 -69
  40. package/dist/cli/commands/exec.js.map +0 -1
  41. package/dist/cli/commands/init/analyze-step.js +0 -21
  42. package/dist/cli/commands/init/analyze-step.js.map +0 -1
  43. package/dist/cli/commands/init/apply-answers.js +0 -122
  44. package/dist/cli/commands/init/apply-answers.js.map +0 -1
  45. package/dist/cli/commands/init/apply-step.js +0 -165
  46. package/dist/cli/commands/init/apply-step.js.map +0 -1
  47. package/dist/cli/commands/init/auth-step.js +0 -48
  48. package/dist/cli/commands/init/auth-step.js.map +0 -1
  49. package/dist/cli/commands/init/boilerplate-step.js +0 -20
  50. package/dist/cli/commands/init/boilerplate-step.js.map +0 -1
  51. package/dist/cli/commands/init/clients-step.js +0 -78
  52. package/dist/cli/commands/init/clients-step.js.map +0 -1
  53. package/dist/cli/commands/init/context-step.js +0 -81
  54. package/dist/cli/commands/init/context-step.js.map +0 -1
  55. package/dist/cli/commands/init/describe-step.js +0 -68
  56. package/dist/cli/commands/init/describe-step.js.map +0 -1
  57. package/dist/cli/commands/init/index.js +0 -98
  58. package/dist/cli/commands/init/index.js.map +0 -1
  59. package/dist/cli/commands/init/mode.js +0 -18
  60. package/dist/cli/commands/init/mode.js.map +0 -1
  61. package/dist/cli/commands/init/progress.js +0 -60
  62. package/dist/cli/commands/init/progress.js.map +0 -1
  63. package/dist/cli/commands/init/project-step.js +0 -133
  64. package/dist/cli/commands/init/project-step.js.map +0 -1
  65. package/dist/cli/commands/init/provision-step.js +0 -103
  66. package/dist/cli/commands/init/provision-step.js.map +0 -1
  67. package/dist/cli/commands/map.js +0 -18
  68. package/dist/cli/commands/map.js.map +0 -1
  69. package/dist/cli/commands/plan.js +0 -45
  70. package/dist/cli/commands/plan.js.map +0 -1
  71. package/dist/cli/commands/skills.js +0 -23
  72. package/dist/cli/commands/skills.js.map +0 -1
  73. package/dist/cli/commands/sync.js +0 -319
  74. package/dist/cli/commands/sync.js.map +0 -1
  75. package/dist/cli/commands/validate-plan.js +0 -42
  76. package/dist/cli/commands/validate-plan.js.map +0 -1
  77. package/dist/cli/commands/wave.js +0 -57
  78. package/dist/cli/commands/wave.js.map +0 -1
  79. package/dist/cli/copy/auth.json +0 -6
  80. package/dist/cli/copy/flows.json +0 -6
  81. package/dist/cli/copy/init.json +0 -20
  82. package/dist/cli/copy/sync.json +0 -3
  83. package/dist/cli/copy.js +0 -23
  84. package/dist/cli/copy.js.map +0 -1
  85. package/dist/cli/flows/clients.js +0 -130
  86. package/dist/cli/flows/clients.js.map +0 -1
  87. package/dist/cli/flows/completion.js +0 -63
  88. package/dist/cli/flows/completion.js.map +0 -1
  89. package/dist/cli/flows/dependencies.js +0 -114
  90. package/dist/cli/flows/dependencies.js.map +0 -1
  91. package/dist/cli/flows/sections.js +0 -85
  92. package/dist/cli/flows/sections.js.map +0 -1
  93. package/dist/cli/flows/user-config.js +0 -37
  94. package/dist/cli/flows/user-config.js.map +0 -1
  95. package/dist/cli/ui/render.js +0 -239
  96. package/dist/cli/ui/render.js.map +0 -1
  97. package/dist/cli/ui/report.js +0 -130
  98. package/dist/cli/ui/report.js.map +0 -1
  99. package/dist/config.js +0 -289
  100. package/dist/config.js.map +0 -1
  101. package/dist/constants.js +0 -9
  102. package/dist/constants.js.map +0 -1
  103. package/dist/core/ports.js +0 -2
  104. package/dist/core/ports.js.map +0 -1
  105. package/dist/core/types.js +0 -5
  106. package/dist/core/types.js.map +0 -1
  107. package/dist/database.types.js +0 -11
  108. package/dist/database.types.js.map +0 -1
  109. package/dist/lib/active-project.js +0 -28
  110. package/dist/lib/active-project.js.map +0 -1
  111. package/dist/lib/autopull.js +0 -13
  112. package/dist/lib/autopull.js.map +0 -1
  113. package/dist/lib/boilerplate-scaffold.js +0 -65
  114. package/dist/lib/boilerplate-scaffold.js.map +0 -1
  115. package/dist/lib/boilerplates.js +0 -61
  116. package/dist/lib/boilerplates.js.map +0 -1
  117. package/dist/lib/calendar-logic.js +0 -59
  118. package/dist/lib/calendar-logic.js.map +0 -1
  119. package/dist/lib/calendar-write-logic.js +0 -6
  120. package/dist/lib/calendar-write-logic.js.map +0 -1
  121. package/dist/lib/client-configs.js +0 -191
  122. package/dist/lib/client-configs.js.map +0 -1
  123. package/dist/lib/client-install.js +0 -40
  124. package/dist/lib/client-install.js.map +0 -1
  125. package/dist/lib/colors.js +0 -92
  126. package/dist/lib/colors.js.map +0 -1
  127. package/dist/lib/cowork-extension.js +0 -143
  128. package/dist/lib/cowork-extension.js.map +0 -1
  129. package/dist/lib/dates.js +0 -21
  130. package/dist/lib/dates.js.map +0 -1
  131. package/dist/lib/dependencies.js +0 -145
  132. package/dist/lib/dependencies.js.map +0 -1
  133. package/dist/lib/dependency-install.js +0 -163
  134. package/dist/lib/dependency-install.js.map +0 -1
  135. package/dist/lib/duration.js +0 -5
  136. package/dist/lib/duration.js.map +0 -1
  137. package/dist/lib/exec-delegate.js +0 -218
  138. package/dist/lib/exec-delegate.js.map +0 -1
  139. package/dist/lib/exec-engines.js +0 -90
  140. package/dist/lib/exec-engines.js.map +0 -1
  141. package/dist/lib/exec-events.js +0 -87
  142. package/dist/lib/exec-events.js.map +0 -1
  143. package/dist/lib/exec-translators.js +0 -198
  144. package/dist/lib/exec-translators.js.map +0 -1
  145. package/dist/lib/file-merge.js +0 -33
  146. package/dist/lib/file-merge.js.map +0 -1
  147. package/dist/lib/git-exposure.js +0 -35
  148. package/dist/lib/git-exposure.js.map +0 -1
  149. package/dist/lib/harness.js +0 -127
  150. package/dist/lib/harness.js.map +0 -1
  151. package/dist/lib/hooks.js +0 -216
  152. package/dist/lib/hooks.js.map +0 -1
  153. package/dist/lib/patterns.js +0 -25
  154. package/dist/lib/patterns.js.map +0 -1
  155. package/dist/lib/pg-error.js +0 -53
  156. package/dist/lib/pg-error.js.map +0 -1
  157. package/dist/lib/plan-delegate.js +0 -117
  158. package/dist/lib/plan-delegate.js.map +0 -1
  159. package/dist/lib/project-context.js +0 -151
  160. package/dist/lib/project-context.js.map +0 -1
  161. package/dist/lib/prompts.js +0 -69
  162. package/dist/lib/prompts.js.map +0 -1
  163. package/dist/lib/provision-apply.js +0 -220
  164. package/dist/lib/provision-apply.js.map +0 -1
  165. package/dist/lib/provision-collect.js +0 -47
  166. package/dist/lib/provision-collect.js.map +0 -1
  167. package/dist/lib/provision.js +0 -45
  168. package/dist/lib/provision.js.map +0 -1
  169. package/dist/lib/release-logic.js +0 -10
  170. package/dist/lib/release-logic.js.map +0 -1
  171. package/dist/lib/repo-map.js +0 -176
  172. package/dist/lib/repo-map.js.map +0 -1
  173. package/dist/lib/require-config.js +0 -32
  174. package/dist/lib/require-config.js.map +0 -1
  175. package/dist/lib/rules.js +0 -146
  176. package/dist/lib/rules.js.map +0 -1
  177. package/dist/lib/sections.js +0 -89
  178. package/dist/lib/sections.js.map +0 -1
  179. package/dist/lib/skill-agent.js +0 -44
  180. package/dist/lib/skill-agent.js.map +0 -1
  181. package/dist/lib/skill-serve.js +0 -128
  182. package/dist/lib/skill-serve.js.map +0 -1
  183. package/dist/lib/skills-cache.js +0 -99
  184. package/dist/lib/skills-cache.js.map +0 -1
  185. package/dist/lib/skills.js +0 -237
  186. package/dist/lib/skills.js.map +0 -1
  187. package/dist/lib/sprint-deadline.js +0 -28
  188. package/dist/lib/sprint-deadline.js.map +0 -1
  189. package/dist/lib/sprint-logic.js +0 -31
  190. package/dist/lib/sprint-logic.js.map +0 -1
  191. package/dist/lib/targets.js +0 -150
  192. package/dist/lib/targets.js.map +0 -1
  193. package/dist/lib/task-history.js +0 -15
  194. package/dist/lib/task-history.js.map +0 -1
  195. package/dist/lib/telemetry.js +0 -51
  196. package/dist/lib/telemetry.js.map +0 -1
  197. package/dist/lib/tool-result.js +0 -15
  198. package/dist/lib/tool-result.js.map +0 -1
  199. package/dist/lib/validate-plan-delegate.js +0 -106
  200. package/dist/lib/validate-plan-delegate.js.map +0 -1
  201. package/dist/lib/version-check.js +0 -89
  202. package/dist/lib/version-check.js.map +0 -1
  203. package/dist/lib/wave-scheduler.js +0 -95
  204. package/dist/lib/wave-scheduler.js.map +0 -1
  205. package/dist/session-factory.js +0 -19
  206. package/dist/session-factory.js.map +0 -1
  207. package/dist/spinner.js +0 -12
  208. package/dist/spinner.js.map +0 -1
  209. package/dist/tools/activate-sprint.js +0 -44
  210. package/dist/tools/activate-sprint.js.map +0 -1
  211. package/dist/tools/add-checklist.js +0 -63
  212. package/dist/tools/add-checklist.js.map +0 -1
  213. package/dist/tools/add-holiday.js +0 -41
  214. package/dist/tools/add-holiday.js.map +0 -1
  215. package/dist/tools/add-home-office.js +0 -31
  216. package/dist/tools/add-home-office.js.map +0 -1
  217. package/dist/tools/add-vacation.js +0 -39
  218. package/dist/tools/add-vacation.js.map +0 -1
  219. package/dist/tools/attach-pr.js +0 -97
  220. package/dist/tools/attach-pr.js.map +0 -1
  221. package/dist/tools/comment-task.js +0 -72
  222. package/dist/tools/comment-task.js.map +0 -1
  223. package/dist/tools/create-release.js +0 -46
  224. package/dist/tools/create-release.js.map +0 -1
  225. package/dist/tools/create-sprint.js +0 -66
  226. package/dist/tools/create-sprint.js.map +0 -1
  227. package/dist/tools/create-task.js +0 -174
  228. package/dist/tools/create-task.js.map +0 -1
  229. package/dist/tools/delegate-exec.js +0 -63
  230. package/dist/tools/delegate-exec.js.map +0 -1
  231. package/dist/tools/end-allocation.js +0 -38
  232. package/dist/tools/end-allocation.js.map +0 -1
  233. package/dist/tools/end-sprint.js +0 -37
  234. package/dist/tools/end-sprint.js.map +0 -1
  235. package/dist/tools/end-task-allocation.js +0 -60
  236. package/dist/tools/end-task-allocation.js.map +0 -1
  237. package/dist/tools/exec-status.js +0 -45
  238. package/dist/tools/exec-status.js.map +0 -1
  239. package/dist/tools/finalize-release.js +0 -45
  240. package/dist/tools/finalize-release.js.map +0 -1
  241. package/dist/tools/get-active-allocation.js +0 -69
  242. package/dist/tools/get-active-allocation.js.map +0 -1
  243. package/dist/tools/get-calendar.js +0 -40
  244. package/dist/tools/get-calendar.js.map +0 -1
  245. package/dist/tools/get-context.js +0 -48
  246. package/dist/tools/get-context.js.map +0 -1
  247. package/dist/tools/get-sprint.js +0 -38
  248. package/dist/tools/get-sprint.js.map +0 -1
  249. package/dist/tools/get-task.js +0 -146
  250. package/dist/tools/get-task.js.map +0 -1
  251. package/dist/tools/index.js +0 -84
  252. package/dist/tools/index.js.map +0 -1
  253. package/dist/tools/list-my-allocations.js +0 -71
  254. package/dist/tools/list-my-allocations.js.map +0 -1
  255. package/dist/tools/list-projects.js +0 -38
  256. package/dist/tools/list-projects.js.map +0 -1
  257. package/dist/tools/list-releases.js +0 -32
  258. package/dist/tools/list-releases.js.map +0 -1
  259. package/dist/tools/list-sprints.js +0 -30
  260. package/dist/tools/list-sprints.js.map +0 -1
  261. package/dist/tools/list-tasks.js +0 -95
  262. package/dist/tools/list-tasks.js.map +0 -1
  263. package/dist/tools/move-task.js +0 -82
  264. package/dist/tools/move-task.js.map +0 -1
  265. package/dist/tools/plan.js +0 -56
  266. package/dist/tools/plan.js.map +0 -1
  267. package/dist/tools/record-delivery.js +0 -100
  268. package/dist/tools/record-delivery.js.map +0 -1
  269. package/dist/tools/remove-holiday.js +0 -31
  270. package/dist/tools/remove-holiday.js.map +0 -1
  271. package/dist/tools/remove-home-office.js +0 -32
  272. package/dist/tools/remove-home-office.js.map +0 -1
  273. package/dist/tools/remove-vacation.js +0 -31
  274. package/dist/tools/remove-vacation.js.map +0 -1
  275. package/dist/tools/set-project.js +0 -52
  276. package/dist/tools/set-project.js.map +0 -1
  277. package/dist/tools/set-review.js +0 -132
  278. package/dist/tools/set-review.js.map +0 -1
  279. package/dist/tools/sprint-common.js +0 -13
  280. package/dist/tools/sprint-common.js.map +0 -1
  281. package/dist/tools/start-allocation.js +0 -32
  282. package/dist/tools/start-allocation.js.map +0 -1
  283. package/dist/tools/start-task-allocation.js +0 -83
  284. package/dist/tools/start-task-allocation.js.map +0 -1
  285. package/dist/tools/update-release.js +0 -58
  286. package/dist/tools/update-release.js.map +0 -1
  287. package/dist/tools/update-sprint.js +0 -56
  288. package/dist/tools/update-sprint.js.map +0 -1
  289. package/dist/tools/update-task.js +0 -183
  290. package/dist/tools/update-task.js.map +0 -1
  291. package/dist/tools/validate-plan.js +0 -58
  292. package/dist/tools/validate-plan.js.map +0 -1
  293. package/dist/version.js +0 -16
  294. package/dist/version.js.map +0 -1
@@ -1,90 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { spawnSync } from 'node:child_process';
3
- import { homedir } from 'node:os';
4
- import { join } from 'node:path';
5
- import { envName } from '../brand.js';
6
- import { translateClaude, translateCodex } from './exec-translators.js';
7
- /**
8
- * Registro central dos engines da delegação headless. É o **único** lugar que conhece
9
- * nome de binário, candidatos de PATH, flags e — sob `--events` — como pedir a saída
10
- * estruturada e quem traduz o formato nativo. Adicionar engine = adicionar uma entrada.
11
- */
12
- export const ENGINES = ['codex', 'claude'];
13
- export const DEFAULT_ENGINE = 'codex';
14
- /** Planejar pede raciocínio; executar pede velocidade — daí o default por verbo. */
15
- export const PLAN_ENGINE = 'claude';
16
- // O MCP é spawnado por app GUI, com PATH mínimo — daí a busca em locais conhecidos.
17
- function knownPaths(bin, ...extra) {
18
- return [
19
- join(homedir(), '.local', 'bin', bin),
20
- '/opt/homebrew/bin/' + bin,
21
- '/usr/local/bin/' + bin,
22
- ...extra,
23
- ];
24
- }
25
- const SPECS = {
26
- codex: {
27
- bin: 'codex',
28
- candidates: knownPaths('codex'),
29
- binEnv: envName('CODEX_BIN'),
30
- argsEnv: envName('CODEX_ARGS'),
31
- args: (prompt) => ['exec', '--full-auto', prompt],
32
- structuredArgs: (prompt) => ['exec', '--full-auto', '--json', prompt],
33
- translate: translateCodex,
34
- missing: `codex não encontrado — instale/logue (\`codex login\`) ou defina ${envName('CODEX_BIN')}`,
35
- },
36
- claude: {
37
- bin: 'claude',
38
- candidates: knownPaths('claude', join(homedir(), '.claude', 'local', 'claude')),
39
- binEnv: envName('CLAUDE_BIN'),
40
- argsEnv: envName('CLAUDE_ARGS'),
41
- args: (prompt) => ['-p', prompt, '--permission-mode', 'acceptEdits'],
42
- // `stream-json` com `-p` exige `--verbose`, senão o claude recusa a combinação.
43
- structuredArgs: (prompt) => [
44
- '-p',
45
- prompt,
46
- '--permission-mode',
47
- 'acceptEdits',
48
- '--output-format',
49
- 'stream-json',
50
- '--verbose',
51
- ],
52
- translate: translateClaude,
53
- missing: `claude não encontrado — instale/logue (\`claude login\`) ou defina ${envName('CLAUDE_BIN')}`,
54
- },
55
- };
56
- export function isEngine(value) {
57
- return typeof value === 'string' && ENGINES.includes(value);
58
- }
59
- /** Normaliza o valor pedido; ausente → default do verbo; inválido → `null` (o caller reporta). */
60
- export function parseEngine(value, fallback = DEFAULT_ENGINE) {
61
- if (value === undefined || value === null || value === '')
62
- return fallback;
63
- return isEngine(value) ? value : null;
64
- }
65
- export function engineMissingError(engine) {
66
- return SPECS[engine].missing;
67
- }
68
- /** Args headless do engine; `NOCLAF_<ENGINE>_ARGS` sobrescreve (prompt vai no fim). */
69
- export function engineArgs(engine, prompt, structured = false) {
70
- const spec = SPECS[engine];
71
- const override = process.env[spec.argsEnv];
72
- if (override && override.trim())
73
- return [...override.trim().split(/\s+/), prompt];
74
- return structured ? spec.structuredArgs(prompt) : spec.args(prompt);
75
- }
76
- export function engineTranslator(engine) {
77
- return SPECS[engine].translate;
78
- }
79
- /** Acha o binário: override de env, depois PATH, depois os candidatos conhecidos. */
80
- export function resolveEngineBin(engine) {
81
- const spec = SPECS[engine];
82
- const override = process.env[spec.binEnv];
83
- if (override && existsSync(override))
84
- return override;
85
- const onPath = spawnSync(spec.bin, ['--version'], { stdio: 'ignore' });
86
- if (!onPath.error)
87
- return spec.bin;
88
- return spec.candidates.find((p) => existsSync(p)) ?? null;
89
- }
90
- //# sourceMappingURL=exec-engines.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-engines.js","sourceRoot":"","sources":["../../src/lib/exec-engines.ts"],"names":[],"mappings":"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"}
@@ -1,87 +0,0 @@
1
- import { spawnSync } from 'node:child_process';
2
- export function formatEvent(event) {
3
- return `${JSON.stringify({ ...event, ts: new Date().toISOString() })}\n`;
4
- }
5
- export function emitEvent(event) {
6
- process.stderr.write(formatEvent(event));
7
- }
8
- /** Junta os chunks e entrega linha por linha — um chunk pode cortar um JSON no meio. */
9
- export function lineSink(onLine) {
10
- let buffer = '';
11
- return {
12
- onData: (chunk) => {
13
- buffer += chunk.toString();
14
- const lines = buffer.split('\n');
15
- buffer = lines.pop() ?? '';
16
- for (const line of lines)
17
- if (line.trim())
18
- onLine(line);
19
- },
20
- flush: () => {
21
- const rest = buffer;
22
- buffer = '';
23
- if (rest.trim())
24
- onLine(rest);
25
- },
26
- };
27
- }
28
- /** Toda falha de tradução (não-JSON, tipo desconhecido, tradutor quebrado) degrada pra `log`. */
29
- export function eventsFromLine(line, translate) {
30
- try {
31
- const events = translate(JSON.parse(line));
32
- if (events)
33
- return events;
34
- }
35
- catch {
36
- /* degrada */
37
- }
38
- return [{ type: 'log', line }];
39
- }
40
- /** stdout do engine em modo estruturado → eventos noclaf; `collect` acumula o texto do agente. */
41
- export function structuredSink(translate, collect) {
42
- const tokens = { input: 0, output: 0, total: 0 };
43
- const sink = lineSink((line) => {
44
- for (const event of eventsFromLine(line, translate)) {
45
- emitEvent(event);
46
- if (event.type === 'message')
47
- collect(`${event.markdown}\n`);
48
- if (event.type !== 'tokens')
49
- continue;
50
- tokens.input += event.input;
51
- tokens.output += event.output;
52
- tokens.total += event.total;
53
- }
54
- });
55
- return { ...sink, tokens };
56
- }
57
- /** stderr do engine: não é estruturado, então cada linha vira `log`. */
58
- export function logSink() {
59
- return lineSink((line) => emitEvent({ type: 'log', line }));
60
- }
61
- /** Contagem medida do diff — a fonte de `added`/`removed`; nenhum engine reporta linhas. */
62
- export function changedStats(worktree) {
63
- const r = spawnSync('git', ['diff', '--numstat', 'HEAD'], { cwd: worktree, encoding: 'utf8' });
64
- return (r.stdout ?? '')
65
- .split('\n')
66
- .map((line) => line.split('\t'))
67
- .filter((cols) => cols.length === 3 && cols[2])
68
- .map(([added, removed, path]) => ({
69
- path: path,
70
- added: Number(added) || 0,
71
- removed: Number(removed) || 0,
72
- }));
73
- }
74
- export function emitRunEvents(checks, changed, state) {
75
- for (const [id, result] of Object.entries(checks)) {
76
- emitEvent({
77
- type: 'check',
78
- id: id,
79
- status: result.ok ? 'pass' : 'fail',
80
- detail: result.ok ? undefined : result.output,
81
- });
82
- }
83
- for (const stat of changed)
84
- emitEvent({ type: 'changed', ...stat });
85
- emitEvent({ type: 'phase', value: state });
86
- }
87
- //# sourceMappingURL=exec-events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-events.js","sourceRoot":"","sources":["../../src/lib/exec-events.ts"],"names":[],"mappings":"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"}
@@ -1,198 +0,0 @@
1
- function asRecord(value) {
2
- return typeof value === 'object' && value !== null ? value : null;
3
- }
4
- function text(value) {
5
- return typeof value === 'string' ? value : '';
6
- }
7
- function num(value) {
8
- return typeof value === 'number' && Number.isFinite(value) ? value : 0;
9
- }
10
- /** Usage ausente/zerado é silêncio — a telemetria é aditiva e nunca inventa número. */
11
- function tokens(input, output) {
12
- return input || output ? [{ type: 'tokens', input, output, total: input + output }] : [];
13
- }
14
- // Bloco em branco (o claude emite thinking vazio) não é evento — silêncio em vez de ruído.
15
- function step(value, tool) {
16
- return value.trim() ? [{ type: 'step', text: value, tool }] : [];
17
- }
18
- function message(markdown) {
19
- return markdown.trim() ? [{ type: 'message', markdown }] : [];
20
- }
21
- /** Item do codex que representa "o agente está fazendo algo" → `step` com o rótulo do tool. */
22
- function codexStartedStep(item) {
23
- switch (item.type) {
24
- case 'command_execution':
25
- return step(text(item.command), 'shell');
26
- case 'file_change': {
27
- const changes = Array.isArray(item.changes) ? item.changes : [];
28
- const paths = changes.map((c) => text(asRecord(c)?.path)).filter(Boolean);
29
- return step(paths.join(', '), 'edit');
30
- }
31
- case 'mcp_tool_call':
32
- return step(text(item.tool), text(item.server) || 'mcp');
33
- case 'collab_tool_call':
34
- return step(text(item.tool), 'collab');
35
- case 'web_search':
36
- return step(text(item.query), 'web_search');
37
- // Só chegam como `item.completed`; aqui é silêncio, não desconhecido.
38
- case 'agent_message':
39
- case 'reasoning':
40
- case 'todo_list':
41
- case 'error':
42
- return [];
43
- default:
44
- return null;
45
- }
46
- }
47
- /** Falha de um item com ciclo de vida (comando, tool) vira `error` recuperável. */
48
- function codexItemFailure(item) {
49
- if (item.status !== 'failed')
50
- return [];
51
- const detail = text(asRecord(item.error)?.message) || text(item.aggregated_output);
52
- const label = text(item.command) || text(item.tool) || text(item.type);
53
- return [{ type: 'error', message: detail || `falhou: ${label}`, recoverable: true }];
54
- }
55
- function codexCompletedItem(item) {
56
- switch (item.type) {
57
- case 'agent_message':
58
- return message(text(item.text));
59
- case 'reasoning':
60
- return step(text(item.text));
61
- case 'error':
62
- return [{ type: 'error', message: text(item.message), recoverable: true }];
63
- case 'command_execution':
64
- case 'mcp_tool_call':
65
- case 'collab_tool_call':
66
- case 'file_change':
67
- return codexItemFailure(item);
68
- case 'todo_list':
69
- case 'web_search':
70
- return [];
71
- default:
72
- return null;
73
- }
74
- }
75
- /** `codex exec --json`: envelopes `thread.*`/`turn.*`/`item.*`/`error` em JSONL. */
76
- export function translateCodex(native) {
77
- const event = asRecord(native);
78
- if (!event)
79
- return null;
80
- const item = asRecord(event.item);
81
- switch (event.type) {
82
- case 'thread.started':
83
- case 'turn.started':
84
- case 'item.updated':
85
- return [];
86
- // `cached_input_tokens` do codex é subconjunto de `input_tokens` — somar duplicaria.
87
- case 'turn.completed': {
88
- const usage = asRecord(event.usage);
89
- return usage ? tokens(num(usage.input_tokens), num(usage.output_tokens)) : [];
90
- }
91
- case 'item.started':
92
- return item ? codexStartedStep(item) : null;
93
- case 'item.completed':
94
- return item ? codexCompletedItem(item) : null;
95
- case 'turn.failed':
96
- return [
97
- { type: 'error', message: text(asRecord(event.error)?.message), recoverable: false },
98
- ];
99
- case 'error':
100
- return [{ type: 'error', message: text(event.message), recoverable: true }];
101
- default:
102
- return null;
103
- }
104
- }
105
- /** O rótulo mais informativo que o input do tool oferece, sem inventar. */
106
- function claudeToolLabel(input, name) {
107
- const record = asRecord(input);
108
- if (!record)
109
- return name;
110
- for (const key of ['description', 'command', 'file_path', 'pattern', 'path', 'prompt']) {
111
- const value = text(record[key]);
112
- if (value)
113
- return value;
114
- }
115
- return name;
116
- }
117
- function claudeAssistantBlock(block) {
118
- switch (block.type) {
119
- case 'text':
120
- return message(text(block.text));
121
- case 'thinking':
122
- return step(text(block.thinking));
123
- case 'tool_use': {
124
- const name = text(block.name);
125
- return step(claudeToolLabel(block.input, name), name);
126
- }
127
- default:
128
- return null;
129
- }
130
- }
131
- function claudeBlocks(native, map) {
132
- const content = asRecord(native.message)?.content;
133
- if (!Array.isArray(content))
134
- return null;
135
- const events = [];
136
- for (const raw of content) {
137
- const block = asRecord(raw);
138
- const mapped = block ? map(block) : null;
139
- // Bloco desconhecido degrada sozinho — não descarta os irmãos já traduzidos.
140
- events.push(...(mapped ?? [{ type: 'log', line: JSON.stringify(raw) }]));
141
- }
142
- return events;
143
- }
144
- /** Só o `tool_result` que falhou interessa como evento; o resto é contexto do modelo. */
145
- function claudeUserBlock(block) {
146
- if (block.type !== 'tool_result')
147
- return null;
148
- if (block.is_error !== true)
149
- return [];
150
- const content = block.content;
151
- const message = typeof content === 'string' ? content : JSON.stringify(content);
152
- return [{ type: 'error', message, recoverable: true }];
153
- }
154
- /** No claude o cache é contado à parte de `input_tokens` — o custo real é a soma dos três. */
155
- function claudeUsage(native) {
156
- const usage = asRecord(native.usage);
157
- if (!usage)
158
- return [];
159
- const input = num(usage.input_tokens) +
160
- num(usage.cache_creation_input_tokens) +
161
- num(usage.cache_read_input_tokens);
162
- return tokens(input, num(usage.output_tokens));
163
- }
164
- function claudeResult(native) {
165
- const usage = claudeUsage(native);
166
- if (native.is_error !== true && native.subtype === 'success')
167
- return usage;
168
- return [
169
- ...usage,
170
- {
171
- type: 'error',
172
- code: text(native.subtype) || undefined,
173
- message: text(native.result) || text(native.subtype) || 'run falhou',
174
- recoverable: false,
175
- },
176
- ];
177
- }
178
- /** `claude --output-format stream-json`: envelopes `system`/`assistant`/`user`/`result`. */
179
- export function translateClaude(native) {
180
- const event = asRecord(native);
181
- if (!event)
182
- return null;
183
- switch (event.type) {
184
- case 'system':
185
- case 'rate_limit_event':
186
- case 'stream_event':
187
- return [];
188
- case 'assistant':
189
- return claudeBlocks(event, claudeAssistantBlock);
190
- case 'user':
191
- return claudeBlocks(event, claudeUserBlock);
192
- case 'result':
193
- return claudeResult(event);
194
- default:
195
- return null;
196
- }
197
- }
198
- //# sourceMappingURL=exec-translators.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-translators.js","sourceRoot":"","sources":["../../src/lib/exec-translators.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync, } from 'node:fs';
2
- import { dirname } from 'node:path';
3
- import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
4
- export function backupFile(path) {
5
- const backupPath = `${path}.bak.${Date.now()}`;
6
- copyFileSync(path, backupPath);
7
- return backupPath;
8
- }
9
- export function readJson(path) {
10
- if (!existsSync(path))
11
- return null;
12
- const raw = readFileSync(path, 'utf-8');
13
- if (raw.trim().length === 0)
14
- return null;
15
- return JSON.parse(raw);
16
- }
17
- export function writeJson(path, data) {
18
- mkdirSync(dirname(path), { recursive: true });
19
- writeFileSync(path, JSON.stringify(data, null, 2) + '\n', 'utf-8');
20
- }
21
- export function readToml(path) {
22
- if (!existsSync(path))
23
- return null;
24
- const raw = readFileSync(path, 'utf-8');
25
- if (raw.trim().length === 0)
26
- return null;
27
- return parseToml(raw);
28
- }
29
- export function writeToml(path, data) {
30
- mkdirSync(dirname(path), { recursive: true });
31
- writeFileSync(path, stringifyToml(data) + '\n', 'utf-8');
32
- }
33
- //# sourceMappingURL=file-merge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-merge.js","sourceRoot":"","sources":["../../src/lib/file-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,SAAS,EACT,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,UAAU,GAAG,GAAG,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/C,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAa;IACnD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,SAAS,CAAC,GAAG,CAA4B,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAA6B;IACnE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,35 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { realpathSync } from "node:fs";
3
- import { dirname, join } from "node:path";
4
- /**
5
- * Detecta o destino "exposto": os arquivos provisionados caem dentro de um worktree
6
- * git (típico de `~/.claude/skills` ser symlink pra um repo de dotfiles) e **não estão
7
- * ignorados** lá. Nesse estado, um `git clean -fd`/`checkout`/`stash` no repo apaga ou
8
- * reverte tudo — e o usuário vê as skills "sumindo do nada", voltando só no próximo sync.
9
- *
10
- * Retorna a raiz do repo, ou `null` quando não há risco (fora de repo, ou ignorado).
11
- */
12
- export function gitExposedRoot(targetDir, relPaths) {
13
- // Uma amostra basta: os arquivos do mesmo destino compartilham o mesmo status.
14
- const sample = relPaths.slice(0, 5).map((p) => join(targetDir, p));
15
- if (sample.length === 0)
16
- return null;
17
- const real = (p) => {
18
- try {
19
- return realpathSync(p);
20
- }
21
- catch {
22
- return p;
23
- }
24
- };
25
- const cwd = real(dirname(sample[0]));
26
- const git = (args) => spawnSync("git", ["-C", cwd, ...args], { encoding: "utf-8" });
27
- const root = git(["rev-parse", "--show-toplevel"]);
28
- if (root.status !== 0)
29
- return null;
30
- // `check-ignore -q` sai 0 se **algum** path é ignorado — o caso "já protegido".
31
- if (git(["check-ignore", "-q", ...sample.map(real)]).status === 0)
32
- return null;
33
- return root.stdout.trim() || null;
34
- }
35
- //# sourceMappingURL=git-exposure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-exposure.js","sourceRoot":"","sources":["../../src/lib/git-exposure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,QAAkB;IAElB,+EAA+E;IAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,IAAc,EAAE,EAAE,CAC7B,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,gFAAgF;IAChF,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/E,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACpC,CAAC"}
@@ -1,127 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
- import { brand } from '../brand.js';
3
- import { dirname, join } from 'node:path';
4
- import { extractSection } from './rules.js';
5
- import { generateRepoMap } from './repo-map.js';
6
- /**
7
- * Grava o **harness** de código no repo (versionado, do time): o arquivo de rules
8
- * concatenadas + as âncoras no `AGENTS.md` (com o bloco de overview do NOS) + um
9
- * `CLAUDE.md` fino. Idempotente e não-destrutivo: só reescreve o que é do noclaf; o
10
- * texto do time no `AGENTS.md` (fora do bloco marcado) é preservado.
11
- */
12
- export const HARNESS_RULES_REL = 'docs/_rules/noclaf.md';
13
- export const HARNESS_PATTERNS_REL = 'docs/_patterns.md';
14
- export const HARNESS_REVIEW_REL = 'docs/_review.md';
15
- const AGENTS_REL = 'AGENTS.md';
16
- const CLAUDE_REL = 'CLAUDE.md';
17
- const OV_START = '<!-- noclaf:overview:start -->';
18
- const OV_END = '<!-- noclaf:overview:end -->';
19
- /**
20
- * Corpo do `docs/_review.md`: os critérios das rules (do bundle, via `concatenateReviewCriteria`)
21
- * + a seção `## Critérios` do `docs/_patterns.md` do repo, se existir (padrões observados). Pura
22
- * quanto ao input `rulesCriteria`; lê o `_patterns.md` do `cwd` (determinístico pelo estado dele).
23
- */
24
- export function buildReviewMarkdown(cwd, rulesCriteria) {
25
- const blocks = [];
26
- if (rulesCriteria.trim())
27
- blocks.push(rulesCriteria.trim());
28
- const patternsPath = join(cwd, HARNESS_PATTERNS_REL);
29
- if (existsSync(patternsPath)) {
30
- const observed = extractSection(readFileSync(patternsPath, 'utf8'), 'Critérios');
31
- if (observed)
32
- blocks.push(`## Padrões observados (do repo)\n\n${observed}`);
33
- }
34
- return blocks.join('\n\n');
35
- }
36
- function escapeRe(s) {
37
- return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
38
- }
39
- function writeIfChanged(path, content) {
40
- if (!existsSync(path)) {
41
- mkdirSync(dirname(path), { recursive: true });
42
- writeFileSync(path, content, 'utf8');
43
- return 'created';
44
- }
45
- if (readFileSync(path, 'utf8') === content)
46
- return 'unchanged';
47
- writeFileSync(path, content, 'utf8');
48
- return 'updated';
49
- }
50
- /** Insere um bloco logo após o primeiro heading `# …`, ou no topo se não houver. */
51
- function insertAfterTitle(text, block) {
52
- const lines = text.split('\n');
53
- const i = lines.findIndex((l) => /^#\s/.test(l));
54
- if (i === -1)
55
- return `${block}\n${text}`;
56
- lines.splice(i + 1, 0, '', block);
57
- return lines.join('\n');
58
- }
59
- /** Garante o bloco de overview (marcado) + as âncoras `@` no `AGENTS.md`. */
60
- function ensureAgents(path, overview) {
61
- const anchors = [`@${HARNESS_RULES_REL}`, `@${HARNESS_PATTERNS_REL}`];
62
- const ovBlock = overview
63
- ? `${OV_START}\n## Sobre o projeto\n\n${overview.trim()}\n${OV_END}`
64
- : null;
65
- if (!existsSync(path)) {
66
- const ov = ovBlock ? `${ovBlock}\n\n` : '';
67
- const content = `# AGENTS.md\n\n${ov}## Harness\n\n${anchors.join('\n')}\n`;
68
- mkdirSync(dirname(path), { recursive: true });
69
- writeFileSync(path, content, 'utf8');
70
- return 'created';
71
- }
72
- let text = readFileSync(path, 'utf8');
73
- const before = text;
74
- if (ovBlock) {
75
- const re = new RegExp(`${escapeRe(OV_START)}[\\s\\S]*?${escapeRe(OV_END)}`);
76
- text = re.test(text) ? text.replace(re, ovBlock) : insertAfterTitle(text, ovBlock);
77
- }
78
- for (const line of anchors) {
79
- if (!text.split('\n').some((l) => l.trim() === line)) {
80
- text = `${text.trimEnd()}\n${line}\n`;
81
- }
82
- }
83
- if (text === before)
84
- return 'unchanged';
85
- writeFileSync(path, text, 'utf8');
86
- return 'updated';
87
- }
88
- /**
89
- * Escreve o harness no repo (`cwd`) — o versionado (rules/review/AGENTS/CLAUDE) mais o
90
- * `docs/_map.md` gerado, esse **não** versionado. `rulesMarkdown` vem do concatenador;
91
- * `overview` é o texto do NOS (opcional — ausente, o bloco de overview não é tocado).
92
- */
93
- export function writeRepoHarness(cwd, opts) {
94
- return { ...writeHarnessFiles(cwd, opts), map: generateRepoMap(cwd).action };
95
- }
96
- function writeHarnessFiles(cwd, opts) {
97
- const result = {
98
- rules: 'empty',
99
- review: 'empty',
100
- agents: 'unchanged',
101
- claude: 'unchanged',
102
- };
103
- // 1. docs/_rules/noclaf.md — totalmente do noclaf.
104
- if (opts.rulesMarkdown.trim()) {
105
- const header = `# Harness de código — ${brand.name}\n\n` +
106
- `<!-- Gerado por \`${brand.name} sync\`. Não edite à mão — rode \`${brand.name} sync\`. -->\n\n`;
107
- result.rules = writeIfChanged(join(cwd, HARNESS_RULES_REL), `${header}${opts.rulesMarkdown.trim()}\n`);
108
- }
109
- // 1b. docs/_review.md — rubrica de review (critérios das rules + padrões observados).
110
- const reviewBody = buildReviewMarkdown(cwd, opts.reviewMarkdown ?? '');
111
- if (reviewBody.trim()) {
112
- const header = `# Rubrica de review — ${brand.name}\n\n` +
113
- `<!-- Gerado por \`${brand.name} sync\`. Não edite à mão — rode \`${brand.name} sync\`. ` +
114
- `Fonte única de critérios pro gate interno e pro review externo (Visor). -->\n\n`;
115
- result.review = writeIfChanged(join(cwd, HARNESS_REVIEW_REL), `${header}${reviewBody.trim()}\n`);
116
- }
117
- // 2. AGENTS.md — overview (bloco marcado) + âncoras.
118
- result.agents = ensureAgents(join(cwd, AGENTS_REL), opts.overview ?? null);
119
- // 3. CLAUDE.md fino — scaffold-if-missing.
120
- const claudePath = join(cwd, CLAUDE_REL);
121
- if (!existsSync(claudePath)) {
122
- writeFileSync(claudePath, `@${AGENTS_REL}\n`, 'utf8');
123
- result.claude = 'created';
124
- }
125
- return result;
126
- }
127
- //# sourceMappingURL=harness.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/lib/harness.ts"],"names":[],"mappings":"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"}