@devtrack-solution/codesdd 1.2.2 → 1.2.4-rc3

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 (413) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +170 -31
  3. package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +8 -0
  4. package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +8 -0
  5. package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +8 -0
  6. package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +8 -0
  7. package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +8 -0
  8. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -2
  9. package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +10 -0
  10. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +2 -2
  11. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
  12. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
  13. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +372 -0
  14. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +13 -13
  15. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
  16. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +294 -0
  17. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +5 -5
  18. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
  19. package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +41 -0
  20. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
  21. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +7 -9
  22. package/LICENSE +1 -1
  23. package/README.md +399 -53
  24. package/bin/codesdd.js +3 -2
  25. package/dist/applications/sdd/index.d.ts +16 -0
  26. package/dist/applications/sdd/index.js +16 -0
  27. package/dist/cli/index.d.ts +2 -2
  28. package/dist/cli/index.js +11 -558
  29. package/dist/cli/program.d.ts +14 -0
  30. package/dist/cli/program.js +645 -0
  31. package/dist/commands/change.js +5 -5
  32. package/dist/commands/completion.d.ts +1 -1
  33. package/dist/commands/completion.js +9 -2
  34. package/dist/commands/config.js +320 -20
  35. package/dist/commands/feedback.js +1 -1
  36. package/dist/commands/schema.d.ts +63 -0
  37. package/dist/commands/schema.js +12 -12
  38. package/dist/commands/sdd/backlog.d.ts +3 -0
  39. package/dist/commands/sdd/backlog.js +54 -0
  40. package/dist/commands/sdd/execution.js +489 -28
  41. package/dist/commands/sdd/plugin.d.ts +3 -0
  42. package/dist/commands/sdd/plugin.js +158 -0
  43. package/dist/commands/sdd/shared.d.ts +1 -0
  44. package/dist/commands/sdd/shared.js +11 -22
  45. package/dist/commands/sdd/skills.js +7 -0
  46. package/dist/commands/sdd.js +107 -15
  47. package/dist/commands/spec.js +9 -9
  48. package/dist/commands/validate.js +6 -6
  49. package/dist/commands/workflow/instructions.js +6 -6
  50. package/dist/commands/workflow/new-change.js +3 -3
  51. package/dist/commands/workflow/shared.d.ts +1 -1
  52. package/dist/commands/workflow/shared.js +4 -4
  53. package/dist/core/archive.js +15 -5
  54. package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
  55. package/dist/core/artifact-graph/instruction-loader.js +3 -3
  56. package/dist/core/artifact-graph/resolver.d.ts +4 -4
  57. package/dist/core/artifact-graph/resolver.js +6 -6
  58. package/dist/core/branding.js +3 -3
  59. package/dist/core/cli/command-matrix.js +19 -1
  60. package/dist/core/cli-command-quality.d.ts +27 -0
  61. package/dist/core/cli-command-quality.js +180 -0
  62. package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
  63. package/dist/core/command-generation/adapters/costrict.js +2 -2
  64. package/dist/core/command-generation/types.d.ts +1 -1
  65. package/dist/core/completions/command-registry.d.ts +1 -1
  66. package/dist/core/completions/command-registry.js +200 -12
  67. package/dist/core/completions/completion-provider.d.ts +14 -1
  68. package/dist/core/completions/completion-provider.js +29 -1
  69. package/dist/core/completions/generators/bash-generator.d.ts +1 -1
  70. package/dist/core/completions/generators/bash-generator.js +20 -12
  71. package/dist/core/completions/generators/fish-generator.d.ts +9 -1
  72. package/dist/core/completions/generators/fish-generator.js +39 -25
  73. package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
  74. package/dist/core/completions/generators/powershell-generator.js +21 -11
  75. package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
  76. package/dist/core/completions/generators/zsh-generator.js +21 -42
  77. package/dist/core/completions/installers/bash-installer.js +6 -6
  78. package/dist/core/completions/installers/fish-installer.js +1 -1
  79. package/dist/core/completions/installers/powershell-installer.js +14 -14
  80. package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
  81. package/dist/core/completions/installers/zsh-installer.js +36 -8
  82. package/dist/core/completions/templates/bash-templates.d.ts +1 -1
  83. package/dist/core/completions/templates/bash-templates.js +12 -6
  84. package/dist/core/completions/templates/fish-templates.d.ts +2 -2
  85. package/dist/core/completions/templates/fish-templates.js +20 -9
  86. package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
  87. package/dist/core/completions/templates/powershell-templates.js +13 -4
  88. package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
  89. package/dist/core/completions/templates/zsh-templates.js +18 -9
  90. package/dist/core/config-schema.d.ts +20 -1
  91. package/dist/core/config-schema.js +70 -2
  92. package/dist/core/config.d.ts +3 -3
  93. package/dist/core/config.js +4 -4
  94. package/dist/core/global-config.d.ts +57 -12
  95. package/dist/core/global-config.js +344 -27
  96. package/dist/core/index.d.ts +1 -1
  97. package/dist/core/index.js +2 -2
  98. package/dist/core/init.d.ts +6 -1
  99. package/dist/core/init.js +99 -77
  100. package/dist/core/legacy-cleanup.d.ts +17 -17
  101. package/dist/core/legacy-cleanup.js +96 -79
  102. package/dist/core/list.js +18 -4
  103. package/dist/core/migration.d.ts +3 -1
  104. package/dist/core/migration.js +7 -8
  105. package/dist/core/parsers/change-parser.js +1 -1
  106. package/dist/core/parsers/markdown-parser.js +2 -2
  107. package/dist/core/profile-sync-drift.d.ts +1 -1
  108. package/dist/core/profile-sync-drift.js +13 -13
  109. package/dist/core/project-config.d.ts +4 -4
  110. package/dist/core/project-config.js +11 -11
  111. package/dist/core/schemas/change.schema.d.ts +1 -1
  112. package/dist/core/schemas/change.schema.js +1 -1
  113. package/dist/core/schemas/spec.schema.d.ts +1 -1
  114. package/dist/core/schemas/spec.schema.js +1 -1
  115. package/dist/core/sdd/adr.js +23 -1
  116. package/dist/core/sdd/agent-binding.d.ts +346 -0
  117. package/dist/core/sdd/agent-binding.js +343 -0
  118. package/dist/core/sdd/agent-runtime-contract.d.ts +204 -0
  119. package/dist/core/sdd/agent-runtime-contract.js +200 -0
  120. package/dist/core/sdd/backlog-cli.d.ts +16 -0
  121. package/dist/core/sdd/backlog-cli.js +146 -0
  122. package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
  123. package/dist/core/sdd/backlog-conflict-policy.js +230 -0
  124. package/dist/core/sdd/backlog-projection.d.ts +8 -0
  125. package/dist/core/sdd/backlog-projection.js +89 -0
  126. package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
  127. package/dist/core/sdd/backlog-provider-contract.js +158 -0
  128. package/dist/core/sdd/bootstrap.js +2 -2
  129. package/dist/core/sdd/check.d.ts +44 -0
  130. package/dist/core/sdd/check.js +62 -24
  131. package/dist/core/sdd/contract.d.ts +13 -0
  132. package/dist/core/sdd/contract.js +36 -0
  133. package/dist/core/sdd/coordination/coordination-adapters.d.ts +53 -8
  134. package/dist/core/sdd/coordination/coordination-adapters.js +182 -16
  135. package/dist/core/sdd/coordination/index.d.ts +1 -0
  136. package/dist/core/sdd/coordination/index.js +1 -0
  137. package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
  138. package/dist/core/sdd/coordination/redis-runtime.js +698 -0
  139. package/dist/core/sdd/deepagent-contracts.d.ts +370 -0
  140. package/dist/core/sdd/deepagent-contracts.js +235 -0
  141. package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
  142. package/dist/core/sdd/deepagents/adr-governor.js +30 -0
  143. package/dist/core/sdd/deepagents/backend.d.ts +63 -0
  144. package/dist/core/sdd/deepagents/backend.js +174 -0
  145. package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
  146. package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
  147. package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
  148. package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
  149. package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
  150. package/dist/core/sdd/deepagents/model-provider.js +379 -0
  151. package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
  152. package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
  153. package/dist/core/sdd/deepagents/policy.d.ts +75 -0
  154. package/dist/core/sdd/deepagents/policy.js +358 -0
  155. package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
  156. package/dist/core/sdd/deepagents/quality-witness.js +77 -0
  157. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
  158. package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
  159. package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
  160. package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
  161. package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
  162. package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
  163. package/dist/core/sdd/default-bootstrap-files.d.ts +3 -3
  164. package/dist/core/sdd/default-bootstrap-files.js +50 -10
  165. package/dist/core/sdd/default-skills.d.ts +30 -0
  166. package/dist/core/sdd/default-skills.js +288 -8
  167. package/dist/core/sdd/devtrack-api-appliance.d.ts +91 -0
  168. package/dist/core/sdd/devtrack-api-appliance.js +280 -0
  169. package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
  170. package/dist/core/sdd/devtrack-api-architecture.js +608 -0
  171. package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
  172. package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
  173. package/dist/core/sdd/diagnose.d.ts +59 -0
  174. package/dist/core/sdd/diagnose.js +37 -37
  175. package/dist/core/sdd/docs-sync.js +54 -20
  176. package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
  177. package/dist/core/sdd/domain/capability-diff.js +200 -0
  178. package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
  179. package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
  180. package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
  181. package/dist/core/sdd/domain/post-active-validation.js +61 -0
  182. package/dist/core/sdd/domain/semantic-intent-classifier.d.ts +29 -0
  183. package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -0
  184. package/dist/core/sdd/domain/transition-engine.js +1 -0
  185. package/dist/core/sdd/entity-reference.d.ts +5 -0
  186. package/dist/core/sdd/entity-reference.js +22 -0
  187. package/dist/core/sdd/foundation-artifact-map-validator.d.ts +16 -0
  188. package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
  189. package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
  190. package/dist/core/sdd/foundation-layer-manifest.js +117 -0
  191. package/dist/core/sdd/governance-backfill.d.ts +31 -0
  192. package/dist/core/sdd/governance-backfill.js +359 -0
  193. package/dist/core/sdd/governance-parser.d.ts +21 -0
  194. package/dist/core/sdd/governance-parser.js +91 -0
  195. package/dist/core/sdd/governance-schemas.d.ts +245 -0
  196. package/dist/core/sdd/governance-schemas.js +143 -0
  197. package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
  198. package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
  199. package/dist/core/sdd/init.d.ts +3 -0
  200. package/dist/core/sdd/init.js +6 -3
  201. package/dist/core/sdd/intent-guard.d.ts +22 -0
  202. package/dist/core/sdd/intent-guard.js +67 -0
  203. package/dist/core/sdd/json-schema.js +108 -6
  204. package/dist/core/sdd/knowledge-graph.d.ts +45 -0
  205. package/dist/core/sdd/knowledge-graph.js +288 -0
  206. package/dist/core/sdd/legacy-operations.js +507 -44
  207. package/dist/core/sdd/lenses.d.ts +1 -0
  208. package/dist/core/sdd/lenses.js +29 -1
  209. package/dist/core/sdd/migrate-workspace.js +95 -2
  210. package/dist/core/sdd/migrate.d.ts +1 -1
  211. package/dist/core/sdd/migrate.js +36 -2
  212. package/dist/core/sdd/package-security-gates.d.ts +21 -0
  213. package/dist/core/sdd/package-security-gates.js +119 -0
  214. package/dist/core/sdd/package-structure-gate.d.ts +83 -0
  215. package/dist/core/sdd/package-structure-gate.js +357 -0
  216. package/dist/core/sdd/parallel-feat-automation.d.ts +330 -0
  217. package/dist/core/sdd/parallel-feat-automation.js +424 -0
  218. package/dist/core/sdd/plugin-broker.d.ts +777 -0
  219. package/dist/core/sdd/plugin-broker.js +492 -0
  220. package/dist/core/sdd/plugin-certification.d.ts +79 -0
  221. package/dist/core/sdd/plugin-certification.js +453 -0
  222. package/dist/core/sdd/plugin-cli.d.ts +139 -0
  223. package/dist/core/sdd/plugin-cli.js +265 -0
  224. package/dist/core/sdd/plugin-evidence.d.ts +348 -0
  225. package/dist/core/sdd/plugin-evidence.js +307 -0
  226. package/dist/core/sdd/plugin-manifest.d.ts +232 -0
  227. package/dist/core/sdd/plugin-manifest.js +225 -0
  228. package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
  229. package/dist/core/sdd/plugin-policy-pack.js +236 -0
  230. package/dist/core/sdd/plugin-policy.d.ts +68 -0
  231. package/dist/core/sdd/plugin-policy.js +212 -0
  232. package/dist/core/sdd/plugin-registry.d.ts +447 -0
  233. package/dist/core/sdd/plugin-registry.js +138 -0
  234. package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
  235. package/dist/core/sdd/plugin-sdk-contract.js +268 -0
  236. package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
  237. package/dist/core/sdd/plugin-skill-binding.js +339 -0
  238. package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
  239. package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
  240. package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
  241. package/dist/core/sdd/quality-evidence-renderer.js +218 -0
  242. package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
  243. package/dist/core/sdd/quality-scenario-runner.js +613 -0
  244. package/dist/core/sdd/quality-validation.d.ts +620 -0
  245. package/dist/core/sdd/quality-validation.js +239 -0
  246. package/dist/core/sdd/release-readiness.d.ts +19 -0
  247. package/dist/core/sdd/release-readiness.js +472 -0
  248. package/dist/core/sdd/resolve-project-root.d.ts +2 -2
  249. package/dist/core/sdd/resolve-project-root.js +11 -5
  250. package/dist/core/sdd/runtime-boundary-contract.d.ts +45 -0
  251. package/dist/core/sdd/runtime-boundary-contract.js +90 -0
  252. package/dist/core/sdd/sanitize.d.ts +30 -1
  253. package/dist/core/sdd/sanitize.js +23 -23
  254. package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
  255. package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
  256. package/dist/core/sdd/services/agent-run.service.d.ts +97 -0
  257. package/dist/core/sdd/services/agent-run.service.js +261 -0
  258. package/dist/core/sdd/services/breakdown.service.js +2 -1
  259. package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
  260. package/dist/core/sdd/services/capability-diff.service.js +26 -0
  261. package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
  262. package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
  263. package/dist/core/sdd/services/context.service.d.ts +43 -340
  264. package/dist/core/sdd/services/context.service.js +341 -25
  265. package/dist/core/sdd/services/debate.service.js +15 -2
  266. package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
  267. package/dist/core/sdd/services/feature-lint.service.js +105 -5
  268. package/dist/core/sdd/services/finalize.service.d.ts +105 -0
  269. package/dist/core/sdd/services/finalize.service.js +499 -38
  270. package/dist/core/sdd/services/frontend-gap.service.js +22 -7
  271. package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
  272. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
  273. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
  274. package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
  275. package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
  276. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  277. package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
  278. package/dist/core/sdd/services/legacy-capability.service.js +38 -21
  279. package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
  280. package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
  281. package/dist/core/sdd/services/onboard.service.js +2 -1
  282. package/dist/core/sdd/services/rebuild.service.js +6 -1
  283. package/dist/core/sdd/services/semantic-intent-classifier.service.d.ts +6 -0
  284. package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
  285. package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
  286. package/dist/core/sdd/services/skills-sync.service.js +55 -2
  287. package/dist/core/sdd/services/start.service.js +6 -4
  288. package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
  289. package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
  290. package/dist/core/sdd/skill-evidence.d.ts +19 -0
  291. package/dist/core/sdd/skill-evidence.js +38 -0
  292. package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
  293. package/dist/core/sdd/skill-policy-pool.js +185 -0
  294. package/dist/core/sdd/state.d.ts +23 -0
  295. package/dist/core/sdd/state.js +313 -66
  296. package/dist/core/sdd/store/sdd-stores.js +2 -2
  297. package/dist/core/sdd/structural-health.d.ts +55 -55
  298. package/dist/core/sdd/types.d.ts +60 -19
  299. package/dist/core/sdd/types.js +21 -0
  300. package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
  301. package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
  302. package/dist/core/sdd/views.js +17 -0
  303. package/dist/core/sdd/workspace-schemas.d.ts +670 -19
  304. package/dist/core/sdd/workspace-schemas.js +285 -5
  305. package/dist/core/sdd/write-manifest.js +22 -4
  306. package/dist/core/shared/skill-generation.d.ts +1 -1
  307. package/dist/core/shared/skill-generation.js +15 -15
  308. package/dist/core/shared/tool-detection.d.ts +3 -3
  309. package/dist/core/shared/tool-detection.js +14 -14
  310. package/dist/core/specs-apply.js +6 -6
  311. package/dist/core/templates/index.d.ts +1 -1
  312. package/dist/core/templates/index.js +1 -1
  313. package/dist/core/templates/workflows/apply-change.js +14 -14
  314. package/dist/core/templates/workflows/archive-change.js +32 -32
  315. package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
  316. package/dist/core/templates/workflows/continue-change.js +12 -12
  317. package/dist/core/templates/workflows/explore.js +29 -29
  318. package/dist/core/templates/workflows/feedback.js +6 -6
  319. package/dist/core/templates/workflows/ff-change.js +24 -24
  320. package/dist/core/templates/workflows/new-change.js +20 -20
  321. package/dist/core/templates/workflows/onboard.js +33 -33
  322. package/dist/core/templates/workflows/propose.js +23 -23
  323. package/dist/core/templates/workflows/sdd.js +8 -8
  324. package/dist/core/templates/workflows/sync-specs.js +19 -19
  325. package/dist/core/templates/workflows/verify-change.js +17 -17
  326. package/dist/core/update.d.ts +2 -2
  327. package/dist/core/update.js +16 -15
  328. package/dist/core/validation/constants.d.ts +1 -1
  329. package/dist/core/validation/constants.js +1 -1
  330. package/dist/core/view.js +11 -11
  331. package/dist/domains/sdd/index.d.ts +6 -0
  332. package/dist/domains/sdd/index.js +6 -0
  333. package/dist/infrastructures/sdd/index.d.ts +7 -0
  334. package/dist/infrastructures/sdd/index.js +6 -0
  335. package/dist/presentations/cli/sdd/index.d.ts +3 -0
  336. package/dist/presentations/cli/sdd/index.js +3 -0
  337. package/dist/shared/sdd/index.d.ts +3 -0
  338. package/dist/shared/sdd/index.js +2 -0
  339. package/dist/telemetry/config.d.ts +2 -1
  340. package/dist/telemetry/config.js +17 -8
  341. package/dist/telemetry/index.d.ts +10 -2
  342. package/dist/telemetry/index.js +40 -7
  343. package/dist/ui/ascii-patterns.d.ts +2 -2
  344. package/dist/ui/ascii-patterns.js +2 -2
  345. package/dist/ui/welcome-screen.js +2 -2
  346. package/dist/utils/change-metadata.d.ts +4 -4
  347. package/dist/utils/change-metadata.js +6 -6
  348. package/dist/utils/change-utils.d.ts +3 -3
  349. package/dist/utils/change-utils.js +5 -5
  350. package/dist/utils/file-system.js +1 -1
  351. package/dist/utils/interactive.js +1 -1
  352. package/dist/utils/item-discovery.js +4 -4
  353. package/dist/utils/legacy-spec-compat.d.ts +2 -0
  354. package/dist/utils/legacy-spec-compat.js +2 -0
  355. package/dist/utils/shell-detection.d.ts +1 -0
  356. package/dist/utils/shell-detection.js +16 -0
  357. package/package.json +34 -21
  358. package/schemas/sdd/1-spec.schema.json +1 -1
  359. package/schemas/sdd/2-plan.schema.json +280 -3
  360. package/schemas/sdd/3-tasks.schema.json +73 -1
  361. package/schemas/sdd/4-changelog.schema.json +1 -1
  362. package/schemas/sdd/5-quality.schema.json +701 -5
  363. package/schemas/sdd/adr.schema.json +148 -0
  364. package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
  365. package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
  366. package/schemas/sdd/agent-runtime-command-plan.schema.json +212 -0
  367. package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -0
  368. package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
  369. package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
  370. package/schemas/sdd/codesdd-plugin.schema.json +645 -0
  371. package/schemas/sdd/debate.schema.json +244 -0
  372. package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
  373. package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
  374. package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
  375. package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
  376. package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
  377. package/schemas/sdd/deepagent-run-request.schema.json +637 -0
  378. package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
  379. package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
  380. package/schemas/sdd/discarded.schema.json +127 -0
  381. package/schemas/sdd/epic.schema.json +147 -0
  382. package/schemas/sdd/insight.schema.json +136 -0
  383. package/schemas/sdd/parallel-feat-automation-plan.schema.json +304 -0
  384. package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
  385. package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
  386. package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
  387. package/schemas/sdd/plugin-artifact-manifest.schema.json +259 -0
  388. package/schemas/sdd/plugin-artifact-map.schema.json +223 -0
  389. package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
  390. package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
  391. package/schemas/sdd/plugin-evidence-manifest.schema.json +678 -0
  392. package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
  393. package/schemas/sdd/plugin-package-governance.schema.json +74 -0
  394. package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
  395. package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
  396. package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
  397. package/schemas/sdd/plugin-registry.schema.json +729 -0
  398. package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
  399. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +954 -0
  400. package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
  401. package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
  402. package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
  403. package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
  404. package/schemas/sdd/quality-evidence-bundle.schema.json +1337 -0
  405. package/schemas/sdd/quality-run.schema.json +197 -0
  406. package/schemas/sdd/quality-scenario.schema.json +252 -0
  407. package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
  408. package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
  409. package/schemas/sdd/workspace-catalog.schema.json +13232 -35
  410. package/schemas/spec-driven/schema.yaml +4 -4
  411. package/schemas/spec-driven/templates/proposal.md +1 -1
  412. package/dist/utils/openspec-compat.d.ts +0 -2
  413. package/dist/utils/openspec-compat.js +0 -2
