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.
- package/README.md +27 -145
- package/bin/specrails-core.mjs +12 -554
- package/dist/agent-runtime/capabilities.js +0 -1
- package/dist/agent-runtime/cli-executor.d.ts +1 -1
- package/dist/agent-runtime/cli-executor.js +4 -3
- package/dist/agent-runtime/cli-process.js +0 -1
- package/dist/agent-runtime/cli.d.ts +8 -0
- package/dist/agent-runtime/cli.js +31 -5
- package/dist/agent-runtime/codex-schema.js +0 -1
- package/dist/agent-runtime/compact/architect.d.ts +3 -272
- package/dist/agent-runtime/compact/architect.js +8 -9
- package/dist/agent-runtime/compact/chat-client.d.ts +3 -3
- package/dist/agent-runtime/compact/chat-client.js +1 -2
- package/dist/agent-runtime/compact/developer.d.ts +3 -70
- package/dist/agent-runtime/compact/developer.js +13 -14
- package/dist/agent-runtime/compact/environment.d.ts +4 -5
- package/dist/agent-runtime/compact/environment.js +1 -2
- package/dist/agent-runtime/compact/exit-code-honesty.d.ts +2 -1
- package/dist/agent-runtime/compact/exit-code-honesty.js +0 -1
- package/dist/agent-runtime/compact/guarded-loop.d.ts +2 -18
- package/dist/agent-runtime/compact/guarded-loop.js +7 -8
- package/dist/agent-runtime/compact/prompt-inputs.d.ts +0 -2
- package/dist/agent-runtime/compact/prompt-inputs.js +1 -2
- package/dist/agent-runtime/compact/reviewer.d.ts +0 -13
- package/dist/agent-runtime/compact/reviewer.js +5 -6
- package/dist/agent-runtime/compact/step.d.ts +0 -1
- package/dist/agent-runtime/compact/step.js +1 -2
- package/dist/agent-runtime/compact/test-reachability.js +0 -1
- package/dist/agent-runtime/config.js +0 -1
- package/dist/agent-runtime/core-host.d.ts +1 -1
- package/dist/agent-runtime/core-host.js +5 -3
- package/dist/agent-runtime/durable-store.d.ts +0 -1
- package/dist/agent-runtime/durable-store.js +1 -2
- package/dist/agent-runtime/efficiency-summary.d.ts +2 -2
- package/dist/agent-runtime/efficiency-summary.js +1 -2
- package/dist/agent-runtime/efficiency-types.js +0 -1
- package/dist/agent-runtime/efficiency.js +0 -1
- package/dist/agent-runtime/evaluation-corpus.js +0 -1
- package/dist/agent-runtime/evaluation.d.ts +2 -1
- package/dist/agent-runtime/evaluation.js +1 -2
- package/dist/agent-runtime/executor-types.d.ts +1 -1
- package/dist/agent-runtime/executor-types.js +0 -1
- package/dist/agent-runtime/executors.js +0 -1
- package/dist/agent-runtime/gemini-policy.js +0 -1
- package/dist/agent-runtime/graph/artifacts.d.ts +1 -1
- package/dist/agent-runtime/graph/artifacts.js +11 -5
- package/dist/agent-runtime/graph/nodes.d.ts +1 -1
- package/dist/agent-runtime/graph/nodes.js +1 -2
- package/dist/agent-runtime/graph/review-policy.js +0 -1
- package/dist/agent-runtime/graph/roles.d.ts +2 -5
- package/dist/agent-runtime/graph/roles.js +2 -8
- package/dist/agent-runtime/graph/state.d.ts +1 -1
- package/dist/agent-runtime/graph/state.js +0 -1
- package/dist/agent-runtime/graph-checkpointer.d.ts +2 -1
- package/dist/agent-runtime/graph-checkpointer.js +0 -1
- package/dist/agent-runtime/guardrails.d.ts +3 -3
- package/dist/agent-runtime/guardrails.js +1 -2
- package/dist/agent-runtime/index.d.ts +2 -1
- package/dist/agent-runtime/index.js +2 -2
- package/dist/agent-runtime/kimi-acp.js +1 -2
- package/dist/agent-runtime/kimi-model.d.ts +6 -0
- package/dist/agent-runtime/kimi-model.js +12 -0
- package/dist/agent-runtime/openai-executor.d.ts +0 -9
- package/dist/agent-runtime/openai-executor.js +6 -7
- package/dist/agent-runtime/openspec-tool-server.js +1 -2
- package/dist/agent-runtime/openspec.d.ts +0 -2
- package/dist/agent-runtime/openspec.js +3 -7
- package/dist/agent-runtime/prompts.d.ts +4 -3
- package/dist/agent-runtime/prompts.js +0 -1
- package/dist/agent-runtime/provider-diagnostic.js +1 -2
- package/dist/agent-runtime/recovery.d.ts +46 -0
- package/dist/agent-runtime/recovery.js +169 -0
- package/dist/agent-runtime/repository-context.d.ts +1 -1
- package/dist/agent-runtime/repository-context.js +0 -1
- package/dist/agent-runtime/review-context.d.ts +1 -1
- package/dist/agent-runtime/review-context.js +0 -1
- package/dist/agent-runtime/role-routing.js +0 -1
- package/dist/agent-runtime/role-state.js +0 -1
- package/dist/agent-runtime/runtime-identity.js +1 -2
- package/dist/agent-runtime/tool-event.js +0 -1
- package/dist/agent-runtime/verification-plan.d.ts +5 -4
- package/dist/agent-runtime/verification-plan.js +1 -2
- package/dist/agent-runtime/workflow-types.js +0 -1
- package/dist/agent-runtime/workflow.js +0 -1
- package/dist/agent-runtime/workspace-tools.d.ts +2 -2
- package/dist/agent-runtime/workspace-tools.js +1 -2
- package/dist/installer/cli.d.ts +3 -32
- package/dist/installer/cli.js +26 -101
- package/dist/installer/commands/framework.d.ts +4 -3
- package/dist/installer/commands/framework.js +0 -1
- package/dist/installer/commands/init.d.ts +4 -25
- package/dist/installer/commands/init.js +5 -8
- package/dist/installer/phases/framework-lifecycle.d.ts +3 -17
- package/dist/installer/phases/framework-lifecycle.js +2 -3
- package/dist/installer/phases/install-config.d.ts +7 -8
- package/dist/installer/phases/install-config.js +2 -7
- package/dist/installer/phases/manifest.d.ts +6 -7
- package/dist/installer/phases/manifest.js +2 -7
- package/dist/installer/phases/prereqs.d.ts +6 -7
- package/dist/installer/phases/prereqs.js +4 -6
- package/dist/installer/phases/provider-detect.d.ts +6 -7
- package/dist/installer/phases/provider-detect.js +2 -4
- package/dist/installer/phases/scaffold.d.ts +9 -10
- package/dist/installer/phases/scaffold.js +82 -805
- package/dist/installer/util/errors.js +0 -1
- package/dist/installer/util/exec.d.ts +3 -2
- package/dist/installer/util/exec.js +0 -1
- package/dist/installer/util/fs.d.ts +0 -10
- package/dist/installer/util/fs.js +1 -2
- package/dist/installer/util/git.js +0 -1
- package/dist/installer/util/install-transaction.d.ts +2 -2
- package/dist/installer/util/install-transaction.js +1 -2
- package/dist/installer/util/logger.d.ts +1 -3
- package/dist/installer/util/logger.js +0 -1
- package/dist/installer/util/paths.js +0 -1
- package/dist/installer/util/registry.d.ts +4 -8
- package/dist/installer/util/registry.js +2 -3
- package/dist/{installer/runtime → pipeline}/pipeline-state.js +0 -3
- package/dist/shared/args.d.ts +18 -0
- package/dist/shared/args.js +53 -0
- package/integration-contract.json +10 -46
- package/package.json +3 -10
- package/templates/agents/sr-architect.md +15 -310
- package/templates/agents/sr-developer.md +15 -269
- package/templates/agents/sr-reviewer.md +13 -367
- package/templates/codex-skills/rails/sr-architect/SKILL.md +14 -308
- package/templates/codex-skills/rails/sr-developer/SKILL.md +14 -201
- package/templates/codex-skills/rails/sr-reviewer/SKILL.md +15 -289
- package/templates/kimi/specrails/run-skill.mjs +91 -2173
- package/bin/tui-installer.mjs +0 -430
- package/commands/doctor.md +0 -62
- package/dist/agent-runtime/capabilities.js.map +0 -1
- package/dist/agent-runtime/cli-executor.js.map +0 -1
- package/dist/agent-runtime/cli-process.js.map +0 -1
- package/dist/agent-runtime/cli.js.map +0 -1
- package/dist/agent-runtime/codex-schema.js.map +0 -1
- package/dist/agent-runtime/compact/architect.js.map +0 -1
- package/dist/agent-runtime/compact/chat-client.js.map +0 -1
- package/dist/agent-runtime/compact/developer.js.map +0 -1
- package/dist/agent-runtime/compact/environment.js.map +0 -1
- package/dist/agent-runtime/compact/exit-code-honesty.js.map +0 -1
- package/dist/agent-runtime/compact/guarded-loop.js.map +0 -1
- package/dist/agent-runtime/compact/prompt-inputs.js.map +0 -1
- package/dist/agent-runtime/compact/reviewer.js.map +0 -1
- package/dist/agent-runtime/compact/step.js.map +0 -1
- package/dist/agent-runtime/compact/test-reachability.js.map +0 -1
- package/dist/agent-runtime/config.js.map +0 -1
- package/dist/agent-runtime/core-host.js.map +0 -1
- package/dist/agent-runtime/durable-store.js.map +0 -1
- package/dist/agent-runtime/efficiency-summary.js.map +0 -1
- package/dist/agent-runtime/efficiency-types.js.map +0 -1
- package/dist/agent-runtime/efficiency.js.map +0 -1
- package/dist/agent-runtime/evaluation-corpus.js.map +0 -1
- package/dist/agent-runtime/evaluation.js.map +0 -1
- package/dist/agent-runtime/executor-types.js.map +0 -1
- package/dist/agent-runtime/executors.js.map +0 -1
- package/dist/agent-runtime/gemini-policy.js.map +0 -1
- package/dist/agent-runtime/graph/artifacts.js.map +0 -1
- package/dist/agent-runtime/graph/nodes.js.map +0 -1
- package/dist/agent-runtime/graph/review-policy.js.map +0 -1
- package/dist/agent-runtime/graph/roles.js.map +0 -1
- package/dist/agent-runtime/graph/state.js.map +0 -1
- package/dist/agent-runtime/graph-checkpointer.js.map +0 -1
- package/dist/agent-runtime/guardrails.js.map +0 -1
- package/dist/agent-runtime/index.js.map +0 -1
- package/dist/agent-runtime/kimi-acp.js.map +0 -1
- package/dist/agent-runtime/openai-executor.js.map +0 -1
- package/dist/agent-runtime/openspec-tool-server.js.map +0 -1
- package/dist/agent-runtime/openspec.js.map +0 -1
- package/dist/agent-runtime/prompts.js.map +0 -1
- package/dist/agent-runtime/provider-diagnostic.js.map +0 -1
- package/dist/agent-runtime/repository-context.js.map +0 -1
- package/dist/agent-runtime/review-context.js.map +0 -1
- package/dist/agent-runtime/role-routing.js.map +0 -1
- package/dist/agent-runtime/role-state.js.map +0 -1
- package/dist/agent-runtime/runtime-identity.js.map +0 -1
- package/dist/agent-runtime/tool-event.js.map +0 -1
- package/dist/agent-runtime/verification-plan.js.map +0 -1
- package/dist/agent-runtime/workflow-types.js.map +0 -1
- package/dist/agent-runtime/workflow.js.map +0 -1
- package/dist/agent-runtime/workspace-tools.js.map +0 -1
- package/dist/installer/cli.js.map +0 -1
- package/dist/installer/commands/doctor.d.ts +0 -27
- package/dist/installer/commands/doctor.js +0 -615
- package/dist/installer/commands/doctor.js.map +0 -1
- package/dist/installer/commands/framework.js.map +0 -1
- package/dist/installer/commands/init.js.map +0 -1
- package/dist/installer/commands/update.d.ts +0 -56
- package/dist/installer/commands/update.js +0 -257
- package/dist/installer/commands/update.js.map +0 -1
- package/dist/installer/commands/v5-migration.d.ts +0 -32
- package/dist/installer/commands/v5-migration.js +0 -133
- package/dist/installer/commands/v5-migration.js.map +0 -1
- package/dist/installer/phases/framework-lifecycle.js.map +0 -1
- package/dist/installer/phases/install-config.js.map +0 -1
- package/dist/installer/phases/manifest.js.map +0 -1
- package/dist/installer/phases/prereqs.js.map +0 -1
- package/dist/installer/phases/provider-detect.js.map +0 -1
- package/dist/installer/phases/scaffold.js.map +0 -1
- package/dist/installer/runtime/kimi.d.ts +0 -84
- package/dist/installer/runtime/kimi.js +0 -255
- package/dist/installer/runtime/kimi.js.map +0 -1
- package/dist/installer/runtime/pipeline-state.js.map +0 -1
- package/dist/installer/util/errors.js.map +0 -1
- package/dist/installer/util/exec.js.map +0 -1
- package/dist/installer/util/fs.js.map +0 -1
- package/dist/installer/util/git.js.map +0 -1
- package/dist/installer/util/install-transaction.js.map +0 -1
- package/dist/installer/util/logger.js.map +0 -1
- package/dist/installer/util/paths.js.map +0 -1
- package/dist/installer/util/prompts.d.ts +0 -23
- package/dist/installer/util/prompts.js +0 -49
- package/dist/installer/util/prompts.js.map +0 -1
- package/dist/installer/util/registry.js.map +0 -1
- package/dist/installer/util/template.d.ts +0 -23
- package/dist/installer/util/template.js +0 -60
- package/dist/installer/util/template.js.map +0 -1
- package/docs/README.md +0 -40
- package/docs/agent-runtime-efficiency.md +0 -65
- package/docs/agent-runtime.md +0 -347
- package/docs/agents.md +0 -315
- package/docs/changelog.md +0 -168
- package/docs/ci-cd.md +0 -60
- package/docs/concepts.md +0 -183
- package/docs/customization.md +0 -363
- package/docs/deployment.md +0 -234
- package/docs/getting-started.md +0 -122
- package/docs/installation.md +0 -395
- package/docs/local-tickets.md +0 -191
- package/docs/migration-guide.md +0 -140
- package/docs/playbook-oss-maintainer.md +0 -112
- package/docs/playbook-parallel-dev.md +0 -124
- package/docs/playbook-product-discovery.md +0 -115
- package/docs/plugin-architecture.md +0 -144
- package/docs/research/codex-compatibility-analysis.md +0 -365
- package/docs/research/mcp-feasibility-analysis.md +0 -382
- package/docs/testing/test-matrix-codex.md +0 -130
- package/docs/updating.md +0 -89
- package/docs/user-docs/cli-reference.md +0 -428
- package/docs/user-docs/codex-vs-claude-code.md +0 -23
- package/docs/user-docs/core-updates.md +0 -70
- package/docs/user-docs/faq.md +0 -146
- package/docs/user-docs/getting-started-codex.md +0 -194
- package/docs/user-docs/getting-started-kimi.md +0 -423
- package/docs/user-docs/installation.md +0 -237
- package/docs/user-docs/provider-pipelines.md +0 -96
- package/docs/user-docs/quick-start.md +0 -161
- package/docs/windows.md +0 -78
- package/docs/workflows.md +0 -463
- package/schemas/profile.v1.json +0 -207
- package/templates/claude-md/CLAUDE-quickstart.md +0 -54
- package/templates/claude-md/root.md +0 -50
- package/templates/codex-skills/batch-implement/SKILL.md +0 -38
- package/templates/codex-skills/implement/SKILL.md +0 -38
- package/templates/codex-skills/retry/SKILL.md +0 -16
- package/templates/commands/specrails/compat-check.md +0 -271
- package/templates/commands/specrails/doctor.md +0 -62
- package/templates/commands/specrails/explore-spec.md +0 -173
- package/templates/commands/specrails/health-check.md +0 -527
- package/templates/commands/specrails/memory-inspect.md +0 -261
- package/templates/commands/specrails/opsx-diff.md +0 -419
- package/templates/commands/specrails/propose-spec.md +0 -102
- package/templates/commands/specrails/refactor-recommender.md +0 -169
- package/templates/commands/specrails/telemetry.md +0 -552
- package/templates/commands/specrails/why.md +0 -96
- package/templates/gemini-commands/batch-implement.toml +0 -37
- package/templates/gemini-commands/implement.toml +0 -37
- package/templates/gemini-commands/retry.toml +0 -15
- package/templates/profiles/default.json +0 -14
- package/templates/profiles/kimi-default.json +0 -15
- package/templates/rules/layer.md +0 -8
- package/templates/runtime/provider-pipeline.md +0 -113
- package/templates/security/security-exemptions.yaml +0 -20
- package/templates/settings/confidence-config.json +0 -17
- package/templates/settings/settings.json +0 -15
- /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', '
|
|
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 '../
|
|
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
|
-
|
|
17
|
+
interface HarnessSource {
|
|
18
18
|
path: string;
|
|
19
19
|
hash: string;
|
|
20
20
|
byteCount: number;
|
|
21
21
|
}
|
|
22
|
-
|
|
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
|
-
|
|
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 '../
|
|
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,5 +1,5 @@
|
|
|
1
1
|
import type { AgentRole } from './executor-types.js';
|
|
2
|
-
|
|
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
|
-
|
|
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
|
package/dist/installer/cli.d.ts
CHANGED
|
@@ -1,35 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* specrails-core CLI entry
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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>;
|
package/dist/installer/cli.js
CHANGED
|
@@ -1,100 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* specrails-core CLI entry
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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 {
|
|
18
|
-
import {
|
|
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 —
|
|
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
|
|
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,
|
|
57
|
+
return runPipelineCommand(flags, positionals);
|
|
134
58
|
case 'runtime':
|
|
135
|
-
return (await import('../agent-runtime/cli.js')).runRuntimeCommand(flags,
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
|
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 —
|
|
191
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {};
|
|
@@ -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
|
|
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
|
-
|
|
28
|
+
interface InitResult {
|
|
30
29
|
repoRoot: string;
|
|
31
30
|
provider: Provider;
|
|
32
31
|
}
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
133
|
-
//
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7
|
+
type ModelPreset = 'balanced' | 'budget' | 'max';
|
|
8
8
|
/** Provider-native model selection retained verbatim in install-config.yaml. */
|
|
9
|
-
|
|
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
|
|
18
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|