@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.
Files changed (213) hide show
  1. package/.sdd/skills/curated/devtrack-api/SKILL.md +98 -12
  2. package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +10 -0
  3. package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +10 -0
  4. package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +10 -0
  5. package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +10 -0
  6. package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +10 -0
  7. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +5 -3
  8. package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +12 -0
  9. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +61 -5
  10. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +15 -3
  11. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +1951 -0
  12. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +16 -14
  13. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +40 -0
  14. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +19 -2
  15. package/.sdd/skills/curated/devtrack-api/references/generated-artifact-invalidation.md +97 -0
  16. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +30 -1
  17. package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +42 -0
  18. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +22 -1
  19. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +9 -7
  20. package/README.md +280 -29
  21. package/dist/applications/sdd/index.d.ts +16 -0
  22. package/dist/applications/sdd/index.js +16 -0
  23. package/dist/cli/program.js +180 -11
  24. package/dist/commands/config.js +197 -10
  25. package/dist/commands/sdd/execution.js +408 -16
  26. package/dist/commands/sdd/plugin.js +5 -0
  27. package/dist/commands/sdd/shared.d.ts +1 -0
  28. package/dist/commands/sdd/shared.js +10 -0
  29. package/dist/commands/sdd.js +157 -7
  30. package/dist/core/cli/command-matrix.d.ts +18 -0
  31. package/dist/core/cli/command-matrix.js +157 -0
  32. package/dist/core/cli-command-quality.js +11 -0
  33. package/dist/core/completions/command-registry.js +45 -0
  34. package/dist/core/config-schema.d.ts +31 -1
  35. package/dist/core/config-schema.js +79 -5
  36. package/dist/core/config.d.ts +1 -0
  37. package/dist/core/config.js +11 -0
  38. package/dist/core/global-config.d.ts +29 -0
  39. package/dist/core/init.d.ts +2 -2
  40. package/dist/core/init.js +13 -14
  41. package/dist/core/sdd/agent-binding.d.ts +19 -19
  42. package/dist/core/sdd/agent-runtime-contract.d.ts +204 -0
  43. package/dist/core/sdd/agent-runtime-contract.js +200 -0
  44. package/dist/core/sdd/allocator-recovery.d.ts +14 -0
  45. package/dist/core/sdd/allocator-recovery.js +30 -0
  46. package/dist/core/sdd/allocator-security.d.ts +18 -0
  47. package/dist/core/sdd/allocator-security.js +36 -0
  48. package/dist/core/sdd/api-foundation-baseline.d.ts +111 -0
  49. package/dist/core/sdd/api-foundation-baseline.js +151 -0
  50. package/dist/core/sdd/api-foundation-parity.d.ts +114 -0
  51. package/dist/core/sdd/api-foundation-parity.js +131 -0
  52. package/dist/core/sdd/api-profile-catalog.d.ts +36 -0
  53. package/dist/core/sdd/api-profile-catalog.js +132 -0
  54. package/dist/core/sdd/api-profile-dry-run-projection.d.ts +93 -0
  55. package/dist/core/sdd/api-profile-dry-run-projection.js +370 -0
  56. package/dist/core/sdd/api-profile-recipes.d.ts +82 -0
  57. package/dist/core/sdd/api-profile-recipes.js +484 -0
  58. package/dist/core/sdd/artifact-id-allocator.d.ts +368 -0
  59. package/dist/core/sdd/artifact-id-allocator.js +510 -0
  60. package/dist/core/sdd/check.d.ts +52 -1
  61. package/dist/core/sdd/check.js +326 -11
  62. package/dist/core/sdd/coordination/coordination-adapters.d.ts +15 -8
  63. package/dist/core/sdd/coordination/coordination-adapters.js +43 -15
  64. package/dist/core/sdd/coordination/index.d.ts +1 -0
  65. package/dist/core/sdd/coordination/index.js +1 -0
  66. package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
  67. package/dist/core/sdd/coordination/redis-runtime.js +698 -0
  68. package/dist/core/sdd/deepagent-contracts.d.ts +99 -5
  69. package/dist/core/sdd/deepagent-contracts.js +62 -0
  70. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +3 -3
  71. package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
  72. package/dist/core/sdd/default-bootstrap-files.js +14 -10
  73. package/dist/core/sdd/default-skills.js +115 -9
  74. package/dist/core/sdd/devtrack-api-appliance.d.ts +42 -1
  75. package/dist/core/sdd/devtrack-api-appliance.js +159 -32
  76. package/dist/core/sdd/devtrack-api-architecture.d.ts +16 -0
  77. package/dist/core/sdd/devtrack-api-architecture.js +86 -0
  78. package/dist/core/sdd/docs-sync.js +24 -18
  79. package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
  80. package/dist/core/sdd/domain/capability-diff.js +200 -0
  81. package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
  82. package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
  83. package/dist/core/sdd/domain/semantic-intent-classifier.d.ts +29 -0
  84. package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -0
  85. package/dist/core/sdd/enterprise-mutating-command-gate.d.ts +27 -0
  86. package/dist/core/sdd/enterprise-mutating-command-gate.js +104 -0
  87. package/dist/core/sdd/enterprise-provenance-gates.d.ts +20 -0
  88. package/dist/core/sdd/enterprise-provenance-gates.js +63 -0
  89. package/dist/core/sdd/enterprise-provisioning-policy.d.ts +26 -0
  90. package/dist/core/sdd/enterprise-provisioning-policy.js +104 -0
  91. package/dist/core/sdd/foundation-artifact-map-validator.d.ts +16 -0
  92. package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
  93. package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
  94. package/dist/core/sdd/foundation-layer-manifest.js +117 -0
  95. package/dist/core/sdd/governance-schemas.d.ts +2 -2
  96. package/dist/core/sdd/governance-schemas.js +11 -2
  97. package/dist/core/sdd/intent-guard.d.ts +22 -0
  98. package/dist/core/sdd/intent-guard.js +67 -0
  99. package/dist/core/sdd/json-schema.js +13 -1
  100. package/dist/core/sdd/legacy-operations.js +169 -5
  101. package/dist/core/sdd/migrate-workspace.js +39 -0
  102. package/dist/core/sdd/package-security-gates.d.ts +21 -0
  103. package/dist/core/sdd/package-security-gates.js +121 -0
  104. package/dist/core/sdd/package-structure-gate.d.ts +85 -3
  105. package/dist/core/sdd/package-structure-gate.js +384 -11
  106. package/dist/core/sdd/parallel-feat-automation.d.ts +185 -7
  107. package/dist/core/sdd/parallel-feat-automation.js +212 -0
  108. package/dist/core/sdd/plugin-broker.d.ts +223 -4
  109. package/dist/core/sdd/plugin-broker.js +10 -0
  110. package/dist/core/sdd/plugin-cli.d.ts +30 -0
  111. package/dist/core/sdd/plugin-cli.js +70 -3
  112. package/dist/core/sdd/plugin-evidence.d.ts +73 -0
  113. package/dist/core/sdd/plugin-manifest.d.ts +69 -1
  114. package/dist/core/sdd/plugin-manifest.js +10 -0
  115. package/dist/core/sdd/plugin-policy-pack.d.ts +1 -1
  116. package/dist/core/sdd/plugin-policy.js +6 -1
  117. package/dist/core/sdd/plugin-registry.d.ts +138 -2
  118. package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
  119. package/dist/core/sdd/plugin-sdk-contract.js +268 -0
  120. package/dist/core/sdd/plugin-skill-binding.d.ts +1 -1
  121. package/dist/core/sdd/quality-validation.d.ts +89 -16
  122. package/dist/core/sdd/release-readiness.d.ts +68 -0
  123. package/dist/core/sdd/release-readiness.js +767 -0
  124. package/dist/core/sdd/reversa-architecture-extractor.d.ts +13 -0
  125. package/dist/core/sdd/reversa-architecture-extractor.js +89 -0
  126. package/dist/core/sdd/reversa-artifact-writer.d.ts +18 -0
  127. package/dist/core/sdd/reversa-artifact-writer.js +40 -0
  128. package/dist/core/sdd/reversa-command-policy.d.ts +136 -0
  129. package/dist/core/sdd/reversa-command-policy.js +361 -0
  130. package/dist/core/sdd/reversa-data-extractor.d.ts +11 -0
  131. package/dist/core/sdd/reversa-data-extractor.js +73 -0
  132. package/dist/core/sdd/reversa-equivalence.d.ts +20 -0
  133. package/dist/core/sdd/reversa-equivalence.js +34 -0
  134. package/dist/core/sdd/reversa-evidence.d.ts +298 -0
  135. package/dist/core/sdd/reversa-evidence.js +118 -0
  136. package/dist/core/sdd/reversa-reconstruction.d.ts +29 -0
  137. package/dist/core/sdd/reversa-reconstruction.js +32 -0
  138. package/dist/core/sdd/reversa-rules-extractor.d.ts +12 -0
  139. package/dist/core/sdd/reversa-rules-extractor.js +86 -0
  140. package/dist/core/sdd/reversa-source-safety.d.ts +19 -0
  141. package/dist/core/sdd/reversa-source-safety.js +105 -0
  142. package/dist/core/sdd/reversa-surface-scout.d.ts +13 -0
  143. package/dist/core/sdd/reversa-surface-scout.js +85 -0
  144. package/dist/core/sdd/reversa-ux-mapper.d.ts +11 -0
  145. package/dist/core/sdd/reversa-ux-mapper.js +73 -0
  146. package/dist/core/sdd/runtime-boundary-contract.d.ts +45 -0
  147. package/dist/core/sdd/runtime-boundary-contract.js +90 -0
  148. package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
  149. package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
  150. package/dist/core/sdd/services/agent-run.service.d.ts +38 -6
  151. package/dist/core/sdd/services/agent-run.service.js +73 -1
  152. package/dist/core/sdd/services/archive-quality-coherence.service.d.ts +17 -0
  153. package/dist/core/sdd/services/archive-quality-coherence.service.js +141 -0
  154. package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
  155. package/dist/core/sdd/services/capability-diff.service.js +26 -0
  156. package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
  157. package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
  158. package/dist/core/sdd/services/context.service.d.ts +43 -340
  159. package/dist/core/sdd/services/context.service.js +323 -9
  160. package/dist/core/sdd/services/decide.service.js +1 -1
  161. package/dist/core/sdd/services/finalize.service.d.ts +27 -0
  162. package/dist/core/sdd/services/finalize.service.js +226 -18
  163. package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
  164. package/dist/core/sdd/services/historical-quality-regression.service.d.ts +35 -0
  165. package/dist/core/sdd/services/historical-quality-regression.service.js +228 -0
  166. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  167. package/dist/core/sdd/services/planning-execution-coherence.service.d.ts +45 -0
  168. package/dist/core/sdd/services/planning-execution-coherence.service.js +225 -0
  169. package/dist/core/sdd/services/semantic-intent-classifier.service.d.ts +6 -0
  170. package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
  171. package/dist/core/sdd/state.d.ts +1 -0
  172. package/dist/core/sdd/state.js +266 -34
  173. package/dist/core/sdd/store/sdd-stores.js +2 -2
  174. package/dist/core/sdd/structural-health.d.ts +13 -13
  175. package/dist/core/sdd/types.d.ts +30 -15
  176. package/dist/core/sdd/types.js +4 -0
  177. package/dist/core/sdd/views.js +17 -0
  178. package/dist/core/sdd/workspace-schemas.d.ts +428 -7
  179. package/dist/core/sdd/workspace-schemas.js +223 -70
  180. package/dist/core/shared/skill-generation.d.ts +2 -0
  181. package/dist/core/shared/skill-generation.js +19 -2
  182. package/dist/core/shared/tool-detection.d.ts +19 -0
  183. package/dist/core/shared/tool-detection.js +89 -0
  184. package/dist/domains/sdd/index.d.ts +6 -0
  185. package/dist/domains/sdd/index.js +6 -0
  186. package/dist/infrastructures/sdd/index.d.ts +7 -0
  187. package/dist/infrastructures/sdd/index.js +6 -0
  188. package/dist/presentations/cli/sdd/index.d.ts +3 -0
  189. package/dist/presentations/cli/sdd/index.js +3 -0
  190. package/dist/shared/sdd/index.d.ts +3 -0
  191. package/dist/shared/sdd/index.js +2 -0
  192. package/package.json +14 -10
  193. package/schemas/sdd/2-plan.schema.json +207 -2
  194. package/schemas/sdd/5-quality.schema.json +324 -25
  195. package/schemas/sdd/agent-runtime-command-plan.schema.json +212 -0
  196. package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -0
  197. package/schemas/sdd/codesdd-plugin.schema.json +171 -0
  198. package/schemas/sdd/deepagent-run-request.schema.json +316 -0
  199. package/schemas/sdd/parallel-feat-automation-plan.schema.json +89 -0
  200. package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
  201. package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
  202. package/schemas/sdd/plugin-artifact-manifest.schema.json +109 -0
  203. package/schemas/sdd/plugin-artifact-map.schema.json +223 -0
  204. package/schemas/sdd/plugin-evidence-manifest.schema.json +109 -0
  205. package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
  206. package/schemas/sdd/plugin-package-governance.schema.json +74 -0
  207. package/schemas/sdd/plugin-registry.schema.json +171 -0
  208. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +109 -0
  209. package/schemas/sdd/quality-evidence-bundle.schema.json +109 -0
  210. package/schemas/sdd/reversa-evidence-bundle.schema.json +466 -0
  211. package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
  212. package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
  213. 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