@specforge/mcp 3.0.7 → 3.1.1
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/dist/autopilot/agents/agent-runner.d.ts.map +1 -1
- package/dist/autopilot/agents/agent-runner.js +7 -0
- package/dist/autopilot/agents/agent-runner.js.map +1 -1
- package/dist/autopilot/api/autopilot-api-client.d.ts +5 -4
- package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -1
- package/dist/autopilot/api/autopilot-api-client.js +21 -26
- package/dist/autopilot/api/autopilot-api-client.js.map +1 -1
- package/dist/autopilot/cli/run.d.ts.map +1 -1
- package/dist/autopilot/cli/run.js +28 -0
- package/dist/autopilot/cli/run.js.map +1 -1
- package/dist/autopilot/core/dependency-resolver.d.ts +10 -1
- package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -1
- package/dist/autopilot/core/dependency-resolver.js +27 -1
- package/dist/autopilot/core/dependency-resolver.js.map +1 -1
- package/dist/autopilot/core/dispatcher.d.ts +26 -0
- package/dist/autopilot/core/dispatcher.d.ts.map +1 -1
- package/dist/autopilot/core/dispatcher.js +116 -6
- package/dist/autopilot/core/dispatcher.js.map +1 -1
- package/dist/autopilot/readiness/aggregation.d.ts +56 -0
- package/dist/autopilot/readiness/aggregation.d.ts.map +1 -0
- package/dist/autopilot/readiness/aggregation.js +94 -0
- package/dist/autopilot/readiness/aggregation.js.map +1 -0
- package/dist/autopilot/readiness/config.d.ts +15 -0
- package/dist/autopilot/readiness/config.d.ts.map +1 -0
- package/dist/autopilot/readiness/config.js +76 -0
- package/dist/autopilot/readiness/config.js.map +1 -0
- package/dist/autopilot/readiness/index.d.ts +16 -0
- package/dist/autopilot/readiness/index.d.ts.map +1 -0
- package/dist/autopilot/readiness/index.js +11 -0
- package/dist/autopilot/readiness/index.js.map +1 -0
- package/dist/autopilot/readiness/post-scoring.d.ts +28 -0
- package/dist/autopilot/readiness/post-scoring.d.ts.map +1 -0
- package/dist/autopilot/readiness/post-scoring.js +41 -0
- package/dist/autopilot/readiness/post-scoring.js.map +1 -0
- package/dist/autopilot/readiness/preflight.d.ts +36 -0
- package/dist/autopilot/readiness/preflight.d.ts.map +1 -0
- package/dist/autopilot/readiness/preflight.js +93 -0
- package/dist/autopilot/readiness/preflight.js.map +1 -0
- package/dist/autopilot/readiness/prompt-section.d.ts +19 -0
- package/dist/autopilot/readiness/prompt-section.d.ts.map +1 -0
- package/dist/autopilot/readiness/prompt-section.js +33 -0
- package/dist/autopilot/readiness/prompt-section.js.map +1 -0
- package/dist/autopilot/readiness/types.d.ts +25 -0
- package/dist/autopilot/readiness/types.d.ts.map +1 -0
- package/dist/autopilot/readiness/types.js +8 -0
- package/dist/autopilot/readiness/types.js.map +1 -0
- package/dist/autopilot/sync/sync-manager.d.ts.map +1 -1
- package/dist/autopilot/sync/sync-manager.js +2 -1
- package/dist/autopilot/sync/sync-manager.js.map +1 -1
- package/dist/autopilot/types.d.ts +28 -0
- package/dist/autopilot/types.d.ts.map +1 -1
- package/dist/autopilot/types.js.map +1 -1
- package/dist/cli/commands/index.d.ts +5 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +5 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +184 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.types.d.ts +37 -0
- package/dist/cli/commands/init.types.d.ts.map +1 -1
- package/dist/cli/commands/init.types.js +18 -0
- package/dist/cli/commands/init.types.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +18 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +154 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/plan.types.d.ts +60 -0
- package/dist/cli/commands/plan.types.d.ts.map +1 -0
- package/dist/cli/commands/plan.types.js +8 -0
- package/dist/cli/commands/plan.types.js.map +1 -0
- package/dist/cli/commands/review-implementation.d.ts +16 -0
- package/dist/cli/commands/review-implementation.d.ts.map +1 -0
- package/dist/cli/commands/review-implementation.js +226 -0
- package/dist/cli/commands/review-implementation.js.map +1 -0
- package/dist/cli/commands/review-planning.d.ts +15 -0
- package/dist/cli/commands/review-planning.d.ts.map +1 -0
- package/dist/cli/commands/review-planning.js +177 -0
- package/dist/cli/commands/review-planning.js.map +1 -0
- package/dist/cli/commands/score/display.d.ts +20 -0
- package/dist/cli/commands/score/display.d.ts.map +1 -0
- package/dist/cli/commands/score/display.js +111 -0
- package/dist/cli/commands/score/display.js.map +1 -0
- package/dist/cli/commands/score/index.d.ts +9 -0
- package/dist/cli/commands/score/index.d.ts.map +1 -0
- package/dist/cli/commands/score/index.js +12 -0
- package/dist/cli/commands/score/index.js.map +1 -0
- package/dist/cli/commands/score/score.d.ts +17 -0
- package/dist/cli/commands/score/score.d.ts.map +1 -0
- package/dist/cli/commands/score/score.js +144 -0
- package/dist/cli/commands/score/score.js.map +1 -0
- package/dist/cli/commands/score/types.d.ts +79 -0
- package/dist/cli/commands/score/types.d.ts.map +1 -0
- package/dist/cli/commands/score/types.js +51 -0
- package/dist/cli/commands/score/types.js.map +1 -0
- package/dist/cli/commands/spec-activate.d.ts +29 -0
- package/dist/cli/commands/spec-activate.d.ts.map +1 -0
- package/dist/cli/commands/spec-activate.js +155 -0
- package/dist/cli/commands/spec-activate.js.map +1 -0
- package/dist/cli/commands/spec-activate.types.d.ts +24 -0
- package/dist/cli/commands/spec-activate.types.d.ts.map +1 -0
- package/dist/cli/commands/spec-activate.types.js +8 -0
- package/dist/cli/commands/spec-activate.types.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +89 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/status.types.d.ts +2 -0
- package/dist/cli/commands/status.types.d.ts.map +1 -1
- package/dist/cli/commands/status.types.js.map +1 -1
- package/dist/cli/config/agent-teams.types.d.ts +194 -0
- package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
- package/dist/cli/config/agent-teams.types.js +36 -0
- package/dist/cli/config/agent-teams.types.js.map +1 -0
- package/dist/cli/config/index.d.ts +2 -0
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -0
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/config/loader.d.ts +36 -2
- package/dist/cli/config/loader.d.ts.map +1 -1
- package/dist/cli/config/loader.js +65 -0
- package/dist/cli/config/loader.js.map +1 -1
- package/dist/cli/config/validation.d.ts +69 -0
- package/dist/cli/config/validation.d.ts.map +1 -0
- package/dist/cli/config/validation.js +295 -0
- package/dist/cli/config/validation.js.map +1 -0
- package/dist/cli/config/writer.d.ts +39 -0
- package/dist/cli/config/writer.d.ts.map +1 -1
- package/dist/cli/config/writer.js +58 -0
- package/dist/cli/config/writer.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +10 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/monorepo-detector.d.ts +31 -0
- package/dist/lib/monorepo-detector.d.ts.map +1 -0
- package/dist/lib/monorepo-detector.js +271 -0
- package/dist/lib/monorepo-detector.js.map +1 -0
- package/dist/lib/prompt-generator.d.ts +65 -0
- package/dist/lib/prompt-generator.d.ts.map +1 -0
- package/dist/lib/prompt-generator.js +174 -0
- package/dist/lib/prompt-generator.js.map +1 -0
- package/dist/lib/strategy-analyzer.d.ts +59 -0
- package/dist/lib/strategy-analyzer.d.ts.map +1 -0
- package/dist/lib/strategy-analyzer.js +137 -0
- package/dist/lib/strategy-analyzer.js.map +1 -0
- package/dist/tools/core/context-helper.d.ts +22 -0
- package/dist/tools/core/context-helper.d.ts.map +1 -1
- package/dist/tools/core/context-helper.js +37 -1
- package/dist/tools/core/context-helper.js.map +1 -1
- package/dist/tools/core/workspace-files.d.ts +49 -0
- package/dist/tools/core/workspace-files.d.ts.map +1 -0
- package/dist/tools/core/workspace-files.js +259 -0
- package/dist/tools/core/workspace-files.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +147 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +3 -2
- package/src/cli/templates/agents/content/core/sfag-implementer.ts +113 -0
- package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +107 -0
- package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +126 -0
- package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +132 -0
- package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +153 -0
- package/src/cli/templates/agents/content/task-type/sfag-api-implementer.ts +132 -0
- package/src/cli/templates/agents/content/task-type/sfag-docs-writer.ts +183 -0
- package/src/cli/templates/agents/content/task-type/sfag-frontend-builder.ts +141 -0
- package/src/cli/templates/agents/content/task-type/sfag-infra-architect.ts +149 -0
- package/src/cli/templates/agents/content/task-type/sfag-schema-designer.ts +132 -0
- package/src/cli/templates/agents/content/task-type/sfag-test-writer.ts +171 -0
- package/src/cli/templates/agents/index.ts +74 -0
- package/src/cli/templates/commands.ts +179 -0
- package/src/cli/templates/content/sf-autonomous.ts +78 -0
- package/src/cli/templates/content/sf-blockers.ts +68 -0
- package/src/cli/templates/content/sf-commit.ts +78 -0
- package/src/cli/templates/content/sf-context.ts +64 -0
- package/src/cli/templates/content/sf-create-epics.ts +129 -0
- package/src/cli/templates/content/sf-create-spec.ts +136 -0
- package/src/cli/templates/content/sf-create-tickets.ts +148 -0
- package/src/cli/templates/content/sf-epic.ts +69 -0
- package/src/cli/templates/content/sf-help.ts +61 -0
- package/src/cli/templates/content/sf-import.ts +88 -0
- package/src/cli/templates/content/sf-init.ts +61 -0
- package/src/cli/templates/content/sf-next.ts +67 -0
- package/src/cli/templates/content/sf-reset.ts +78 -0
- package/src/cli/templates/content/sf-review.ts +67 -0
- package/src/cli/templates/content/sf-search.ts +64 -0
- package/src/cli/templates/content/sf-status.ts +67 -0
- package/src/cli/templates/content/sf-ticket.ts +76 -0
- package/src/cli/templates/content/sf-validate.ts +78 -0
- package/src/cli/templates/index.ts +16 -0
- package/src/cli/templates/skills/specforge-conventions.md +109 -0
- package/src/cli/templates/skills/specforge-orchestrator.md +401 -0
- package/src/cli/templates/skills/specforge-validator.md +122 -0
- package/src/cli/templates/skills/specforge-worker.md +378 -0
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import fs from 'node:fs';
|
|
11
11
|
import { CONFIG_DEFAULTS, CONFIG_ENV_VARS, } from './types.js';
|
|
12
|
+
import { AGENT_TEAMS_DEFAULTS, MONOREPO_DEFAULTS, } from './agent-teams.types.js';
|
|
12
13
|
import { getGlobalConfigPath, findProjectConfigPath, } from './paths.js';
|
|
14
|
+
import { validateSpecforgeJson, formatValidationErrors, } from './validation.js';
|
|
13
15
|
/**
|
|
14
16
|
* Load global configuration from ~/.specforge/config.json
|
|
15
17
|
*
|
|
@@ -77,6 +79,12 @@ export function loadProjectConfig() {
|
|
|
77
79
|
console.warn(`Warning: ${configPath} is not a valid config object`);
|
|
78
80
|
return null;
|
|
79
81
|
}
|
|
82
|
+
// Validate Agent Teams config sections
|
|
83
|
+
const validation = validateSpecforgeJson(parsed);
|
|
84
|
+
if (!validation.valid) {
|
|
85
|
+
const lines = formatValidationErrors(validation.errors);
|
|
86
|
+
console.warn(`Warning: Invalid config in ${configPath}:\n${lines.join('\n')}`);
|
|
87
|
+
}
|
|
80
88
|
return parsed;
|
|
81
89
|
}
|
|
82
90
|
catch (error) {
|
|
@@ -234,4 +242,61 @@ export function getSpecificationId() {
|
|
|
234
242
|
const config = resolveConfig();
|
|
235
243
|
return config.specificationId;
|
|
236
244
|
}
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
// Agent Teams config helpers
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
/**
|
|
249
|
+
* Get Agent Teams config with defaults merged.
|
|
250
|
+
*
|
|
251
|
+
* Always returns a fully-resolved config object — never null.
|
|
252
|
+
* Partial configs are merged with defaults via spread operator.
|
|
253
|
+
*
|
|
254
|
+
* @param config - Parsed project config (or null for all defaults)
|
|
255
|
+
* @returns Resolved Agent Teams config with all defaults applied
|
|
256
|
+
*/
|
|
257
|
+
export function getAgentTeamsConfig(config) {
|
|
258
|
+
const partial = config?.agentTeams;
|
|
259
|
+
return {
|
|
260
|
+
enabled: partial?.enabled ?? AGENT_TEAMS_DEFAULTS.enabled,
|
|
261
|
+
strategy: partial?.strategy ?? AGENT_TEAMS_DEFAULTS.strategy,
|
|
262
|
+
maxParallelTeams: partial?.maxParallelTeams ?? AGENT_TEAMS_DEFAULTS.maxParallelTeams,
|
|
263
|
+
maxTokensPerWorker: partial?.maxTokensPerWorker ?? AGENT_TEAMS_DEFAULTS.maxTokensPerWorker,
|
|
264
|
+
branchPrefix: partial?.branchPrefix ?? AGENT_TEAMS_DEFAULTS.branchPrefix,
|
|
265
|
+
branchPattern: partial?.branchPattern ?? AGENT_TEAMS_DEFAULTS.branchPattern,
|
|
266
|
+
autoValidate: partial?.autoValidate ?? AGENT_TEAMS_DEFAULTS.autoValidate,
|
|
267
|
+
timeoutMinutes: partial?.timeoutMinutes ?? AGENT_TEAMS_DEFAULTS.timeoutMinutes,
|
|
268
|
+
escalationPolicy: partial?.escalationPolicy ?? AGENT_TEAMS_DEFAULTS.escalationPolicy,
|
|
269
|
+
...(partial?.validationCommands ? { validationCommands: partial.validationCommands } : {}),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get the active specification from config.
|
|
274
|
+
*
|
|
275
|
+
* @param config - Parsed project config
|
|
276
|
+
* @returns ActiveSpecification if set, null otherwise
|
|
277
|
+
*/
|
|
278
|
+
export function getActiveSpecification(config) {
|
|
279
|
+
return config?.activeSpecification ?? null;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get monorepo config with defaults merged.
|
|
283
|
+
*
|
|
284
|
+
* Returns null if the monorepo section is not present at all.
|
|
285
|
+
* If present (even partially), merges with defaults.
|
|
286
|
+
*
|
|
287
|
+
* @param config - Parsed project config
|
|
288
|
+
* @returns MonorepoConfig with defaults applied, or null if section absent
|
|
289
|
+
*/
|
|
290
|
+
export function getMonorepoConfig(config) {
|
|
291
|
+
const partial = config?.monorepo;
|
|
292
|
+
if (!partial) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
detected: partial.detected ?? MONOREPO_DEFAULTS.detected,
|
|
297
|
+
tool: partial.tool ?? MONOREPO_DEFAULTS.tool,
|
|
298
|
+
workspaces: partial.workspaces ?? [...MONOREPO_DEFAULTS.workspaces],
|
|
299
|
+
rootDir: partial.rootDir ?? MONOREPO_DEFAULTS.rootDir,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
237
302
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/cli/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/cli/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Schema Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates the extended .specforge.json configuration schema.
|
|
5
|
+
* Each section is validated independently — absent sections are
|
|
6
|
+
* considered valid (all sections are optional).
|
|
7
|
+
*
|
|
8
|
+
* Uses manual validation (no external libs) to match existing patterns.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* A single validation error with field path and expected values.
|
|
12
|
+
*/
|
|
13
|
+
export interface ValidationError {
|
|
14
|
+
/** Dot-separated field path (e.g., "agentTeams.strategy") */
|
|
15
|
+
field: string;
|
|
16
|
+
/** Human-readable error message including expected values */
|
|
17
|
+
message: string;
|
|
18
|
+
/** The actual value that failed validation */
|
|
19
|
+
value: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Result of a validation operation.
|
|
23
|
+
*/
|
|
24
|
+
export interface ValidationResult {
|
|
25
|
+
/** Whether all validations passed */
|
|
26
|
+
valid: boolean;
|
|
27
|
+
/** List of validation errors (empty when valid) */
|
|
28
|
+
errors: ValidationError[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate the `agentTeams` config section.
|
|
32
|
+
*
|
|
33
|
+
* Returns valid:true if the section is absent/undefined.
|
|
34
|
+
* Only validates fields that are present (all are optional).
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateAgentTeamsConfig(config: unknown): ValidationResult;
|
|
37
|
+
/**
|
|
38
|
+
* Validate the `activeSpecification` config section.
|
|
39
|
+
*
|
|
40
|
+
* Returns valid:true if the section is absent/undefined.
|
|
41
|
+
* When present, `id`, `title`, and `activatedAt` are required.
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateActiveSpecification(config: unknown): ValidationResult;
|
|
44
|
+
/**
|
|
45
|
+
* Validate the `monorepo` config section.
|
|
46
|
+
*
|
|
47
|
+
* Returns valid:true if the section is absent/undefined.
|
|
48
|
+
* Validates tool enum, workspaces array structure, and path formats.
|
|
49
|
+
*/
|
|
50
|
+
export declare function validateMonorepoConfig(config: unknown): ValidationResult;
|
|
51
|
+
/**
|
|
52
|
+
* Validate the entire .specforge.json config for Agent Teams sections.
|
|
53
|
+
*
|
|
54
|
+
* Orchestrates sub-validators and aggregates all errors.
|
|
55
|
+
* Only validates the new Agent Teams sections — existing ProjectConfig
|
|
56
|
+
* fields are validated elsewhere.
|
|
57
|
+
*
|
|
58
|
+
* @param config - Raw parsed JSON object from .specforge.json
|
|
59
|
+
* @returns Combined validation result from all sections
|
|
60
|
+
*/
|
|
61
|
+
export declare function validateSpecforgeJson(config: unknown): ValidationResult;
|
|
62
|
+
/**
|
|
63
|
+
* Format validation errors into human-readable lines.
|
|
64
|
+
*
|
|
65
|
+
* @param errors - Array of validation errors
|
|
66
|
+
* @returns Formatted error strings, one per line
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatValidationErrors(errors: ValidationError[]): string[];
|
|
69
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/cli/config/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AA6DD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CA2E1E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CA0C7E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAkExE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAiBvE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAK1E"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Schema Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates the extended .specforge.json configuration schema.
|
|
5
|
+
* Each section is validated independently — absent sections are
|
|
6
|
+
* considered valid (all sections are optional).
|
|
7
|
+
*
|
|
8
|
+
* Uses manual validation (no external libs) to match existing patterns.
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Allowed values (from design doc)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const ALLOWED_STRATEGIES = ['auto', 'single', 'parallel', 'phased'];
|
|
14
|
+
const ALLOWED_ESCALATION_POLICIES = ['pause', 'skip', 'ask'];
|
|
15
|
+
const ALLOWED_MONOREPO_TOOLS = ['turborepo', 'nx', 'lerna', 'pnpm', 'npm'];
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Helpers
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
function err(field, message, value) {
|
|
20
|
+
return { field, message, value };
|
|
21
|
+
}
|
|
22
|
+
function isObject(v) {
|
|
23
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
24
|
+
}
|
|
25
|
+
function oneOf(field, value, allowed) {
|
|
26
|
+
if (typeof value !== 'string' || !allowed.includes(value)) {
|
|
27
|
+
return err(field, `Must be one of: ${allowed.join(', ')}`, value);
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function numberInRange(field, value, min, max) {
|
|
32
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max) {
|
|
33
|
+
return err(field, `Must be a number between ${min} and ${max}`, value);
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function mustBeBoolean(field, value) {
|
|
38
|
+
if (typeof value !== 'boolean') {
|
|
39
|
+
return err(field, 'Must be a boolean', value);
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function mustBeString(field, value) {
|
|
44
|
+
if (typeof value !== 'string') {
|
|
45
|
+
return err(field, 'Must be a string', value);
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function mustBeNonEmptyString(field, value) {
|
|
50
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
51
|
+
return err(field, 'Must be a non-empty string', value);
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Section validators
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
/**
|
|
59
|
+
* Validate the `agentTeams` config section.
|
|
60
|
+
*
|
|
61
|
+
* Returns valid:true if the section is absent/undefined.
|
|
62
|
+
* Only validates fields that are present (all are optional).
|
|
63
|
+
*/
|
|
64
|
+
export function validateAgentTeamsConfig(config) {
|
|
65
|
+
if (config === undefined || config === null) {
|
|
66
|
+
return { valid: true, errors: [] };
|
|
67
|
+
}
|
|
68
|
+
const errors = [];
|
|
69
|
+
const prefix = 'agentTeams';
|
|
70
|
+
if (!isObject(config)) {
|
|
71
|
+
return { valid: false, errors: [err(prefix, 'Must be an object', config)] };
|
|
72
|
+
}
|
|
73
|
+
if ('enabled' in config && config.enabled !== undefined) {
|
|
74
|
+
const e = mustBeBoolean(`${prefix}.enabled`, config.enabled);
|
|
75
|
+
if (e)
|
|
76
|
+
errors.push(e);
|
|
77
|
+
}
|
|
78
|
+
if ('strategy' in config && config.strategy !== undefined) {
|
|
79
|
+
const e = oneOf(`${prefix}.strategy`, config.strategy, ALLOWED_STRATEGIES);
|
|
80
|
+
if (e)
|
|
81
|
+
errors.push(e);
|
|
82
|
+
}
|
|
83
|
+
if ('maxParallelTeams' in config && config.maxParallelTeams !== undefined) {
|
|
84
|
+
const e = numberInRange(`${prefix}.maxParallelTeams`, config.maxParallelTeams, 1, 10);
|
|
85
|
+
if (e)
|
|
86
|
+
errors.push(e);
|
|
87
|
+
}
|
|
88
|
+
if ('maxTokensPerWorker' in config && config.maxTokensPerWorker !== undefined) {
|
|
89
|
+
const e = numberInRange(`${prefix}.maxTokensPerWorker`, config.maxTokensPerWorker, 10000, 200000);
|
|
90
|
+
if (e)
|
|
91
|
+
errors.push(e);
|
|
92
|
+
}
|
|
93
|
+
if ('branchPrefix' in config && config.branchPrefix !== undefined) {
|
|
94
|
+
const e = mustBeString(`${prefix}.branchPrefix`, config.branchPrefix);
|
|
95
|
+
if (e)
|
|
96
|
+
errors.push(e);
|
|
97
|
+
}
|
|
98
|
+
if ('branchPattern' in config && config.branchPattern !== undefined) {
|
|
99
|
+
const strErr = mustBeString(`${prefix}.branchPattern`, config.branchPattern);
|
|
100
|
+
if (strErr) {
|
|
101
|
+
errors.push(strErr);
|
|
102
|
+
}
|
|
103
|
+
else if (typeof config.branchPattern === 'string' && !config.branchPattern.includes('{prefix}')) {
|
|
104
|
+
errors.push(err(`${prefix}.branchPattern`, 'Must contain {prefix} placeholder', config.branchPattern));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if ('autoValidate' in config && config.autoValidate !== undefined) {
|
|
108
|
+
const e = mustBeBoolean(`${prefix}.autoValidate`, config.autoValidate);
|
|
109
|
+
if (e)
|
|
110
|
+
errors.push(e);
|
|
111
|
+
}
|
|
112
|
+
if ('validationCommands' in config && config.validationCommands !== undefined) {
|
|
113
|
+
if (!isObject(config.validationCommands)) {
|
|
114
|
+
errors.push(err(`${prefix}.validationCommands`, 'Must be an object', config.validationCommands));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
for (const key of ['test', 'lint', 'typeCheck', 'build']) {
|
|
118
|
+
if (key in config.validationCommands && config.validationCommands[key] !== undefined) {
|
|
119
|
+
const e = mustBeString(`${prefix}.validationCommands.${key}`, config.validationCommands[key]);
|
|
120
|
+
if (e)
|
|
121
|
+
errors.push(e);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if ('timeoutMinutes' in config && config.timeoutMinutes !== undefined) {
|
|
127
|
+
const e = numberInRange(`${prefix}.timeoutMinutes`, config.timeoutMinutes, 5, 60);
|
|
128
|
+
if (e)
|
|
129
|
+
errors.push(e);
|
|
130
|
+
}
|
|
131
|
+
if ('escalationPolicy' in config && config.escalationPolicy !== undefined) {
|
|
132
|
+
const e = oneOf(`${prefix}.escalationPolicy`, config.escalationPolicy, ALLOWED_ESCALATION_POLICIES);
|
|
133
|
+
if (e)
|
|
134
|
+
errors.push(e);
|
|
135
|
+
}
|
|
136
|
+
return { valid: errors.length === 0, errors };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Validate the `activeSpecification` config section.
|
|
140
|
+
*
|
|
141
|
+
* Returns valid:true if the section is absent/undefined.
|
|
142
|
+
* When present, `id`, `title`, and `activatedAt` are required.
|
|
143
|
+
*/
|
|
144
|
+
export function validateActiveSpecification(config) {
|
|
145
|
+
if (config === undefined || config === null) {
|
|
146
|
+
return { valid: true, errors: [] };
|
|
147
|
+
}
|
|
148
|
+
const errors = [];
|
|
149
|
+
const prefix = 'activeSpecification';
|
|
150
|
+
if (!isObject(config)) {
|
|
151
|
+
return { valid: false, errors: [err(prefix, 'Must be an object', config)] };
|
|
152
|
+
}
|
|
153
|
+
// id — required, non-empty string
|
|
154
|
+
if (!('id' in config) || config.id === undefined) {
|
|
155
|
+
errors.push(err(`${prefix}.id`, 'Required field is missing', undefined));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const e = mustBeNonEmptyString(`${prefix}.id`, config.id);
|
|
159
|
+
if (e)
|
|
160
|
+
errors.push(e);
|
|
161
|
+
}
|
|
162
|
+
// title — required, non-empty string, max 200 chars
|
|
163
|
+
if (!('title' in config) || config.title === undefined) {
|
|
164
|
+
errors.push(err(`${prefix}.title`, 'Required field is missing', undefined));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const e = mustBeNonEmptyString(`${prefix}.title`, config.title);
|
|
168
|
+
if (e) {
|
|
169
|
+
errors.push(e);
|
|
170
|
+
}
|
|
171
|
+
else if (typeof config.title === 'string' && config.title.length > 200) {
|
|
172
|
+
errors.push(err(`${prefix}.title`, 'Must be at most 200 characters', config.title));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// activatedAt — required, valid ISO 8601
|
|
176
|
+
if (!('activatedAt' in config) || config.activatedAt === undefined) {
|
|
177
|
+
errors.push(err(`${prefix}.activatedAt`, 'Required field is missing', undefined));
|
|
178
|
+
}
|
|
179
|
+
else if (typeof config.activatedAt !== 'string') {
|
|
180
|
+
errors.push(err(`${prefix}.activatedAt`, 'Must be a string', config.activatedAt));
|
|
181
|
+
}
|
|
182
|
+
else if (isNaN(Date.parse(config.activatedAt))) {
|
|
183
|
+
errors.push(err(`${prefix}.activatedAt`, 'Must be a valid ISO 8601 date string', config.activatedAt));
|
|
184
|
+
}
|
|
185
|
+
return { valid: errors.length === 0, errors };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Validate the `monorepo` config section.
|
|
189
|
+
*
|
|
190
|
+
* Returns valid:true if the section is absent/undefined.
|
|
191
|
+
* Validates tool enum, workspaces array structure, and path formats.
|
|
192
|
+
*/
|
|
193
|
+
export function validateMonorepoConfig(config) {
|
|
194
|
+
if (config === undefined || config === null) {
|
|
195
|
+
return { valid: true, errors: [] };
|
|
196
|
+
}
|
|
197
|
+
const errors = [];
|
|
198
|
+
const prefix = 'monorepo';
|
|
199
|
+
if (!isObject(config)) {
|
|
200
|
+
return { valid: false, errors: [err(prefix, 'Must be an object', config)] };
|
|
201
|
+
}
|
|
202
|
+
if ('detected' in config && config.detected !== undefined) {
|
|
203
|
+
const e = mustBeBoolean(`${prefix}.detected`, config.detected);
|
|
204
|
+
if (e)
|
|
205
|
+
errors.push(e);
|
|
206
|
+
}
|
|
207
|
+
if ('tool' in config && config.tool !== undefined && config.tool !== null) {
|
|
208
|
+
const e = oneOf(`${prefix}.tool`, config.tool, ALLOWED_MONOREPO_TOOLS);
|
|
209
|
+
if (e)
|
|
210
|
+
errors.push(e);
|
|
211
|
+
}
|
|
212
|
+
if ('rootDir' in config && config.rootDir !== undefined) {
|
|
213
|
+
const e = mustBeString(`${prefix}.rootDir`, config.rootDir);
|
|
214
|
+
if (e)
|
|
215
|
+
errors.push(e);
|
|
216
|
+
}
|
|
217
|
+
if ('workspaces' in config && config.workspaces !== undefined) {
|
|
218
|
+
if (!Array.isArray(config.workspaces)) {
|
|
219
|
+
errors.push(err(`${prefix}.workspaces`, 'Must be an array', config.workspaces));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
for (let i = 0; i < config.workspaces.length; i++) {
|
|
223
|
+
const entry = config.workspaces[i];
|
|
224
|
+
const entryPrefix = `${prefix}.workspaces[${i}]`;
|
|
225
|
+
if (!isObject(entry)) {
|
|
226
|
+
errors.push(err(entryPrefix, 'Must be an object with name, path, and dependencies', entry));
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (!('name' in entry) || typeof entry.name !== 'string' || entry.name.trim().length === 0) {
|
|
230
|
+
errors.push(err(`${entryPrefix}.name`, 'Must be a non-empty string', entry.name));
|
|
231
|
+
}
|
|
232
|
+
if (!('path' in entry) || typeof entry.path !== 'string') {
|
|
233
|
+
errors.push(err(`${entryPrefix}.path`, 'Must be a string', entry.path));
|
|
234
|
+
}
|
|
235
|
+
else if (entry.path.startsWith('/')) {
|
|
236
|
+
errors.push(err(`${entryPrefix}.path`, 'Must be a relative path (no leading /)', entry.path));
|
|
237
|
+
}
|
|
238
|
+
if ('dependencies' in entry && entry.dependencies !== undefined) {
|
|
239
|
+
if (!Array.isArray(entry.dependencies)) {
|
|
240
|
+
errors.push(err(`${entryPrefix}.dependencies`, 'Must be an array of strings', entry.dependencies));
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
for (let j = 0; j < entry.dependencies.length; j++) {
|
|
244
|
+
if (typeof entry.dependencies[j] !== 'string') {
|
|
245
|
+
errors.push(err(`${entryPrefix}.dependencies[${j}]`, 'Must be a string', entry.dependencies[j]));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return { valid: errors.length === 0, errors };
|
|
254
|
+
}
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
// Top-level validator
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
/**
|
|
259
|
+
* Validate the entire .specforge.json config for Agent Teams sections.
|
|
260
|
+
*
|
|
261
|
+
* Orchestrates sub-validators and aggregates all errors.
|
|
262
|
+
* Only validates the new Agent Teams sections — existing ProjectConfig
|
|
263
|
+
* fields are validated elsewhere.
|
|
264
|
+
*
|
|
265
|
+
* @param config - Raw parsed JSON object from .specforge.json
|
|
266
|
+
* @returns Combined validation result from all sections
|
|
267
|
+
*/
|
|
268
|
+
export function validateSpecforgeJson(config) {
|
|
269
|
+
if (config === undefined || config === null) {
|
|
270
|
+
return { valid: true, errors: [] };
|
|
271
|
+
}
|
|
272
|
+
if (!isObject(config)) {
|
|
273
|
+
return { valid: false, errors: [err('config', 'Must be an object', config)] };
|
|
274
|
+
}
|
|
275
|
+
const results = [
|
|
276
|
+
validateAgentTeamsConfig(config.agentTeams),
|
|
277
|
+
validateActiveSpecification(config.activeSpecification),
|
|
278
|
+
validateMonorepoConfig(config.monorepo),
|
|
279
|
+
];
|
|
280
|
+
const errors = results.flatMap(r => r.errors);
|
|
281
|
+
return { valid: errors.length === 0, errors };
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Format validation errors into human-readable lines.
|
|
285
|
+
*
|
|
286
|
+
* @param errors - Array of validation errors
|
|
287
|
+
* @returns Formatted error strings, one per line
|
|
288
|
+
*/
|
|
289
|
+
export function formatValidationErrors(errors) {
|
|
290
|
+
return errors.map(e => {
|
|
291
|
+
const valueStr = e.value === undefined ? 'undefined' : JSON.stringify(e.value);
|
|
292
|
+
return ` ${e.field}: ${e.message} (got ${valueStr})`;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/cli/config/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - Path validation to prevent writes outside allowed directories
|
|
11
11
|
*/
|
|
12
12
|
import { GlobalConfig, ProjectConfig } from './types.js';
|
|
13
|
+
import type { ActiveSpecification, AgentTeamsConfig } from './agent-teams.types.js';
|
|
13
14
|
/**
|
|
14
15
|
* Ensure global config directory exists with secure permissions
|
|
15
16
|
*
|
|
@@ -87,6 +88,44 @@ export declare function deleteGlobalConfigField(field: keyof GlobalConfig): void
|
|
|
87
88
|
* ```
|
|
88
89
|
*/
|
|
89
90
|
export declare function saveProjectConfig(config: Partial<ProjectConfig>, targetDir?: string): void;
|
|
91
|
+
/**
|
|
92
|
+
* Set the active specification in .specforge.json
|
|
93
|
+
*
|
|
94
|
+
* Updates only the `activeSpecification` section, preserving all other fields.
|
|
95
|
+
* Pass `null` to remove the active specification entirely.
|
|
96
|
+
*
|
|
97
|
+
* @param spec - ActiveSpecification to set, or null to clear
|
|
98
|
+
* @param targetDir - Directory containing .specforge.json (defaults to cwd)
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* // Set active specification
|
|
103
|
+
* setActiveSpecification({ id: 'spec_123', title: 'My Spec', activatedAt: new Date().toISOString() });
|
|
104
|
+
*
|
|
105
|
+
* // Clear active specification
|
|
106
|
+
* setActiveSpecification(null);
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export declare function setActiveSpecification(spec: ActiveSpecification | null, targetDir?: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Update the Agent Teams configuration in .specforge.json
|
|
112
|
+
*
|
|
113
|
+
* Merges the provided partial config with the existing `agentTeams` section,
|
|
114
|
+
* preserving all other fields. Only the keys present in `config` are overwritten.
|
|
115
|
+
*
|
|
116
|
+
* @param config - Partial AgentTeamsConfig to merge
|
|
117
|
+
* @param targetDir - Directory containing .specforge.json (defaults to cwd)
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* // Enable agent teams
|
|
122
|
+
* setAgentTeamsConfig({ enabled: true });
|
|
123
|
+
*
|
|
124
|
+
* // Update strategy and timeout, keeping other settings
|
|
125
|
+
* setAgentTeamsConfig({ strategy: 'parallel', timeoutMinutes: 30 });
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export declare function setAgentTeamsConfig(config: Partial<AgentTeamsConfig>, targetDir?: string): void;
|
|
90
129
|
/**
|
|
91
130
|
* MCP server configuration with optional environment variables
|
|
92
131
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/cli/config/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACL,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/cli/config/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACL,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAsBhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAetC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAgCpE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,YAAY,GAAG,IAAI,CAuBvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAgCN;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAChC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAaN;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAUN;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,UAAU,EAAE;QACV,SAAS,EAAE,eAAe,CAAC;KAC5B,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAkBhE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAmBtD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAiCzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
|
|
@@ -181,6 +181,64 @@ export function saveProjectConfig(config, targetDir) {
|
|
|
181
181
|
`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Set the active specification in .specforge.json
|
|
186
|
+
*
|
|
187
|
+
* Updates only the `activeSpecification` section, preserving all other fields.
|
|
188
|
+
* Pass `null` to remove the active specification entirely.
|
|
189
|
+
*
|
|
190
|
+
* @param spec - ActiveSpecification to set, or null to clear
|
|
191
|
+
* @param targetDir - Directory containing .specforge.json (defaults to cwd)
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* // Set active specification
|
|
196
|
+
* setActiveSpecification({ id: 'spec_123', title: 'My Spec', activatedAt: new Date().toISOString() });
|
|
197
|
+
*
|
|
198
|
+
* // Clear active specification
|
|
199
|
+
* setActiveSpecification(null);
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export function setActiveSpecification(spec, targetDir) {
|
|
203
|
+
const existing = loadProjectConfig() || {};
|
|
204
|
+
const updated = structuredClone(existing);
|
|
205
|
+
if (spec === null) {
|
|
206
|
+
// Set to undefined (not delete) so the spread in saveProjectConfig
|
|
207
|
+
// overrides the existing value, and the remove-undefined loop cleans it up.
|
|
208
|
+
updated.activeSpecification = undefined;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
updated.activeSpecification = spec;
|
|
212
|
+
}
|
|
213
|
+
saveProjectConfig(updated, targetDir);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Update the Agent Teams configuration in .specforge.json
|
|
217
|
+
*
|
|
218
|
+
* Merges the provided partial config with the existing `agentTeams` section,
|
|
219
|
+
* preserving all other fields. Only the keys present in `config` are overwritten.
|
|
220
|
+
*
|
|
221
|
+
* @param config - Partial AgentTeamsConfig to merge
|
|
222
|
+
* @param targetDir - Directory containing .specforge.json (defaults to cwd)
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```typescript
|
|
226
|
+
* // Enable agent teams
|
|
227
|
+
* setAgentTeamsConfig({ enabled: true });
|
|
228
|
+
*
|
|
229
|
+
* // Update strategy and timeout, keeping other settings
|
|
230
|
+
* setAgentTeamsConfig({ strategy: 'parallel', timeoutMinutes: 30 });
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
export function setAgentTeamsConfig(config, targetDir) {
|
|
234
|
+
const existing = loadProjectConfig() || {};
|
|
235
|
+
const updated = structuredClone(existing);
|
|
236
|
+
updated.agentTeams = {
|
|
237
|
+
...updated.agentTeams,
|
|
238
|
+
...config,
|
|
239
|
+
};
|
|
240
|
+
saveProjectConfig(updated, targetDir);
|
|
241
|
+
}
|
|
184
242
|
/**
|
|
185
243
|
* Generate MCP configuration for Claude Code integration
|
|
186
244
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/cli/config/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/cli/config/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,qDAAqD;IACrD,UAAU,EAAE,KAAK;IACjB,uDAAuD;IACvD,WAAW,EAAE,KAAK;IAClB,2CAA2C;IAC3C,YAAY,EAAE,KAAK;CACX,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IAEvC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,iBAAiB;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,IAAI;YAC1D,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA6B;IAC5D,eAAe,EAAE,CAAC;IAElB,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,uBAAuB;IACvB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAEpC,gBAAgB;IAChB,MAAM,MAAM,GAAiB;QAC3B,GAAG,QAAQ;QACX,GAAG,MAAM;KACV,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAChC,IAAI,MAAM,CAAC,GAAyB,CAAC,KAAK,SAAS,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC,GAAyB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAEvD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,IAAI;YAChD,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAyB;IAC/D,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,sBAAsB;IAChC,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAEpC,eAAe;IACf,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEvB,sBAAsB;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAEzD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,IAAI;YACjD,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA8B,EAC9B,SAAkB;IAElB,MAAM,UAAU,GAAG,SAAS;QAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;QACvD,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAE3B,iDAAiD;IACjD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAE3C,gBAAgB;IAChB,MAAM,MAAM,GAAkB;QAC5B,GAAG,QAAQ;QACX,GAAG,MAAM;KACV,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAChC,IAAI,MAAM,CAAC,GAA0B,CAAC,KAAK,SAAS,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,GAA0B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kCAAkC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAEvD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,IAAI;YACjD,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAgC,EAChC,SAAkB;IAElB,MAAM,QAAQ,GAAwB,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE1C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,mEAAmE;QACnE,4EAA4E;QAC5E,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,iBAAiB,CAAC,OAAiC,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiC,EACjC,SAAkB;IAElB,MAAM,QAAQ,GAAwB,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE1C,OAAO,CAAC,UAAU,GAAG;QACnB,GAAG,OAAO,CAAC,UAAU;QACrB,GAAG,MAAM;KACV,CAAC;IAEF,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAoBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,MAAM,YAAY,GAAoB;QACpC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,uBAAuB,CAAC;KACtC,CAAC;IAEF,qCAAqC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,YAAY,CAAC,GAAG,GAAG;YACjB,iBAAiB,EAAE,MAAM;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE;YACV,SAAS,EAAE,YAAY;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC9C,MAAM,UAAU,GAAG,SAAS;QAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;QACjD,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAEvB,kCAAkC;IAClC,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1E,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,+BAA+B,UAAU,IAAI;YAC7C,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,SAAkB;IAC9D,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,uDAAuD;QACvD,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,CAAC,iBAAiB;QACjC,CAAC;QAED,yCAAyC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,OAAO,GAAG,eAAe,GAAG,IAAI;YAClC,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CAAC;QAE5C,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,OAAO,CAAC,IAAI,CACV,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClG,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW;IACzB,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|