@devtrack-solution/codesdd 1.2.3 → 1.2.4
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/.sdd/skills/curated/devtrack-api/SKILL.md +98 -12
- package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +5 -3
- package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +12 -0
- package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +61 -5
- package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +15 -3
- package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +1951 -0
- package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +16 -14
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +40 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +19 -2
- package/.sdd/skills/curated/devtrack-api/references/generated-artifact-invalidation.md +97 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +30 -1
- package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +42 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +22 -1
- package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +9 -7
- package/README.md +280 -29
- package/dist/applications/sdd/index.d.ts +16 -0
- package/dist/applications/sdd/index.js +16 -0
- package/dist/cli/program.js +180 -11
- package/dist/commands/config.js +197 -10
- package/dist/commands/sdd/execution.js +408 -16
- package/dist/commands/sdd/plugin.js +5 -0
- package/dist/commands/sdd/shared.d.ts +1 -0
- package/dist/commands/sdd/shared.js +10 -0
- package/dist/commands/sdd.js +157 -7
- package/dist/core/cli/command-matrix.d.ts +18 -0
- package/dist/core/cli/command-matrix.js +157 -0
- package/dist/core/cli-command-quality.js +11 -0
- package/dist/core/completions/command-registry.js +45 -0
- package/dist/core/config-schema.d.ts +31 -1
- package/dist/core/config-schema.js +79 -5
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.js +11 -0
- package/dist/core/global-config.d.ts +29 -0
- package/dist/core/init.d.ts +2 -2
- package/dist/core/init.js +13 -14
- package/dist/core/sdd/agent-binding.d.ts +19 -19
- package/dist/core/sdd/agent-runtime-contract.d.ts +204 -0
- package/dist/core/sdd/agent-runtime-contract.js +200 -0
- package/dist/core/sdd/allocator-recovery.d.ts +14 -0
- package/dist/core/sdd/allocator-recovery.js +30 -0
- package/dist/core/sdd/allocator-security.d.ts +18 -0
- package/dist/core/sdd/allocator-security.js +36 -0
- package/dist/core/sdd/api-foundation-baseline.d.ts +111 -0
- package/dist/core/sdd/api-foundation-baseline.js +151 -0
- package/dist/core/sdd/api-foundation-parity.d.ts +114 -0
- package/dist/core/sdd/api-foundation-parity.js +131 -0
- package/dist/core/sdd/api-profile-catalog.d.ts +36 -0
- package/dist/core/sdd/api-profile-catalog.js +132 -0
- package/dist/core/sdd/api-profile-dry-run-projection.d.ts +93 -0
- package/dist/core/sdd/api-profile-dry-run-projection.js +370 -0
- package/dist/core/sdd/api-profile-recipes.d.ts +82 -0
- package/dist/core/sdd/api-profile-recipes.js +484 -0
- package/dist/core/sdd/artifact-id-allocator.d.ts +368 -0
- package/dist/core/sdd/artifact-id-allocator.js +510 -0
- package/dist/core/sdd/check.d.ts +52 -1
- package/dist/core/sdd/check.js +326 -11
- package/dist/core/sdd/coordination/coordination-adapters.d.ts +15 -8
- package/dist/core/sdd/coordination/coordination-adapters.js +43 -15
- package/dist/core/sdd/coordination/index.d.ts +1 -0
- package/dist/core/sdd/coordination/index.js +1 -0
- package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
- package/dist/core/sdd/coordination/redis-runtime.js +698 -0
- package/dist/core/sdd/deepagent-contracts.d.ts +99 -5
- package/dist/core/sdd/deepagent-contracts.js +62 -0
- package/dist/core/sdd/deepagents/reversa-subagents.d.ts +3 -3
- package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
- package/dist/core/sdd/default-bootstrap-files.js +14 -10
- package/dist/core/sdd/default-skills.js +115 -9
- package/dist/core/sdd/devtrack-api-appliance.d.ts +42 -1
- package/dist/core/sdd/devtrack-api-appliance.js +159 -32
- package/dist/core/sdd/devtrack-api-architecture.d.ts +16 -0
- package/dist/core/sdd/devtrack-api-architecture.js +86 -0
- package/dist/core/sdd/docs-sync.js +24 -18
- package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
- package/dist/core/sdd/domain/capability-diff.js +200 -0
- package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
- package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
- package/dist/core/sdd/domain/semantic-intent-classifier.d.ts +29 -0
- package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -0
- package/dist/core/sdd/enterprise-mutating-command-gate.d.ts +27 -0
- package/dist/core/sdd/enterprise-mutating-command-gate.js +104 -0
- package/dist/core/sdd/enterprise-provenance-gates.d.ts +20 -0
- package/dist/core/sdd/enterprise-provenance-gates.js +63 -0
- package/dist/core/sdd/enterprise-provisioning-policy.d.ts +26 -0
- package/dist/core/sdd/enterprise-provisioning-policy.js +104 -0
- package/dist/core/sdd/foundation-artifact-map-validator.d.ts +16 -0
- package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
- package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
- package/dist/core/sdd/foundation-layer-manifest.js +117 -0
- package/dist/core/sdd/governance-schemas.d.ts +2 -2
- package/dist/core/sdd/governance-schemas.js +11 -2
- package/dist/core/sdd/intent-guard.d.ts +22 -0
- package/dist/core/sdd/intent-guard.js +67 -0
- package/dist/core/sdd/json-schema.js +13 -1
- package/dist/core/sdd/legacy-operations.js +169 -5
- package/dist/core/sdd/migrate-workspace.js +39 -0
- package/dist/core/sdd/package-security-gates.d.ts +21 -0
- package/dist/core/sdd/package-security-gates.js +121 -0
- package/dist/core/sdd/package-structure-gate.d.ts +85 -3
- package/dist/core/sdd/package-structure-gate.js +384 -11
- package/dist/core/sdd/parallel-feat-automation.d.ts +185 -7
- package/dist/core/sdd/parallel-feat-automation.js +212 -0
- package/dist/core/sdd/plugin-broker.d.ts +223 -4
- package/dist/core/sdd/plugin-broker.js +10 -0
- package/dist/core/sdd/plugin-cli.d.ts +30 -0
- package/dist/core/sdd/plugin-cli.js +70 -3
- package/dist/core/sdd/plugin-evidence.d.ts +73 -0
- package/dist/core/sdd/plugin-manifest.d.ts +69 -1
- package/dist/core/sdd/plugin-manifest.js +10 -0
- package/dist/core/sdd/plugin-policy-pack.d.ts +1 -1
- package/dist/core/sdd/plugin-policy.js +6 -1
- package/dist/core/sdd/plugin-registry.d.ts +138 -2
- package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
- package/dist/core/sdd/plugin-sdk-contract.js +268 -0
- package/dist/core/sdd/plugin-skill-binding.d.ts +1 -1
- package/dist/core/sdd/quality-validation.d.ts +89 -16
- package/dist/core/sdd/release-readiness.d.ts +68 -0
- package/dist/core/sdd/release-readiness.js +767 -0
- package/dist/core/sdd/reversa-architecture-extractor.d.ts +13 -0
- package/dist/core/sdd/reversa-architecture-extractor.js +89 -0
- package/dist/core/sdd/reversa-artifact-writer.d.ts +18 -0
- package/dist/core/sdd/reversa-artifact-writer.js +40 -0
- package/dist/core/sdd/reversa-command-policy.d.ts +136 -0
- package/dist/core/sdd/reversa-command-policy.js +361 -0
- package/dist/core/sdd/reversa-data-extractor.d.ts +11 -0
- package/dist/core/sdd/reversa-data-extractor.js +73 -0
- package/dist/core/sdd/reversa-equivalence.d.ts +20 -0
- package/dist/core/sdd/reversa-equivalence.js +34 -0
- package/dist/core/sdd/reversa-evidence.d.ts +298 -0
- package/dist/core/sdd/reversa-evidence.js +118 -0
- package/dist/core/sdd/reversa-reconstruction.d.ts +29 -0
- package/dist/core/sdd/reversa-reconstruction.js +32 -0
- package/dist/core/sdd/reversa-rules-extractor.d.ts +12 -0
- package/dist/core/sdd/reversa-rules-extractor.js +86 -0
- package/dist/core/sdd/reversa-source-safety.d.ts +19 -0
- package/dist/core/sdd/reversa-source-safety.js +105 -0
- package/dist/core/sdd/reversa-surface-scout.d.ts +13 -0
- package/dist/core/sdd/reversa-surface-scout.js +85 -0
- package/dist/core/sdd/reversa-ux-mapper.d.ts +11 -0
- package/dist/core/sdd/reversa-ux-mapper.js +73 -0
- package/dist/core/sdd/runtime-boundary-contract.d.ts +45 -0
- package/dist/core/sdd/runtime-boundary-contract.js +90 -0
- package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
- package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
- package/dist/core/sdd/services/agent-run.service.d.ts +38 -6
- package/dist/core/sdd/services/agent-run.service.js +73 -1
- package/dist/core/sdd/services/archive-quality-coherence.service.d.ts +17 -0
- package/dist/core/sdd/services/archive-quality-coherence.service.js +141 -0
- package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
- package/dist/core/sdd/services/capability-diff.service.js +26 -0
- package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
- package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
- package/dist/core/sdd/services/context.service.d.ts +43 -340
- package/dist/core/sdd/services/context.service.js +323 -9
- package/dist/core/sdd/services/decide.service.js +1 -1
- package/dist/core/sdd/services/finalize.service.d.ts +27 -0
- package/dist/core/sdd/services/finalize.service.js +226 -18
- package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
- package/dist/core/sdd/services/historical-quality-regression.service.d.ts +35 -0
- package/dist/core/sdd/services/historical-quality-regression.service.js +228 -0
- package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
- package/dist/core/sdd/services/planning-execution-coherence.service.d.ts +45 -0
- package/dist/core/sdd/services/planning-execution-coherence.service.js +225 -0
- package/dist/core/sdd/services/semantic-intent-classifier.service.d.ts +6 -0
- package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
- package/dist/core/sdd/state.d.ts +1 -0
- package/dist/core/sdd/state.js +266 -34
- package/dist/core/sdd/store/sdd-stores.js +2 -2
- package/dist/core/sdd/structural-health.d.ts +13 -13
- package/dist/core/sdd/types.d.ts +30 -15
- package/dist/core/sdd/types.js +4 -0
- package/dist/core/sdd/views.js +17 -0
- package/dist/core/sdd/workspace-schemas.d.ts +428 -7
- package/dist/core/sdd/workspace-schemas.js +223 -70
- package/dist/core/shared/skill-generation.d.ts +2 -0
- package/dist/core/shared/skill-generation.js +19 -2
- package/dist/core/shared/tool-detection.d.ts +19 -0
- package/dist/core/shared/tool-detection.js +89 -0
- package/dist/domains/sdd/index.d.ts +6 -0
- package/dist/domains/sdd/index.js +6 -0
- package/dist/infrastructures/sdd/index.d.ts +7 -0
- package/dist/infrastructures/sdd/index.js +6 -0
- package/dist/presentations/cli/sdd/index.d.ts +3 -0
- package/dist/presentations/cli/sdd/index.js +3 -0
- package/dist/shared/sdd/index.d.ts +3 -0
- package/dist/shared/sdd/index.js +2 -0
- package/package.json +14 -10
- package/schemas/sdd/2-plan.schema.json +207 -2
- package/schemas/sdd/5-quality.schema.json +324 -25
- package/schemas/sdd/agent-runtime-command-plan.schema.json +212 -0
- package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -0
- package/schemas/sdd/codesdd-plugin.schema.json +171 -0
- package/schemas/sdd/deepagent-run-request.schema.json +316 -0
- package/schemas/sdd/parallel-feat-automation-plan.schema.json +89 -0
- package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
- package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +109 -0
- package/schemas/sdd/plugin-artifact-map.schema.json +223 -0
- package/schemas/sdd/plugin-evidence-manifest.schema.json +109 -0
- package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
- package/schemas/sdd/plugin-package-governance.schema.json +74 -0
- package/schemas/sdd/plugin-registry.schema.json +171 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +109 -0
- package/schemas/sdd/quality-evidence-bundle.schema.json +109 -0
- package/schemas/sdd/reversa-evidence-bundle.schema.json +466 -0
- package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
- package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
- package/schemas/sdd/workspace-catalog.schema.json +5298 -1409
|
@@ -1,10 +1,37 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
export declare const parallelFeatStateBoundarySchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
4
|
+
canonical_state_glob: z.ZodLiteral<".sdd/state/*.yaml">;
|
|
5
|
+
project_state_root: z.ZodLiteral<".sdd">;
|
|
6
|
+
hidden_state_allowed: z.ZodLiteral<false>;
|
|
7
|
+
external_state_allowed: z.ZodLiteral<false>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
export declare const PARALLEL_FEAT_STATE_BOUNDARY: {
|
|
10
|
+
id: "codesdd-canonical-sdd-state";
|
|
11
|
+
canonical_state_glob: ".sdd/state/*.yaml";
|
|
12
|
+
project_state_root: ".sdd";
|
|
13
|
+
hidden_state_allowed: false;
|
|
14
|
+
external_state_allowed: false;
|
|
15
|
+
};
|
|
2
16
|
export declare const parallelFeatAutomationFeatureSchema: z.ZodObject<{
|
|
3
17
|
feature_ref: z.ZodString;
|
|
4
18
|
title: z.ZodString;
|
|
5
19
|
recommended_skills: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
6
20
|
lock_domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
7
21
|
}, z.core.$strip>;
|
|
22
|
+
export declare const parallelFeatSchedulerFeatureSchema: z.ZodObject<{
|
|
23
|
+
feature_ref: z.ZodString;
|
|
24
|
+
title: z.ZodString;
|
|
25
|
+
recommended_skills: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
26
|
+
lock_domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
27
|
+
blocked_by: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
28
|
+
status: z.ZodDefault<z.ZodEnum<{
|
|
29
|
+
READY: "READY";
|
|
30
|
+
IN_PROGRESS: "IN_PROGRESS";
|
|
31
|
+
DONE: "DONE";
|
|
32
|
+
BLOCKED: "BLOCKED";
|
|
33
|
+
}>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
8
35
|
export declare const parallelFeatAutomationRequestSchema: z.ZodObject<{
|
|
9
36
|
schema_version: z.ZodDefault<z.ZodLiteral<1>>;
|
|
10
37
|
generated_at: z.ZodOptional<z.ZodString>;
|
|
@@ -13,8 +40,8 @@ export declare const parallelFeatAutomationRequestSchema: z.ZodObject<{
|
|
|
13
40
|
require_commit_per_feature: z.ZodDefault<z.ZodBoolean>;
|
|
14
41
|
require_finalize_before_commit: z.ZodDefault<z.ZodBoolean>;
|
|
15
42
|
agent_provider: z.ZodOptional<z.ZodEnum<{
|
|
16
|
-
codex: "codex";
|
|
17
43
|
opencode: "opencode";
|
|
44
|
+
codex: "codex";
|
|
18
45
|
deepagents: "deepagents";
|
|
19
46
|
fake: "fake";
|
|
20
47
|
"claude-code": "claude-code";
|
|
@@ -28,18 +55,47 @@ export declare const parallelFeatAutomationRequestSchema: z.ZodObject<{
|
|
|
28
55
|
}, z.core.$strip>>>;
|
|
29
56
|
waves: z.ZodDefault<z.ZodArray<z.ZodArray<z.ZodString>>>;
|
|
30
57
|
}, z.core.$strip>;
|
|
58
|
+
export declare const parallelFeatSchedulerRequestSchema: z.ZodObject<{
|
|
59
|
+
schema_version: z.ZodDefault<z.ZodLiteral<1>>;
|
|
60
|
+
generated_at: z.ZodOptional<z.ZodString>;
|
|
61
|
+
max_agents: z.ZodDefault<z.ZodNumber>;
|
|
62
|
+
require_clean_worktree: z.ZodDefault<z.ZodBoolean>;
|
|
63
|
+
require_commit_per_feature: z.ZodDefault<z.ZodBoolean>;
|
|
64
|
+
require_finalize_before_commit: z.ZodDefault<z.ZodBoolean>;
|
|
65
|
+
agent_provider: z.ZodOptional<z.ZodEnum<{
|
|
66
|
+
opencode: "opencode";
|
|
67
|
+
codex: "codex";
|
|
68
|
+
deepagents: "deepagents";
|
|
69
|
+
fake: "fake";
|
|
70
|
+
"claude-code": "claude-code";
|
|
71
|
+
cloudcode: "cloudcode";
|
|
72
|
+
}>>;
|
|
73
|
+
features: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
74
|
+
feature_ref: z.ZodString;
|
|
75
|
+
title: z.ZodString;
|
|
76
|
+
recommended_skills: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
77
|
+
lock_domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
78
|
+
blocked_by: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
79
|
+
status: z.ZodDefault<z.ZodEnum<{
|
|
80
|
+
READY: "READY";
|
|
81
|
+
IN_PROGRESS: "IN_PROGRESS";
|
|
82
|
+
DONE: "DONE";
|
|
83
|
+
BLOCKED: "BLOCKED";
|
|
84
|
+
}>>;
|
|
85
|
+
}, z.core.$strip>>>;
|
|
86
|
+
}, z.core.$strip>;
|
|
31
87
|
export declare const parallelFeatAutomationStepSchema: z.ZodObject<{
|
|
32
88
|
feature_ref: z.ZodString;
|
|
33
89
|
title: z.ZodString;
|
|
34
90
|
sequence: z.ZodNumber;
|
|
35
91
|
delegation: z.ZodObject<{
|
|
36
92
|
mode: z.ZodEnum<{
|
|
37
|
-
"local-codex": "local-codex";
|
|
38
93
|
"agent-adapter": "agent-adapter";
|
|
94
|
+
"local-codex": "local-codex";
|
|
39
95
|
}>;
|
|
40
96
|
provider: z.ZodOptional<z.ZodEnum<{
|
|
41
|
-
codex: "codex";
|
|
42
97
|
opencode: "opencode";
|
|
98
|
+
codex: "codex";
|
|
43
99
|
deepagents: "deepagents";
|
|
44
100
|
fake: "fake";
|
|
45
101
|
"claude-code": "claude-code";
|
|
@@ -53,6 +109,9 @@ export declare const parallelFeatAutomationStepSchema: z.ZodObject<{
|
|
|
53
109
|
commit_per_feature: z.ZodBoolean;
|
|
54
110
|
commit_message: z.ZodString;
|
|
55
111
|
}, z.core.$strip>;
|
|
112
|
+
state_boundary_ref: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
113
|
+
allowed_state_writes: z.ZodArray<z.ZodString>;
|
|
114
|
+
forbidden_state_writes: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
56
115
|
evidence_required: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
57
116
|
}, z.core.$strip>;
|
|
58
117
|
export declare const parallelFeatAutomationWaveSchema: z.ZodObject<{
|
|
@@ -69,12 +128,12 @@ export declare const parallelFeatAutomationWaveSchema: z.ZodObject<{
|
|
|
69
128
|
sequence: z.ZodNumber;
|
|
70
129
|
delegation: z.ZodObject<{
|
|
71
130
|
mode: z.ZodEnum<{
|
|
72
|
-
"local-codex": "local-codex";
|
|
73
131
|
"agent-adapter": "agent-adapter";
|
|
132
|
+
"local-codex": "local-codex";
|
|
74
133
|
}>;
|
|
75
134
|
provider: z.ZodOptional<z.ZodEnum<{
|
|
76
|
-
codex: "codex";
|
|
77
135
|
opencode: "opencode";
|
|
136
|
+
codex: "codex";
|
|
78
137
|
deepagents: "deepagents";
|
|
79
138
|
fake: "fake";
|
|
80
139
|
"claude-code": "claude-code";
|
|
@@ -88,6 +147,9 @@ export declare const parallelFeatAutomationWaveSchema: z.ZodObject<{
|
|
|
88
147
|
commit_per_feature: z.ZodBoolean;
|
|
89
148
|
commit_message: z.ZodString;
|
|
90
149
|
}, z.core.$strip>;
|
|
150
|
+
state_boundary_ref: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
151
|
+
allowed_state_writes: z.ZodArray<z.ZodString>;
|
|
152
|
+
forbidden_state_writes: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
91
153
|
evidence_required: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
92
154
|
}, z.core.$strip>>>;
|
|
93
155
|
}, z.core.$strip>;
|
|
@@ -100,6 +162,19 @@ export declare const parallelFeatAutomationPlanSchema: z.ZodObject<{
|
|
|
100
162
|
empty: "empty";
|
|
101
163
|
}>;
|
|
102
164
|
max_agents: z.ZodNumber;
|
|
165
|
+
state_boundary: z.ZodObject<{
|
|
166
|
+
id: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
167
|
+
canonical_state_glob: z.ZodLiteral<".sdd/state/*.yaml">;
|
|
168
|
+
project_state_root: z.ZodLiteral<".sdd">;
|
|
169
|
+
hidden_state_allowed: z.ZodLiteral<false>;
|
|
170
|
+
external_state_allowed: z.ZodLiteral<false>;
|
|
171
|
+
}, z.core.$strip>;
|
|
172
|
+
write_policy: z.ZodObject<{
|
|
173
|
+
allowed_root: z.ZodLiteral<".sdd">;
|
|
174
|
+
canonical_state_glob: z.ZodLiteral<".sdd/state/*.yaml">;
|
|
175
|
+
hidden_state_allowed: z.ZodLiteral<false>;
|
|
176
|
+
external_state_allowed: z.ZodLiteral<false>;
|
|
177
|
+
}, z.core.$strip>;
|
|
103
178
|
rules: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
104
179
|
waves: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
105
180
|
wave_index: z.ZodNumber;
|
|
@@ -115,12 +190,12 @@ export declare const parallelFeatAutomationPlanSchema: z.ZodObject<{
|
|
|
115
190
|
sequence: z.ZodNumber;
|
|
116
191
|
delegation: z.ZodObject<{
|
|
117
192
|
mode: z.ZodEnum<{
|
|
118
|
-
"local-codex": "local-codex";
|
|
119
193
|
"agent-adapter": "agent-adapter";
|
|
194
|
+
"local-codex": "local-codex";
|
|
120
195
|
}>;
|
|
121
196
|
provider: z.ZodOptional<z.ZodEnum<{
|
|
122
|
-
codex: "codex";
|
|
123
197
|
opencode: "opencode";
|
|
198
|
+
codex: "codex";
|
|
124
199
|
deepagents: "deepagents";
|
|
125
200
|
fake: "fake";
|
|
126
201
|
"claude-code": "claude-code";
|
|
@@ -134,6 +209,9 @@ export declare const parallelFeatAutomationPlanSchema: z.ZodObject<{
|
|
|
134
209
|
commit_per_feature: z.ZodBoolean;
|
|
135
210
|
commit_message: z.ZodString;
|
|
136
211
|
}, z.core.$strip>;
|
|
212
|
+
state_boundary_ref: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
213
|
+
allowed_state_writes: z.ZodArray<z.ZodString>;
|
|
214
|
+
forbidden_state_writes: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
137
215
|
evidence_required: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
138
216
|
}, z.core.$strip>>>;
|
|
139
217
|
}, z.core.$strip>>>;
|
|
@@ -143,10 +221,110 @@ export declare const parallelFeatAutomationPlanSchema: z.ZodObject<{
|
|
|
143
221
|
blocked_wave_count: z.ZodNumber;
|
|
144
222
|
}, z.core.$strip>;
|
|
145
223
|
}, z.core.$strip>;
|
|
224
|
+
export declare const parallelFeatSchedulerBlockedFeatureSchema: z.ZodObject<{
|
|
225
|
+
feature_ref: z.ZodString;
|
|
226
|
+
blocked_by: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
227
|
+
reason: z.ZodString;
|
|
228
|
+
}, z.core.$strip>;
|
|
229
|
+
export declare const parallelFeatSchedulerResultSchema: z.ZodObject<{
|
|
230
|
+
schema_version: z.ZodLiteral<1>;
|
|
231
|
+
generated_at: z.ZodString;
|
|
232
|
+
status: z.ZodEnum<{
|
|
233
|
+
ready: "ready";
|
|
234
|
+
blocked: "blocked";
|
|
235
|
+
empty: "empty";
|
|
236
|
+
}>;
|
|
237
|
+
plan: z.ZodObject<{
|
|
238
|
+
schema_version: z.ZodLiteral<1>;
|
|
239
|
+
generated_at: z.ZodString;
|
|
240
|
+
status: z.ZodEnum<{
|
|
241
|
+
ready: "ready";
|
|
242
|
+
blocked: "blocked";
|
|
243
|
+
empty: "empty";
|
|
244
|
+
}>;
|
|
245
|
+
max_agents: z.ZodNumber;
|
|
246
|
+
state_boundary: z.ZodObject<{
|
|
247
|
+
id: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
248
|
+
canonical_state_glob: z.ZodLiteral<".sdd/state/*.yaml">;
|
|
249
|
+
project_state_root: z.ZodLiteral<".sdd">;
|
|
250
|
+
hidden_state_allowed: z.ZodLiteral<false>;
|
|
251
|
+
external_state_allowed: z.ZodLiteral<false>;
|
|
252
|
+
}, z.core.$strip>;
|
|
253
|
+
write_policy: z.ZodObject<{
|
|
254
|
+
allowed_root: z.ZodLiteral<".sdd">;
|
|
255
|
+
canonical_state_glob: z.ZodLiteral<".sdd/state/*.yaml">;
|
|
256
|
+
hidden_state_allowed: z.ZodLiteral<false>;
|
|
257
|
+
external_state_allowed: z.ZodLiteral<false>;
|
|
258
|
+
}, z.core.$strip>;
|
|
259
|
+
rules: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
260
|
+
waves: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
261
|
+
wave_index: z.ZodNumber;
|
|
262
|
+
max_parallel: z.ZodNumber;
|
|
263
|
+
status: z.ZodEnum<{
|
|
264
|
+
ready: "ready";
|
|
265
|
+
blocked: "blocked";
|
|
266
|
+
}>;
|
|
267
|
+
conflicts: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
268
|
+
steps: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
269
|
+
feature_ref: z.ZodString;
|
|
270
|
+
title: z.ZodString;
|
|
271
|
+
sequence: z.ZodNumber;
|
|
272
|
+
delegation: z.ZodObject<{
|
|
273
|
+
mode: z.ZodEnum<{
|
|
274
|
+
"agent-adapter": "agent-adapter";
|
|
275
|
+
"local-codex": "local-codex";
|
|
276
|
+
}>;
|
|
277
|
+
provider: z.ZodOptional<z.ZodEnum<{
|
|
278
|
+
opencode: "opencode";
|
|
279
|
+
codex: "codex";
|
|
280
|
+
deepagents: "deepagents";
|
|
281
|
+
fake: "fake";
|
|
282
|
+
"claude-code": "claude-code";
|
|
283
|
+
cloudcode: "cloudcode";
|
|
284
|
+
}>>;
|
|
285
|
+
}, z.core.$strip>;
|
|
286
|
+
commands: z.ZodArray<z.ZodString>;
|
|
287
|
+
commit_boundary: z.ZodObject<{
|
|
288
|
+
clean_worktree_required: z.ZodBoolean;
|
|
289
|
+
finalize_before_commit: z.ZodBoolean;
|
|
290
|
+
commit_per_feature: z.ZodBoolean;
|
|
291
|
+
commit_message: z.ZodString;
|
|
292
|
+
}, z.core.$strip>;
|
|
293
|
+
state_boundary_ref: z.ZodLiteral<"codesdd-canonical-sdd-state">;
|
|
294
|
+
allowed_state_writes: z.ZodArray<z.ZodString>;
|
|
295
|
+
forbidden_state_writes: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
296
|
+
evidence_required: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
297
|
+
}, z.core.$strip>>>;
|
|
298
|
+
}, z.core.$strip>>>;
|
|
299
|
+
summary: z.ZodObject<{
|
|
300
|
+
feature_count: z.ZodNumber;
|
|
301
|
+
wave_count: z.ZodNumber;
|
|
302
|
+
blocked_wave_count: z.ZodNumber;
|
|
303
|
+
}, z.core.$strip>;
|
|
304
|
+
}, z.core.$strip>;
|
|
305
|
+
blocked_features: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
306
|
+
feature_ref: z.ZodString;
|
|
307
|
+
blocked_by: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
308
|
+
reason: z.ZodString;
|
|
309
|
+
}, z.core.$strip>>>;
|
|
310
|
+
summary: z.ZodObject<{
|
|
311
|
+
feature_count: z.ZodNumber;
|
|
312
|
+
scheduled_feature_count: z.ZodNumber;
|
|
313
|
+
done_feature_count: z.ZodNumber;
|
|
314
|
+
blocked_feature_count: z.ZodNumber;
|
|
315
|
+
wave_count: z.ZodNumber;
|
|
316
|
+
}, z.core.$strip>;
|
|
317
|
+
}, z.core.$strip>;
|
|
146
318
|
export type ParallelFeatAutomationFeature = z.infer<typeof parallelFeatAutomationFeatureSchema>;
|
|
147
319
|
export type ParallelFeatAutomationRequest = z.infer<typeof parallelFeatAutomationRequestSchema>;
|
|
148
320
|
export type ParallelFeatAutomationRequestInput = z.input<typeof parallelFeatAutomationRequestSchema>;
|
|
149
321
|
export type ParallelFeatAutomationStep = z.infer<typeof parallelFeatAutomationStepSchema>;
|
|
150
322
|
export type ParallelFeatAutomationPlan = z.infer<typeof parallelFeatAutomationPlanSchema>;
|
|
323
|
+
export type ParallelFeatSchedulerFeature = z.infer<typeof parallelFeatSchedulerFeatureSchema>;
|
|
324
|
+
export type ParallelFeatSchedulerRequest = z.infer<typeof parallelFeatSchedulerRequestSchema>;
|
|
325
|
+
export type ParallelFeatSchedulerRequestInput = z.input<typeof parallelFeatSchedulerRequestSchema>;
|
|
326
|
+
export type ParallelFeatSchedulerBlockedFeature = z.infer<typeof parallelFeatSchedulerBlockedFeatureSchema>;
|
|
327
|
+
export type ParallelFeatSchedulerResult = z.infer<typeof parallelFeatSchedulerResultSchema>;
|
|
151
328
|
export declare function buildParallelFeatAutomationPlan(input: ParallelFeatAutomationRequestInput): ParallelFeatAutomationPlan;
|
|
329
|
+
export declare function scheduleChainedFeatWaves(input: ParallelFeatSchedulerRequestInput): ParallelFeatSchedulerResult;
|
|
152
330
|
//# sourceMappingURL=parallel-feat-automation.d.ts.map
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
const FEATURE_REF_PATTERN = /^FEAT-\d{4}$/;
|
|
3
3
|
const featureRefSchema = z.string().regex(FEATURE_REF_PATTERN);
|
|
4
|
+
const sddPolicyPathSchema = z
|
|
5
|
+
.string()
|
|
6
|
+
.min(1)
|
|
7
|
+
.refine((value) => value === '.sdd' || value.startsWith('.sdd/'), {
|
|
8
|
+
message: 'Execution plans may only declare writes inside the canonical .sdd boundary.',
|
|
9
|
+
});
|
|
4
10
|
const agentProviderSchema = z.enum([
|
|
5
11
|
'codex',
|
|
6
12
|
'opencode',
|
|
@@ -9,12 +15,30 @@ const agentProviderSchema = z.enum([
|
|
|
9
15
|
'deepagents',
|
|
10
16
|
'fake',
|
|
11
17
|
]);
|
|
18
|
+
export const parallelFeatStateBoundarySchema = z.object({
|
|
19
|
+
id: z.literal('codesdd-canonical-sdd-state'),
|
|
20
|
+
canonical_state_glob: z.literal('.sdd/state/*.yaml'),
|
|
21
|
+
project_state_root: z.literal('.sdd'),
|
|
22
|
+
hidden_state_allowed: z.literal(false),
|
|
23
|
+
external_state_allowed: z.literal(false),
|
|
24
|
+
});
|
|
25
|
+
export const PARALLEL_FEAT_STATE_BOUNDARY = {
|
|
26
|
+
id: 'codesdd-canonical-sdd-state',
|
|
27
|
+
canonical_state_glob: '.sdd/state/*.yaml',
|
|
28
|
+
project_state_root: '.sdd',
|
|
29
|
+
hidden_state_allowed: false,
|
|
30
|
+
external_state_allowed: false,
|
|
31
|
+
};
|
|
12
32
|
export const parallelFeatAutomationFeatureSchema = z.object({
|
|
13
33
|
feature_ref: featureRefSchema,
|
|
14
34
|
title: z.string().min(3),
|
|
15
35
|
recommended_skills: z.array(z.string().min(1)).default([]),
|
|
16
36
|
lock_domains: z.array(z.string().min(1)).default([]),
|
|
17
37
|
});
|
|
38
|
+
export const parallelFeatSchedulerFeatureSchema = parallelFeatAutomationFeatureSchema.extend({
|
|
39
|
+
blocked_by: z.array(featureRefSchema).default([]),
|
|
40
|
+
status: z.enum(['READY', 'IN_PROGRESS', 'BLOCKED', 'DONE']).default('READY'),
|
|
41
|
+
});
|
|
18
42
|
export const parallelFeatAutomationRequestSchema = z
|
|
19
43
|
.object({
|
|
20
44
|
schema_version: z.literal(1).default(1),
|
|
@@ -50,6 +74,30 @@ export const parallelFeatAutomationRequestSchema = z
|
|
|
50
74
|
}
|
|
51
75
|
}
|
|
52
76
|
});
|
|
77
|
+
export const parallelFeatSchedulerRequestSchema = z
|
|
78
|
+
.object({
|
|
79
|
+
schema_version: z.literal(1).default(1),
|
|
80
|
+
generated_at: z.string().datetime().optional(),
|
|
81
|
+
max_agents: z.number().int().min(1).max(10).default(5),
|
|
82
|
+
require_clean_worktree: z.boolean().default(true),
|
|
83
|
+
require_commit_per_feature: z.boolean().default(true),
|
|
84
|
+
require_finalize_before_commit: z.boolean().default(true),
|
|
85
|
+
agent_provider: agentProviderSchema.optional(),
|
|
86
|
+
features: z.array(parallelFeatSchedulerFeatureSchema).default([]),
|
|
87
|
+
})
|
|
88
|
+
.superRefine((request, context) => {
|
|
89
|
+
const seenFeatureRefs = new Set();
|
|
90
|
+
for (const [featureIndex, feature] of request.features.entries()) {
|
|
91
|
+
if (seenFeatureRefs.has(feature.feature_ref)) {
|
|
92
|
+
context.addIssue({
|
|
93
|
+
code: 'custom',
|
|
94
|
+
path: ['features', featureIndex, 'feature_ref'],
|
|
95
|
+
message: `Feature ${feature.feature_ref} appears more than once.`,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
seenFeatureRefs.add(feature.feature_ref);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
53
101
|
export const parallelFeatAutomationStepSchema = z.object({
|
|
54
102
|
feature_ref: featureRefSchema,
|
|
55
103
|
title: z.string().min(3),
|
|
@@ -65,6 +113,9 @@ export const parallelFeatAutomationStepSchema = z.object({
|
|
|
65
113
|
commit_per_feature: z.boolean(),
|
|
66
114
|
commit_message: z.string().min(1),
|
|
67
115
|
}),
|
|
116
|
+
state_boundary_ref: z.literal('codesdd-canonical-sdd-state'),
|
|
117
|
+
allowed_state_writes: z.array(sddPolicyPathSchema).min(1),
|
|
118
|
+
forbidden_state_writes: z.array(z.string().min(1)).default(['.codesdd/**', 'external-context/**']),
|
|
68
119
|
evidence_required: z.array(z.string().min(1)).default([]),
|
|
69
120
|
});
|
|
70
121
|
export const parallelFeatAutomationWaveSchema = z.object({
|
|
@@ -79,6 +130,13 @@ export const parallelFeatAutomationPlanSchema = z.object({
|
|
|
79
130
|
generated_at: z.string().datetime(),
|
|
80
131
|
status: z.enum(['ready', 'blocked', 'empty']),
|
|
81
132
|
max_agents: z.number().int().positive(),
|
|
133
|
+
state_boundary: parallelFeatStateBoundarySchema,
|
|
134
|
+
write_policy: z.object({
|
|
135
|
+
allowed_root: z.literal('.sdd'),
|
|
136
|
+
canonical_state_glob: z.literal('.sdd/state/*.yaml'),
|
|
137
|
+
hidden_state_allowed: z.literal(false),
|
|
138
|
+
external_state_allowed: z.literal(false),
|
|
139
|
+
}),
|
|
82
140
|
rules: z.array(z.string().min(1)).default([]),
|
|
83
141
|
waves: z.array(parallelFeatAutomationWaveSchema).default([]),
|
|
84
142
|
summary: z.object({
|
|
@@ -87,6 +145,25 @@ export const parallelFeatAutomationPlanSchema = z.object({
|
|
|
87
145
|
blocked_wave_count: z.number().int().nonnegative(),
|
|
88
146
|
}),
|
|
89
147
|
});
|
|
148
|
+
export const parallelFeatSchedulerBlockedFeatureSchema = z.object({
|
|
149
|
+
feature_ref: featureRefSchema,
|
|
150
|
+
blocked_by: z.array(featureRefSchema).default([]),
|
|
151
|
+
reason: z.string().min(1),
|
|
152
|
+
});
|
|
153
|
+
export const parallelFeatSchedulerResultSchema = z.object({
|
|
154
|
+
schema_version: z.literal(1),
|
|
155
|
+
generated_at: z.string().datetime(),
|
|
156
|
+
status: z.enum(['ready', 'blocked', 'empty']),
|
|
157
|
+
plan: parallelFeatAutomationPlanSchema,
|
|
158
|
+
blocked_features: z.array(parallelFeatSchedulerBlockedFeatureSchema).default([]),
|
|
159
|
+
summary: z.object({
|
|
160
|
+
feature_count: z.number().int().nonnegative(),
|
|
161
|
+
scheduled_feature_count: z.number().int().nonnegative(),
|
|
162
|
+
done_feature_count: z.number().int().nonnegative(),
|
|
163
|
+
blocked_feature_count: z.number().int().nonnegative(),
|
|
164
|
+
wave_count: z.number().int().nonnegative(),
|
|
165
|
+
}),
|
|
166
|
+
});
|
|
90
167
|
export function buildParallelFeatAutomationPlan(input) {
|
|
91
168
|
const request = parallelFeatAutomationRequestSchema.parse(input);
|
|
92
169
|
const generatedAt = request.generated_at ?? new Date().toISOString();
|
|
@@ -98,6 +175,8 @@ export function buildParallelFeatAutomationPlan(input) {
|
|
|
98
175
|
generated_at: generatedAt,
|
|
99
176
|
status: 'empty',
|
|
100
177
|
max_agents: request.max_agents,
|
|
178
|
+
state_boundary: PARALLEL_FEAT_STATE_BOUNDARY,
|
|
179
|
+
write_policy: buildWritePolicy(),
|
|
101
180
|
rules: automationRules(request),
|
|
102
181
|
waves: [],
|
|
103
182
|
summary: {
|
|
@@ -124,6 +203,8 @@ export function buildParallelFeatAutomationPlan(input) {
|
|
|
124
203
|
generated_at: generatedAt,
|
|
125
204
|
status: blockedWaveCount > 0 ? 'blocked' : 'ready',
|
|
126
205
|
max_agents: request.max_agents,
|
|
206
|
+
state_boundary: PARALLEL_FEAT_STATE_BOUNDARY,
|
|
207
|
+
write_policy: buildWritePolicy(),
|
|
127
208
|
rules: automationRules(request),
|
|
128
209
|
waves,
|
|
129
210
|
summary: {
|
|
@@ -133,6 +214,85 @@ export function buildParallelFeatAutomationPlan(input) {
|
|
|
133
214
|
},
|
|
134
215
|
});
|
|
135
216
|
}
|
|
217
|
+
export function scheduleChainedFeatWaves(input) {
|
|
218
|
+
const request = parallelFeatSchedulerRequestSchema.parse(input);
|
|
219
|
+
const generatedAt = request.generated_at ?? new Date().toISOString();
|
|
220
|
+
const doneFeatureRefs = new Set(request.features
|
|
221
|
+
.filter((feature) => feature.status === 'DONE')
|
|
222
|
+
.map((feature) => feature.feature_ref));
|
|
223
|
+
const pendingFeatures = request.features.filter((feature) => feature.status !== 'DONE');
|
|
224
|
+
if (pendingFeatures.length === 0) {
|
|
225
|
+
const plan = buildParallelFeatAutomationPlan({
|
|
226
|
+
...request,
|
|
227
|
+
generated_at: generatedAt,
|
|
228
|
+
features: [],
|
|
229
|
+
waves: [],
|
|
230
|
+
});
|
|
231
|
+
return parallelFeatSchedulerResultSchema.parse({
|
|
232
|
+
schema_version: 1,
|
|
233
|
+
generated_at: generatedAt,
|
|
234
|
+
status: 'empty',
|
|
235
|
+
plan,
|
|
236
|
+
blocked_features: [],
|
|
237
|
+
summary: {
|
|
238
|
+
feature_count: request.features.length,
|
|
239
|
+
scheduled_feature_count: 0,
|
|
240
|
+
done_feature_count: doneFeatureRefs.size,
|
|
241
|
+
blocked_feature_count: 0,
|
|
242
|
+
wave_count: 0,
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
const featureMap = new Map(request.features.map((feature) => [feature.feature_ref, feature]));
|
|
247
|
+
const scheduledFeatureRefs = new Set(doneFeatureRefs);
|
|
248
|
+
const unscheduled = new Map(pendingFeatures.map((feature) => [feature.feature_ref, feature]));
|
|
249
|
+
const waves = [];
|
|
250
|
+
while (unscheduled.size > 0) {
|
|
251
|
+
const candidates = [...unscheduled.values()].filter((feature) => getBlockingDependencies(feature, scheduledFeatureRefs, featureMap).length === 0);
|
|
252
|
+
if (candidates.length === 0) {
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
const wave = selectConflictFreeWave(candidates, request.max_agents);
|
|
256
|
+
waves.push(wave.map((feature) => feature.feature_ref));
|
|
257
|
+
for (const feature of wave) {
|
|
258
|
+
scheduledFeatureRefs.add(feature.feature_ref);
|
|
259
|
+
unscheduled.delete(feature.feature_ref);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const scheduledFeatures = waves
|
|
263
|
+
.flat()
|
|
264
|
+
.map((featureRef) => featureMap.get(featureRef));
|
|
265
|
+
const blockedFeatures = [...unscheduled.values()].map((feature) => {
|
|
266
|
+
const blockedBy = getBlockingDependencies(feature, scheduledFeatureRefs, featureMap);
|
|
267
|
+
return parallelFeatSchedulerBlockedFeatureSchema.parse({
|
|
268
|
+
feature_ref: feature.feature_ref,
|
|
269
|
+
blocked_by: blockedBy,
|
|
270
|
+
reason: blockedBy.length > 0
|
|
271
|
+
? `Waiting for unscheduled dependencies: ${blockedBy.join(', ')}.`
|
|
272
|
+
: 'Deferred because no dependency-safe execution slot was available.',
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
const plan = buildParallelFeatAutomationPlan({
|
|
276
|
+
...request,
|
|
277
|
+
generated_at: generatedAt,
|
|
278
|
+
features: scheduledFeatures.map(toAutomationFeature),
|
|
279
|
+
waves,
|
|
280
|
+
});
|
|
281
|
+
return parallelFeatSchedulerResultSchema.parse({
|
|
282
|
+
schema_version: 1,
|
|
283
|
+
generated_at: generatedAt,
|
|
284
|
+
status: blockedFeatures.length > 0 ? 'blocked' : plan.status,
|
|
285
|
+
plan,
|
|
286
|
+
blocked_features: blockedFeatures,
|
|
287
|
+
summary: {
|
|
288
|
+
feature_count: request.features.length,
|
|
289
|
+
scheduled_feature_count: scheduledFeatures.length,
|
|
290
|
+
done_feature_count: doneFeatureRefs.size,
|
|
291
|
+
blocked_feature_count: blockedFeatures.length,
|
|
292
|
+
wave_count: waves.length,
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
}
|
|
136
296
|
function normalizeWaves(request) {
|
|
137
297
|
const sourceWaves = request.waves.length > 0
|
|
138
298
|
? request.waves
|
|
@@ -177,6 +337,15 @@ function buildStep(feature, sequence, request) {
|
|
|
177
337
|
commit_per_feature: request.require_commit_per_feature,
|
|
178
338
|
commit_message: `feat(sdd): execute ${feature.feature_ref.toLowerCase()}`,
|
|
179
339
|
},
|
|
340
|
+
state_boundary_ref: 'codesdd-canonical-sdd-state',
|
|
341
|
+
allowed_state_writes: [
|
|
342
|
+
`.sdd/active/${feature.feature_ref}/`,
|
|
343
|
+
`.sdd/archived/${feature.feature_ref}/`,
|
|
344
|
+
'.sdd/state/backlog.yaml',
|
|
345
|
+
'.sdd/state/finalize-queue.yaml',
|
|
346
|
+
'.sdd/state/transition-log.yaml',
|
|
347
|
+
],
|
|
348
|
+
forbidden_state_writes: ['.codesdd/**', 'external-context/**'],
|
|
180
349
|
evidence_required: [
|
|
181
350
|
'focused_coverage',
|
|
182
351
|
'build',
|
|
@@ -189,8 +358,17 @@ function buildStep(feature, sequence, request) {
|
|
|
189
358
|
],
|
|
190
359
|
});
|
|
191
360
|
}
|
|
361
|
+
function buildWritePolicy() {
|
|
362
|
+
return {
|
|
363
|
+
allowed_root: '.sdd',
|
|
364
|
+
canonical_state_glob: '.sdd/state/*.yaml',
|
|
365
|
+
hidden_state_allowed: false,
|
|
366
|
+
external_state_allowed: false,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
192
369
|
function automationRules(request) {
|
|
193
370
|
return [
|
|
371
|
+
'state_boundary=codesdd-canonical-sdd-state',
|
|
194
372
|
`max_agents=${request.max_agents}`,
|
|
195
373
|
`clean_worktree_required=${request.require_clean_worktree}`,
|
|
196
374
|
`commit_per_feature=${request.require_commit_per_feature}`,
|
|
@@ -209,4 +387,38 @@ function detectLockConflicts(features, waveIndex) {
|
|
|
209
387
|
.filter(([, owners]) => owners.length > 1)
|
|
210
388
|
.map(([lockDomain, owners]) => `wave ${waveIndex} lock ${lockDomain} shared by ${owners.join(', ')}`);
|
|
211
389
|
}
|
|
390
|
+
function getBlockingDependencies(feature, scheduledFeatureRefs, featureMap) {
|
|
391
|
+
return feature.blocked_by.filter((dependencyRef) => {
|
|
392
|
+
if (scheduledFeatureRefs.has(dependencyRef)) {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
return featureMap.has(dependencyRef) || !scheduledFeatureRefs.has(dependencyRef);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
function selectConflictFreeWave(candidates, maxAgents) {
|
|
399
|
+
const selected = [];
|
|
400
|
+
const selectedLockDomains = new Set();
|
|
401
|
+
for (const candidate of candidates) {
|
|
402
|
+
if (selected.length >= maxAgents) {
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
const hasLockConflict = candidate.lock_domains.some((lockDomain) => selectedLockDomains.has(lockDomain));
|
|
406
|
+
if (hasLockConflict) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
selected.push(candidate);
|
|
410
|
+
for (const lockDomain of candidate.lock_domains) {
|
|
411
|
+
selectedLockDomains.add(lockDomain);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return selected;
|
|
415
|
+
}
|
|
416
|
+
function toAutomationFeature(feature) {
|
|
417
|
+
return {
|
|
418
|
+
feature_ref: feature.feature_ref,
|
|
419
|
+
title: feature.title,
|
|
420
|
+
recommended_skills: feature.recommended_skills,
|
|
421
|
+
lock_domains: feature.lock_domains,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
212
424
|
//# sourceMappingURL=parallel-feat-automation.js.map
|