specrails-core 5.6.0 → 6.0.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 (275) hide show
  1. package/README.md +27 -145
  2. package/bin/specrails-core.mjs +12 -554
  3. package/dist/agent-runtime/capabilities.js +0 -1
  4. package/dist/agent-runtime/cli-executor.d.ts +1 -1
  5. package/dist/agent-runtime/cli-executor.js +1 -2
  6. package/dist/agent-runtime/cli-process.js +0 -1
  7. package/dist/agent-runtime/cli.js +3 -4
  8. package/dist/agent-runtime/codex-schema.js +0 -1
  9. package/dist/agent-runtime/compact/architect.d.ts +3 -272
  10. package/dist/agent-runtime/compact/architect.js +8 -9
  11. package/dist/agent-runtime/compact/chat-client.d.ts +3 -3
  12. package/dist/agent-runtime/compact/chat-client.js +1 -2
  13. package/dist/agent-runtime/compact/developer.d.ts +3 -70
  14. package/dist/agent-runtime/compact/developer.js +13 -14
  15. package/dist/agent-runtime/compact/environment.d.ts +4 -5
  16. package/dist/agent-runtime/compact/environment.js +1 -2
  17. package/dist/agent-runtime/compact/exit-code-honesty.d.ts +2 -1
  18. package/dist/agent-runtime/compact/exit-code-honesty.js +0 -1
  19. package/dist/agent-runtime/compact/guarded-loop.d.ts +2 -18
  20. package/dist/agent-runtime/compact/guarded-loop.js +7 -8
  21. package/dist/agent-runtime/compact/prompt-inputs.d.ts +0 -2
  22. package/dist/agent-runtime/compact/prompt-inputs.js +1 -2
  23. package/dist/agent-runtime/compact/reviewer.d.ts +0 -13
  24. package/dist/agent-runtime/compact/reviewer.js +5 -6
  25. package/dist/agent-runtime/compact/step.d.ts +0 -1
  26. package/dist/agent-runtime/compact/step.js +1 -2
  27. package/dist/agent-runtime/compact/test-reachability.js +0 -1
  28. package/dist/agent-runtime/config.js +0 -1
  29. package/dist/agent-runtime/core-host.d.ts +1 -1
  30. package/dist/agent-runtime/core-host.js +1 -2
  31. package/dist/agent-runtime/durable-store.d.ts +0 -1
  32. package/dist/agent-runtime/durable-store.js +1 -2
  33. package/dist/agent-runtime/efficiency-summary.d.ts +2 -2
  34. package/dist/agent-runtime/efficiency-summary.js +1 -2
  35. package/dist/agent-runtime/efficiency-types.js +0 -1
  36. package/dist/agent-runtime/efficiency.js +0 -1
  37. package/dist/agent-runtime/evaluation-corpus.js +0 -1
  38. package/dist/agent-runtime/evaluation.d.ts +2 -1
  39. package/dist/agent-runtime/evaluation.js +1 -2
  40. package/dist/agent-runtime/executor-types.d.ts +1 -1
  41. package/dist/agent-runtime/executor-types.js +0 -1
  42. package/dist/agent-runtime/executors.js +0 -1
  43. package/dist/agent-runtime/gemini-policy.js +0 -1
  44. package/dist/agent-runtime/graph/artifacts.d.ts +1 -1
  45. package/dist/agent-runtime/graph/artifacts.js +1 -2
  46. package/dist/agent-runtime/graph/nodes.d.ts +1 -1
  47. package/dist/agent-runtime/graph/nodes.js +1 -2
  48. package/dist/agent-runtime/graph/review-policy.js +0 -1
  49. package/dist/agent-runtime/graph/roles.d.ts +2 -5
  50. package/dist/agent-runtime/graph/roles.js +2 -8
  51. package/dist/agent-runtime/graph/state.d.ts +1 -1
  52. package/dist/agent-runtime/graph/state.js +0 -1
  53. package/dist/agent-runtime/graph-checkpointer.d.ts +2 -1
  54. package/dist/agent-runtime/graph-checkpointer.js +0 -1
  55. package/dist/agent-runtime/guardrails.d.ts +3 -3
  56. package/dist/agent-runtime/guardrails.js +1 -2
  57. package/dist/agent-runtime/index.d.ts +1 -1
  58. package/dist/agent-runtime/index.js +1 -2
  59. package/dist/agent-runtime/kimi-acp.js +1 -2
  60. package/dist/agent-runtime/kimi-model.d.ts +6 -0
  61. package/dist/agent-runtime/kimi-model.js +12 -0
  62. package/dist/agent-runtime/openai-executor.d.ts +0 -9
  63. package/dist/agent-runtime/openai-executor.js +6 -7
  64. package/dist/agent-runtime/openspec-tool-server.js +1 -2
  65. package/dist/agent-runtime/openspec.d.ts +0 -2
  66. package/dist/agent-runtime/openspec.js +1 -6
  67. package/dist/agent-runtime/prompts.d.ts +4 -3
  68. package/dist/agent-runtime/prompts.js +0 -1
  69. package/dist/agent-runtime/provider-diagnostic.js +1 -2
  70. package/dist/agent-runtime/recovery.js +1 -2
  71. package/dist/agent-runtime/repository-context.d.ts +1 -1
  72. package/dist/agent-runtime/repository-context.js +0 -1
  73. package/dist/agent-runtime/review-context.d.ts +1 -1
  74. package/dist/agent-runtime/review-context.js +0 -1
  75. package/dist/agent-runtime/role-routing.js +0 -1
  76. package/dist/agent-runtime/role-state.js +0 -1
  77. package/dist/agent-runtime/runtime-identity.js +1 -2
  78. package/dist/agent-runtime/tool-event.js +0 -1
  79. package/dist/agent-runtime/verification-plan.d.ts +5 -4
  80. package/dist/agent-runtime/verification-plan.js +1 -2
  81. package/dist/agent-runtime/workflow-types.js +0 -1
  82. package/dist/agent-runtime/workflow.js +0 -1
  83. package/dist/agent-runtime/workspace-tools.d.ts +2 -2
  84. package/dist/agent-runtime/workspace-tools.js +1 -2
  85. package/dist/installer/cli.d.ts +3 -32
  86. package/dist/installer/cli.js +26 -101
  87. package/dist/installer/commands/framework.d.ts +4 -3
  88. package/dist/installer/commands/framework.js +0 -1
  89. package/dist/installer/commands/init.d.ts +4 -25
  90. package/dist/installer/commands/init.js +5 -8
  91. package/dist/installer/phases/framework-lifecycle.d.ts +3 -17
  92. package/dist/installer/phases/framework-lifecycle.js +2 -3
  93. package/dist/installer/phases/install-config.d.ts +7 -8
  94. package/dist/installer/phases/install-config.js +2 -7
  95. package/dist/installer/phases/manifest.d.ts +6 -7
  96. package/dist/installer/phases/manifest.js +2 -7
  97. package/dist/installer/phases/prereqs.d.ts +6 -7
  98. package/dist/installer/phases/prereqs.js +4 -6
  99. package/dist/installer/phases/provider-detect.d.ts +6 -7
  100. package/dist/installer/phases/provider-detect.js +2 -4
  101. package/dist/installer/phases/scaffold.d.ts +9 -10
  102. package/dist/installer/phases/scaffold.js +82 -805
  103. package/dist/installer/util/errors.js +0 -1
  104. package/dist/installer/util/exec.d.ts +3 -2
  105. package/dist/installer/util/exec.js +0 -1
  106. package/dist/installer/util/fs.d.ts +0 -10
  107. package/dist/installer/util/fs.js +1 -2
  108. package/dist/installer/util/git.js +0 -1
  109. package/dist/installer/util/install-transaction.d.ts +2 -2
  110. package/dist/installer/util/install-transaction.js +1 -2
  111. package/dist/installer/util/logger.d.ts +1 -3
  112. package/dist/installer/util/logger.js +0 -1
  113. package/dist/installer/util/paths.js +0 -1
  114. package/dist/installer/util/registry.d.ts +4 -8
  115. package/dist/installer/util/registry.js +2 -3
  116. package/dist/{installer/runtime → pipeline}/pipeline-state.js +0 -3
  117. package/dist/shared/args.d.ts +18 -0
  118. package/dist/shared/args.js +53 -0
  119. package/integration-contract.json +10 -46
  120. package/package.json +3 -10
  121. package/templates/agents/sr-architect.md +15 -310
  122. package/templates/agents/sr-developer.md +15 -269
  123. package/templates/agents/sr-reviewer.md +13 -367
  124. package/templates/codex-skills/rails/sr-architect/SKILL.md +14 -308
  125. package/templates/codex-skills/rails/sr-developer/SKILL.md +14 -201
  126. package/templates/codex-skills/rails/sr-reviewer/SKILL.md +15 -289
  127. package/templates/kimi/specrails/run-skill.mjs +91 -2173
  128. package/bin/tui-installer.mjs +0 -430
  129. package/commands/doctor.md +0 -62
  130. package/dist/agent-runtime/capabilities.js.map +0 -1
  131. package/dist/agent-runtime/cli-executor.js.map +0 -1
  132. package/dist/agent-runtime/cli-process.js.map +0 -1
  133. package/dist/agent-runtime/cli.js.map +0 -1
  134. package/dist/agent-runtime/codex-schema.js.map +0 -1
  135. package/dist/agent-runtime/compact/architect.js.map +0 -1
  136. package/dist/agent-runtime/compact/chat-client.js.map +0 -1
  137. package/dist/agent-runtime/compact/developer.js.map +0 -1
  138. package/dist/agent-runtime/compact/environment.js.map +0 -1
  139. package/dist/agent-runtime/compact/exit-code-honesty.js.map +0 -1
  140. package/dist/agent-runtime/compact/guarded-loop.js.map +0 -1
  141. package/dist/agent-runtime/compact/prompt-inputs.js.map +0 -1
  142. package/dist/agent-runtime/compact/reviewer.js.map +0 -1
  143. package/dist/agent-runtime/compact/step.js.map +0 -1
  144. package/dist/agent-runtime/compact/test-reachability.js.map +0 -1
  145. package/dist/agent-runtime/config.js.map +0 -1
  146. package/dist/agent-runtime/core-host.js.map +0 -1
  147. package/dist/agent-runtime/durable-store.js.map +0 -1
  148. package/dist/agent-runtime/efficiency-summary.js.map +0 -1
  149. package/dist/agent-runtime/efficiency-types.js.map +0 -1
  150. package/dist/agent-runtime/efficiency.js.map +0 -1
  151. package/dist/agent-runtime/evaluation-corpus.js.map +0 -1
  152. package/dist/agent-runtime/evaluation.js.map +0 -1
  153. package/dist/agent-runtime/executor-types.js.map +0 -1
  154. package/dist/agent-runtime/executors.js.map +0 -1
  155. package/dist/agent-runtime/gemini-policy.js.map +0 -1
  156. package/dist/agent-runtime/graph/artifacts.js.map +0 -1
  157. package/dist/agent-runtime/graph/nodes.js.map +0 -1
  158. package/dist/agent-runtime/graph/review-policy.js.map +0 -1
  159. package/dist/agent-runtime/graph/roles.js.map +0 -1
  160. package/dist/agent-runtime/graph/state.js.map +0 -1
  161. package/dist/agent-runtime/graph-checkpointer.js.map +0 -1
  162. package/dist/agent-runtime/guardrails.js.map +0 -1
  163. package/dist/agent-runtime/index.js.map +0 -1
  164. package/dist/agent-runtime/kimi-acp.js.map +0 -1
  165. package/dist/agent-runtime/openai-executor.js.map +0 -1
  166. package/dist/agent-runtime/openspec-tool-server.js.map +0 -1
  167. package/dist/agent-runtime/openspec.js.map +0 -1
  168. package/dist/agent-runtime/prompts.js.map +0 -1
  169. package/dist/agent-runtime/provider-diagnostic.js.map +0 -1
  170. package/dist/agent-runtime/recovery.js.map +0 -1
  171. package/dist/agent-runtime/repository-context.js.map +0 -1
  172. package/dist/agent-runtime/review-context.js.map +0 -1
  173. package/dist/agent-runtime/role-routing.js.map +0 -1
  174. package/dist/agent-runtime/role-state.js.map +0 -1
  175. package/dist/agent-runtime/runtime-identity.js.map +0 -1
  176. package/dist/agent-runtime/tool-event.js.map +0 -1
  177. package/dist/agent-runtime/verification-plan.js.map +0 -1
  178. package/dist/agent-runtime/workflow-types.js.map +0 -1
  179. package/dist/agent-runtime/workflow.js.map +0 -1
  180. package/dist/agent-runtime/workspace-tools.js.map +0 -1
  181. package/dist/installer/cli.js.map +0 -1
  182. package/dist/installer/commands/doctor.d.ts +0 -27
  183. package/dist/installer/commands/doctor.js +0 -615
  184. package/dist/installer/commands/doctor.js.map +0 -1
  185. package/dist/installer/commands/framework.js.map +0 -1
  186. package/dist/installer/commands/init.js.map +0 -1
  187. package/dist/installer/commands/update.d.ts +0 -56
  188. package/dist/installer/commands/update.js +0 -257
  189. package/dist/installer/commands/update.js.map +0 -1
  190. package/dist/installer/commands/v5-migration.d.ts +0 -32
  191. package/dist/installer/commands/v5-migration.js +0 -133
  192. package/dist/installer/commands/v5-migration.js.map +0 -1
  193. package/dist/installer/phases/framework-lifecycle.js.map +0 -1
  194. package/dist/installer/phases/install-config.js.map +0 -1
  195. package/dist/installer/phases/manifest.js.map +0 -1
  196. package/dist/installer/phases/prereqs.js.map +0 -1
  197. package/dist/installer/phases/provider-detect.js.map +0 -1
  198. package/dist/installer/phases/scaffold.js.map +0 -1
  199. package/dist/installer/runtime/kimi.d.ts +0 -84
  200. package/dist/installer/runtime/kimi.js +0 -255
  201. package/dist/installer/runtime/kimi.js.map +0 -1
  202. package/dist/installer/runtime/pipeline-state.js.map +0 -1
  203. package/dist/installer/util/errors.js.map +0 -1
  204. package/dist/installer/util/exec.js.map +0 -1
  205. package/dist/installer/util/fs.js.map +0 -1
  206. package/dist/installer/util/git.js.map +0 -1
  207. package/dist/installer/util/install-transaction.js.map +0 -1
  208. package/dist/installer/util/logger.js.map +0 -1
  209. package/dist/installer/util/paths.js.map +0 -1
  210. package/dist/installer/util/prompts.d.ts +0 -23
  211. package/dist/installer/util/prompts.js +0 -49
  212. package/dist/installer/util/prompts.js.map +0 -1
  213. package/dist/installer/util/registry.js.map +0 -1
  214. package/dist/installer/util/template.d.ts +0 -23
  215. package/dist/installer/util/template.js +0 -60
  216. package/dist/installer/util/template.js.map +0 -1
  217. package/docs/README.md +0 -40
  218. package/docs/agent-runtime-efficiency.md +0 -65
  219. package/docs/agent-runtime.md +0 -393
  220. package/docs/agents.md +0 -315
  221. package/docs/changelog.md +0 -168
  222. package/docs/ci-cd.md +0 -60
  223. package/docs/concepts.md +0 -183
  224. package/docs/customization.md +0 -363
  225. package/docs/deployment.md +0 -234
  226. package/docs/getting-started.md +0 -122
  227. package/docs/installation.md +0 -395
  228. package/docs/local-tickets.md +0 -191
  229. package/docs/migration-guide.md +0 -140
  230. package/docs/playbook-oss-maintainer.md +0 -112
  231. package/docs/playbook-parallel-dev.md +0 -124
  232. package/docs/playbook-product-discovery.md +0 -115
  233. package/docs/plugin-architecture.md +0 -144
  234. package/docs/research/codex-compatibility-analysis.md +0 -365
  235. package/docs/research/mcp-feasibility-analysis.md +0 -382
  236. package/docs/testing/test-matrix-codex.md +0 -130
  237. package/docs/updating.md +0 -89
  238. package/docs/user-docs/cli-reference.md +0 -428
  239. package/docs/user-docs/codex-vs-claude-code.md +0 -23
  240. package/docs/user-docs/core-updates.md +0 -70
  241. package/docs/user-docs/faq.md +0 -146
  242. package/docs/user-docs/getting-started-codex.md +0 -194
  243. package/docs/user-docs/getting-started-kimi.md +0 -423
  244. package/docs/user-docs/installation.md +0 -237
  245. package/docs/user-docs/provider-pipelines.md +0 -96
  246. package/docs/user-docs/quick-start.md +0 -161
  247. package/docs/windows.md +0 -78
  248. package/docs/workflows.md +0 -463
  249. package/schemas/profile.v1.json +0 -207
  250. package/templates/claude-md/CLAUDE-quickstart.md +0 -54
  251. package/templates/claude-md/root.md +0 -50
  252. package/templates/codex-skills/batch-implement/SKILL.md +0 -38
  253. package/templates/codex-skills/implement/SKILL.md +0 -38
  254. package/templates/codex-skills/retry/SKILL.md +0 -16
  255. package/templates/commands/specrails/compat-check.md +0 -271
  256. package/templates/commands/specrails/doctor.md +0 -62
  257. package/templates/commands/specrails/explore-spec.md +0 -173
  258. package/templates/commands/specrails/health-check.md +0 -527
  259. package/templates/commands/specrails/memory-inspect.md +0 -261
  260. package/templates/commands/specrails/opsx-diff.md +0 -419
  261. package/templates/commands/specrails/propose-spec.md +0 -102
  262. package/templates/commands/specrails/refactor-recommender.md +0 -169
  263. package/templates/commands/specrails/telemetry.md +0 -553
  264. package/templates/commands/specrails/why.md +0 -96
  265. package/templates/gemini-commands/batch-implement.toml +0 -37
  266. package/templates/gemini-commands/implement.toml +0 -37
  267. package/templates/gemini-commands/retry.toml +0 -15
  268. package/templates/profiles/default.json +0 -14
  269. package/templates/profiles/kimi-default.json +0 -15
  270. package/templates/rules/layer.md +0 -8
  271. package/templates/runtime/provider-pipeline.md +0 -113
  272. package/templates/security/security-exemptions.yaml +0 -20
  273. package/templates/settings/confidence-config.json +0 -17
  274. package/templates/settings/settings.json +0 -15
  275. /package/dist/{installer/runtime → pipeline}/pipeline-state.d.ts +0 -0
