specrails-core 5.5.1 → 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 (276) 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 +4 -3
  6. package/dist/agent-runtime/cli-process.js +0 -1
  7. package/dist/agent-runtime/cli.d.ts +8 -0
  8. package/dist/agent-runtime/cli.js +31 -5
  9. package/dist/agent-runtime/codex-schema.js +0 -1
  10. package/dist/agent-runtime/compact/architect.d.ts +3 -272
  11. package/dist/agent-runtime/compact/architect.js +8 -9
  12. package/dist/agent-runtime/compact/chat-client.d.ts +3 -3
  13. package/dist/agent-runtime/compact/chat-client.js +1 -2
  14. package/dist/agent-runtime/compact/developer.d.ts +3 -70
  15. package/dist/agent-runtime/compact/developer.js +13 -14
  16. package/dist/agent-runtime/compact/environment.d.ts +4 -5
  17. package/dist/agent-runtime/compact/environment.js +1 -2
  18. package/dist/agent-runtime/compact/exit-code-honesty.d.ts +2 -1
  19. package/dist/agent-runtime/compact/exit-code-honesty.js +0 -1
  20. package/dist/agent-runtime/compact/guarded-loop.d.ts +2 -18
  21. package/dist/agent-runtime/compact/guarded-loop.js +7 -8
  22. package/dist/agent-runtime/compact/prompt-inputs.d.ts +0 -2
  23. package/dist/agent-runtime/compact/prompt-inputs.js +1 -2
  24. package/dist/agent-runtime/compact/reviewer.d.ts +0 -13
  25. package/dist/agent-runtime/compact/reviewer.js +5 -6
  26. package/dist/agent-runtime/compact/step.d.ts +0 -1
  27. package/dist/agent-runtime/compact/step.js +1 -2
  28. package/dist/agent-runtime/compact/test-reachability.js +0 -1
  29. package/dist/agent-runtime/config.js +0 -1
  30. package/dist/agent-runtime/core-host.d.ts +1 -1
  31. package/dist/agent-runtime/core-host.js +5 -3
  32. package/dist/agent-runtime/durable-store.d.ts +0 -1
  33. package/dist/agent-runtime/durable-store.js +1 -2
  34. package/dist/agent-runtime/efficiency-summary.d.ts +2 -2
  35. package/dist/agent-runtime/efficiency-summary.js +1 -2
  36. package/dist/agent-runtime/efficiency-types.js +0 -1
  37. package/dist/agent-runtime/efficiency.js +0 -1
  38. package/dist/agent-runtime/evaluation-corpus.js +0 -1
  39. package/dist/agent-runtime/evaluation.d.ts +2 -1
  40. package/dist/agent-runtime/evaluation.js +1 -2
  41. package/dist/agent-runtime/executor-types.d.ts +1 -1
  42. package/dist/agent-runtime/executor-types.js +0 -1
  43. package/dist/agent-runtime/executors.js +0 -1
  44. package/dist/agent-runtime/gemini-policy.js +0 -1
  45. package/dist/agent-runtime/graph/artifacts.d.ts +1 -1
  46. package/dist/agent-runtime/graph/artifacts.js +11 -5
  47. package/dist/agent-runtime/graph/nodes.d.ts +1 -1
  48. package/dist/agent-runtime/graph/nodes.js +1 -2
  49. package/dist/agent-runtime/graph/review-policy.js +0 -1
  50. package/dist/agent-runtime/graph/roles.d.ts +2 -5
  51. package/dist/agent-runtime/graph/roles.js +2 -8
  52. package/dist/agent-runtime/graph/state.d.ts +1 -1
  53. package/dist/agent-runtime/graph/state.js +0 -1
  54. package/dist/agent-runtime/graph-checkpointer.d.ts +2 -1
  55. package/dist/agent-runtime/graph-checkpointer.js +0 -1
  56. package/dist/agent-runtime/guardrails.d.ts +3 -3
  57. package/dist/agent-runtime/guardrails.js +1 -2
  58. package/dist/agent-runtime/index.d.ts +2 -1
  59. package/dist/agent-runtime/index.js +2 -2
  60. package/dist/agent-runtime/kimi-acp.js +1 -2
  61. package/dist/agent-runtime/kimi-model.d.ts +6 -0
  62. package/dist/agent-runtime/kimi-model.js +12 -0
  63. package/dist/agent-runtime/openai-executor.d.ts +0 -9
  64. package/dist/agent-runtime/openai-executor.js +6 -7
  65. package/dist/agent-runtime/openspec-tool-server.js +1 -2
  66. package/dist/agent-runtime/openspec.d.ts +0 -2
  67. package/dist/agent-runtime/openspec.js +3 -7
  68. package/dist/agent-runtime/prompts.d.ts +4 -3
  69. package/dist/agent-runtime/prompts.js +0 -1
  70. package/dist/agent-runtime/provider-diagnostic.js +1 -2
  71. package/dist/agent-runtime/recovery.d.ts +46 -0
  72. package/dist/agent-runtime/recovery.js +169 -0
  73. package/dist/agent-runtime/repository-context.d.ts +1 -1
  74. package/dist/agent-runtime/repository-context.js +0 -1
  75. package/dist/agent-runtime/review-context.d.ts +1 -1
  76. package/dist/agent-runtime/review-context.js +0 -1
  77. package/dist/agent-runtime/role-routing.js +0 -1
  78. package/dist/agent-runtime/role-state.js +0 -1
  79. package/dist/agent-runtime/runtime-identity.js +1 -2
  80. package/dist/agent-runtime/tool-event.js +0 -1
  81. package/dist/agent-runtime/verification-plan.d.ts +5 -4
  82. package/dist/agent-runtime/verification-plan.js +1 -2
  83. package/dist/agent-runtime/workflow-types.js +0 -1
  84. package/dist/agent-runtime/workflow.js +0 -1
  85. package/dist/agent-runtime/workspace-tools.d.ts +2 -2
  86. package/dist/agent-runtime/workspace-tools.js +1 -2
  87. package/dist/installer/cli.d.ts +3 -32
  88. package/dist/installer/cli.js +26 -101
  89. package/dist/installer/commands/framework.d.ts +4 -3
  90. package/dist/installer/commands/framework.js +0 -1
  91. package/dist/installer/commands/init.d.ts +4 -25
  92. package/dist/installer/commands/init.js +5 -8
  93. package/dist/installer/phases/framework-lifecycle.d.ts +3 -17
  94. package/dist/installer/phases/framework-lifecycle.js +2 -3
  95. package/dist/installer/phases/install-config.d.ts +7 -8
  96. package/dist/installer/phases/install-config.js +2 -7
  97. package/dist/installer/phases/manifest.d.ts +6 -7
  98. package/dist/installer/phases/manifest.js +2 -7
  99. package/dist/installer/phases/prereqs.d.ts +6 -7
  100. package/dist/installer/phases/prereqs.js +4 -6
  101. package/dist/installer/phases/provider-detect.d.ts +6 -7
  102. package/dist/installer/phases/provider-detect.js +2 -4
  103. package/dist/installer/phases/scaffold.d.ts +9 -10
  104. package/dist/installer/phases/scaffold.js +82 -805
  105. package/dist/installer/util/errors.js +0 -1
  106. package/dist/installer/util/exec.d.ts +3 -2
  107. package/dist/installer/util/exec.js +0 -1
  108. package/dist/installer/util/fs.d.ts +0 -10
  109. package/dist/installer/util/fs.js +1 -2
  110. package/dist/installer/util/git.js +0 -1
  111. package/dist/installer/util/install-transaction.d.ts +2 -2
  112. package/dist/installer/util/install-transaction.js +1 -2
  113. package/dist/installer/util/logger.d.ts +1 -3
  114. package/dist/installer/util/logger.js +0 -1
  115. package/dist/installer/util/paths.js +0 -1
  116. package/dist/installer/util/registry.d.ts +4 -8
  117. package/dist/installer/util/registry.js +2 -3
  118. package/dist/{installer/runtime → pipeline}/pipeline-state.js +0 -3
  119. package/dist/shared/args.d.ts +18 -0
  120. package/dist/shared/args.js +53 -0
  121. package/integration-contract.json +10 -46
  122. package/package.json +3 -10
  123. package/templates/agents/sr-architect.md +15 -310
  124. package/templates/agents/sr-developer.md +15 -269
  125. package/templates/agents/sr-reviewer.md +13 -367
  126. package/templates/codex-skills/rails/sr-architect/SKILL.md +14 -308
  127. package/templates/codex-skills/rails/sr-developer/SKILL.md +14 -201
  128. package/templates/codex-skills/rails/sr-reviewer/SKILL.md +15 -289
  129. package/templates/kimi/specrails/run-skill.mjs +91 -2173
  130. package/bin/tui-installer.mjs +0 -430
  131. package/commands/doctor.md +0 -62
  132. package/dist/agent-runtime/capabilities.js.map +0 -1
  133. package/dist/agent-runtime/cli-executor.js.map +0 -1
  134. package/dist/agent-runtime/cli-process.js.map +0 -1
  135. package/dist/agent-runtime/cli.js.map +0 -1
  136. package/dist/agent-runtime/codex-schema.js.map +0 -1
  137. package/dist/agent-runtime/compact/architect.js.map +0 -1
  138. package/dist/agent-runtime/compact/chat-client.js.map +0 -1
  139. package/dist/agent-runtime/compact/developer.js.map +0 -1
  140. package/dist/agent-runtime/compact/environment.js.map +0 -1
  141. package/dist/agent-runtime/compact/exit-code-honesty.js.map +0 -1
  142. package/dist/agent-runtime/compact/guarded-loop.js.map +0 -1
  143. package/dist/agent-runtime/compact/prompt-inputs.js.map +0 -1
  144. package/dist/agent-runtime/compact/reviewer.js.map +0 -1
  145. package/dist/agent-runtime/compact/step.js.map +0 -1
  146. package/dist/agent-runtime/compact/test-reachability.js.map +0 -1
  147. package/dist/agent-runtime/config.js.map +0 -1
  148. package/dist/agent-runtime/core-host.js.map +0 -1
  149. package/dist/agent-runtime/durable-store.js.map +0 -1
  150. package/dist/agent-runtime/efficiency-summary.js.map +0 -1
  151. package/dist/agent-runtime/efficiency-types.js.map +0 -1
  152. package/dist/agent-runtime/efficiency.js.map +0 -1
  153. package/dist/agent-runtime/evaluation-corpus.js.map +0 -1
  154. package/dist/agent-runtime/evaluation.js.map +0 -1
  155. package/dist/agent-runtime/executor-types.js.map +0 -1
  156. package/dist/agent-runtime/executors.js.map +0 -1
  157. package/dist/agent-runtime/gemini-policy.js.map +0 -1
  158. package/dist/agent-runtime/graph/artifacts.js.map +0 -1
  159. package/dist/agent-runtime/graph/nodes.js.map +0 -1
  160. package/dist/agent-runtime/graph/review-policy.js.map +0 -1
  161. package/dist/agent-runtime/graph/roles.js.map +0 -1
  162. package/dist/agent-runtime/graph/state.js.map +0 -1
  163. package/dist/agent-runtime/graph-checkpointer.js.map +0 -1
  164. package/dist/agent-runtime/guardrails.js.map +0 -1
  165. package/dist/agent-runtime/index.js.map +0 -1
  166. package/dist/agent-runtime/kimi-acp.js.map +0 -1
  167. package/dist/agent-runtime/openai-executor.js.map +0 -1
  168. package/dist/agent-runtime/openspec-tool-server.js.map +0 -1
  169. package/dist/agent-runtime/openspec.js.map +0 -1
  170. package/dist/agent-runtime/prompts.js.map +0 -1
  171. package/dist/agent-runtime/provider-diagnostic.js.map +0 -1
  172. package/dist/agent-runtime/repository-context.js.map +0 -1
  173. package/dist/agent-runtime/review-context.js.map +0 -1
  174. package/dist/agent-runtime/role-routing.js.map +0 -1
  175. package/dist/agent-runtime/role-state.js.map +0 -1
  176. package/dist/agent-runtime/runtime-identity.js.map +0 -1
  177. package/dist/agent-runtime/tool-event.js.map +0 -1
  178. package/dist/agent-runtime/verification-plan.js.map +0 -1
  179. package/dist/agent-runtime/workflow-types.js.map +0 -1
  180. package/dist/agent-runtime/workflow.js.map +0 -1
  181. package/dist/agent-runtime/workspace-tools.js.map +0 -1
  182. package/dist/installer/cli.js.map +0 -1
  183. package/dist/installer/commands/doctor.d.ts +0 -27
  184. package/dist/installer/commands/doctor.js +0 -615
  185. package/dist/installer/commands/doctor.js.map +0 -1
  186. package/dist/installer/commands/framework.js.map +0 -1
  187. package/dist/installer/commands/init.js.map +0 -1
  188. package/dist/installer/commands/update.d.ts +0 -56
  189. package/dist/installer/commands/update.js +0 -257
  190. package/dist/installer/commands/update.js.map +0 -1
  191. package/dist/installer/commands/v5-migration.d.ts +0 -32
  192. package/dist/installer/commands/v5-migration.js +0 -133
  193. package/dist/installer/commands/v5-migration.js.map +0 -1
  194. package/dist/installer/phases/framework-lifecycle.js.map +0 -1
  195. package/dist/installer/phases/install-config.js.map +0 -1
  196. package/dist/installer/phases/manifest.js.map +0 -1
  197. package/dist/installer/phases/prereqs.js.map +0 -1
  198. package/dist/installer/phases/provider-detect.js.map +0 -1
  199. package/dist/installer/phases/scaffold.js.map +0 -1
  200. package/dist/installer/runtime/kimi.d.ts +0 -84
  201. package/dist/installer/runtime/kimi.js +0 -255
  202. package/dist/installer/runtime/kimi.js.map +0 -1
  203. package/dist/installer/runtime/pipeline-state.js.map +0 -1
  204. package/dist/installer/util/errors.js.map +0 -1
  205. package/dist/installer/util/exec.js.map +0 -1
  206. package/dist/installer/util/fs.js.map +0 -1
  207. package/dist/installer/util/git.js.map +0 -1
  208. package/dist/installer/util/install-transaction.js.map +0 -1
  209. package/dist/installer/util/logger.js.map +0 -1
  210. package/dist/installer/util/paths.js.map +0 -1
  211. package/dist/installer/util/prompts.d.ts +0 -23
  212. package/dist/installer/util/prompts.js +0 -49
  213. package/dist/installer/util/prompts.js.map +0 -1
  214. package/dist/installer/util/registry.js.map +0 -1
  215. package/dist/installer/util/template.d.ts +0 -23
  216. package/dist/installer/util/template.js +0 -60
  217. package/dist/installer/util/template.js.map +0 -1
  218. package/docs/README.md +0 -40
  219. package/docs/agent-runtime-efficiency.md +0 -65
  220. package/docs/agent-runtime.md +0 -347
  221. package/docs/agents.md +0 -315
  222. package/docs/changelog.md +0 -168
  223. package/docs/ci-cd.md +0 -60
  224. package/docs/concepts.md +0 -183
  225. package/docs/customization.md +0 -363
  226. package/docs/deployment.md +0 -234
  227. package/docs/getting-started.md +0 -122
  228. package/docs/installation.md +0 -395
  229. package/docs/local-tickets.md +0 -191
  230. package/docs/migration-guide.md +0 -140
  231. package/docs/playbook-oss-maintainer.md +0 -112
  232. package/docs/playbook-parallel-dev.md +0 -124
  233. package/docs/playbook-product-discovery.md +0 -115
  234. package/docs/plugin-architecture.md +0 -144
  235. package/docs/research/codex-compatibility-analysis.md +0 -365
  236. package/docs/research/mcp-feasibility-analysis.md +0 -382
  237. package/docs/testing/test-matrix-codex.md +0 -130
  238. package/docs/updating.md +0 -89
  239. package/docs/user-docs/cli-reference.md +0 -428
  240. package/docs/user-docs/codex-vs-claude-code.md +0 -23
  241. package/docs/user-docs/core-updates.md +0 -70
  242. package/docs/user-docs/faq.md +0 -146
  243. package/docs/user-docs/getting-started-codex.md +0 -194
  244. package/docs/user-docs/getting-started-kimi.md +0 -423
  245. package/docs/user-docs/installation.md +0 -237
  246. package/docs/user-docs/provider-pipelines.md +0 -96
  247. package/docs/user-docs/quick-start.md +0 -161
  248. package/docs/windows.md +0 -78
  249. package/docs/workflows.md +0 -463
  250. package/schemas/profile.v1.json +0 -207
  251. package/templates/claude-md/CLAUDE-quickstart.md +0 -54
  252. package/templates/claude-md/root.md +0 -50
  253. package/templates/codex-skills/batch-implement/SKILL.md +0 -38
  254. package/templates/codex-skills/implement/SKILL.md +0 -38
  255. package/templates/codex-skills/retry/SKILL.md +0 -16
  256. package/templates/commands/specrails/compat-check.md +0 -271
  257. package/templates/commands/specrails/doctor.md +0 -62
  258. package/templates/commands/specrails/explore-spec.md +0 -173
  259. package/templates/commands/specrails/health-check.md +0 -527
  260. package/templates/commands/specrails/memory-inspect.md +0 -261
  261. package/templates/commands/specrails/opsx-diff.md +0 -419
  262. package/templates/commands/specrails/propose-spec.md +0 -102
  263. package/templates/commands/specrails/refactor-recommender.md +0 -169
  264. package/templates/commands/specrails/telemetry.md +0 -552
  265. package/templates/commands/specrails/why.md +0 -96
  266. package/templates/gemini-commands/batch-implement.toml +0 -37
  267. package/templates/gemini-commands/implement.toml +0 -37
  268. package/templates/gemini-commands/retry.toml +0 -15
  269. package/templates/profiles/default.json +0 -14
  270. package/templates/profiles/kimi-default.json +0 -15
  271. package/templates/rules/layer.md +0 -8
  272. package/templates/runtime/provider-pipeline.md +0 -113
  273. package/templates/security/security-exemptions.yaml +0 -20
  274. package/templates/settings/confidence-config.json +0 -17
  275. package/templates/settings/settings.json +0 -15
  276. /package/dist/{installer/runtime → pipeline}/pipeline-state.d.ts +0 -0
