@nathapp/nax 0.50.2 → 0.51.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 (352) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/nax.js +579 -373
  3. package/package.json +1 -3
  4. package/bin/nax.ts +0 -1195
  5. package/src/acceptance/fix-generator.ts +0 -322
  6. package/src/acceptance/generator.ts +0 -423
  7. package/src/acceptance/index.ts +0 -42
  8. package/src/acceptance/refinement.ts +0 -224
  9. package/src/acceptance/templates/cli.ts +0 -47
  10. package/src/acceptance/templates/component.ts +0 -78
  11. package/src/acceptance/templates/e2e.ts +0 -43
  12. package/src/acceptance/templates/index.ts +0 -21
  13. package/src/acceptance/templates/snapshot.ts +0 -50
  14. package/src/acceptance/templates/unit.ts +0 -48
  15. package/src/acceptance/types.ts +0 -135
  16. package/src/agents/acp/adapter.ts +0 -888
  17. package/src/agents/acp/cost.ts +0 -9
  18. package/src/agents/acp/index.ts +0 -7
  19. package/src/agents/acp/interaction-bridge.ts +0 -126
  20. package/src/agents/acp/parser.ts +0 -119
  21. package/src/agents/acp/spawn-client.ts +0 -373
  22. package/src/agents/acp/types.ts +0 -22
  23. package/src/agents/aider/adapter.ts +0 -135
  24. package/src/agents/claude/adapter.ts +0 -258
  25. package/src/agents/claude/complete.ts +0 -80
  26. package/src/agents/claude/cost.ts +0 -16
  27. package/src/agents/claude/execution.ts +0 -215
  28. package/src/agents/claude/index.ts +0 -3
  29. package/src/agents/claude/interactive.ts +0 -77
  30. package/src/agents/claude/plan.ts +0 -179
  31. package/src/agents/codex/adapter.ts +0 -153
  32. package/src/agents/cost/calculate.ts +0 -154
  33. package/src/agents/cost/index.ts +0 -10
  34. package/src/agents/cost/parse.ts +0 -97
  35. package/src/agents/cost/pricing.ts +0 -59
  36. package/src/agents/cost/types.ts +0 -45
  37. package/src/agents/gemini/adapter.ts +0 -177
  38. package/src/agents/index.ts +0 -18
  39. package/src/agents/opencode/adapter.ts +0 -106
  40. package/src/agents/registry.ts +0 -136
  41. package/src/agents/shared/decompose.ts +0 -154
  42. package/src/agents/shared/model-resolution.ts +0 -43
  43. package/src/agents/shared/types-extended.ts +0 -164
  44. package/src/agents/shared/validation.ts +0 -69
  45. package/src/agents/shared/version-detection.ts +0 -109
  46. package/src/agents/types.ts +0 -205
  47. package/src/analyze/classifier.ts +0 -282
  48. package/src/analyze/index.ts +0 -16
  49. package/src/analyze/scanner.ts +0 -171
  50. package/src/analyze/types.ts +0 -51
  51. package/src/cli/accept.ts +0 -108
  52. package/src/cli/agents.ts +0 -87
  53. package/src/cli/analyze-parser.ts +0 -291
  54. package/src/cli/analyze.ts +0 -352
  55. package/src/cli/config-descriptions.ts +0 -218
  56. package/src/cli/config-diff.ts +0 -103
  57. package/src/cli/config-display.ts +0 -285
  58. package/src/cli/config-get.ts +0 -55
  59. package/src/cli/config.ts +0 -14
  60. package/src/cli/constitution.ts +0 -17
  61. package/src/cli/diagnose-analysis.ts +0 -159
  62. package/src/cli/diagnose-formatter.ts +0 -87
  63. package/src/cli/diagnose.ts +0 -203
  64. package/src/cli/generate.ts +0 -250
  65. package/src/cli/index.ts +0 -42
  66. package/src/cli/init-context.ts +0 -405
  67. package/src/cli/init-detect.ts +0 -303
  68. package/src/cli/init.ts +0 -296
  69. package/src/cli/interact.ts +0 -295
  70. package/src/cli/plan.ts +0 -509
  71. package/src/cli/plugins.ts +0 -122
  72. package/src/cli/prompts-export.ts +0 -58
  73. package/src/cli/prompts-init.ts +0 -200
  74. package/src/cli/prompts-main.ts +0 -183
  75. package/src/cli/prompts-shared.ts +0 -70
  76. package/src/cli/prompts-tdd.ts +0 -88
  77. package/src/cli/prompts.ts +0 -17
  78. package/src/cli/runs.ts +0 -174
  79. package/src/cli/status-cost.ts +0 -151
  80. package/src/cli/status-features.ts +0 -405
  81. package/src/cli/status.ts +0 -13
  82. package/src/commands/common.ts +0 -171
  83. package/src/commands/diagnose.ts +0 -17
  84. package/src/commands/index.ts +0 -9
  85. package/src/commands/logs-formatter.ts +0 -201
  86. package/src/commands/logs-reader.ts +0 -171
  87. package/src/commands/logs.ts +0 -103
  88. package/src/commands/precheck.ts +0 -86
  89. package/src/commands/runs.ts +0 -220
  90. package/src/commands/unlock.ts +0 -96
  91. package/src/config/defaults.ts +0 -217
  92. package/src/config/index.ts +0 -22
  93. package/src/config/loader.ts +0 -143
  94. package/src/config/merge.ts +0 -106
  95. package/src/config/merger.ts +0 -147
  96. package/src/config/path-security.ts +0 -121
  97. package/src/config/paths.ts +0 -27
  98. package/src/config/permissions.ts +0 -63
  99. package/src/config/runtime-types.ts +0 -520
  100. package/src/config/schema-types.ts +0 -53
  101. package/src/config/schema.ts +0 -60
  102. package/src/config/schemas.ts +0 -425
  103. package/src/config/test-strategy.ts +0 -71
  104. package/src/config/types.ts +0 -57
  105. package/src/config/validate.ts +0 -103
  106. package/src/constitution/generator.ts +0 -158
  107. package/src/constitution/generators/aider.ts +0 -41
  108. package/src/constitution/generators/claude.ts +0 -35
  109. package/src/constitution/generators/cursor.ts +0 -36
  110. package/src/constitution/generators/opencode.ts +0 -38
  111. package/src/constitution/generators/types.ts +0 -33
  112. package/src/constitution/generators/windsurf.ts +0 -36
  113. package/src/constitution/index.ts +0 -11
  114. package/src/constitution/loader.ts +0 -121
  115. package/src/constitution/types.ts +0 -31
  116. package/src/context/auto-detect.ts +0 -228
  117. package/src/context/builder.ts +0 -299
  118. package/src/context/elements.ts +0 -122
  119. package/src/context/formatter.ts +0 -107
  120. package/src/context/generator.ts +0 -343
  121. package/src/context/generators/aider.ts +0 -34
  122. package/src/context/generators/claude.ts +0 -28
  123. package/src/context/generators/codex.ts +0 -28
  124. package/src/context/generators/cursor.ts +0 -28
  125. package/src/context/generators/gemini.ts +0 -28
  126. package/src/context/generators/opencode.ts +0 -30
  127. package/src/context/generators/windsurf.ts +0 -28
  128. package/src/context/greenfield.ts +0 -114
  129. package/src/context/index.ts +0 -34
  130. package/src/context/injector.ts +0 -279
  131. package/src/context/parent-context.ts +0 -39
  132. package/src/context/test-scanner.ts +0 -370
  133. package/src/context/types.ts +0 -98
  134. package/src/decompose/apply.ts +0 -50
  135. package/src/decompose/builder.ts +0 -181
  136. package/src/decompose/index.ts +0 -8
  137. package/src/decompose/sections/codebase.ts +0 -26
  138. package/src/decompose/sections/constraints.ts +0 -32
  139. package/src/decompose/sections/index.ts +0 -4
  140. package/src/decompose/sections/sibling-stories.ts +0 -25
  141. package/src/decompose/sections/target-story.ts +0 -31
  142. package/src/decompose/types.ts +0 -55
  143. package/src/decompose/validators/complexity.ts +0 -45
  144. package/src/decompose/validators/coverage.ts +0 -134
  145. package/src/decompose/validators/dependency.ts +0 -91
  146. package/src/decompose/validators/index.ts +0 -35
  147. package/src/decompose/validators/overlap.ts +0 -128
  148. package/src/errors.ts +0 -67
  149. package/src/execution/batching.ts +0 -157
  150. package/src/execution/crash-heartbeat.ts +0 -77
  151. package/src/execution/crash-recovery.ts +0 -79
  152. package/src/execution/crash-signals.ts +0 -165
  153. package/src/execution/crash-writer.ts +0 -154
  154. package/src/execution/deferred-review.ts +0 -105
  155. package/src/execution/dry-run.ts +0 -81
  156. package/src/execution/escalation/escalation.ts +0 -46
  157. package/src/execution/escalation/index.ts +0 -13
  158. package/src/execution/escalation/tier-escalation.ts +0 -346
  159. package/src/execution/escalation/tier-outcome.ts +0 -143
  160. package/src/execution/executor-types.ts +0 -73
  161. package/src/execution/helpers.ts +0 -38
  162. package/src/execution/index.ts +0 -27
  163. package/src/execution/iteration-runner.ts +0 -160
  164. package/src/execution/lifecycle/acceptance-loop.ts +0 -280
  165. package/src/execution/lifecycle/headless-formatter.ts +0 -83
  166. package/src/execution/lifecycle/index.ts +0 -11
  167. package/src/execution/lifecycle/parallel-lifecycle.ts +0 -101
  168. package/src/execution/lifecycle/precheck-runner.ts +0 -140
  169. package/src/execution/lifecycle/run-cleanup.ts +0 -81
  170. package/src/execution/lifecycle/run-completion.ts +0 -247
  171. package/src/execution/lifecycle/run-initialization.ts +0 -187
  172. package/src/execution/lifecycle/run-regression.ts +0 -305
  173. package/src/execution/lifecycle/run-setup.ts +0 -240
  174. package/src/execution/lifecycle/story-size-prompts.ts +0 -123
  175. package/src/execution/lock.ts +0 -129
  176. package/src/execution/parallel-coordinator.ts +0 -281
  177. package/src/execution/parallel-executor-rectification-pass.ts +0 -117
  178. package/src/execution/parallel-executor-rectify.ts +0 -136
  179. package/src/execution/parallel-executor.ts +0 -330
  180. package/src/execution/parallel-worker.ts +0 -149
  181. package/src/execution/parallel.ts +0 -13
  182. package/src/execution/pid-registry.ts +0 -275
  183. package/src/execution/pipeline-result-handler.ts +0 -221
  184. package/src/execution/progress.ts +0 -27
  185. package/src/execution/queue-handler.ts +0 -109
  186. package/src/execution/runner-completion.ts +0 -171
  187. package/src/execution/runner-execution.ts +0 -243
  188. package/src/execution/runner-setup.ts +0 -86
  189. package/src/execution/runner.ts +0 -265
  190. package/src/execution/sequential-executor.ts +0 -219
  191. package/src/execution/status-file.ts +0 -264
  192. package/src/execution/status-writer.ts +0 -181
  193. package/src/execution/story-context.ts +0 -266
  194. package/src/execution/story-selector.ts +0 -76
  195. package/src/execution/test-output-parser.ts +0 -14
  196. package/src/execution/timeout-handler.ts +0 -100
  197. package/src/hooks/index.ts +0 -2
  198. package/src/hooks/runner.ts +0 -280
  199. package/src/hooks/types.ts +0 -79
  200. package/src/interaction/chain.ts +0 -170
  201. package/src/interaction/index.ts +0 -61
  202. package/src/interaction/init.ts +0 -84
  203. package/src/interaction/plugins/auto.ts +0 -243
  204. package/src/interaction/plugins/cli.ts +0 -300
  205. package/src/interaction/plugins/telegram.ts +0 -384
  206. package/src/interaction/plugins/webhook.ts +0 -286
  207. package/src/interaction/state.ts +0 -171
  208. package/src/interaction/triggers.ts +0 -250
  209. package/src/interaction/types.ts +0 -170
  210. package/src/logger/formatters.ts +0 -84
  211. package/src/logger/index.ts +0 -16
  212. package/src/logger/logger.ts +0 -296
  213. package/src/logger/types.ts +0 -48
  214. package/src/logging/formatter.ts +0 -355
  215. package/src/logging/index.ts +0 -22
  216. package/src/logging/types.ts +0 -93
  217. package/src/metrics/aggregator.ts +0 -191
  218. package/src/metrics/index.ts +0 -14
  219. package/src/metrics/tracker.ts +0 -200
  220. package/src/metrics/types.ts +0 -115
  221. package/src/optimizer/index.ts +0 -63
  222. package/src/optimizer/noop.optimizer.ts +0 -24
  223. package/src/optimizer/rule-based.optimizer.ts +0 -248
  224. package/src/optimizer/types.ts +0 -53
  225. package/src/pipeline/event-bus.ts +0 -297
  226. package/src/pipeline/events.ts +0 -130
  227. package/src/pipeline/index.ts +0 -19
  228. package/src/pipeline/runner.ts +0 -149
  229. package/src/pipeline/stages/acceptance-setup.ts +0 -140
  230. package/src/pipeline/stages/acceptance.ts +0 -215
  231. package/src/pipeline/stages/autofix.ts +0 -262
  232. package/src/pipeline/stages/completion.ts +0 -110
  233. package/src/pipeline/stages/constitution.ts +0 -63
  234. package/src/pipeline/stages/context.ts +0 -122
  235. package/src/pipeline/stages/execution.ts +0 -359
  236. package/src/pipeline/stages/index.ts +0 -86
  237. package/src/pipeline/stages/optimizer.ts +0 -74
  238. package/src/pipeline/stages/prompt.ts +0 -79
  239. package/src/pipeline/stages/queue-check.ts +0 -103
  240. package/src/pipeline/stages/rectify.ts +0 -101
  241. package/src/pipeline/stages/regression.ts +0 -99
  242. package/src/pipeline/stages/review.ts +0 -94
  243. package/src/pipeline/stages/routing.ts +0 -276
  244. package/src/pipeline/stages/verify.ts +0 -286
  245. package/src/pipeline/subscribers/events-writer.ts +0 -135
  246. package/src/pipeline/subscribers/hooks.ts +0 -179
  247. package/src/pipeline/subscribers/interaction.ts +0 -103
  248. package/src/pipeline/subscribers/registry.ts +0 -73
  249. package/src/pipeline/subscribers/reporters.ts +0 -174
  250. package/src/pipeline/types.ts +0 -220
  251. package/src/plugins/extensions.ts +0 -225
  252. package/src/plugins/index.ts +0 -33
  253. package/src/plugins/loader.ts +0 -352
  254. package/src/plugins/plugin-logger.ts +0 -41
  255. package/src/plugins/registry.ts +0 -168
  256. package/src/plugins/types.ts +0 -206
  257. package/src/plugins/validator.ts +0 -352
  258. package/src/prd/index.ts +0 -220
  259. package/src/prd/schema.ts +0 -268
  260. package/src/prd/types.ts +0 -273
  261. package/src/prd/validate.ts +0 -41
  262. package/src/precheck/checks-agents.ts +0 -63
  263. package/src/precheck/checks-blockers.ts +0 -23
  264. package/src/precheck/checks-cli.ts +0 -68
  265. package/src/precheck/checks-config.ts +0 -102
  266. package/src/precheck/checks-git.ts +0 -117
  267. package/src/precheck/checks-system.ts +0 -101
  268. package/src/precheck/checks-warnings.ts +0 -221
  269. package/src/precheck/checks.ts +0 -36
  270. package/src/precheck/index.ts +0 -374
  271. package/src/precheck/story-size-gate.ts +0 -144
  272. package/src/precheck/types.ts +0 -31
  273. package/src/prompts/builder.ts +0 -166
  274. package/src/prompts/index.ts +0 -2
  275. package/src/prompts/loader.ts +0 -43
  276. package/src/prompts/sections/conventions.ts +0 -19
  277. package/src/prompts/sections/hermetic.ts +0 -41
  278. package/src/prompts/sections/index.ts +0 -12
  279. package/src/prompts/sections/isolation.ts +0 -70
  280. package/src/prompts/sections/role-task.ts +0 -182
  281. package/src/prompts/sections/story.ts +0 -55
  282. package/src/prompts/sections/verdict.ts +0 -70
  283. package/src/prompts/types.ts +0 -21
  284. package/src/queue/index.ts +0 -2
  285. package/src/queue/manager.ts +0 -254
  286. package/src/queue/types.ts +0 -54
  287. package/src/review/index.ts +0 -8
  288. package/src/review/orchestrator.ts +0 -154
  289. package/src/review/runner.ts +0 -303
  290. package/src/review/types.ts +0 -70
  291. package/src/routing/batch-route.ts +0 -35
  292. package/src/routing/builder.ts +0 -81
  293. package/src/routing/chain.ts +0 -75
  294. package/src/routing/content-hash.ts +0 -25
  295. package/src/routing/index.ts +0 -20
  296. package/src/routing/loader.ts +0 -62
  297. package/src/routing/router.ts +0 -305
  298. package/src/routing/strategies/adaptive.ts +0 -215
  299. package/src/routing/strategies/index.ts +0 -8
  300. package/src/routing/strategies/keyword.ts +0 -180
  301. package/src/routing/strategies/llm-prompts.ts +0 -224
  302. package/src/routing/strategies/llm.ts +0 -320
  303. package/src/routing/strategies/manual.ts +0 -50
  304. package/src/routing/strategy.ts +0 -102
  305. package/src/tdd/cleanup.ts +0 -120
  306. package/src/tdd/index.ts +0 -22
  307. package/src/tdd/isolation.ts +0 -117
  308. package/src/tdd/orchestrator.ts +0 -406
  309. package/src/tdd/prompts.ts +0 -40
  310. package/src/tdd/rectification-gate.ts +0 -274
  311. package/src/tdd/session-runner.ts +0 -263
  312. package/src/tdd/types.ts +0 -84
  313. package/src/tdd/verdict-reader.ts +0 -266
  314. package/src/tdd/verdict.ts +0 -152
  315. package/src/tui/App.tsx +0 -265
  316. package/src/tui/components/AgentPanel.tsx +0 -75
  317. package/src/tui/components/CostOverlay.tsx +0 -118
  318. package/src/tui/components/HelpOverlay.tsx +0 -107
  319. package/src/tui/components/StatusBar.tsx +0 -63
  320. package/src/tui/components/StoriesPanel.tsx +0 -177
  321. package/src/tui/hooks/useKeyboard.ts +0 -142
  322. package/src/tui/hooks/useLayout.ts +0 -137
  323. package/src/tui/hooks/usePipelineEvents.ts +0 -183
  324. package/src/tui/hooks/usePty.ts +0 -189
  325. package/src/tui/index.tsx +0 -38
  326. package/src/tui/types.ts +0 -76
  327. package/src/utils/errors.ts +0 -12
  328. package/src/utils/git.ts +0 -245
  329. package/src/utils/json-file.ts +0 -72
  330. package/src/utils/log-test-output.ts +0 -25
  331. package/src/utils/path-security.ts +0 -73
  332. package/src/utils/queue-writer.ts +0 -54
  333. package/src/verification/crash-detector.ts +0 -34
  334. package/src/verification/executor.ts +0 -250
  335. package/src/verification/index.ts +0 -12
  336. package/src/verification/orchestrator-types.ts +0 -154
  337. package/src/verification/orchestrator.ts +0 -76
  338. package/src/verification/parser.ts +0 -220
  339. package/src/verification/rectification-loop.ts +0 -172
  340. package/src/verification/rectification.ts +0 -108
  341. package/src/verification/runners.ts +0 -129
  342. package/src/verification/smart-runner.ts +0 -307
  343. package/src/verification/strategies/acceptance.ts +0 -136
  344. package/src/verification/strategies/regression.ts +0 -90
  345. package/src/verification/strategies/scoped.ts +0 -154
  346. package/src/verification/types.ts +0 -117
  347. package/src/version.ts +0 -40
  348. package/src/worktree/dispatcher.ts +0 -6
  349. package/src/worktree/index.ts +0 -2
  350. package/src/worktree/manager.ts +0 -193
  351. package/src/worktree/merge.ts +0 -302
  352. package/src/worktree/types.ts +0 -4