@@ -2,38 +2,7 @@ import type { AgentResult } from '../executor-types.js';
2
2
  import { type CompactEnv } from './step.js';
3
3
  /** The load-bearing tokens of a criterion: identifiers (`createGame`, `applyInput`, `tick`), numbers and hyphenated terms — never prose words. */
4
4
  export declare function criterionTokens(text: string): string[];
5
- export interface Inventory {
6
- greenfield: boolean;
7
- languages: string[];
8
- frameworks: string[];
9
- keyFiles: string[];
10
- tests: string[];
11
- notes: string;
12
- }
13
- export interface Proposal {
14
- why: string;
15
- whatChanges: string[];
16
- capabilities: {
17
- new: string[];
18
- modified: string[];
19
- };
20
- impact: string[];
21
- }
22
- export interface Design {
23
- context: string;
24
- goals: string[];
25
- nonGoals: string[];
26
- decisions: {
27
- title: string;
28
- choice: string;
29
- why: string;
30
- }[];
31
- risks: {
32
- risk: string;
33
- mitigation: string;
34
- }[];
35
- }
36
- export interface Spec {
5
+ interface Spec {
37
6
  name: string;
38
7
  requirements: {
39
8
  name: string;
@@ -45,7 +14,7 @@ export interface Spec {
45
14
  }[];
46
15
  }[];
47
16
  }
48
- export interface Tasks {
17
+ interface Tasks {
49
18
  groups: {
50
19
  title: string;
51
20
  tasks: string[];
@@ -57,245 +26,6 @@ export interface Tasks {
57
26
  }[];
58
27
  blockingQuestion?: string;
59
28
  }
60
- export declare const INVENTORY_SCHEMA: {
61
- type: string;
62
- additionalProperties: boolean;
63
- required: string[];
64
- properties: {
65
- greenfield: {
66
- type: string;
67
- };
68
- languages: {
69
- type: string;
70
- items: {
71
- type: string;
72
- };
73
- };
74
- frameworks: {
75
- type: string;
76
- items: {
77
- type: string;
78
- };
79
- };
80
- keyFiles: {
81
- type: string;
82
- items: {
83
- type: string;
84
- };
85
- };
86
- tests: {
87
- type: string;
88
- items: {
89
- type: string;
90
- };
91
- };
92
- notes: {
93
- type: string;
94
- };
95
- };
96
- };
97
- export declare const PROPOSAL_SCHEMA: {
98
- type: string;
99
- additionalProperties: boolean;
100
- required: string[];
101
- properties: {
102
- why: {
103
- type: string;
104
- };
105
- whatChanges: {
106
- type: string;
107
- items: {
108
- type: string;
109
- };
110
- };
111
- capabilities: {
112
- type: string;
113
- additionalProperties: boolean;
114
- required: string[];
115
- properties: {
116
- new: {
117
- type: string;
118
- items: {
119
- type: string;
120
- };
121
- };
122
- modified: {
123
- type: string;
124
- items: {
125
- type: string;
126
- };
127
- };
128
- };
129
- };
130
- impact: {
131
- type: string;
132
- items: {
133
- type: string;
134
- };
135
- };
136
- };
137
- };
138
- export declare const DESIGN_SCHEMA: {
139
- type: string;
140
- additionalProperties: boolean;
141
- required: string[];
142
- properties: {
143
- context: {
144
- type: string;
145
- };
146
- goals: {
147
- type: string;
148
- items: {
149
- type: string;
150
- };
151
- };
152
- nonGoals: {
153
- type: string;
154
- items: {
155
- type: string;
156
- };
157
- };
158
- decisions: {
159
- type: string;
160
- items: {
161
- type: string;
162
- additionalProperties: boolean;
163
- required: string[];
164
- properties: {
165
- title: {
166
- type: string;
167
- };
168
- choice: {
169
- type: string;
170
- };
171
- why: {
172
- type: string;
173
- };
174
- };
175
- };
176
- };
177
- risks: {
178
- type: string;
179
- items: {
180
- type: string;
181
- additionalProperties: boolean;
182
- required: string[];
183
- properties: {
184
- risk: {
185
- type: string;
186
- };
187
- mitigation: {
188
- type: string;
189
- };
190
- };
191
- };
192
- };
193
- };
194
- };
195
- export declare const SPEC_SCHEMA: {
196
- type: string;
197
- additionalProperties: boolean;
198
- required: string[];
199
- properties: {
200
- name: {
201
- type: string;
202
- };
203
- requirements: {
204
- type: string;
205
- items: {
206
- type: string;
207
- additionalProperties: boolean;
208
- required: string[];
209
- properties: {
210
- name: {
211
- type: string;
212
- };
213
- text: {
214
- type: string;
215
- };
216
- scenarios: {
217
- type: string;
218
- items: {
219
- type: string;
220
- additionalProperties: boolean;
221
- required: string[];
222
- properties: {
223
- name: {
224
- type: string;
225
- };
226
- when: {
227
- type: string;
228
- };
229
- then: {
230
- type: string;
231
- };
232
- };
233
- };
234
- };
235
- };
236
- };
237
- };
238
- };
239
- };
240
- export declare const TASKS_SCHEMA: {
241
- type: string;
242
- additionalProperties: boolean;
243
- required: string[];
244
- properties: {
245
- groups: {
246
- type: string;
247
- items: {
248
- type: string;
249
- additionalProperties: boolean;
250
- required: string[];
251
- properties: {
252
- title: {
253
- type: string;
254
- };
255
- tasks: {
256
- type: string;
257
- items: {
258
- type: string;
259
- };
260
- };
261
- };
262
- };
263
- };
264
- verification: {
265
- type: string;
266
- items: {
267
- type: string;
268
- additionalProperties: boolean;
269
- required: string[];
270
- properties: {
271
- repositoryId: {
272
- type: string;
273
- };
274
- command: {
275
- type: string;
276
- };
277
- args: {
278
- type: string;
279
- items: {
280
- type: string;
281
- };
282
- };
283
- };
284
- };
285
- };
286
- blockingQuestion: {
287
- type: string;
288
- };
289
- };
290
- };
291
- /** True when no repository holds anything but OpenSpec artifacts and repository boilerplate. */
292
- export declare function hostGreenfield(roots: string[]): boolean;
293
- /** Rendered with the exact headings `openspec instructions proposal` returns. */
294
- export declare function renderProposal(proposal: Proposal, capabilityNames: {
295
- new: string[];
296
- modified: string[];
297
- }): string;
298
- export declare function renderDesign(design: Design, greenfield: boolean): string;
299
29
  /** True when any media/font file exists under the roots (bounded walk, dot/dependency dirs skipped). */
300
30
  export declare function hasBinaryAssets(roots: readonly string[], limit?: number): boolean;
301
31
  /**
@@ -347,3 +77,4 @@ export declare function normalizeTasksForTest(raw: Record<string, unknown>, repo
347
77
  * the graph's participation and completeness checks pass unchanged.
348
78
  */
349
79
  export declare function runCompactArchitect(env: CompactEnv): Promise<AgentResult>;
80
+ export {};
@@ -29,18 +29,18 @@ const SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
29
29
  const NON_SOURCE = new Set(['openspec', 'README.md', 'README', 'LICENSE', 'LICENSE.md', '.gitignore', '.gitattributes', '.editorconfig', 'CLAUDE.md', 'AGENTS.md', 'GEMINI.md', '.DS_Store']);
30
30
  const HIDDEN = /^\./;
31
31
  const stringList = { type: 'array', items: { type: 'string' } };
32
- export const INVENTORY_SCHEMA = { type: 'object', additionalProperties: false, required: ['greenfield', 'languages', 'frameworks', 'keyFiles', 'tests', 'notes'], properties: { greenfield: { type: 'boolean' }, languages: stringList, frameworks: stringList, keyFiles: stringList, tests: stringList, notes: { type: 'string' } } };
33
- export const PROPOSAL_SCHEMA = { type: 'object', additionalProperties: false, required: ['why', 'whatChanges', 'capabilities', 'impact'], properties: { why: { type: 'string' }, whatChanges: stringList, capabilities: { type: 'object', additionalProperties: false, required: ['new', 'modified'], properties: { new: stringList, modified: stringList } }, impact: stringList } };
34
- export const DESIGN_SCHEMA = { type: 'object', additionalProperties: false, required: ['context', 'goals', 'nonGoals', 'decisions', 'risks'], properties: { context: { type: 'string' }, goals: stringList, nonGoals: stringList, decisions: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['title', 'choice', 'why'], properties: { title: { type: 'string' }, choice: { type: 'string' }, why: { type: 'string' } } } }, risks: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['risk', 'mitigation'], properties: { risk: { type: 'string' }, mitigation: { type: 'string' } } } } } };
35
- export const SPEC_SCHEMA = { type: 'object', additionalProperties: false, required: ['name', 'requirements'], properties: { name: { type: 'string' }, requirements: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['name', 'text', 'scenarios'], properties: { name: { type: 'string' }, text: { type: 'string' }, scenarios: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['name', 'when', 'then'], properties: { name: { type: 'string' }, when: { type: 'string' }, then: { type: 'string' } } } } } } } } };
32
+ const INVENTORY_SCHEMA = { type: 'object', additionalProperties: false, required: ['greenfield', 'languages', 'frameworks', 'keyFiles', 'tests', 'notes'], properties: { greenfield: { type: 'boolean' }, languages: stringList, frameworks: stringList, keyFiles: stringList, tests: stringList, notes: { type: 'string' } } };
33
+ const PROPOSAL_SCHEMA = { type: 'object', additionalProperties: false, required: ['why', 'whatChanges', 'capabilities', 'impact'], properties: { why: { type: 'string' }, whatChanges: stringList, capabilities: { type: 'object', additionalProperties: false, required: ['new', 'modified'], properties: { new: stringList, modified: stringList } }, impact: stringList } };
34
+ const DESIGN_SCHEMA = { type: 'object', additionalProperties: false, required: ['context', 'goals', 'nonGoals', 'decisions', 'risks'], properties: { context: { type: 'string' }, goals: stringList, nonGoals: stringList, decisions: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['title', 'choice', 'why'], properties: { title: { type: 'string' }, choice: { type: 'string' }, why: { type: 'string' } } } }, risks: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['risk', 'mitigation'], properties: { risk: { type: 'string' }, mitigation: { type: 'string' } } } } } };
35
+ const SPEC_SCHEMA = { type: 'object', additionalProperties: false, required: ['name', 'requirements'], properties: { name: { type: 'string' }, requirements: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['name', 'text', 'scenarios'], properties: { name: { type: 'string' }, text: { type: 'string' }, scenarios: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['name', 'when', 'then'], properties: { name: { type: 'string' }, when: { type: 'string' }, then: { type: 'string' } } } } } } } } };
36
36
  /** Names the repository's primary language for the plan, so task file names use its extension (a greenfield repository has none yet). */