@@ -0,0 +1,200 @@
1
+ import { toJSONSchema, z } from 'zod';
2
+ const JSON_SCHEMA_DRAFT = 'https://json-schema.org/draft/2020-12/schema';
3
+ const FEATURE_REF_PATTERN = /^FEAT-\d{4}$/;
4
+ export const agentRuntimeProviderSchema = z.enum(['deepagents', 'codex', 'opencode']);
5
+ export const agentRuntimeModeSchema = z.enum(['read-only', 'plan', 'validate', 'apply-sandbox', 'apply-approved']);
6
+ export const agentRuntimeSandboxSchema = z.enum(['read-only', 'workspace-write', 'danger-full-access']);
7
+ export const agentRuntimeStatusSchema = z.enum(['planned', 'blocked']);
8
+ export const opencodeExecutionStatusSchema = z.enum([
9
+ 'planned',
10
+ 'skipped',
11
+ 'blocked',
12
+ 'running',
13
+ 'completed',
14
+ 'failed',
15
+ ]);
16
+ const agentRuntimeCommandSchema = z.object({
17
+ executable: z.string().min(1),
18
+ args: z.array(z.string()).default([]),
19
+ stdin: z.string().optional(),
20
+ });
21
+ const agentRuntimeEvidenceArtifactSchema = z.object({
22
+ kind: z.string().min(1),
23
+ ref: z.string().min(1),
24
+ path: z.string().min(1).optional(),
25
+ sha256: z.string().min(1).optional(),
26
+ });
27
+ const agentRuntimeRiskSchema = z.object({
28
+ id: z.string().min(1),
29
+ severity: z.enum(['low', 'medium', 'high', 'critical']),
30
+ summary: z.string().min(1),
31
+ mitigation: z.string().min(1).optional(),
32
+ });
33
+ export const agentRuntimeCommandPlanRequestSchema = z.object({
34
+ schema_version: z.literal(1).default(1),
35
+ feature_ref: z.string().regex(FEATURE_REF_PATTERN),
36
+ provider: agentRuntimeProviderSchema,
37
+ mode: agentRuntimeModeSchema.default('plan'),
38
+ instruction: z.string().min(1),
39
+ cwd: z.string().min(1).default('.'),
40
+ model: z.string().min(1).optional(),
41
+ sandbox: agentRuntimeSandboxSchema.default('read-only'),
42
+ output_schema: z.string().min(1).optional(),
43
+ output_last_message: z.string().min(1).optional(),
44
+ agent: z.string().min(1).optional(),
45
+ session: z.string().min(1).optional(),
46
+ files: z.array(z.string().min(1)).default([]),
47
+ approval_grants: z.array(z.enum(['maintainer', 'architecture-board', 'security'])).default([]),
48
+ });
49
+ export const agentRuntimeCommandPlanSchema = z.object({
50
+ schema_version: z.literal(1),
51
+ created_at: z.string().datetime(),
52
+ status: agentRuntimeStatusSchema,
53
+ request: agentRuntimeCommandPlanRequestSchema,
54
+ provider: agentRuntimeProviderSchema,
55
+ command: agentRuntimeCommandSchema.optional(),
56
+ evidence_contract: z.enum(['agent-runtime-v2/deepagents', 'agent-runtime-v2/codex-exec', 'agent-runtime-v2/opencode-run']),
57
+ structured_output: z.boolean(),
58
+ reasons: z.array(z.string()).default([]),
59
+ policy: z.object({
60
+ direct_state_write_allowed: z.literal(false),
61
+ requires_codesdd_finalize: z.literal(true),
62
+ mutating_modes_require_approval: z.literal(true),
63
+ }),
64
+ });
65
+ export const opencodeExecutionEvidenceSchema = z.object({
66
+ schema_version: z.literal(1),
67
+ contract: z.literal('agent-runtime-v2/opencode-run'),
68
+ provider: z.literal('opencode'),
69
+ feature_ref: z.string().regex(FEATURE_REF_PATTERN),
70
+ run_id: z.string().min(1),
71
+ created_at: z.string().datetime(),
72
+ mode: agentRuntimeModeSchema,
73
+ status: opencodeExecutionStatusSchema,
74
+ command: agentRuntimeCommandSchema.extend({
75
+ executable: z.literal('opencode'),
76
+ }),
77
+ command_plan_ref: z.string().min(1).optional(),
78
+ cwd: z.string().min(1).default('.'),
79
+ exit_code: z.number().int().nullable().default(null),
80
+ started_at: z.string().datetime().optional(),
81
+ completed_at: z.string().datetime().optional(),
82
+ duration_ms: z.number().int().nonnegative().optional(),
83
+ structured_output: z.record(z.string(), z.unknown()).default({}),
84
+ stdout_excerpt: z.string().max(8000).optional(),
85
+ stderr_excerpt: z.string().max(8000).optional(),
86
+ artifacts: z.array(agentRuntimeEvidenceArtifactSchema).default([]),
87
+ validations: z.array(z.string().min(1)).default([]),
88
+ redactions: z.array(z.string().min(1)).default([]),
89
+ risks: z.array(agentRuntimeRiskSchema).default([]),
90
+ policy: z.object({
91
+ direct_state_write_allowed: z.literal(false),
92
+ requires_codesdd_finalize: z.literal(true),
93
+ raw_secret_output_allowed: z.literal(false),
94
+ transcript_storage: z.enum(['forbidden', 'redacted-excerpts-only']).default('redacted-excerpts-only'),
95
+ }),
96
+ finalize_intent: z.boolean().default(false),
97
+ });
98
+ export function buildAgentRuntimeCommandPlan(request, createdAt = new Date().toISOString()) {
99
+ const parsed = agentRuntimeCommandPlanRequestSchema.parse(request);
100
+ const reasons = collectPolicyReasons(parsed);
101
+ const status = reasons.length > 0 ? 'blocked' : 'planned';
102
+ const command = status === 'planned' ? buildCommand(parsed) : undefined;
103
+ return agentRuntimeCommandPlanSchema.parse({
104
+ schema_version: 1,
105
+ created_at: createdAt,
106
+ status,
107
+ request: parsed,
108
+ provider: parsed.provider,
109
+ command,
110
+ evidence_contract: evidenceContract(parsed.provider),
111
+ structured_output: true,
112
+ reasons,
113
+ policy: {
114
+ direct_state_write_allowed: false,
115
+ requires_codesdd_finalize: true,
116
+ mutating_modes_require_approval: true,
117
+ },
118
+ });
119
+ }
120
+ export function buildOpenCodeExecutionEvidence(evidence) {
121
+ return opencodeExecutionEvidenceSchema.parse(evidence);
122
+ }
123
+ export function buildAgentRuntimeJsonSchemas() {
124
+ return {
125
+ 'agent-runtime-command-plan.yaml': {
126
+ ...toJSONSchema(agentRuntimeCommandPlanSchema),
127
+ $schema: JSON_SCHEMA_DRAFT,
128
+ title: 'CodeSDD Agent Runtime Command Plan',
129
+ description: 'Provider-normalized command plan for DeepAgents, Codex exec, and OpenCode run agent runtimes.',
130
+ },
131
+ 'agent-runtime-opencode-run-evidence.yaml': {
132
+ ...toJSONSchema(opencodeExecutionEvidenceSchema),
133
+ $schema: JSON_SCHEMA_DRAFT,
134
+ title: 'CodeSDD Agent Runtime OpenCode Run Evidence',
135
+ description: 'Machine-readable OpenCode run evidence with redacted excerpts, artifacts, validations, and finalize policy.',
136
+ },
137
+ };
138
+ }
139
+ function collectPolicyReasons(request) {
140
+ const reasons = [];
141
+ const mutating = request.mode === 'apply-sandbox' || request.mode === 'apply-approved';
142
+ if (mutating && request.approval_grants.length === 0) {
143
+ reasons.push(`Mode ${request.mode} requires explicit approval evidence before agent execution.`);
144
+ }
145
+ if (request.provider !== 'deepagents' && request.mode === 'apply-approved') {
146
+ reasons.push('Codex and OpenCode apply-approved execution is not enabled until plugin evidence ingestion is complete.');
147
+ }
148
+ if (request.provider === 'codex' && request.sandbox === 'danger-full-access') {
149
+ reasons.push('Codex danger-full-access sandbox is forbidden by the default CodeSDD agent runtime contract.');
150
+ }
151
+ return reasons;
152
+ }
153
+ function buildCommand(request) {
154
+ if (request.provider === 'deepagents') {
155
+ return {
156
+ executable: 'codesdd',
157
+ args: ['sdd', 'agent', 'run', request.feature_ref, '--provider', 'deepagents', '--mode', request.mode],
158
+ };
159
+ }
160
+ if (request.provider === 'codex') {
161
+ const args = ['exec', '--json', '--cd', request.cwd, '--sandbox', request.sandbox];
162
+ if (request.model)
163
+ args.push('--model', request.model);
164
+ if (request.output_schema)
165
+ args.push('--output-schema', request.output_schema);
166
+ if (request.output_last_message)
167
+ args.push('--output-last-message', request.output_last_message);
168
+ for (const file of request.files) {
169
+ args.push('--image', file);
170
+ }
171
+ args.push(request.instruction);
172
+ return {
173
+ executable: 'codex',
174
+ args,
175
+ };
176
+ }
177
+ const args = ['run', '--format', 'json', '--dir', request.cwd];
178
+ if (request.model)
179
+ args.push('--model', request.model);
180
+ if (request.agent)
181
+ args.push('--agent', request.agent);
182
+ if (request.session)
183
+ args.push('--session', request.session);
184
+ for (const file of request.files) {
185
+ args.push('--file', file);
186
+ }
187
+ args.push(request.instruction);
188
+ return {
189
+ executable: 'opencode',
190
+ args,
191
+ };
192
+ }
193
+ function evidenceContract(provider) {
194
+ if (provider === 'codex')
195
+ return 'agent-runtime-v2/codex-exec';
196
+ if (provider === 'opencode')
197
+ return 'agent-runtime-v2/opencode-run';
198
+ return 'agent-runtime-v2/deepagents';
199
+ }
200
+ //# sourceMappingURL=agent-runtime-contract.js.map
@@ -0,0 +1,16 @@
1
+ import { type BacklogProviderId, type BacklogProjectionPlan, type CanonicalBacklogItem } from './backlog-provider-contract.js';
2
+ export interface BacklogProjectDryRunOptions {
3
+ provider: BacklogProviderId;
4
+ ref: string;
5
+ items?: CanonicalBacklogItem[];
6
+ created_at?: string;
7
+ }
8
+ export interface BacklogProjectDryRunResult {
9
+ schema_version: 1;
10
+ dry_run: true;
11
+ ref: string;
12
+ fixture: string;
13
+ plan: BacklogProjectionPlan;
14
+ }
15
+ export declare function buildBacklogProjectDryRun(options: BacklogProjectDryRunOptions): BacklogProjectDryRunResult;
16
+ //# sourceMappingURL=backlog-cli.d.ts.map
@@ -0,0 +1,146 @@
1
+ import { backlogProjectionPlanSchema, buildBacklogProjectionItem, } from './backlog-provider-contract.js';
2
+ const azureDevOpsContract = {
3
+ schema_version: 1,
4
+ provider: 'azure-devops',
5
+ adapter_id: 'azure-devops',
6
+ label: 'Azure DevOps Boards',
7
+ status: 'experimental',
8
+ auth: {
9
+ mode: 'pat',
10
+ required_env: ['AZURE_DEVOPS_EXT_PAT'],
11
+ secret_fields: ['AZURE_DEVOPS_EXT_PAT'],
12
+ },
13
+ capabilities: [
14
+ {
15
+ operation: 'create',
16
+ entity_kinds: ['epic', 'feature'],
17
+ dry_run: true,
18
+ apply: false,
19
+ idempotent: true,
20
+ required_fields: ['System.Title', 'System.State', 'Custom.CodeSDDRef'],
21
+ },
22
+ {
23
+ operation: 'link',
24
+ entity_kinds: ['epic', 'feature'],
25
+ dry_run: true,
26
+ apply: false,
27
+ idempotent: true,
28
+ },
29
+ ],
30
+ mapping: {
31
+ external_project_field: 'System.TeamProject',
32
+ external_id_field: 'System.Id',
33
+ external_url_field: 'System.Url',
34
+ canonical_ref_field: 'Custom.CodeSDDRef',
35
+ parent_ref_field: 'Custom.CodeSDDParentRef',
36
+ entity_type_field: 'Custom.CodeSDDEntityType',
37
+ title_field: 'System.Title',
38
+ status_field: 'System.State',
39
+ },
40
+ canonical_state_boundary: {
41
+ source_of_truth: 'codesdd',
42
+ state_paths: ['.sdd/state/*.yaml'],
43
+ external_state_authoritative: false,
44
+ hidden_state_allowed: false,
45
+ },
46
+ governance: {
47
+ owner: 'platform-architecture',
48
+ sync_requires_dry_run: true,
49
+ mutation_requires_approval: true,
50
+ audit_event: 'codesdd.backlog.projection',
51
+ },
52
+ };
53
+ const epic0039Fixture = [
54
+ {
55
+ ref: 'EPIC-0039',
56
+ kind: 'epic',
57
+ title: 'Provider-agnostic backlog integration and CodeSDD naming governance',
58
+ status: 'SPLIT',
59
+ labels: ['codesdd', 'backlog-integration'],
60
+ },
61
+ {
62
+ ref: 'FEAT-0166',
63
+ kind: 'feature',
64
+ title: 'Backlog provider contract and canonical projection schema',
65
+ status: 'DONE',
66
+ parent_ref: 'EPIC-0039',
67
+ labels: ['codesdd', 'backlog-integration'],
68
+ },
69
+ {
70
+ ref: 'FEAT-0167',
71
+ kind: 'feature',
72
+ title: 'Azure DevOps dry-run projection planner',
73
+ status: 'IN_PROGRESS',
74
+ parent_ref: 'EPIC-0039',
75
+ labels: ['codesdd', 'backlog-integration'],
76
+ },
77
+ {
78
+ ref: 'FEAT-0168',
79
+ kind: 'feature',
80
+ title: 'Backlog sync conflict and idempotency policy',
81
+ status: 'IN_PROGRESS',
82
+ parent_ref: 'EPIC-0039',
83
+ labels: ['codesdd', 'backlog-integration'],
84
+ },
85
+ {
86
+ ref: 'FEAT-0169',
87
+ kind: 'feature',
88
+ title: 'Backlog integration CLI dry-run surface',
89
+ status: 'IN_PROGRESS',
90
+ parent_ref: 'EPIC-0039',
91
+ labels: ['codesdd', 'backlog-integration'],
92
+ },
93
+ {
94
+ ref: 'FEAT-0170',
95
+ kind: 'feature',
96
+ title: 'Backlog integration documentation and handoff',
97
+ status: 'IN_PROGRESS',
98
+ parent_ref: 'EPIC-0039',
99
+ labels: ['codesdd', 'backlog-integration'],
100
+ },
101
+ ];
102
+ export function buildBacklogProjectDryRun(options) {
103
+ if (options.provider !== 'azure-devops') {
104
+ throw new Error(`Unsupported backlog provider for dry-run projection: ${options.provider}.`);
105
+ }
106
+ const items = options.items ?? resolveFixtureItems(options.ref);
107
+ const createdAt = options.created_at ?? new Date().toISOString();
108
+ const plan = backlogProjectionPlanSchema.parse({
109
+ schema_version: 1,
110
+ created_at: createdAt,
111
+ provider: options.provider,
112
+ mode: 'dry-run',
113
+ direction: 'push',
114
+ source_of_truth: 'codesdd',
115
+ items: items.map((item) => buildBacklogProjectionItem({
116
+ contract: azureDevOpsContract,
117
+ item,
118
+ external_type: toAzureDevOpsWorkItemType(item),
119
+ })),
120
+ warnings: [
121
+ 'Dry-run only: no network calls, credentials, external IDs, or provider writes are used.',
122
+ `Projection source: ${options.items ? 'caller-provided canonical items' : `built-in ${options.ref} fixture`}.`,
123
+ ],
124
+ });
125
+ return {
126
+ schema_version: 1,
127
+ dry_run: true,
128
+ ref: options.ref,
129
+ fixture: options.items ? 'provided' : options.ref,
130
+ plan,
131
+ };
132
+ }
133
+ function resolveFixtureItems(ref) {
134
+ if (ref !== 'EPIC-0039') {
135
+ throw new Error(`No built-in backlog projection fixture for ${ref}. Provide canonical items in code or use EPIC-0039.`);
136
+ }
137
+ return epic0039Fixture;
138
+ }
139
+ function toAzureDevOpsWorkItemType(item) {
140
+ if (item.kind === 'epic')
141
+ return 'Epic';
142
+ if (item.kind === 'feature')
143
+ return 'User Story';
144
+ return item.kind;
145
+ }
146
+ //# sourceMappingURL=backlog-cli.js.map
@@ -0,0 +1,58 @@
1
+ import type { BacklogEntityKind, BacklogProviderId } from './backlog-provider-contract.js';
2
+ export type BacklogConflictClassification = 'none' | 'create' | 'update' | 'manual-review' | 'stale-external' | 'canonical-drift';
3
+ export type BacklogSyncOperation = 'noop' | 'create' | 'update' | 'manual-review';
4
+ export type BacklogSyncDecisionSeverity = 'info' | 'warning' | 'error';
5
+ export interface BacklogSyncFieldSet {
6
+ title: string;
7
+ status: string;
8
+ parent_ref?: string;
9
+ labels?: string[];
10
+ }
11
+ export interface CanonicalBacklogSyncItem extends BacklogSyncFieldSet {
12
+ ref: string;
13
+ kind: Exclude<BacklogEntityKind, 'task'>;
14
+ updated_at?: string;
15
+ last_synced_at?: string;
16
+ last_synced_fingerprint?: string;
17
+ fields?: Record<string, string | string[] | undefined>;
18
+ }
19
+ export interface ExternalBacklogWorkItem extends Partial<BacklogSyncFieldSet> {
20
+ provider: BacklogProviderId;
21
+ external_id?: string;
22
+ canonical_ref?: string;
23
+ updated_at?: string;
24
+ last_synced_at?: string;
25
+ codesdd_fingerprint?: string;
26
+ idempotency_key?: string;
27
+ fields?: Record<string, string | string[] | undefined>;
28
+ }
29
+ export interface BacklogConflictDecision {
30
+ code: string;
31
+ severity: BacklogSyncDecisionSeverity;
32
+ message: string;
33
+ field?: string;
34
+ source_of_truth: 'codesdd';
35
+ canonical_value?: unknown;
36
+ external_value?: unknown;
37
+ }
38
+ export interface BacklogConflictPolicyInput {
39
+ provider: BacklogProviderId;
40
+ canonical: CanonicalBacklogSyncItem;
41
+ external?: ExternalBacklogWorkItem;
42
+ source_of_truth?: string;
43
+ }
44
+ export interface BacklogConflictPolicyResult {
45
+ classification: BacklogConflictClassification;
46
+ operation: BacklogSyncOperation;
47
+ idempotency_key: string;
48
+ canonical_fingerprint: string;
49
+ decisions: BacklogConflictDecision[];
50
+ }
51
+ export declare function classifyBacklogSyncConflict(input: BacklogConflictPolicyInput): BacklogConflictPolicyResult;
52
+ export declare function buildBacklogSyncIdempotencyKey(input: {
53
+ provider: BacklogProviderId;
54
+ canonical_ref: string;
55
+ operation: BacklogSyncOperation;
56
+ }): string;
57
+ export declare function fingerprintBacklogSyncFields(fields: BacklogSyncFieldSet): string;
58
+ //# sourceMappingURL=backlog-conflict-policy.d.ts.map
@@ -0,0 +1,230 @@
1
+ import { createHash } from 'node:crypto';
2
+ const POLICY_VERSION = 'v1';
3
+ export function classifyBacklogSyncConflict(input) {
4
+ const canonical = normalizeCanonical(input.canonical);
5
+ const sourceOfTruth = input.source_of_truth ?? 'codesdd';
6
+ const canonicalFingerprint = fingerprintBacklogSyncFields(canonical);
7
+ const decisions = [
8
+ {
9
+ code: 'source-of-truth.codesdd',
10
+ severity: 'info',
11
+ message: 'CodeSDD canonical state is authoritative for backlog sync decisions.',
12
+ source_of_truth: 'codesdd',
13
+ },
14
+ ];
15
+ if (sourceOfTruth !== 'codesdd') {
16
+ decisions.push({
17
+ code: 'source-of-truth.unsupported',
18
+ severity: 'error',
19
+ message: 'Backlog sync only supports CodeSDD as the source of truth.',
20
+ source_of_truth: 'codesdd',
21
+ external_value: sourceOfTruth,
22
+ });
23
+ return buildResult('manual-review', input.provider, canonical.ref, canonicalFingerprint, decisions);
24
+ }
25
+ if (!input.external) {
26
+ decisions.push({
27
+ code: 'external.missing',
28
+ severity: 'info',
29
+ message: 'No external work item is linked; create a provider item from canonical CodeSDD state.',
30
+ source_of_truth: 'codesdd',
31
+ });
32
+ return buildResult('create', input.provider, canonical.ref, canonicalFingerprint, decisions);
33
+ }
34
+ const external = normalizeExternal(input.external);
35
+ if (external.provider !== input.provider) {
36
+ decisions.push({
37
+ code: 'provider.mismatch',
38
+ severity: 'error',
39
+ message: 'External work item belongs to a different provider than the sync request.',
40
+ source_of_truth: 'codesdd',
41
+ canonical_value: input.provider,
42
+ external_value: external.provider,
43
+ });
44
+ return buildResult('manual-review', input.provider, canonical.ref, canonicalFingerprint, decisions);
45
+ }
46
+ if (external.canonical_ref && external.canonical_ref !== canonical.ref) {
47
+ decisions.push({
48
+ code: 'canonical-ref.mismatch',
49
+ severity: 'error',
50
+ message: 'External work item points at a different CodeSDD reference.',
51
+ field: 'canonical_ref',
52
+ source_of_truth: 'codesdd',
53
+ canonical_value: canonical.ref,
54
+ external_value: external.canonical_ref,
55
+ });
56
+ return buildResult('manual-review', input.provider, canonical.ref, canonicalFingerprint, decisions);
57
+ }
58
+ const diffs = diffSyncFields(canonical, external);
59
+ for (const diff of diffs) {
60
+ decisions.push({
61
+ code: 'field.diff',
62
+ severity: 'warning',
63
+ message: `External field ${diff.field} differs from canonical CodeSDD state.`,
64
+ field: diff.field,
65
+ source_of_truth: 'codesdd',
66
+ canonical_value: diff.canonical_value,
67
+ external_value: diff.external_value,
68
+ });
69
+ }
70
+ if (diffs.length === 0 && external.codesdd_fingerprint === canonicalFingerprint) {
71
+ decisions.push({
72
+ code: 'sync.clean',
73
+ severity: 'info',
74
+ message: 'External work item already matches the canonical CodeSDD fingerprint.',
75
+ source_of_truth: 'codesdd',
76
+ });
77
+ return buildResult('none', input.provider, canonical.ref, canonicalFingerprint, decisions);
78
+ }
79
+ if (diffs.length === 0 && !external.codesdd_fingerprint) {
80
+ decisions.push({
81
+ code: 'sync.equivalent-without-fingerprint',
82
+ severity: 'info',
83
+ message: 'External work item fields match canonical state, but provider fingerprint metadata is absent.',
84
+ source_of_truth: 'codesdd',
85
+ });
86
+ return buildResult('update', input.provider, canonical.ref, canonicalFingerprint, decisions);
87
+ }
88
+ const lastSyncedAt = latestDate(canonical.last_synced_at, external.last_synced_at);
89
+ const canonicalChanged = changedAfter(canonical.updated_at, lastSyncedAt);
90
+ const externalChanged = changedAfter(external.updated_at, lastSyncedAt);
91
+ if (diffs.length > 0 && canonicalChanged && externalChanged) {
92
+ decisions.push({
93
+ code: 'drift.concurrent',
94
+ severity: 'error',
95
+ message: 'Both canonical and external items changed after the last sync; manual review is required.',
96
+ source_of_truth: 'codesdd',
97
+ });
98
+ return buildResult('manual-review', input.provider, canonical.ref, canonicalFingerprint, decisions);
99
+ }
100
+ if (diffs.length > 0 && canonicalChanged) {
101
+ decisions.push({
102
+ code: 'canonical.drift',
103
+ severity: 'warning',
104
+ message: 'Canonical CodeSDD state changed after the last sync; push canonical state to the provider.',
105
+ source_of_truth: 'codesdd',
106
+ });
107
+ return buildResult('canonical-drift', input.provider, canonical.ref, canonicalFingerprint, decisions);
108
+ }
109
+ if (diffs.length > 0 && externalChanged) {
110
+ decisions.push({
111
+ code: 'external.stale',
112
+ severity: 'warning',
113
+ message: 'External work item drifted from CodeSDD; overwrite from canonical state unless reviewed.',
114
+ source_of_truth: 'codesdd',
115
+ });
116
+ return buildResult('stale-external', input.provider, canonical.ref, canonicalFingerprint, decisions);
117
+ }
118
+ decisions.push({
119
+ code: 'sync.update-required',
120
+ severity: 'warning',
121
+ message: 'External work item differs from canonical CodeSDD state and should be updated.',
122
+ source_of_truth: 'codesdd',
123
+ });
124
+ return buildResult('update', input.provider, canonical.ref, canonicalFingerprint, decisions);
125
+ }
126
+ export function buildBacklogSyncIdempotencyKey(input) {
127
+ return ['codesdd-backlog-sync', POLICY_VERSION, input.provider, input.canonical_ref, input.operation].join(':');
128
+ }
129
+ export function fingerprintBacklogSyncFields(fields) {
130
+ return `sha256:${createHash('sha256').update(stableStringify(normalizeFieldSet(fields))).digest('hex')}`;
131
+ }
132
+ function buildResult(classification, provider, canonicalRef, canonicalFingerprint, decisions) {
133
+ const operation = operationForClassification(classification);
134
+ return {
135
+ classification,
136
+ operation,
137
+ idempotency_key: buildBacklogSyncIdempotencyKey({ provider, canonical_ref: canonicalRef, operation }),
138
+ canonical_fingerprint: canonicalFingerprint,
139
+ decisions,
140
+ };
141
+ }
142
+ function operationForClassification(classification) {
143
+ if (classification === 'none')
144
+ return 'noop';
145
+ if (classification === 'create')
146
+ return 'create';
147
+ if (classification === 'manual-review')
148
+ return 'manual-review';
149
+ return 'update';
150
+ }
151
+ function normalizeCanonical(item) {
152
+ return {
153
+ ...item,
154
+ ...normalizeFieldSet(item),
155
+ };
156
+ }
157
+ function normalizeExternal(item) {
158
+ return {
159
+ ...item,
160
+ title: normalizeString(item.title),
161
+ status: normalizeString(item.status),
162
+ parent_ref: normalizeOptionalString(item.parent_ref),
163
+ labels: normalizeLabels(item.labels),
164
+ };
165
+ }
166
+ function normalizeFieldSet(fields) {
167
+ return {
168
+ title: normalizeString(fields.title),
169
+ status: normalizeString(fields.status),
170
+ parent_ref: normalizeOptionalString(fields.parent_ref) ?? '',
171
+ labels: normalizeLabels(fields.labels),
172
+ };
173
+ }
174
+ function normalizeString(value) {
175
+ return (value ?? '').trim();
176
+ }
177
+ function normalizeOptionalString(value) {
178
+ const normalized = normalizeString(value);
179
+ return normalized.length > 0 ? normalized : undefined;
180
+ }
181
+ function normalizeLabels(labels) {
182
+ return Array.from(new Set((labels ?? []).map((label) => label.trim()).filter(Boolean))).sort((left, right) => left.localeCompare(right));
183
+ }
184
+ function diffSyncFields(canonical, external) {
185
+ const canonicalFields = normalizeFieldSet(canonical);
186
+ const externalFields = normalizeFieldSet({
187
+ title: external.title ?? '',
188
+ status: external.status ?? '',
189
+ parent_ref: external.parent_ref,
190
+ labels: external.labels,
191
+ });
192
+ const diffs = [];
193
+ for (const field of ['title', 'status', 'parent_ref']) {
194
+ if (canonicalFields[field] !== externalFields[field]) {
195
+ diffs.push({ field, canonical_value: canonicalFields[field], external_value: externalFields[field] });
196
+ }
197
+ }
198
+ if (stableStringify(canonicalFields.labels) !== stableStringify(externalFields.labels)) {
199
+ diffs.push({ field: 'labels', canonical_value: canonicalFields.labels, external_value: externalFields.labels });
200
+ }
201
+ return diffs;
202
+ }
203
+ function latestDate(left, right) {
204
+ if (!left)
205
+ return right;
206
+ if (!right)
207
+ return left;
208
+ return Date.parse(left) >= Date.parse(right) ? left : right;
209
+ }
210
+ function changedAfter(candidate, baseline) {
211
+ if (!candidate || !baseline)
212
+ return false;
213
+ const candidateTime = Date.parse(candidate);
214
+ const baselineTime = Date.parse(baseline);
215
+ return Number.isFinite(candidateTime) && Number.isFinite(baselineTime) && candidateTime > baselineTime;
216
+ }
217
+ function stableStringify(value) {
218
+ if (Array.isArray(value)) {
219
+ return `[${value.map(stableStringify).join(',')}]`;
220
+ }
221
+ if (value && typeof value === 'object') {
222
+ const entries = Object.entries(value)
223
+ .filter(([, item]) => item !== undefined)
224
+ .sort(([left], [right]) => left.localeCompare(right))
225
+ .map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`);
226
+ return `{${entries.join(',')}}`;
227
+ }
228
+ return JSON.stringify(value);
229
+ }
230
+ //# sourceMappingURL=backlog-conflict-policy.js.map
@@ -0,0 +1,8 @@
1
+ import { type BacklogProjectionPlan, type BacklogProviderContract, type BacklogProviderContractInput, type CanonicalBacklogItem } from './backlog-provider-contract.js';
2
+ export declare function builtInAzureDevOpsBacklogContract(): BacklogProviderContract;
3
+ export declare function buildAzureDevOpsBacklogProjectionPlan(input: {
4
+ items: CanonicalBacklogItem[];
5
+ created_at?: string;
6
+ contract?: BacklogProviderContractInput;
7
+ }): BacklogProjectionPlan;
8
+ //# sourceMappingURL=backlog-projection.d.ts.map