@@ -1,43 +0,0 @@
1
- /**
2
- * Model resolution utility — AA-006
3
- *
4
- * Resolves a ModelDef from config.models.balanced with fallback chain:
5
- * config value -> adapter default -> throw if none configured
6
- *
7
- * Implementation placeholder — logic to be filled in by the implementer.
8
- */
9
-
10
- import { resolveModel } from "../../config/schema";
11
- import type { ModelDef, NaxConfig } from "../../config/schema";
12
-
13
- /**
14
- * Resolve the balanced model definition from config, with optional adapter default fallback.
15
- *
16
- * Fallback chain:
17
- * 1. config.models.balanced (object or string shorthand)
18
- * 2. adapterDefault (if provided)
19
- * 3. Throws if neither is configured
20
- *
21
- * @param config - Partial NaxConfig (models.balanced is read if present)
22
- * @param adapterDefault - Optional adapter-level fallback ModelDef
23
- * @returns Resolved ModelDef
24
- * @throws Error if no balanced model is configured and no adapter default provided
25
- */
26
- export function resolveBalancedModelDef(
27
- config: Pick<NaxConfig, "models"> | Partial<NaxConfig>,
28
- adapterDefault?: ModelDef,
29
- ): ModelDef {
30
- const configWithModels = config as Pick<NaxConfig, "models">;
31
- const models = configWithModels.models as Record<string, unknown> | undefined;
32
- const balancedEntry = models?.balanced;
33
-
34
- if (balancedEntry) {
35
- return resolveModel(balancedEntry as string | ModelDef);
36
- }
37
-
38
- if (adapterDefault) {
39
- return adapterDefault;
40
- }
41
-
42
- throw new Error("No balanced model configured in config.models.balanced and no adapter default provided");
43
- }
@@ -1,164 +0,0 @@
1
- /**
2
- * Extended Agent Type Definitions
3
- *
4
- * Types for plan mode, decompose mode, and interactive PTY sessions.
5
- * Separated from core types to keep each file under 400 lines.
6
- */
7
-
8
- import type { ModelDef, ModelTier, NaxConfig } from "../../config/schema";
9
-
10
- /**
11
- * Configuration options for running an agent in plan mode.
12
- *
13
- * Plan mode spawns the agent interactively (or non-interactively with input file)
14
- * to gather requirements, ask clarifying questions, and produce a structured spec.
15
- */
16
- export interface PlanOptions {
17
- /** The initial planning prompt or task description */
18
- prompt: string;
19
- /** Working directory */
20
- workdir: string;
21
- /** Whether to run in interactive mode (agent takes over terminal) */
22
- interactive: boolean;
23
- /** Optional codebase context (file tree, dependencies, test patterns) */
24
- codebaseContext?: string;
25
- /** Optional input file path for non-interactive mode */
26
- inputFile?: string;
27
- /** Model tier to use for planning (default: "balanced") */
28
- modelTier?: ModelTier;
29
- /** Resolved model definition */
30
- modelDef?: ModelDef;
31
- /** Global config — used to resolve models.balanced when modelDef is absent */
32
- config?: Partial<NaxConfig>;
33
- /**
34
- * Interaction bridge for mid-session human Q&A (ACP only).
35
- * If provided, the agent can pause and ask clarifying questions during planning.
36
- */
37
- interactionBridge?: {
38
- detectQuestion: (text: string) => Promise<boolean>;
39
- onQuestionDetected: (text: string) => Promise<string>;
40
- };
41
- /** Feature name for ACP session naming (plan→run continuity) */
42
- featureName?: string;
43
- /** Story ID for ACP session naming (plan→run continuity) */
44
- storyId?: string;
45
- /** Session role for TDD isolation (e.g. "test-writer" | "implementer" | "verifier") */
46
- sessionRole?: string;
47
- /** Timeout in seconds — inherited from config.execution.sessionTimeoutSeconds */
48
- timeoutSeconds?: number;
49
- /** Whether to skip permission prompts (maps to permissionMode in ACP) */
50
- dangerouslySkipPermissions?: boolean;
51
- /** Max interaction turns when interactionBridge is active (default: 10) */
52
- maxInteractionTurns?: number;
53
- /**
54
- * Callback invoked with the ACP session name after the session is created.
55
- * Used to persist the name to status.json for plan→run session continuity.
56
- */
57
- onAcpSessionCreated?: (sessionName: string) => Promise<void> | void;
58
- /** PID registry for tracking spawned agent processes — cleanup on crash/SIGTERM */
59
- pidRegistry?: import("../../execution/pid-registry").PidRegistry;
60
- }
61
-
62
- /**
63
- * Result from running an agent in plan mode.
64
- *
65
- * Contains the generated specification content and optional conversation log.
66
- */
67
- export interface PlanResult {
68
- /** The generated specification markdown content */
69
- specContent: string;
70
- /** Optional conversation log (for debugging/review) */
71
- conversationLog?: string;
72
- }
73
-
74
- /**
75
- * Configuration options for running an agent in decompose mode.
76
- *
77
- * Decompose mode reads a spec document and breaks it down into classified user stories
78
- * in a single LLM call (decompose + classify combined).
79
- */
80
- export interface DecomposeOptions {
81
- /** The spec document content to decompose */
82
- specContent: string;
83
- /** Working directory */
84
- workdir: string;
85
- /** Codebase context (file tree, dependencies, test patterns) */
86
- codebaseContext: string;
87
- /** Model tier to use for decomposition (default: "balanced") */
88
- modelTier?: ModelTier;
89
- /** Resolved model definition */
90
- modelDef?: ModelDef;
91
- /** Global config — used to resolve models.balanced when modelDef is absent */
92
- config?: Partial<NaxConfig>;
93
- }
94
-
95
- /** A single classified user story from decompose result. */
96
- export interface DecomposedStory {
97
- /** Story ID (e.g., "US-001") */
98
- id: string;
99
- /** Story title */
100
- title: string;
101
- /** Story description */
102
- description: string;
103
- /** Acceptance criteria */
104
- acceptanceCriteria: string[];
105
- /** Tags for routing */
106
- tags: string[];
107
- /** Dependencies (story IDs) */
108
- dependencies: string[];
109
- /** Classified complexity */
110
- complexity: "simple" | "medium" | "complex" | "expert";
111
- /** Context files to inject into agent prompt before execution */
112
- contextFiles: string[];
113
- /** Classification reasoning */
114
- reasoning: string;
115
- /** Estimated lines of code */
116
- estimatedLOC: number;
117
- /** Implementation risks */
118
- risks: string[];
119
- /** Test strategy recommendation from LLM */
120
- testStrategy?: import("../../config/test-strategy").TestStrategy;
121
- }
122
-
123
- /**
124
- * Result from running an agent in decompose mode.
125
- *
126
- * Contains the decomposed and classified user stories.
127
- */
128
- export interface DecomposeResult {
129
- /** The decomposed and classified user stories */
130
- stories: DecomposedStory[];
131
- }
132
-
133
- /**
134
- * PTY handle interface for managing spawned PTY process.
135
- *
136
- * Provides methods to write input, resize terminal, and kill process.
137
- * Returned by runInteractive() for TUI integration.
138
- */
139
- export interface PtyHandle {
140
- /** Write input to PTY stdin */
141
- write(data: string): void;
142
- /** Resize PTY terminal */
143
- resize(cols: number, rows: number): void;
144
- /** Kill PTY process */
145
- kill(): void;
146
- /** Process ID */
147
- pid: number;
148
- }
149
-
150
- /**
151
- * Configuration options for running an agent in interactive PTY mode.
152
- *
153
- * Extends AgentRunOptions with PTY-specific callbacks for output streaming
154
- * and exit handling. Used by TUI to embed agent sessions.
155
- */
156
- export interface InteractiveRunOptions extends AgentRunOptions {
157
- /** Callback fired when PTY outputs data */
158
- onOutput: (data: Buffer) => void;
159
- /** Callback fired when PTY process exits */
160
- onExit: (code: number) => void;
161
- }
162
-
163
- // Re-import for the extends clause
164
- import type { AgentRunOptions } from "../types";
@@ -1,69 +0,0 @@
1
- /**
2
- * Agent Validation Helpers
3
- *
4
- * Runtime validation for agent capabilities and tier compatibility.
5
- */
6
-
7
- import type { ModelTier } from "../../config/schema";
8
- import type { AgentAdapter } from "../types";
9
-
10
- /**
11
- * Check if an agent supports a given model tier.
12
- *
13
- * Used to validate routing decisions at runtime — ensures the orchestrator
14
- * doesn't try to use a tier the agent doesn't support.
15
- *
16
- * @param agent - The agent adapter to validate
17
- * @param tier - The model tier to check (fast/balanced/powerful)
18
- * @returns true if the agent declares support for this tier
19
- *
20
- * @example
21
- * ```ts
22
- * const agent = new ClaudeCodeAdapter();
23
- * if (!validateAgentForTier(agent, "powerful")) {
24
- * console.warn(`Agent ${agent.name} does not support powerful tier`);
25
- * }
26
- * ```
27
- */
28
- export function validateAgentForTier(agent: AgentAdapter, tier: ModelTier): boolean {
29
- return agent.capabilities.supportedTiers.includes(tier);
30
- }
31
-
32
- /**
33
- * Check if an agent supports a specific feature.
34
- *
35
- * @param agent - The agent adapter to validate
36
- * @param feature - The feature to check (tdd/review/refactor/batch)
37
- * @returns true if the agent declares support for this feature
38
- *
39
- * @example
40
- * ```ts
41
- * const agent = new ClaudeCodeAdapter();
42
- * if (!validateAgentFeature(agent, "tdd")) {
43
- * throw new Error("Agent does not support TDD workflow");
44
- * }
45
- * ```
46
- */
47
- export function validateAgentFeature(agent: AgentAdapter, feature: "tdd" | "review" | "refactor" | "batch"): boolean {
48
- return agent.capabilities.features.has(feature);
49
- }
50
-
51
- /**
52
- * Get a human-readable description of agent capabilities.
53
- *
54
- * @param agent - The agent adapter to describe
55
- * @returns Formatted capability summary
56
- *
57
- * @example
58
- * ```ts
59
- * const agent = new ClaudeCodeAdapter();
60
- * console.log(describeAgentCapabilities(agent));
61
- * // "claude: tiers=[fast,balanced,powerful], maxTokens=200000, features=[tdd,review,refactor,batch]"
62
- * ```
63
- */
64
- export function describeAgentCapabilities(agent: AgentAdapter): string {
65
- const tiers = agent.capabilities.supportedTiers.join(",");
66
- const features = Array.from(agent.capabilities.features).join(",");
67
- const maxTokens = agent.capabilities.maxContextTokens;
68
- return `${agent.name}: tiers=[${tiers}], maxTokens=${maxTokens}, features=[${features}]`;
69
- }
@@ -1,109 +0,0 @@
1
- /**
2
- * Agent version detection utilities
3
- *
4
- * Extracts version information from installed agent binaries
5
- * by running `<agent> --version` and parsing the output.
6
- */
7
-
8
- import { getInstalledAgents } from "../registry";
9
- import type { AgentAdapter } from "../types";
10
-
11
- /**
12
- * Information about an installed agent including its version
13
- */
14
- export interface AgentVersionInfo {
15
- /** Agent name (e.g., "codex", "aider") */
16
- name: string;
17
- /** Human-readable display name */
18
- displayName: string;
19
- /** Agent version or null if not installed/unable to detect */
20
- version: string | null;
21
- /** Whether the agent binary is installed */
22
- installed: boolean;
23
- }
24
-
25
- /**
26
- * Dependency injection for testability
27
- */
28
- export const _versionDetectionDeps = {
29
- spawn(
30
- cmd: string[],
31
- opts: { stdout: "pipe"; stderr: "pipe" },
32
- ): {
33
- stdout: ReadableStream<Uint8Array>;
34
- stderr: ReadableStream<Uint8Array>;
35
- exited: Promise<number>;
36
- } {
37
- return Bun.spawn(cmd, opts) as unknown as {
38
- stdout: ReadableStream<Uint8Array>;
39
- stderr: ReadableStream<Uint8Array>;
40
- exited: Promise<number>;
41
- };
42
- },
43
- };
44
-
45
- /**
46
- * Get version for a single agent binary
47
- *
48
- * Runs `<agent> --version` and extracts version string.
49
- * Returns null if agent not found or version detection fails.
50
- */
51
- export async function getAgentVersion(binaryName: string): Promise<string | null> {
52
- try {
53
- const proc = _versionDetectionDeps.spawn([binaryName, "--version"], {
54
- stdout: "pipe",
55
- stderr: "pipe",
56
- });
57
-
58
- const exitCode = await proc.exited;
59
- if (exitCode !== 0) {
60
- return null;
61
- }
62
-
63
- const stdout = await new Response(proc.stdout).text();
64
- const versionLine = stdout.trim().split("\n")[0];
65
-
66
- // Extract version from common formats:
67
- // "tool version 1.2.3"
68
- // "v1.2.3"
69
- // "1.2.3"
70
- const versionMatch = versionLine.match(/v?(\d+\.\d+(?:\.\d+)?(?:[-+][\w.]+)?)/);
71
- if (versionMatch) {
72
- return versionMatch[0];
73
- }
74
-
75
- // If no version pattern matched, return the first line as-is
76
- return versionLine || null;
77
- } catch {
78
- // Bun.spawn throws ENOENT if binary not found
79
- return null;
80
- }
81
- }
82
-
83
- /**
84
- * Get version information for all configured agents
85
- *
86
- * Returns list of agents with their installation status and version info.
87
- */
88
- export async function getAgentVersions(): Promise<AgentVersionInfo[]> {
89
- const agents = await getInstalledAgents();
90
- const agentsByName = new Map(agents.map((a) => [a.name, a]));
91
-
92
- // Import ALL_AGENTS to include non-installed ones
93
- const { ALL_AGENTS } = await import("../registry");
94
-
95
- const versions = await Promise.all(
96
- ALL_AGENTS.map(async (agent: AgentAdapter): Promise<AgentVersionInfo> => {
97
- const version = agentsByName.has(agent.name) ? await getAgentVersion(agent.binary) : null;
98
-
99
- return {
100
- name: agent.name,
101
- displayName: agent.displayName,
102
- version,
103
- installed: agentsByName.has(agent.name),
104
- };
105
- }),
106
- );
107
-
108
- return versions;
109
- }
@@ -1,205 +0,0 @@
1
- /**
2
- * Agent Adapter Interface
3
- *
4
- * Every coding agent (Claude Code, Codex, OpenCode, etc.)
5
- * implements this interface so nax can spawn, monitor, and
6
- * collect results from them uniformly.
7
- */
8
-
9
- import type { NaxConfig } from "../config";
10
- import type { ModelDef, ModelTier } from "../config/schema";
11
- import type { TokenUsage } from "./cost";
12
-
13
- // Re-export extended types for backward compatibility
14
- export type {
15
- PlanOptions,
16
- PlanResult,
17
- DecomposeOptions,
18
- DecomposeResult,
19
- DecomposedStory,
20
- PtyHandle,
21
- InteractiveRunOptions,
22
- } from "./shared/types-extended";
23
-
24
- /**
25
- * Agent execution result returned after running a coding agent.
26
- */
27
- export interface AgentResult {
28
- /** Whether the agent completed successfully */
29
- success: boolean;
30
- /** Exit code from the process */
31
- exitCode: number;
32
- /** stdout output (last N lines) */
33
- output: string;
34
- /** stderr output tail (last N lines) — useful for diagnosing failures */
35
- stderr?: string;
36
- /** Whether the agent hit a rate limit */
37
- rateLimited: boolean;
38
- /** Duration in milliseconds */
39
- durationMs: number;
40
- /** Estimated cost for this run (USD) */
41
- estimatedCost: number;
42
- /** Token usage for this run (when available) */
43
- tokenUsage?: TokenUsage;
44
- /** Process ID of the spawned agent (for cleanup on failure) */
45
- pid?: number;
46
- }
47
-
48
- /**
49
- * Configuration options for running a coding agent session.
50
- */
51
- export interface AgentRunOptions {
52
- /** The prompt to send to the agent */
53
- prompt: string;
54
- /** Working directory */
55
- workdir: string;
56
- /** Model tier (for cost estimation) */
57
- modelTier: ModelTier;
58
- /** Resolved model definition */
59
- modelDef: ModelDef;
60
- /** Maximum runtime in seconds */
61
- timeoutSeconds: number;
62
- /** Environment variables to pass */
63
- env?: Record<string, string>;
64
- /** Use --dangerously-skip-permissions flag (default: true) */
65
- dangerouslySkipPermissions?: boolean;
66
- /** Interaction bridge for mid-session human interaction (ACP) */
67
- interactionBridge?: {
68
- detectQuestion: (text: string) => Promise<boolean>;
69
- onQuestionDetected: (text: string) => Promise<string>;
70
- };
71
- /** PID registry for cleanup on crash/SIGTERM */
72
- pidRegistry?: import("../execution/pid-registry").PidRegistry;
73
- /** ACP session name to resume for plan→run session continuity */
74
- acpSessionName?: string;
75
- /** Feature name for ACP session naming and logging */
76
- featureName?: string;
77
- /** Story ID for ACP session naming and logging */
78
- storyId?: string;
79
- /** Session role for TDD isolation (e.g. "test-writer" | "implementer" | "verifier") */
80
- sessionRole?: string;
81
- /** Max turns in multi-turn interaction loop when interactionBridge is active (default: 10) */
82
- maxInteractionTurns?: number;
83
- /** Pipeline stage this run belongs to — used by resolvePermissions() (default: "run") */
84
- pipelineStage?: import("../config/permissions").PipelineStage;
85
- /** Full nax config — passed through so adapters can call resolvePermissions() */
86
- config?: NaxConfig;
87
- /**
88
- * When true, the adapter will NOT close the session after a successful run.
89
- * Use this for rectification loops where the same session must persist across
90
- * multiple attempts so the agent retains full conversation context.
91
- * The caller is responsible for closing the session when the loop is done.
92
- */
93
- keepSessionOpen?: boolean;
94
- }
95
-
96
- /**
97
- * Agent capability metadata describing what features and tiers the agent supports.
98
- */
99
- export interface AgentCapabilities {
100
- /** Model tiers this agent supports (e.g., fast/balanced/powerful) */
101
- readonly supportedTiers: readonly ModelTier[];
102
- /** Maximum context window size in tokens */
103
- readonly maxContextTokens: number;
104
- /** Feature flags — what workflows this agent can handle */
105
- readonly features: ReadonlySet<"tdd" | "review" | "refactor" | "batch">;
106
- }
107
-
108
- /**
109
- * Options for one-shot LLM completion calls.
110
- */
111
- export interface CompleteOptions {
112
- /** Maximum tokens for the response */
113
- maxTokens?: number;
114
- /** Request JSON-formatted output (adds --output-format json) */
115
- jsonMode?: boolean;
116
- /** Override the model (adds --model flag) */
117
- model?: string;
118
- /** Whether to skip permission prompts (maps to permissionMode in ACP) */
119
- dangerouslySkipPermissions?: boolean;
120
- /**
121
- * Working directory for the completion call.
122
- * Used by ACP adapter to set --cwd on the spawned acpx session.
123
- * CLI adapter uses this as the process cwd when spawning the agent binary.
124
- */
125
- workdir?: string;
126
- /**
127
- * Timeout for the completion call in milliseconds.
128
- * Adapters that support it (e.g. ACP) will enforce this as a hard deadline.
129
- * Callers may also wrap complete() in their own Promise.race for shorter timeouts.
130
- */
131
- timeoutMs?: number;
132
- /**
133
- * Full nax config — used by resolvePermissions() to determine permission mode.
134
- * Pass when available so complete() honours permissionProfile / dangerouslySkipPermissions.
135
- */
136
- config?: NaxConfig;
137
- /**
138
- * Named session to use for this completion call.
139
- * If omitted, a timestamp-based ephemeral session name is generated.
140
- * Pass a meaningful name (e.g. "nax-decompose-us-001") to aid debugging.
141
- */
142
- sessionName?: string;
143
- }
144
-
145
- /**
146
- * Typed error thrown when complete() fails due to non-zero exit or empty output.
147
- */
148
- export class CompleteError extends Error {
149
- constructor(
150
- message: string,
151
- public readonly exitCode?: number,
152
- ) {
153
- super(message);
154
- this.name = "CompleteError";
155
- }
156
- }
157
-
158
- /**
159
- * Agent adapter interface — one implementation per supported coding agent.
160
- *
161
- * Provides uniform interface for checking installation, running agents,
162
- * and building CLI commands across different coding agent tools.
163
- */
164
- export interface AgentAdapter {
165
- /** Unique agent name (e.g., "claude", "codex", "opencode") */
166
- readonly name: string;
167
- /** Human-readable display name */
168
- readonly displayName: string;
169
- /** Binary command to check if agent is installed */
170
- readonly binary: string;
171
- /** Capability metadata describing supported tiers and features */
172
- readonly capabilities: AgentCapabilities;
173
-
174
- /** Check if the agent binary is available on this machine. */
175
- isInstalled(): Promise<boolean>;
176
-
177
- /** Run the agent with a prompt and return the result. */
178
- run(options: AgentRunOptions): Promise<AgentResult>;
179
-
180
- /** Build the CLI command for a given run (for dry-run display). */
181
- buildCommand(options: AgentRunOptions): string[];
182
-
183
- /** Run the agent in plan mode to generate a feature specification. */
184
- plan(options: import("./shared/types-extended").PlanOptions): Promise<import("./shared/types-extended").PlanResult>;
185
-
186
- /** Run the agent in decompose mode to break spec into classified stories. */
187
- decompose(
188
- options: import("./shared/types-extended").DecomposeOptions,
189
- ): Promise<import("./shared/types-extended").DecomposeResult>;
190
-
191
- /**
192
- * Run a one-shot LLM call and return the plain text response.
193
- * Uses claude -p CLI for non-interactive completions.
194
- */
195
- complete(prompt: string, options?: CompleteOptions): Promise<string>;
196
-
197
- /**
198
- * Run the agent in interactive PTY mode for TUI embedding.
199
- * This method is optional — only implemented by agents that support
200
- * interactive terminal sessions (e.g., Claude Code).
201
- */
202
- runInteractive?(
203
- options: import("./shared/types-extended").InteractiveRunOptions,
204
- ): import("./shared/types-extended").PtyHandle;
205
- }