@@ -21,7 +21,7 @@ export function runtimePackageIntegrity(root = fileURLToPath(new URL('../../', i
21
21
  else
22
22
  throw new Error('Runtime package contains a nonregular file: ' + relative);
23
23
  };
24
- for (const entry of ['package.json', 'dist', 'bin', 'templates', 'schemas', 'commands', 'integration-contract.json', 'pinned-versions.json']) {
24
+ for (const entry of ['package.json', 'dist', 'bin', 'templates', 'schemas', 'integration-contract.json', 'pinned-versions.json']) {
25
25
  if (existsSync(path.join(root, entry)))
26
26
  visit(entry);
27
27
  }
@@ -30,4 +30,3 @@ export function runtimePackageIntegrity(root = fileURLToPath(new URL('../../', i
30
30
  export function sameRuntimeIdentity(left, right) {
31
31
  return ['packageVersion', 'workflowVersion', 'instructionsVersion', 'packageIntegrity', 'apiVersion'].every(key => left[key] === right[key]);
32
32
  }
33
- //# sourceMappingURL=runtime-identity.js.map
@@ -21,4 +21,3 @@ export function toolEvent(tool, input) {
21
21
  const cwd = args.workdir ?? args.cwd;
22
22
  return { kind: 'tool-start', tool, ...(detail ? { detail } : {}), ...(targetPaths.length ? { targetPaths } : {}), ...(typeof cwd === 'string' ? { cwd } : {}) };
23
23
  }
24
- //# sourceMappingURL=tool-event.js.map
@@ -1,4 +1,4 @@
1
- import { type PipelineContext, type VerificationCommand } from '../installer/runtime/pipeline-state.js';
1
+ import { type PipelineContext, type VerificationCommand } from '../pipeline/pipeline-state.js';
2
2
  export interface ProposedCheck {
3
3
  kind: 'command' | 'harness';
4
4
  key: string;
@@ -14,12 +14,12 @@ export interface ProposedCheck {
14
14
  content: string;
15
15
  }>;
16
16
  }
17
- export interface HarnessSource {
17
+ interface HarnessSource {
18
18
  path: string;
19
19
  hash: string;
20
20
  byteCount: number;
21
21
  }
22
- export interface PlanEntry {
22
+ interface PlanEntry {
23
23
  id: string;
24
24
  key: string;
25
25
  label: string;
@@ -31,7 +31,7 @@ export interface PlanEntry {
31
31
  sources: HarnessSource[];
32
32
  };
33
33
  }
34
- export interface VerificationPlan {
34
+ interface VerificationPlan {
35
35
  schemaVersion: 1;
36
36
  runId: string;
37
37
  revision: number;
@@ -53,3 +53,4 @@ export declare function addDeveloperChecks(context: PipelineContext, proposals:
53
53
  export declare function expandedPlanCommands(context: PipelineContext, plan: VerificationPlan): VerificationCommand[];
54
54
  /** Bind the exact manifest and every source to lifecycle gates. */
55
55
  export declare function bindPlan(context: PipelineContext, plan: VerificationPlan): void;
56
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync, statSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { createHash } from 'node:crypto';
4
- import { bindVerificationPlan, pipelineStateDirectory, validateVerificationRequest } from '../installer/runtime/pipeline-state.js';
4
+ import { bindVerificationPlan, pipelineStateDirectory, validateVerificationRequest } from '../pipeline/pipeline-state.js';
5
5
  import { fingerprint } from './durable-store.js';
6
6
  import { child, write } from './graph/artifacts.js';
7
7
  const SAFE_ID = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/;
@@ -203,4 +203,3 @@ export function bindPlan(context, plan) {
203
203
  }
204
204
  bindVerificationPlan(context, plan.planHash, files);
205
205
  }
206
- //# sourceMappingURL=verification-plan.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=workflow-types.js.map
@@ -633,4 +633,3 @@ export async function runWorkflow(options) {
633
633
  await release();
634
634
  }
635
635
  }
636
- //# sourceMappingURL=workflow.js.map
@@ -1,5 +1,5 @@
1
1
  import type { AgentRole } from './executor-types.js';
2
- export interface WorkspaceToolDefinition {
2
+ interface WorkspaceToolDefinition {
3
3
  type: 'function';
4
4
  function: {
5
5
  name: string;
@@ -7,7 +7,6 @@ export interface WorkspaceToolDefinition {
7
7
  parameters: Record<string, unknown>;
8
8
  };
9
9
  }
10
- export declare function isWithinRoot(root: string, file: string): boolean;
11
10
  export declare function canonicalWorkspace(cwd: string, allowedRoots: string[]): {
12
11
  cwd: string;
13
12
  roots: string[];
@@ -27,3 +26,4 @@ export declare class WorkspaceTools {
27
26
  private search;
28
27
  private diff;
29
28
  }
29
+ export {};
@@ -18,7 +18,7 @@ function integer(value, fallback, max) {
18
18
  return value;
19
19
  }
20
20
  function digest(text) { return createHash('sha256').update(text).digest('hex'); }
21
- export function isWithinRoot(root, file) {
21
+ function isWithinRoot(root, file) {
22
22
  const relative = path.relative(root, file);
23
23
  return relative === '' || (!path.isAbsolute(relative) && relative !== '..' && !relative.startsWith('..' + path.sep));
24
24
  }
@@ -279,4 +279,3 @@ export class WorkspaceTools {
279
279
  return JSON.stringify({ untracked: false, diff: '', truncated: false });
280
280
  }
281
281
  }
282
- //# sourceMappingURL=workspace-tools.js.map
@@ -1,35 +1,6 @@
1
1
  /**
2
- * specrails-core CLI entry point (Node / TypeScript).
3
- *
4
- * Replaces the legacy bash-dispatch path in `bin/specrails-core.js`.
5
- * During the port, `bin/specrails-core.js` keeps shelling out to the
6
- * shell scripts while this module carries the in-progress Node
7
- * implementation. Once Phases 2–4 ship the command handlers and
8
- * Phase 5 deletes the shell scripts, the `bin/` dispatcher collapses
9
- * to a single `import { main } from './dist/installer/cli.js'` call.
2
+ * specrails-core CLI: the installer and runtime entry points Desktop drives.
3
+ * `bin/specrails-core.mjs` and a direct `node dist/installer/cli.js` run both
4
+ * land in {@link main}.
10
5
  */
11
- export interface ParsedArgs {
12
- subcommand: string | null;
13
- flags: Record<string, string | boolean>;
14
- positionals: string[];
15
- }
16
- /**
17
- * Minimal arg parser, no external dep. Handles:
18
- * subcommand (first bare positional)
19
- * --flag (boolean true)
20
- * --flag=value (string)
21
- * --flag value (string, consumes next token)
22
- * -h / --help (help alias)
23
- * -v / --version (version alias)
24
- * positionals (everything else)
25
- */
26
- export declare function parseArgs(argv: string[]): ParsedArgs;
27
- /**
28
- * Sentinel exit code used during the port: when a Node command is not
29
- * yet implemented, the CLI exits with this code and the outer bash
30
- * dispatcher (bin/specrails-core.js) may choose to fall through to
31
- * the shell path. Removed entirely in Phase 5 when no shell scripts
32
- * remain.
33
- */
34
- export declare const NOT_IMPLEMENTED = 2;
35
6
  export declare function main(argv?: string[]): Promise<number>;
@@ -1,100 +1,35 @@
1
1
  /**
2
- * specrails-core CLI entry point (Node / TypeScript).
3
- *
4
- * Replaces the legacy bash-dispatch path in `bin/specrails-core.js`.
5
- * During the port, `bin/specrails-core.js` keeps shelling out to the
6
- * shell scripts while this module carries the in-progress Node
7
- * implementation. Once Phases 2–4 ship the command handlers and
8
- * Phase 5 deletes the shell scripts, the `bin/` dispatcher collapses
9
- * to a single `import { main } from './dist/installer/cli.js'` call.
2
+ * specrails-core CLI: the installer and runtime entry points Desktop drives.
3
+ * `bin/specrails-core.mjs` and a direct `node dist/installer/cli.js` run both
4
+ * land in {@link main}.
10
5
  */
11
6
  import { readFileSync, realpathSync } from 'node:fs';
12
7
  import path from 'node:path';
13
8
  import { fileURLToPath, pathToFileURL } from 'node:url';
14
- import { runDoctor } from './commands/doctor.js';
15
9
  import { runAssemble, runInstallFramework, runSwapCurrent, } from './commands/framework.js';
16
10
  import { runInit } from './commands/init.js';
17
- import { runUpdate } from './commands/update.js';
18
- import { runPipelineCommand } from './runtime/pipeline-state.js';
11
+ import { runPipelineCommand } from '../pipeline/pipeline-state.js';
12
+ import { parseArgs } from '../shared/args.js';
19
13
  import { isInstallerError } from './util/errors.js';
20
14
  import { fatal } from './util/logger.js';
21
- /**
22
- * Minimal arg parser, no external dep. Handles:
23
- * subcommand (first bare positional)
24
- * --flag (boolean true)
25
- * --flag=value (string)
26
- * --flag value (string, consumes next token)
27
- * -h / --help (help alias)
28
- * -v / --version (version alias)
29
- * positionals (everything else)
30
- */
31
- export function parseArgs(argv) {
32
- const flags = {};
33
- const positionals = [];
34
- let subcommand = null;
35
- for (let i = 0; i < argv.length; i++) {
36
- const token = argv[i];
37
- if (token.startsWith('--')) {
38
- const rest = token.slice(2);
39
- const eq = rest.indexOf('=');
40
- if (eq >= 0) {
41
- flags[rest.slice(0, eq)] = rest.slice(eq + 1);
42
- }
43
- else {
44
- const peek = argv[i + 1];
45
- if (peek !== undefined && !peek.startsWith('-')) {
46
- flags[rest] = peek;
47
- i++;
48
- }
49
- else {
50
- flags[rest] = true;
51
- }
52
- }
53
- }
54
- else if (token === '-h') {
55
- flags.help = true;
56
- }
57
- else if (token === '-v') {
58
- flags.version = true;
59
- }
60
- else if (token.startsWith('-') && token.length > 1) {
61
- flags[token.slice(1)] = true;
62
- }
63
- else {
64
- if (subcommand === null) {
65
- subcommand = token;
66
- }
67
- else {
68
- positionals.push(token);
69
- }
70
- }
71
- }
72
- return { subcommand, flags, positionals };
73
- }
74
15
  function usageText() {
75
16
  return [
76
17
  '',
77
- 'specrails-core — Provider-independent AI agent workflow system',
18
+ 'specrails-core — agent workflow engine for specrails-desktop',
78
19
  '',
79
20
  'Usage:',
80
21
  ' specrails-core <command> [options]',
81
22
  '',
82
23
  'Commands:',
83
- ' init Install specrails into a repository',
84
- ' update Update an existing specrails installation',
85
- ' pipeline Inspect and execute durable implementation phases',
86
- ' runtime Run, inspect and resume programmatic agents',
87
- ' doctor Diagnose the health of an existing installation',
24
+ ' init Install specrails into a repository (claude, codex, gemini, or kimi)',
88
25
  ' install-framework Materialize the versioned framework (offline)',
89
26
  ' swap-current Point framework/current at a version (offline)',
90
- ' assemble Symlink the framework into a workspace (offline)',
27
+ ' assemble Link the framework into a project workspace (offline)',
28
+ ' pipeline Inspect and verify durable implementation phases',
29
+ ' runtime Run, inspect and resume programmatic agents',
91
30
  ' help Show this help message',
92
31
  ' version Print the installed version',
93
32
  '',
94
- 'Global options:',
95
- ' -h, --help Show this help',
96
- ' -v, --version Print version',
97
- '',
98
33
  ].join('\n');
99
34
  }
100
35
  function readVersion() {
@@ -113,30 +48,15 @@ function readVersion() {
113
48
  return 'unknown';
114
49
  }
115
50
  }
116
- /**
117
- * Sentinel exit code used during the port: when a Node command is not
118
- * yet implemented, the CLI exits with this code and the outer bash
119
- * dispatcher (bin/specrails-core.js) may choose to fall through to
120
- * the shell path. Removed entirely in Phase 5 when no shell scripts
121
- * remain.
122
- */
123
- export const NOT_IMPLEMENTED = 2;
124
- async function dispatch(subcommand, flags, _positionals) {
51
+ async function dispatch(subcommand, flags, positionals) {
125
52
  switch (subcommand) {
126
53
  case 'init':
127
54
  await runInit(flags);
128
55
  return 0;
129
- case 'update':
130
- await runUpdate(flags);
131
- return 0;
132
56
  case 'pipeline':
133
- return runPipelineCommand(flags, _positionals);
57
+ return runPipelineCommand(flags, positionals);
134
58
  case 'runtime':
135
- return (await import('../agent-runtime/cli.js')).runRuntimeCommand(flags, _positionals);
136
- case 'doctor': {
137
- const result = await runDoctor(flags);
138
- return result.failed === 0 ? 0 : 1;
139
- }
59
+ return (await import('../agent-runtime/cli.js')).runRuntimeCommand(flags, positionals);
140
60
  case 'install-framework':
141
61
  await runInstallFramework(flags);
142
62
  return 0;
@@ -147,7 +67,6 @@ async function dispatch(subcommand, flags, _positionals) {
147
67
  await runAssemble(flags);
148
68
  return 0;
149
69
  case 'help':
150
- case '':
151
70
  process.stdout.write(usageText());
152
71
  return 0;
153
72
  case 'version':
@@ -161,16 +80,23 @@ async function dispatch(subcommand, flags, _positionals) {
161
80
  }
162
81
  export async function main(argv = process.argv.slice(2)) {
163
82
  const { subcommand, flags, positionals } = parseArgs(argv);
164
- if (flags.help === true) {
83
+ // `--version` is global only before a command: `swap-current --version <v>`
84
+ // names a framework version.
85
+ if (subcommand === null) {
86
+ if (flags.version === true || flags.V === true) {
87
+ process.stdout.write(`${readVersion()}\n`);
88
+ return 0;
89
+ }
165
90
  process.stdout.write(usageText());
166
91
  return 0;
167
92
  }
168
- if (flags.version === true) {
169
- process.stdout.write(`${readVersion()}\n`);
93
+ // `init --help` must print help, never install.
94
+ if (flags.help === true && subcommand !== 'runtime') {
95
+ process.stdout.write(usageText());
170
96
  return 0;
171
97
  }
172
98
  try {
173
- return await dispatch(subcommand ?? '', flags, positionals);
99
+ return await dispatch(subcommand, flags, positionals);
174
100
  }
175
101
  catch (err) {
176
102
  if (isInstallerError(err)) {
@@ -187,8 +113,8 @@ export async function main(argv = process.argv.slice(2)) {
187
113
  * (`node dist/installer/cli.js <subcommand>`), run `main()` and propagate its
188
114
  * exit code. specrails-desktop's bundled-core path (server/framework-manager.ts)
189
115
  * spawns `node <core>/dist/installer/cli.js install-framework|assemble …` and
190
- * relies on this — the legacy bin dispatcher (bin/specrails-core.mjs) imports
191
- * `main` and is unaffected (it never executes this file as argv[1]).
116
+ * relies on this — `bin/specrails-core.mjs` imports `main` and is unaffected
117
+ * (it never executes this file as argv[1]).
192
118
  *
193
119
  * Comparing `import.meta.url` against `process.argv[1]` keeps the guard inert on
194
120
  * import (so unit tests that `import { main }` never trigger a process.exit).
@@ -219,4 +145,3 @@ if (isDirectRun) {
219
145
  process.exitCode = code;
220
146
  });
221
147
  }
222
- //# sourceMappingURL=cli.js.map
@@ -40,7 +40,7 @@ export interface AssembleFlags {
40
40
  /** Comma-separated per-project agent allow-list (links a subset of the superset). */
41
41
  'selected-agents'?: string | boolean;
42
42
  }
43
- export interface InstallFrameworkOutcome {
43
+ interface InstallFrameworkOutcome {
44
44
  frameworkDir: string;
45
45
  provider: Provider;
46
46
  version: string;
@@ -48,13 +48,13 @@ export interface InstallFrameworkOutcome {
48
48
  /** True when `current` was swapped to `<version>` this call. */
49
49
  swapped: boolean;
50
50
  }
51
- export interface SwapCurrentOutcome {
51
+ interface SwapCurrentOutcome {
52
52
  frameworkDir: string;
53
53
  version: string;
54
54
  /** Complete provider set validated before the pointer was moved. */
55
55
  providers: Provider[];
56
56
  }
57
- export interface AssembleOutcome {
57
+ interface AssembleOutcome {
58
58
  workspace: string;
59
59
  frameworkDir: string;
60
60
  provider: Provider;
@@ -83,3 +83,4 @@ export declare function runSwapCurrent(flags: SwapCurrentFlags): Promise<SwapCur
83
83
  export declare function runAssemble(flags: AssembleFlags): Promise<AssembleOutcome>;
84
84
  /** Read the package version (the version the desktop should materialize). */
85
85
  export declare function readPackageVersion(scriptDir?: string): string;
86
+ export {};
@@ -186,4 +186,3 @@ export function readPackageVersion(scriptDir) {
186
186
  return 'unknown';
187
187
  }
188
188
  }
189
- //# sourceMappingURL=framework.js.map
@@ -2,8 +2,7 @@ import { type Provider } from '../phases/install-config.js';
2
2
  /**
3
3
  * `npx specrails-core init` entry point.
4
4
  *
5
- * Flags consumed (must remain in sync with ALLOWED_FLAGS in
6
- * bin/specrails-core.cjs until Phase 5):
5
+ * Flags consumed:
7
6
  * --root-dir <path> Target repo (default: cwd)
8
7
  * --yes / -y Non-interactive; auto-init git + accept defaults
9
8
  * --provider <name> Force provider (claude, codex, gemini, or kimi)
@@ -26,11 +25,11 @@ export interface InitFlags {
26
25
  relocate?: boolean;
27
26
  'hub-json'?: boolean;
28
27
  }
29
- export interface InitResult {
28
+ interface InitResult {
30
29
  repoRoot: string;
31
30
  provider: Provider;
32
31
  }
33
- export type WorkspaceProviderSelections = Partial<Record<Provider, string[]>>;
32
+ type WorkspaceProviderSelections = Partial<Record<Provider, string[]>>;
34
33
  /**
35
34
  * Snapshot the provider/role inventory exposed by one live workspace before a
36
35
  * global framework version swap. This matters on Windows: directory junctions
@@ -40,25 +39,6 @@ export type WorkspaceProviderSelections = Partial<Record<Provider, string[]>>;
40
39
  * optional role selection during that refresh.
41
40
  */
42
41
  export declare function snapshotWorkspaceProviderSelections(workspace: string): WorkspaceProviderSelections;
43
- interface ReassembleWorkspaceProvidersInput {
44
- workspace: string;
45
- frameworkDir: string;
46
- version: string;
47
- codeRoot: string;
48
- scriptDir: string;
49
- selectedProvider: Provider;
50
- selectedAgents?: string[];
51
- previousSelections: WorkspaceProviderSelections;
52
- copyStatics: boolean;
53
- }
54
- /**
55
- * Refresh every provider already represented in the project plus the provider
56
- * selected by the current operation. POSIX symlinks continue to follow
57
- * `framework/current`; Windows junctions do not reliably preserve that
58
- * indirection, so rebuilding all live links is required for true
59
- * multi-provider version parity.
60
- */
61
- export declare function reassembleWorkspaceProviders(input: ReassembleWorkspaceProvidersInput): Provider[];
62
42
  /**
63
43
  * Entry called by cli.ts. Returns a {@link InitResult} on success;
64
44
  * throws a typed error (translated to an exit code by the outer CLI)
@@ -72,7 +52,7 @@ export declare function runInit(flags: InitFlags): Promise<InitResult>;
72
52
  * points at the v5 extension path.
73
53
  */
74
54
  export declare function warnUnknownSelectedAgents(selected: string[] | undefined): void;
75
- export interface EnsureFrameworkInput {
55
+ interface EnsureFrameworkInput {
76
56
  scriptDir: string;
77
57
  frameworkDir: string;
78
58
  provider: Provider;
@@ -143,5 +123,4 @@ export declare const KIMI_REQUIRED_OPENSPEC_SKILLS: readonly ["openspec-propose"
143
123
  */
144
124
  export declare function normalizeKimiOpenSpecSkills(repoRoot: string, artifactRoot: string): string[];
145
125
  export declare function normalizeGeminiOpenSpecSkills(repoRoot: string, artifactRoot: string): string[];
146
- export declare function installOpenSpecProject(repoRoot: string, provider: Provider, artifactRoot?: string): Promise<void>;
147
126
  export {};
@@ -97,7 +97,7 @@ function workspaceHasManagedProviderLink(providerRoot, provider) {
97
97
  * indirection, so rebuilding all live links is required for true
98
98
  * multi-provider version parity.
99
99
  */
100
- export function reassembleWorkspaceProviders(input) {
100
+ function reassembleWorkspaceProviders(input) {
101
101
  const providers = WORKSPACE_PROVIDER_ORDER.filter((provider) => provider === input.selectedProvider ||
102
102
  Object.prototype.hasOwnProperty.call(input.previousSelections, provider));
103
103
  for (const provider of providers) {
@@ -129,9 +129,8 @@ export async function runInit(flags) {
129
129
  const repoRoot = path.resolve(typeof flags['root-dir'] === 'string' ? flags['root-dir'] : process.cwd());
130
130
  const autoYes = flags.yes === true || flags.y === true;
131
131
  const skipPrereqs = process.env.SPECRAILS_SKIP_PREREQS === '1';
132
- // Validate an explicit provider before consulting --from-config. The TUI
133
- // intentionally re-enters init with BOTH flags; accepting that flow is safe
134
- // only when the generated config agrees with the original explicit choice.
132
+ // Validate an explicit provider before consulting --from-config; when both
133
+ // are given, the config must agree with the explicit choice.
135
134
  let explicitProvider;
136
135
  if (flags.provider !== undefined) {
137
136
  if (typeof flags.provider !== 'string' ||
@@ -257,7 +256,6 @@ export async function runInit(flags) {
257
256
  recordSuccessfulInstall(repoRoot, { home: process.env.SPECRAILS_REGISTRY_HOME, providers: [prereqs.provider], coreVersion: version });
258
257
  step('Installation complete');
259
258
  info('Agents, commands, and rules were placed directly — no follow-up step required.');
260
- info('Extend the core trio (sr-architect, sr-developer, sr-reviewer) via profiles + custom-*.md agents.');
261
259
  // Terminal sentinel for programmatic consumers (specrails-desktop's setup
262
260
  // wizard matches this exact line via regex to mark the "init complete"
263
261
  // checkpoint). The sentinel line below is FROZEN — the downstream setup
@@ -282,7 +280,7 @@ export function warnUnknownSelectedAgents(selected) {
282
280
  for (const id of selected) {
283
281
  if (!CORE_AGENTS.has(id)) {
284
282
  warn(`install-config.yaml selects agent '${id}', which specrails-core no longer ships — ` +
285
- `skipping (removed in v5; use a .claude/agents/custom-*.md agent declared in a profile).`);
283
+ `skipping (removed in v5).`);
286
284
  }
287
285
  }
288
286
  }
@@ -658,7 +656,7 @@ function removeDirectoryIfEmpty(dir) {
658
656
  if (isDir(dir) && listDir(dir).length === 0)
659
657
  removePath(dir);
660
658
  }
661
- export async function installOpenSpecProject(repoRoot, provider, artifactRoot = repoRoot) {
659
+ async function installOpenSpecProject(repoRoot, provider, artifactRoot = repoRoot) {
662
660
  if (process.env.SPECRAILS_SKIP_OPENSPEC_INIT === '1') {
663
661
  if (provider === 'kimi') {
664
662
  const generatedRoots = [
@@ -709,4 +707,3 @@ export async function installOpenSpecProject(repoRoot, provider, artifactRoot =
709
707
  }
710
708
  }
711
709
  }
712
- //# sourceMappingURL=init.js.map
@@ -1,30 +1,15 @@
1
1
  import { type Provider } from './provider-detect.js';
2
- /**
3
- * Stable provider order for the global framework store. `framework/current` is
4
- * shared by every relocated workspace, so a version transition must carry
5
- * forward every provider that can still have live links through that pointer.
6
- */
7
- export declare const FRAMEWORK_PROVIDERS: readonly Provider[];
8
- export interface ResolveRequiredFrameworkProvidersInput {
2
+ interface ResolveRequiredFrameworkProvidersInput {
9
3
  frameworkDir: string;
10
4
  /** Providers requested by the lifecycle operation that is about to swap. */
11
5
  requested?: readonly Provider[];
12
6
  /** Registry home. Defaults to SPECRAILS_REGISTRY_HOME / the normal home. */
13
7
  registryHome?: string;
14
8
  }
15
- export interface MaterializeFrameworkVersionInput extends ResolveRequiredFrameworkProvidersInput {
9
+ interface MaterializeFrameworkVersionInput extends ResolveRequiredFrameworkProvidersInput {
16
10
  scriptDir: string;
17
11
  version: string;
18
12
  }
19
- /**
20
- * Discover providers represented by a framework version.
21
- *
22
- * A provider is included when either its subtree or its stamp exists. For the
23
- * current version this is deliberately conservative: an interrupted/legacy
24
- * materialization without a stamp may still have live workspace symlinks, so
25
- * the next version must carry that provider forward rather than dropping it.
26
- */
27
- export declare function discoverFrameworkProviders(frameworkDir: string, version: string): Provider[];
28
13
  /**
29
14
  * Compute the provider set that MUST exist in a destination version before the
30
15
  * process may move the global `current` pointer:
@@ -51,3 +36,4 @@ export declare function assertFrameworkVersionComplete(frameworkDir: string, ver
51
36
  * fails, existing workspaces continue resolving through the previous version.
52
37
  */
53
38
  export declare function materializeFrameworkVersion(input: MaterializeFrameworkVersionInput): Provider[];
39
+ export {};
@@ -10,7 +10,7 @@ import { ensureCurrentSymlink, frameworkMaterializationProblem, frameworkStampPa
10
10
  * shared by every relocated workspace, so a version transition must carry
11
11
  * forward every provider that can still have live links through that pointer.
12
12
  */
13
- export const FRAMEWORK_PROVIDERS = [
13
+ const FRAMEWORK_PROVIDERS = [
14
14
  'claude',
15
15
  'codex',
16
16
  'gemini',
@@ -34,7 +34,7 @@ function stableProviders(values) {
34
34
  * materialization without a stamp may still have live workspace symlinks, so
35
35
  * the next version must carry that provider forward rather than dropping it.
36
36
  */
37
- export function discoverFrameworkProviders(frameworkDir, version) {
37
+ function discoverFrameworkProviders(frameworkDir, version) {
38
38
  const versionDir = path.join(frameworkDir, version);
39
39
  return FRAMEWORK_PROVIDERS.filter((provider) => {
40
40
  const { providerDir } = derivedPaths(provider);
@@ -124,4 +124,3 @@ export function materializeFrameworkVersion(input) {
124
124
  ensureCurrentSymlink(input.frameworkDir, input.version);
125
125
  return required;
126
126
  }
127
- //# sourceMappingURL=framework-lifecycle.js.map
@@ -4,9 +4,9 @@ import { InstallerError } from '../util/errors.js';
4
4
  */
5
5
  export type Provider = 'claude' | 'codex' | 'gemini' | 'kimi';
6
6
  /** Cost / capability preset for the model picker. */
7
- export type ModelPreset = 'balanced' | 'budget' | 'max';
7
+ type ModelPreset = 'balanced' | 'budget' | 'max';
8
8
  /** Provider-native model selection retained verbatim in install-config.yaml. */
9
- export interface InstallModelConfig {
9
+ interface InstallModelConfig {
10
10
  preset: ModelPreset;
11
11
  defaults: {
12
12
  model: string;
@@ -14,11 +14,10 @@ export interface InstallModelConfig {
14
14
  overrides: Record<string, string>;
15
15
  }
16
16
  /**
17
- * Shape of the `.specrails/install-config.yaml` file — the single
18
- * source of truth the TUI writes and the installer reads. Fields map
19
- * 1:1 onto the grep-based parser in the retired install.sh.
17
+ * Shape of the `.specrails/install-config.yaml` file that
18
+ * specrails-desktop writes and `init --from-config` reads.
20
19
  */
21
- export interface InstallConfig {
20
+ interface InstallConfig {
22
21
  version: 1;
23
22
  provider: Provider;
24
23
  agents: {
@@ -52,8 +51,7 @@ export declare function resolveConfigPath(repoRoot: string, explicit?: string):
52
51
  export declare function loadInstallConfig(configPath: string): InstallConfig | null;
53
52
  /**
54
53
  * Validates an already-parsed YAML document. Collects every error
55
- * before throwing so the user sees them all at once (matches the
56
- * bash installer's `_config_errors` accumulator behaviour).
54
+ * before throwing so the user sees them all at once.
57
55
  */
58
56
  export declare function validateInstallConfig(raw: unknown): InstallConfig;
59
57
  /**
@@ -62,3 +60,4 @@ export declare function validateInstallConfig(raw: unknown): InstallConfig;
62
60
  * paths (not wired yet) and by tests.
63
61
  */
64
62
  export declare function writeInstallConfig(configPath: string, config: InstallConfig): void;
63
+ export {};
@@ -36,10 +36,7 @@ export function resolveProviderModelConfig(provider, preset = 'balanced') {
36
36
  return {
37
37
  preset,
38
38
  defaults: { model: 'sonnet' },
39
- overrides: {
40
- 'sr-architect': 'opus',
41
- 'sr-product-manager': 'opus',
42
- },
39
+ overrides: { 'sr-architect': 'opus' },
43
40
  };
44
41
  }
45
42
  }
@@ -86,8 +83,7 @@ export function loadInstallConfig(configPath) {
86
83
  }
87
84
  /**
88
85
  * Validates an already-parsed YAML document. Collects every error
89
- * before throwing so the user sees them all at once (matches the
90
- * bash installer's `_config_errors` accumulator behaviour).
86
+ * before throwing so the user sees them all at once.
91
87
  */
92
88
  export function validateInstallConfig(raw) {
93
89
  const errors = [];
@@ -262,4 +258,3 @@ export function writeInstallConfig(configPath, config) {
262
258
  throw new FilesystemError(`failed to write install-config.yaml: ${err.message}`, configPath);
263
259
  }
264
260
  }
265
- //# sourceMappingURL=install-config.js.map