37
37
  function languageLine(roots) {
38
38
  const profile = languageProfile(roots);
39
39
  return profile ? `\nPrimary language of the repository: ${profile.primary}${profile.others.length ? ` (also present: ${profile.others.join(', ')})` : ''} — name new source files with its extension.` : '';
40
40
  }
41
- export const TASKS_SCHEMA = { type: 'object', additionalProperties: false, required: ['groups'], properties: { groups: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['title', 'tasks'], properties: { title: { type: 'string' }, tasks: stringList } } }, verification: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['repositoryId', 'command', 'args'], properties: { repositoryId: { type: 'string' }, command: { type: 'string' }, args: stringList } } }, blockingQuestion: { type: 'string' } } };
41
+ const TASKS_SCHEMA = { type: 'object', additionalProperties: false, required: ['groups'], properties: { groups: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['title', 'tasks'], properties: { title: { type: 'string' }, tasks: stringList } } }, verification: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['repositoryId', 'command', 'args'], properties: { repositoryId: { type: 'string' }, command: { type: 'string' }, args: stringList } } }, blockingQuestion: { type: 'string' } } };
42
42
  /** True when no repository holds anything but OpenSpec artifacts and repository boilerplate. */
43
- export function hostGreenfield(roots) {
43
+ function hostGreenfield(roots) {
44
44
  return roots.every(root => {
45
45
  if (!existsSync(root))
46
46
  return true;
@@ -50,12 +50,12 @@ export function hostGreenfield(roots) {
50
50
  function slug(value) { return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 60); }
51
51
  function bullets(items, fallback) { return items.length ? items.map(item => `- ${item}`).join('\n') : `- ${fallback}`; }
52
52
  /** Rendered with the exact headings `openspec instructions proposal` returns. */
53
- export function renderProposal(proposal, capabilityNames) {
53
+ function renderProposal(proposal, capabilityNames) {
54
54
  return ['## Why', '', proposal.why, '', '## What Changes', '', bullets(proposal.whatChanges, 'See the requirements in the specs of this change.'), '', '## Capabilities', '', '### New Capabilities',
55
55
  ...(capabilityNames.new.length ? capabilityNames.new.map(name => `- \`${name}\`: ${name.replace(/-/g, ' ')}`) : ['- (none)']), '', '### Modified Capabilities',
56
56
  ...(capabilityNames.modified.length ? capabilityNames.modified.map(name => `- \`${name}\`: requirements extended by this change`) : ['- (none)']), '', '## Impact', '', bullets(proposal.impact, 'Limited to the repositories in scope.'), ''].join('\n');
57
57
  }
58
- export function renderDesign(design, greenfield) {
58
+ function renderDesign(design, greenfield) {
59
59
  return ['## Context', '', ...(greenfield ? ['The repository has no application code; the spec means building it from scratch.', ''] : []), design.context, '', '## Goals / Non-Goals', '', '**Goals:**', bullets(design.goals, 'Deliver the requested work.'), '', '**Non-Goals:**', bullets(design.nonGoals, 'Anything outside the frozen scope.'), '', '## Decisions', '',
60
60
  ...(design.decisions.length ? design.decisions.map(item => `- **${item.title}**: ${item.choice} — ${item.why}`) : ['- Follow the existing conventions of the repository.']), '', '## Risks / Trade-offs', '', ...(design.risks.length ? design.risks.map(item => `- [${item.risk}] → ${item.mitigation}`) : ['- [Scope creep] → implement only the listed tasks.']), '', '## Local reference patterns', '', greenfield ? 'No existing implementation to reference: the repository is empty.' : 'See the key files listed in the inventory of this change; no equivalent implementation was verified beyond them.', ''].join('\n');
61
61
  }
@@ -368,4 +368,3 @@ export async function runCompactArchitect(env) {
368
368
  env.onEvent?.({ kind: 'text', text: `Compact architect: ${specs.length} spec${specs.length === 1 ? '' : 's'}, ${tasks.groups.reduce((total, group) => total + group.tasks.length, 0)} tasks, ${inventoryLoop.toolCalls} inventory tool calls.` });
369
369
  return { text: result, usage: env.client.usage, structured };
370
370
  }
371
- //# sourceMappingURL=architect.js.map
@@ -10,11 +10,11 @@ export type ChatMessage = Record<string, unknown>;
10
10
  */
11
11
  export declare function ensurePatientDispatcher(): Promise<void>;
12
12
  export declare function patientFetchInit(): Pick<RequestInit, 'dispatcher'>;
13
- export interface ChatCompletion {
13
+ interface ChatCompletion {
14
14
  message: Record<string, unknown>;
15
15
  finishReason: unknown;
16
16
  }
17
- export interface ChatClientOptions {
17
+ interface ChatClientOptions {
18
18
  endpoint: URL;
19
19
  headers: Record<string, string>;
20
20
  fetch: typeof globalThis.fetch;
@@ -80,4 +80,4 @@ export declare class ChatClient {
80
80
  * non-streaming shape: `{ choices: [{ message, finish_reason }], usage }`.
81
81
  */
82
82
  export declare function readCompletionResponse(response: Response): Promise<unknown>;
83
- export declare function readBoundedResponse(response: Response): Promise<unknown>;
83
+ export {};
@@ -281,7 +281,7 @@ export async function readCompletionResponse(response) {
281
281
  message.tool_calls = toolCalls;
282
282
  return { choices: [{ message, finish_reason: finishReason ?? (toolCalls.length ? 'tool_calls' : 'stop') }], ...(usage ? { usage } : {}) };
283
283
  }
284
- export async function readBoundedResponse(response) {
284
+ async function readBoundedResponse(response) {
285
285
  if (!response.body)
286
286
  throw new Error('Missing response body');
287
287
  const reader = response.body.getReader(), chunks = [];
@@ -304,4 +304,3 @@ export async function readBoundedResponse(response) {
304
304
  }
305
305
  return JSON.parse(Buffer.concat(chunks).toString('utf8'));
306
306
  }
307
- //# sourceMappingURL=chat-client.js.map
@@ -1,50 +1,7 @@
1
1
  import type { ChatMessage } from './chat-client.js';
2
2
  import { type AgentResult } from '../executor-types.js';
3
3
  import { type CompactEnv } from './step.js';
4
- /** Tool calls one task group may spend before it must report. */
5
- export declare const DEFAULT_TASK_TOOL_BUDGET = 25;
6
- export declare const TASK_RESULT_SCHEMA: {
7
- type: string;
8
- additionalProperties: boolean;
9
- required: string[];
10
- properties: {
11
- summary: {
12
- type: string;
13
- };
14
- files: {
15
- type: string;
16
- items: {
17
- type: string;
18
- };
19
- };
20
- tests: {
21
- type: string;
22
- items: {
23
- type: string;
24
- };
25
- };
26
- verification: {
27
- type: string;
28
- };
29
- incomplete: {
30
- type: string;
31
- items: {
32
- type: string;
33
- additionalProperties: boolean;
34
- required: string[];
35
- properties: {
36
- task: {
37
- type: string;
38
- };
39
- reason: {
40
- type: string;
41
- };
42
- };
43
- };
44
- };
45
- };
46
- };
47
- export interface TaskGroup {
4
+ interface TaskGroup {
48
5
  index: number;
49
6
  title: string;
50
7
  tasks: {
@@ -66,9 +23,7 @@ export declare function namedFiles(task: string): string[];
66
23
  * Generic Node/Jest/TS and Python signatures; anything else passes through.
67
24
  */
68
25
  export declare function diagnoseVerificationFailure(feedback: string, roots: readonly string[]): string[];
69
- /** Application source/test files under the roots (bounded), excluding plans, deps and dot dirs. */
70
- export declare function repositoryInventory(roots: readonly string[], limit?: number): string[];
71
- export interface LanguageProfile {
26
+ interface LanguageProfile {
72
27
  primary: string;
73
28
  others: string[];
74
29
  }
@@ -95,8 +50,6 @@ export declare function duplicateSibling(roots: readonly string[], file: string,
95
50
  * adding .tsx is fine).
96
51
  */
97
52
  export declare function foreignLanguageFile(roots: readonly string[], file: string, languages: LanguageProfile): string | undefined;
98
- /** Existing test directories (relative, POSIX) among the conventional names, e.g. `tests`, `test`, `__tests__`, `spec`. */
99
- export declare function existingTestDirs(roots: readonly string[]): string[];
100
53
  /**
101
54
  * A NEW test file outside the directory the repository already keeps its
102
55
  * tests in (`src/hold.test.js` next to an existing `tests/`): the reason to
@@ -112,8 +65,6 @@ export declare function misplacedTestFile(roots: readonly string[], file: string
112
65
  export declare function siblingTestFile(roots: readonly string[], file: string): string | undefined;
113
66
  /** The absolute path a task-named file resolves to: the exact path, else the same stem in a sibling extension of the same language family. */
114
67
  export declare function locateNamedFile(roots: readonly string[], file: string): string | undefined;
115
- /** Extra tool calls a correction group gets on top of the task budget: it must read AND patch, and the feedback is long. */
116
- export declare const CORRECTION_BUDGET_BONUS = 10;
117
68
  /**
118
69
  * Source excerpts around every `file:line` the feedback names (Jest/Babel
119
70
  * `path/file.js: … (30:56)`, TS `file.ts(12,3)` / `file.ts:12:3`, mocha
@@ -125,27 +76,8 @@ export declare function feedbackExcerpts(feedback: string, roots: readonly strin
125
76
  context?: number;
126
77
  maxBytes?: number;
127
78
  }): string;
128
- /** An existing file this long is edited with apply_patch, never regenerated whole (observed: a 1.4k-line test rewritten twice in one group, ~25 minutes of generation). */
129
- export declare const REWRITE_MAX_LINES = 150;
130
- /** Above this many lines, `read_file` answers with an outline (head + index of definitions) instead of the whole file. */
131
- export declare const OUTLINE_MIN_LINES = 400;
132
- /**
133
- * A large file as an outline: the first lines (imports, top-level state) and
134
- * an index of definitions with their line numbers, so the model asks for the
135
- * range it needs with read_lines instead of putting 15k tokens of test file
136
- * into the transcript on every read (observed: 4-minute prefills).
137
- */
138
- export declare function outlineLargeFile(file: string, content: string): string | undefined;
139
- /** Files a model writes to narrate its own work; never part of a task, always noise for the reviewer (observed: fix_summary.json, task-summary.json in the repository root). */
140
- export declare const NARRATION_FILE: RegExp;
141
79
  /** Media/binary extensions a text-only tool can never produce correctly. */
142
80
  export declare const BINARY_ASSET: RegExp;
143
- /** Extra write-only calls a task group gets when it spent its whole budget reading. */
144
- export declare const WRITE_EXTENSION_CALLS = 6;
145
- /** Tool calls the in-place fix round after a failed group check may spend. */
146
- export declare const GROUP_FIX_BUDGET = 20;
147
- /** Test files among `reported` that the repository's own test command (per root) does not execute; empty when no command is detected. */
148
- export declare function unreachedGroupTests(roots: readonly string[], reported: readonly string[]): string[];
149
81
  /** A source file that exists but carries no implementation: a handful of lines, a placeholder import, or only TODOs. */
150
82
  export declare function isStubFile(file: string, minLines?: number): boolean;
151
83
  /** Ticks the given task ids; every other byte of tasks.md is preserved, as the developer write rule requires. */
@@ -158,3 +90,4 @@ export declare function tickTasks(markdown: string, ids: Set<string>): string;
158
90
  export declare function runCompactDeveloper(env: CompactEnv, options?: {
159
91
  taskToolBudget?: number;
160
92
  }): Promise<AgentResult>;
93
+ export {};
@@ -4,16 +4,16 @@ import { unreachedTestFiles, unreachedTestsReason } from './test-reachability.js
4
4
  import path from 'node:path';
5
5
  import { AgentExecutionError } from '../executor-types.js';
6
6
  import { artifactPath } from '../openspec.js';
7
- import { readVerificationEvidence } from '../../installer/runtime/pipeline-state.js';
7
+ import { readVerificationEvidence } from '../../pipeline/pipeline-state.js';
8
8
  import { bounded } from './prompt-inputs.js';
9
9
  import { finalJson, on, openspecCall, strings, text, toolStep } from './step.js';
10
10
  /** Tool calls one task group may spend before it must report. */
11
- export const DEFAULT_TASK_TOOL_BUDGET = 25;
11
+ const DEFAULT_TASK_TOOL_BUDGET = 25;
12
12
  /** Frozen planning artifacts: the developer edits application code, never the plan. */
13
13
  const FROZEN_PATH = /(?:^|[\\/])openspec[\\/]/i;
14
14
  const DEVELOPER_TOOLS = ['list_files', 'read_file', 'read_lines', 'search_text', 'get_diff', 'write_file', 'apply_patch'];
15
15
  const stringList = { type: 'array', items: { type: 'string' } };
16
- export const TASK_RESULT_SCHEMA = { type: 'object', additionalProperties: false, required: ['summary', 'files', 'tests', 'verification', 'incomplete'], properties: { summary: { type: 'string' }, files: stringList, tests: stringList, verification: { type: 'string' }, incomplete: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['task', 'reason'], properties: { task: { type: 'string' }, reason: { type: 'string' } } } } } };
16
+ const TASK_RESULT_SCHEMA = { type: 'object', additionalProperties: false, required: ['summary', 'files', 'tests', 'verification', 'incomplete'], properties: { summary: { type: 'string' }, files: stringList, tests: stringList, verification: { type: 'string' }, incomplete: { type: 'array', items: { type: 'object', additionalProperties: false, required: ['task', 'reason'], properties: { task: { type: 'string' }, reason: { type: 'string' } } } } } };
17
17
  /** Parses the `## N. Title` / `- [ ] N.M text` layout the OpenSpec tasks template prescribes. */
18
18
  export function parseTaskGroups(markdown) {
19
19
  const groups = [];
@@ -133,7 +133,7 @@ function findFiles(root, base, depth = 0) {
133
133
  return out;
134
134
  }
135
135
  /** Application source/test files under the roots (bounded), excluding plans, deps and dot dirs. */
136
- export function repositoryInventory(roots, limit = 60) {
136
+ function repositoryInventory(roots, limit = 60) {
137
137
  const out = [];
138
138
  const walk = (dir, rel, depth) => {
139
139
  if (depth > 6 || out.length >= limit)
@@ -247,7 +247,7 @@ export function foreignLanguageFile(roots, file, languages) {
247
247
  return `"${file}" is ${language}, but this repository is ${languages.primary}-only. Write the same behaviour in ${languages.primary} inside the existing modules; do not add a second language.`;
248
248
  }
249
249
  /** Existing test directories (relative, POSIX) among the conventional names, e.g. `tests`, `test`, `__tests__`, `spec`. */
250
- export function existingTestDirs(roots) {
250
+ function existingTestDirs(roots) {
251
251
  const names = ['tests', 'test', '__tests__', 'spec', 'specs'];
252
252
  return [...new Set(roots.flatMap(root => names.filter(name => { try {
253
253
  return statSync(path.join(root, name)).isDirectory();
@@ -317,7 +317,7 @@ export function locateNamedFile(roots, file) {
317
317
  return undefined;
318
318
  }
319
319
  /** Extra tool calls a correction group gets on top of the task budget: it must read AND patch, and the feedback is long. */
320
- export const CORRECTION_BUDGET_BONUS = 10;
320
+ const CORRECTION_BUDGET_BONUS = 10;
321
321
  /**
322
322
  * Source excerpts around every `file:line` the feedback names (Jest/Babel
323
323
  * `path/file.js: … (30:56)`, TS `file.ts(12,3)` / `file.ts:12:3`, mocha
@@ -369,9 +369,9 @@ export function feedbackExcerpts(feedback, roots, options = {}) {
369
369
  return chunks.join('\n\n');
370
370
  }
371
371
  /** An existing file this long is edited with apply_patch, never regenerated whole (observed: a 1.4k-line test rewritten twice in one group, ~25 minutes of generation). */
372
- export const REWRITE_MAX_LINES = 150;
372
+ const REWRITE_MAX_LINES = 150;
373
373
  /** Above this many lines, `read_file` answers with an outline (head + index of definitions) instead of the whole file. */
374
- export const OUTLINE_MIN_LINES = 400;
374
+ const OUTLINE_MIN_LINES = 400;
375
375
  const OUTLINE_HEAD_LINES = 120;
376
376
  const DEFINITION_LINE = /^\s*(?:(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s*\w+|(?:export\s+)?class\s+\w+|(?:export\s+)?(?:const|let|var)\s+\w+\s*=\s*(?:async\s*)?(?:function\b|\([^)]*\)\s*=>|\w+\s*=>)|(?:static\s+|async\s+|get\s+|set\s+)?[A-Za-z_$][\w$]*\s*\([^)]*\)\s*\{|(?:describe|it|test|suite|context)\s*\(|def\s+\w+|func\s+(?:\([^)]*\)\s*)?\w+|(?:pub\s+)?fn\s+\w+)/;
377
377
  /**
@@ -380,7 +380,7 @@ const DEFINITION_LINE = /^\s*(?:(?:export\s+)?(?:default\s+)?(?:async\s+)?functi
380
380
  * range it needs with read_lines instead of putting 15k tokens of test file
381
381
  * into the transcript on every read (observed: 4-minute prefills).
382
382
  */
383
- export function outlineLargeFile(file, content) {
383
+ function outlineLargeFile(file, content) {
384
384
  const lines = content.split('\n');
385
385
  if (lines.length <= OUTLINE_MIN_LINES)
386
386
  return undefined;
@@ -391,13 +391,13 @@ export function outlineLargeFile(file, content) {
391
391
  return JSON.stringify({ outline: true, path: file, totalLines: lines.length, head: lines.slice(0, OUTLINE_HEAD_LINES).join('\n'), definitions: index, note: `${file} has ${lines.length} lines; this is its first ${OUTLINE_HEAD_LINES} lines plus an index of definitions. Read only the range you need with read_lines(path, startLine, endLine); do not read the whole file.` });
392
392
  }
393
393
  /** Files a model writes to narrate its own work; never part of a task, always noise for the reviewer (observed: fix_summary.json, task-summary.json in the repository root). */
394
- export const NARRATION_FILE = /(?:^|\/)(?:[\w.-]*(?:summary|progress|scratch|handoff)[\w.-]*)\.(?:json|md|txt)$/i;
394
+ const NARRATION_FILE = /(?:^|\/)(?:[\w.-]*(?:summary|progress|scratch|handoff)[\w.-]*)\.(?:json|md|txt)$/i;
395
395
  /** Media/binary extensions a text-only tool can never produce correctly. */
396
396
  export const BINARY_ASSET = /\.(?:wav|mp3|ogg|flac|m4a|aac|png|jpe?g|gif|webp|bmp|ico|woff2?|ttf|otf|eot|mp4|webm|mov|zip|gz|tar|pdf|wasm)$/i;
397
397
  /** Extra write-only calls a task group gets when it spent its whole budget reading. */
398
- export const WRITE_EXTENSION_CALLS = 6;
398
+ const WRITE_EXTENSION_CALLS = 6;
399
399
  /** Tool calls the in-place fix round after a failed group check may spend. */
400
- export const GROUP_FIX_BUDGET = 20;
400
+ const GROUP_FIX_BUDGET = 20;
401
401
  /**
402
402
  * One bounded correction round for a group whose check just failed: the exact
403
403
  * output plus host-read excerpts around every reported file:line, the group's
@@ -465,7 +465,7 @@ async function fixGroupInPlace(env, group, output, budget, evidence, extraTools,
465
465
  return [...new Set(written)];
466
466
  }
467
467
  /** Test files among `reported` that the repository's own test command (per root) does not execute; empty when no command is detected. */
468
- export function unreachedGroupTests(roots, reported) {
468
+ function unreachedGroupTests(roots, reported) {
469
469
  return roots.flatMap(root => { const check = detectCheckCommand(root); return check ? unreachedTestFiles(root, [check], reported) : []; });
470
470
  }
471
471
  /** A source file that exists but carries no implementation: a handful of lines, a placeholder import, or only TODOs. */
@@ -820,4 +820,3 @@ export async function runCompactDeveloper(env, options = {}) {
820
820
  const structured = { summary: summaries.join('\n'), files: [...files], tests: [...tests], verification: verification.length ? verification.join('; ') : 'none', incomplete };
821
821
  return { text: JSON.stringify(structured), usage: env.client.usage, structured };
822
822
  }
823
- //# sourceMappingURL=developer.js.map
@@ -1,11 +1,11 @@
1
1
  import type { spawnSync } from 'node:child_process';
2
- export interface EnvironmentInstall {
2
+ interface EnvironmentInstall {
3
3
  ecosystem: 'node' | 'python' | 'go' | 'rust';
4
4
  root: string;
5
5
  command: string;
6
6
  args: string[];
7
7
  }
8
- export interface InstallOutcome extends EnvironmentInstall {
8
+ interface InstallOutcome extends EnvironmentInstall {
9
9
  ok: boolean;
10
10
  detail: string;
11
11
  }
@@ -17,8 +17,6 @@ export declare function suggestedPackages(output: string): string[];
17
17
  export declare function missingNodeDependencies(root: string): string[];
18
18
  /** The installs a repository root needs, judged from its manifests and the absence of their install output. */
19
19
  export declare function plannedInstalls(root: string, failureOutput?: string): EnvironmentInstall[];
20
- /** Rewrites an exact, unpublished version in package.json to `^<major>.0.0`; true when something changed. */
21
- export declare function relaxManifestPin(root: string, name: string, version: string): boolean;
22
20
  /** Runs each planned install once, bounded; never throws. */
23
21
  export declare function installEnvironment(roots: readonly string[], io?: {
24
22
  spawn?: typeof spawnSync;
@@ -37,7 +35,7 @@ export declare function detectCheckCommand(root: string): {
37
35
  command: string;
38
36
  args: string[];
39
37
  } | undefined;
40
- export interface GroupCheckOutcome {
38
+ interface GroupCheckOutcome {
41
39
  ran: boolean;
42
40
  ok: boolean;
43
41
  command?: string;
@@ -60,3 +58,4 @@ export declare function runGroupCheck(roots: readonly string[], io?: {
60
58
  text?: string;
61
59
  }) => void;
62
60
  }): GroupCheckOutcome;
61
+ export {};
@@ -89,7 +89,7 @@ export function plannedInstalls(root, failureOutput = '') {
89
89
  return plans;
90
90
  }
91
91
  /** Rewrites an exact, unpublished version in package.json to `^<major>.0.0`; true when something changed. */
92
- export function relaxManifestPin(root, name, version) {
92
+ function relaxManifestPin(root, name, version) {
93
93
  const file = path.join(root, 'package.json');
94
94
  let manifest;
95
95
  try {
@@ -210,4 +210,3 @@ export function runGroupCheck(roots, io = {}) {
210
210
  }
211
211
  return { ran: false, ok: true, output: '' };
212
212
  }
213
- //# sourceMappingURL=environment.js.map
@@ -1,4 +1,4 @@
1
- export interface ExitHonestyFinding {
1
+ interface ExitHonestyFinding {
2
2
  command: string;
3
3
  failures: number | null;
4
4
  sample: string;
@@ -6,3 +6,4 @@ export interface ExitHonestyFinding {
6
6
  /** A failure count in a runner summary, or a failure-marker line, despite exit 0. */
7
7
  export declare function exitCodeContradiction(exitCode: number | null, output: string): ExitHonestyFinding | null;
8
8
  export declare function exitHonestyReason(findings: ReadonlyArray<ExitHonestyFinding>): string;
9
+ export {};
@@ -75,4 +75,3 @@ export function exitHonestyReason(findings) {
75
75
  const parts = findings.map(item => `\`${item.command}\` exited 0 but its output reports ${item.failures !== null ? `${item.failures} failing test${item.failures === 1 ? '' : 's'}` : 'a failure'} (${JSON.stringify(item.sample)})`);
76
76
  return `The verification command passed by exit code while reporting failures: ${parts.join('; ')}. A test runner that does not exit non-zero on failure hides broken tests: make the harness set \`process.exitCode = 1\` (or throw) when any test fails, then fix the failing tests.`;
77
77
  }
78
- //# sourceMappingURL=exit-code-honesty.js.map