@devtrack-solution/codesdd 1.2.2 → 1.2.3

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 (345) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +160 -28
  3. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
  4. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
  5. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
  6. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +317 -0
  7. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
  8. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
  9. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
  10. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
  11. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
  12. package/LICENSE +1 -1
  13. package/README.md +243 -51
  14. package/bin/codesdd.js +3 -2
  15. package/dist/cli/index.d.ts +2 -2
  16. package/dist/cli/index.js +11 -558
  17. package/dist/cli/program.d.ts +14 -0
  18. package/dist/cli/program.js +645 -0
  19. package/dist/commands/change.js +5 -5
  20. package/dist/commands/completion.d.ts +1 -1
  21. package/dist/commands/completion.js +9 -2
  22. package/dist/commands/config.js +159 -20
  23. package/dist/commands/feedback.js +1 -1
  24. package/dist/commands/schema.d.ts +63 -0
  25. package/dist/commands/schema.js +12 -12
  26. package/dist/commands/sdd/backlog.d.ts +3 -0
  27. package/dist/commands/sdd/backlog.js +54 -0
  28. package/dist/commands/sdd/execution.js +147 -16
  29. package/dist/commands/sdd/plugin.d.ts +3 -0
  30. package/dist/commands/sdd/plugin.js +153 -0
  31. package/dist/commands/sdd/shared.js +2 -23
  32. package/dist/commands/sdd/skills.js +7 -0
  33. package/dist/commands/sdd.js +69 -12
  34. package/dist/commands/spec.js +9 -9
  35. package/dist/commands/validate.js +6 -6
  36. package/dist/commands/workflow/instructions.js +6 -6
  37. package/dist/commands/workflow/new-change.js +3 -3
  38. package/dist/commands/workflow/shared.d.ts +1 -1
  39. package/dist/commands/workflow/shared.js +4 -4
  40. package/dist/core/archive.js +15 -5
  41. package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
  42. package/dist/core/artifact-graph/instruction-loader.js +3 -3
  43. package/dist/core/artifact-graph/resolver.d.ts +4 -4
  44. package/dist/core/artifact-graph/resolver.js +6 -6
  45. package/dist/core/branding.js +3 -3
  46. package/dist/core/cli/command-matrix.js +10 -1
  47. package/dist/core/cli-command-quality.d.ts +27 -0
  48. package/dist/core/cli-command-quality.js +171 -0
  49. package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
  50. package/dist/core/command-generation/adapters/costrict.js +2 -2
  51. package/dist/core/command-generation/types.d.ts +1 -1
  52. package/dist/core/completions/command-registry.d.ts +1 -1
  53. package/dist/core/completions/command-registry.js +155 -12
  54. package/dist/core/completions/completion-provider.d.ts +14 -1
  55. package/dist/core/completions/completion-provider.js +29 -1
  56. package/dist/core/completions/generators/bash-generator.d.ts +1 -1
  57. package/dist/core/completions/generators/bash-generator.js +20 -12
  58. package/dist/core/completions/generators/fish-generator.d.ts +9 -1
  59. package/dist/core/completions/generators/fish-generator.js +39 -25
  60. package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
  61. package/dist/core/completions/generators/powershell-generator.js +21 -11
  62. package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
  63. package/dist/core/completions/generators/zsh-generator.js +21 -42
  64. package/dist/core/completions/installers/bash-installer.js +6 -6
  65. package/dist/core/completions/installers/fish-installer.js +1 -1
  66. package/dist/core/completions/installers/powershell-installer.js +14 -14
  67. package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
  68. package/dist/core/completions/installers/zsh-installer.js +36 -8
  69. package/dist/core/completions/templates/bash-templates.d.ts +1 -1
  70. package/dist/core/completions/templates/bash-templates.js +12 -6
  71. package/dist/core/completions/templates/fish-templates.d.ts +2 -2
  72. package/dist/core/completions/templates/fish-templates.js +20 -9
  73. package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
  74. package/dist/core/completions/templates/powershell-templates.js +13 -4
  75. package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
  76. package/dist/core/completions/templates/zsh-templates.js +18 -9
  77. package/dist/core/config-schema.d.ts +3 -1
  78. package/dist/core/config-schema.js +26 -1
  79. package/dist/core/config.d.ts +3 -3
  80. package/dist/core/config.js +4 -4
  81. package/dist/core/global-config.d.ts +41 -12
  82. package/dist/core/global-config.js +344 -27
  83. package/dist/core/index.d.ts +1 -1
  84. package/dist/core/index.js +2 -2
  85. package/dist/core/init.d.ts +6 -1
  86. package/dist/core/init.js +99 -77
  87. package/dist/core/legacy-cleanup.d.ts +17 -17
  88. package/dist/core/legacy-cleanup.js +96 -79
  89. package/dist/core/list.js +18 -4
  90. package/dist/core/migration.d.ts +3 -1
  91. package/dist/core/migration.js +7 -8
  92. package/dist/core/parsers/change-parser.js +1 -1
  93. package/dist/core/parsers/markdown-parser.js +2 -2
  94. package/dist/core/profile-sync-drift.d.ts +1 -1
  95. package/dist/core/profile-sync-drift.js +13 -13
  96. package/dist/core/project-config.d.ts +4 -4
  97. package/dist/core/project-config.js +11 -11
  98. package/dist/core/schemas/change.schema.d.ts +1 -1
  99. package/dist/core/schemas/change.schema.js +1 -1
  100. package/dist/core/schemas/spec.schema.d.ts +1 -1
  101. package/dist/core/schemas/spec.schema.js +1 -1
  102. package/dist/core/sdd/adr.js +23 -1
  103. package/dist/core/sdd/agent-binding.d.ts +346 -0
  104. package/dist/core/sdd/agent-binding.js +343 -0
  105. package/dist/core/sdd/backlog-cli.d.ts +16 -0
  106. package/dist/core/sdd/backlog-cli.js +146 -0
  107. package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
  108. package/dist/core/sdd/backlog-conflict-policy.js +230 -0
  109. package/dist/core/sdd/backlog-projection.d.ts +8 -0
  110. package/dist/core/sdd/backlog-projection.js +89 -0
  111. package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
  112. package/dist/core/sdd/backlog-provider-contract.js +158 -0
  113. package/dist/core/sdd/bootstrap.js +2 -2
  114. package/dist/core/sdd/check.d.ts +42 -0
  115. package/dist/core/sdd/check.js +22 -22
  116. package/dist/core/sdd/contract.d.ts +13 -0
  117. package/dist/core/sdd/contract.js +36 -0
  118. package/dist/core/sdd/coordination/coordination-adapters.d.ts +38 -0
  119. package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
  120. package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
  121. package/dist/core/sdd/deepagent-contracts.js +173 -0
  122. package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
  123. package/dist/core/sdd/deepagents/adr-governor.js +30 -0
  124. package/dist/core/sdd/deepagents/backend.d.ts +63 -0
  125. package/dist/core/sdd/deepagents/backend.js +174 -0
  126. package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
  127. package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
  128. package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
  129. package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
  130. package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
  131. package/dist/core/sdd/deepagents/model-provider.js +379 -0
  132. package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
  133. package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
  134. package/dist/core/sdd/deepagents/policy.d.ts +75 -0
  135. package/dist/core/sdd/deepagents/policy.js +358 -0
  136. package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
  137. package/dist/core/sdd/deepagents/quality-witness.js +77 -0
  138. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
  139. package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
  140. package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
  141. package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
  142. package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
  143. package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
  144. package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
  145. package/dist/core/sdd/default-bootstrap-files.js +36 -2
  146. package/dist/core/sdd/default-skills.d.ts +30 -0
  147. package/dist/core/sdd/default-skills.js +181 -5
  148. package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
  149. package/dist/core/sdd/devtrack-api-appliance.js +257 -0
  150. package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
  151. package/dist/core/sdd/devtrack-api-architecture.js +608 -0
  152. package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
  153. package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
  154. package/dist/core/sdd/diagnose.d.ts +59 -0
  155. package/dist/core/sdd/diagnose.js +37 -37
  156. package/dist/core/sdd/docs-sync.js +33 -5
  157. package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
  158. package/dist/core/sdd/domain/post-active-validation.js +61 -0
  159. package/dist/core/sdd/domain/transition-engine.js +1 -0
  160. package/dist/core/sdd/entity-reference.d.ts +5 -0
  161. package/dist/core/sdd/entity-reference.js +22 -0
  162. package/dist/core/sdd/governance-backfill.d.ts +31 -0
  163. package/dist/core/sdd/governance-backfill.js +359 -0
  164. package/dist/core/sdd/governance-parser.d.ts +21 -0
  165. package/dist/core/sdd/governance-parser.js +91 -0
  166. package/dist/core/sdd/governance-schemas.d.ts +245 -0
  167. package/dist/core/sdd/governance-schemas.js +143 -0
  168. package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
  169. package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
  170. package/dist/core/sdd/init.d.ts +3 -0
  171. package/dist/core/sdd/init.js +6 -3
  172. package/dist/core/sdd/json-schema.js +100 -6
  173. package/dist/core/sdd/knowledge-graph.d.ts +45 -0
  174. package/dist/core/sdd/knowledge-graph.js +288 -0
  175. package/dist/core/sdd/legacy-operations.js +431 -43
  176. package/dist/core/sdd/lenses.d.ts +1 -0
  177. package/dist/core/sdd/lenses.js +29 -1
  178. package/dist/core/sdd/migrate-workspace.js +56 -2
  179. package/dist/core/sdd/migrate.d.ts +1 -1
  180. package/dist/core/sdd/migrate.js +36 -2
  181. package/dist/core/sdd/package-structure-gate.d.ts +83 -0
  182. package/dist/core/sdd/package-structure-gate.js +362 -0
  183. package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
  184. package/dist/core/sdd/parallel-feat-automation.js +212 -0
  185. package/dist/core/sdd/plugin-broker.d.ts +558 -0
  186. package/dist/core/sdd/plugin-broker.js +482 -0
  187. package/dist/core/sdd/plugin-certification.d.ts +79 -0
  188. package/dist/core/sdd/plugin-certification.js +453 -0
  189. package/dist/core/sdd/plugin-cli.d.ts +109 -0
  190. package/dist/core/sdd/plugin-cli.js +198 -0
  191. package/dist/core/sdd/plugin-evidence.d.ts +275 -0
  192. package/dist/core/sdd/plugin-evidence.js +307 -0
  193. package/dist/core/sdd/plugin-manifest.d.ts +164 -0
  194. package/dist/core/sdd/plugin-manifest.js +215 -0
  195. package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
  196. package/dist/core/sdd/plugin-policy-pack.js +236 -0
  197. package/dist/core/sdd/plugin-policy.d.ts +68 -0
  198. package/dist/core/sdd/plugin-policy.js +212 -0
  199. package/dist/core/sdd/plugin-registry.d.ts +311 -0
  200. package/dist/core/sdd/plugin-registry.js +138 -0
  201. package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
  202. package/dist/core/sdd/plugin-skill-binding.js +339 -0
  203. package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
  204. package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
  205. package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
  206. package/dist/core/sdd/quality-evidence-renderer.js +218 -0
  207. package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
  208. package/dist/core/sdd/quality-scenario-runner.js +613 -0
  209. package/dist/core/sdd/quality-validation.d.ts +547 -0
  210. package/dist/core/sdd/quality-validation.js +239 -0
  211. package/dist/core/sdd/resolve-project-root.d.ts +2 -2
  212. package/dist/core/sdd/resolve-project-root.js +11 -5
  213. package/dist/core/sdd/sanitize.d.ts +30 -1
  214. package/dist/core/sdd/sanitize.js +23 -23
  215. package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
  216. package/dist/core/sdd/services/agent-run.service.js +189 -0
  217. package/dist/core/sdd/services/breakdown.service.js +2 -1
  218. package/dist/core/sdd/services/context.service.js +18 -16
  219. package/dist/core/sdd/services/debate.service.js +15 -2
  220. package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
  221. package/dist/core/sdd/services/feature-lint.service.js +105 -5
  222. package/dist/core/sdd/services/finalize.service.d.ts +80 -0
  223. package/dist/core/sdd/services/finalize.service.js +323 -24
  224. package/dist/core/sdd/services/frontend-gap.service.js +22 -7
  225. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
  226. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
  227. package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
  228. package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
  229. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  230. package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
  231. package/dist/core/sdd/services/legacy-capability.service.js +38 -21
  232. package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
  233. package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
  234. package/dist/core/sdd/services/onboard.service.js +2 -1
  235. package/dist/core/sdd/services/rebuild.service.js +6 -1
  236. package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
  237. package/dist/core/sdd/services/skills-sync.service.js +55 -2
  238. package/dist/core/sdd/services/start.service.js +6 -4
  239. package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
  240. package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
  241. package/dist/core/sdd/skill-evidence.d.ts +19 -0
  242. package/dist/core/sdd/skill-evidence.js +38 -0
  243. package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
  244. package/dist/core/sdd/skill-policy-pool.js +185 -0
  245. package/dist/core/sdd/state.d.ts +22 -0
  246. package/dist/core/sdd/state.js +66 -41
  247. package/dist/core/sdd/structural-health.d.ts +42 -42
  248. package/dist/core/sdd/types.d.ts +33 -7
  249. package/dist/core/sdd/types.js +17 -0
  250. package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
  251. package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
  252. package/dist/core/sdd/workspace-schemas.d.ts +285 -14
  253. package/dist/core/sdd/workspace-schemas.js +148 -0
  254. package/dist/core/sdd/write-manifest.js +22 -4
  255. package/dist/core/shared/skill-generation.d.ts +1 -1
  256. package/dist/core/shared/skill-generation.js +15 -15
  257. package/dist/core/shared/tool-detection.d.ts +3 -3
  258. package/dist/core/shared/tool-detection.js +14 -14
  259. package/dist/core/specs-apply.js +6 -6
  260. package/dist/core/templates/index.d.ts +1 -1
  261. package/dist/core/templates/index.js +1 -1
  262. package/dist/core/templates/workflows/apply-change.js +14 -14
  263. package/dist/core/templates/workflows/archive-change.js +32 -32
  264. package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
  265. package/dist/core/templates/workflows/continue-change.js +12 -12
  266. package/dist/core/templates/workflows/explore.js +29 -29
  267. package/dist/core/templates/workflows/feedback.js +6 -6
  268. package/dist/core/templates/workflows/ff-change.js +24 -24
  269. package/dist/core/templates/workflows/new-change.js +20 -20
  270. package/dist/core/templates/workflows/onboard.js +33 -33
  271. package/dist/core/templates/workflows/propose.js +23 -23
  272. package/dist/core/templates/workflows/sdd.js +8 -8
  273. package/dist/core/templates/workflows/sync-specs.js +19 -19
  274. package/dist/core/templates/workflows/verify-change.js +17 -17
  275. package/dist/core/update.d.ts +2 -2
  276. package/dist/core/update.js +16 -15
  277. package/dist/core/validation/constants.d.ts +1 -1
  278. package/dist/core/validation/constants.js +1 -1
  279. package/dist/core/view.js +11 -11
  280. package/dist/telemetry/config.d.ts +2 -1
  281. package/dist/telemetry/config.js +17 -8
  282. package/dist/telemetry/index.d.ts +10 -2
  283. package/dist/telemetry/index.js +40 -7
  284. package/dist/ui/ascii-patterns.d.ts +2 -2
  285. package/dist/ui/ascii-patterns.js +2 -2
  286. package/dist/ui/welcome-screen.js +2 -2
  287. package/dist/utils/change-metadata.d.ts +4 -4
  288. package/dist/utils/change-metadata.js +6 -6
  289. package/dist/utils/change-utils.d.ts +3 -3
  290. package/dist/utils/change-utils.js +5 -5
  291. package/dist/utils/file-system.js +1 -1
  292. package/dist/utils/interactive.js +1 -1
  293. package/dist/utils/item-discovery.js +4 -4
  294. package/dist/utils/legacy-spec-compat.d.ts +2 -0
  295. package/dist/utils/legacy-spec-compat.js +2 -0
  296. package/dist/utils/shell-detection.d.ts +1 -0
  297. package/dist/utils/shell-detection.js +16 -0
  298. package/package.json +27 -17
  299. package/schemas/sdd/1-spec.schema.json +1 -1
  300. package/schemas/sdd/2-plan.schema.json +73 -1
  301. package/schemas/sdd/3-tasks.schema.json +73 -1
  302. package/schemas/sdd/4-changelog.schema.json +1 -1
  303. package/schemas/sdd/5-quality.schema.json +442 -2
  304. package/schemas/sdd/adr.schema.json +148 -0
  305. package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
  306. package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
  307. package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
  308. package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
  309. package/schemas/sdd/codesdd-plugin.schema.json +474 -0
  310. package/schemas/sdd/debate.schema.json +244 -0
  311. package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
  312. package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
  313. package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
  314. package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
  315. package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
  316. package/schemas/sdd/deepagent-run-request.schema.json +321 -0
  317. package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
  318. package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
  319. package/schemas/sdd/discarded.schema.json +127 -0
  320. package/schemas/sdd/epic.schema.json +147 -0
  321. package/schemas/sdd/insight.schema.json +136 -0
  322. package/schemas/sdd/parallel-feat-automation-plan.schema.json +215 -0
  323. package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
  324. package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -0
  325. package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
  326. package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
  327. package/schemas/sdd/plugin-evidence-manifest.schema.json +569 -0
  328. package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
  329. package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
  330. package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
  331. package/schemas/sdd/plugin-registry.schema.json +558 -0
  332. package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
  333. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -0
  334. package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
  335. package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
  336. package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
  337. package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
  338. package/schemas/sdd/quality-evidence-bundle.schema.json +1228 -0
  339. package/schemas/sdd/quality-run.schema.json +197 -0
  340. package/schemas/sdd/quality-scenario.schema.json +252 -0
  341. package/schemas/sdd/workspace-catalog.schema.json +9841 -22
  342. package/schemas/spec-driven/schema.yaml +4 -4
  343. package/schemas/spec-driven/templates/proposal.md +1 -1
  344. package/dist/utils/openspec-compat.d.ts +0 -2
  345. package/dist/utils/openspec-compat.js +0 -2
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ import { type PluginManifest } from './plugin-manifest.js';
3
+ export declare const pluginPolicyPackSchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ version: z.ZodString;
6
+ description: z.ZodString;
7
+ applies_to: z.ZodDefault<z.ZodObject<{
8
+ trust_tiers: z.ZodDefault<z.ZodArray<z.ZodEnum<{
9
+ experimental: "experimental";
10
+ blocked: "blocked";
11
+ "local-dev": "local-dev";
12
+ "enterprise-approved": "enterprise-approved";
13
+ }>>>;
14
+ }, z.core.$strip>>;
15
+ requirements: z.ZodDefault<z.ZodObject<{
16
+ max_risk_tier: z.ZodDefault<z.ZodEnum<{
17
+ low: "low";
18
+ medium: "medium";
19
+ high: "high";
20
+ critical: "critical";
21
+ }>>;
22
+ supply_chain: z.ZodDefault<z.ZodObject<{
23
+ checksum: z.ZodDefault<z.ZodBoolean>;
24
+ signature_or_provenance: z.ZodDefault<z.ZodBoolean>;
25
+ sbom: z.ZodDefault<z.ZodBoolean>;
26
+ sbom_formats: z.ZodDefault<z.ZodArray<z.ZodEnum<{
27
+ custom: "custom";
28
+ cyclonedx: "cyclonedx";
29
+ spdx: "spdx";
30
+ }>>>;
31
+ }, z.core.$strip>>;
32
+ validation: z.ZodDefault<z.ZodObject<{
33
+ min_coverage: z.ZodDefault<z.ZodNumber>;
34
+ security_checks: z.ZodDefault<z.ZodArray<z.ZodString>>;
35
+ dependency_checks: z.ZodDefault<z.ZodArray<z.ZodString>>;
36
+ }, z.core.$strip>>;
37
+ execution: z.ZodDefault<z.ZodObject<{
38
+ network: z.ZodOptional<z.ZodEnum<{
39
+ disabled: "disabled";
40
+ restricted: "restricted";
41
+ enabled: "enabled";
42
+ }>>;
43
+ process_spawn: z.ZodOptional<z.ZodEnum<{
44
+ forbidden: "forbidden";
45
+ declared: "declared";
46
+ }>>;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>>;
49
+ }, z.core.$strip>;
50
+ export declare const pluginPolicyPackIssueSchema: z.ZodObject<{
51
+ code: z.ZodString;
52
+ severity: z.ZodEnum<{
53
+ deny: "deny";
54
+ warn: "warn";
55
+ }>;
56
+ message: z.ZodString;
57
+ policy_pack: z.ZodOptional<z.ZodString>;
58
+ }, z.core.$strip>;
59
+ export declare const pluginPolicyPackEvaluationSchema: z.ZodObject<{
60
+ schema_version: z.ZodLiteral<1>;
61
+ plugin_ref: z.ZodObject<{
62
+ id: z.ZodString;
63
+ version: z.ZodString;
64
+ }, z.core.$strip>;
65
+ decision: z.ZodEnum<{
66
+ deny: "deny";
67
+ warn: "warn";
68
+ allow: "allow";
69
+ }>;
70
+ declared_policy_packs: z.ZodDefault<z.ZodArray<z.ZodString>>;
71
+ applied_policy_packs: z.ZodDefault<z.ZodArray<z.ZodString>>;
72
+ issues: z.ZodDefault<z.ZodArray<z.ZodObject<{
73
+ code: z.ZodString;
74
+ severity: z.ZodEnum<{
75
+ deny: "deny";
76
+ warn: "warn";
77
+ }>;
78
+ message: z.ZodString;
79
+ policy_pack: z.ZodOptional<z.ZodString>;
80
+ }, z.core.$strip>>>;
81
+ }, z.core.$strip>;
82
+ export type PluginPolicyPack = z.infer<typeof pluginPolicyPackSchema>;
83
+ export type PluginPolicyPackIssue = z.infer<typeof pluginPolicyPackIssueSchema>;
84
+ export type PluginPolicyPackEvaluation = z.infer<typeof pluginPolicyPackEvaluationSchema>;
85
+ export declare const ENTERPRISE_DEFAULT_POLICY_PACK: PluginPolicyPack;
86
+ export declare const DEVTRACK_API_FOUNDATION_POLICY_PACK: PluginPolicyPack;
87
+ export declare function evaluatePluginPolicyPacks(manifest: PluginManifest, policyPacks: PluginPolicyPack[]): PluginPolicyPackEvaluation;
88
+ //# sourceMappingURL=plugin-policy-pack.d.ts.map
@@ -0,0 +1,236 @@
1
+ import { z } from 'zod';
2
+ import { pluginManifestSchema } from './plugin-manifest.js';
3
+ const SEMVER_PATTERN = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
4
+ const riskRank = {
5
+ low: 1,
6
+ medium: 2,
7
+ high: 3,
8
+ critical: 4,
9
+ };
10
+ export const pluginPolicyPackSchema = z.object({
11
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/),
12
+ version: z.string().regex(SEMVER_PATTERN),
13
+ description: z.string().min(20),
14
+ applies_to: z
15
+ .object({
16
+ trust_tiers: z
17
+ .array(z.enum(['local-dev', 'experimental', 'enterprise-approved', 'blocked']))
18
+ .default(['enterprise-approved']),
19
+ })
20
+ .default({ trust_tiers: ['enterprise-approved'] }),
21
+ requirements: z
22
+ .object({
23
+ max_risk_tier: z.enum(['low', 'medium', 'high', 'critical']).default('medium'),
24
+ supply_chain: z
25
+ .object({
26
+ checksum: z.boolean().default(false),
27
+ signature_or_provenance: z.boolean().default(false),
28
+ sbom: z.boolean().default(false),
29
+ sbom_formats: z.array(z.enum(['cyclonedx', 'spdx', 'custom'])).default([]),
30
+ })
31
+ .default({ checksum: false, signature_or_provenance: false, sbom: false, sbom_formats: [] }),
32
+ validation: z
33
+ .object({
34
+ min_coverage: z.number().min(0).max(100).default(0),
35
+ security_checks: z.array(z.string().min(1)).default([]),
36
+ dependency_checks: z.array(z.string().min(1)).default([]),
37
+ })
38
+ .default({ min_coverage: 0, security_checks: [], dependency_checks: [] }),
39
+ execution: z
40
+ .object({
41
+ network: z.enum(['disabled', 'restricted', 'enabled']).optional(),
42
+ process_spawn: z.enum(['forbidden', 'declared']).optional(),
43
+ })
44
+ .default({}),
45
+ })
46
+ .default({
47
+ max_risk_tier: 'medium',
48
+ supply_chain: { checksum: false, signature_or_provenance: false, sbom: false, sbom_formats: [] },
49
+ validation: { min_coverage: 0, security_checks: [], dependency_checks: [] },
50
+ execution: {},
51
+ }),
52
+ });
53
+ export const pluginPolicyPackIssueSchema = z.object({
54
+ code: z.string().min(1),
55
+ severity: z.enum(['deny', 'warn']),
56
+ message: z.string().min(1),
57
+ policy_pack: z.string().optional(),
58
+ });
59
+ export const pluginPolicyPackEvaluationSchema = z.object({
60
+ schema_version: z.literal(1),
61
+ plugin_ref: z.object({
62
+ id: z.string().min(1),
63
+ version: z.string().min(1),
64
+ }),
65
+ decision: z.enum(['allow', 'warn', 'deny']),
66
+ declared_policy_packs: z.array(z.string()).default([]),
67
+ applied_policy_packs: z.array(z.string()).default([]),
68
+ issues: z.array(pluginPolicyPackIssueSchema).default([]),
69
+ });
70
+ export const ENTERPRISE_DEFAULT_POLICY_PACK = pluginPolicyPackSchema.parse({
71
+ id: 'enterprise-default',
72
+ version: '1.0.0',
73
+ description: 'Default enterprise plugin policy for supply-chain, validation, and safe execution controls.',
74
+ applies_to: {
75
+ trust_tiers: ['enterprise-approved', 'local-dev', 'experimental'],
76
+ },
77
+ requirements: {
78
+ max_risk_tier: 'high',
79
+ supply_chain: {
80
+ checksum: true,
81
+ signature_or_provenance: true,
82
+ sbom: true,
83
+ sbom_formats: ['cyclonedx', 'spdx'],
84
+ },
85
+ validation: {
86
+ min_coverage: 95,
87
+ security_checks: ['dependency-audit'],
88
+ dependency_checks: ['lockfile-review'],
89
+ },
90
+ execution: {
91
+ network: 'disabled',
92
+ process_spawn: 'forbidden',
93
+ },
94
+ },
95
+ });
96
+ export const DEVTRACK_API_FOUNDATION_POLICY_PACK = pluginPolicyPackSchema.parse({
97
+ id: 'devtrack-api-foundation',
98
+ version: '1.0.0',
99
+ description: 'DevTrack API Foundation appliance policy for TypeORM-only dependency and structural validation.',
100
+ applies_to: {
101
+ trust_tiers: ['enterprise-approved'],
102
+ },
103
+ requirements: {
104
+ max_risk_tier: 'high',
105
+ supply_chain: {
106
+ checksum: true,
107
+ signature_or_provenance: true,
108
+ sbom: true,
109
+ sbom_formats: ['cyclonedx'],
110
+ },
111
+ validation: {
112
+ min_coverage: 95,
113
+ security_checks: ['dependency-audit', 'no-secret-fixtures', 'no-out-of-root-writes'],
114
+ dependency_checks: ['lockfile-review', 'typeorm-only-persistence'],
115
+ },
116
+ execution: {
117
+ network: 'disabled',
118
+ process_spawn: 'forbidden',
119
+ },
120
+ },
121
+ });
122
+ export function evaluatePluginPolicyPacks(manifest, policyPacks) {
123
+ const parsedManifest = pluginManifestSchema.parse(manifest);
124
+ const parsedPolicyPacks = policyPacks.map((pack) => pluginPolicyPackSchema.parse(pack));
125
+ const packById = new Map(parsedPolicyPacks.map((pack) => [pack.id, pack]));
126
+ const issues = [];
127
+ const appliedPolicyPacks = [];
128
+ if (parsedManifest.governance.policy_packs.length === 0) {
129
+ issues.push(warn('NO_POLICY_PACK_DECLARED', `Plugin ${parsedManifest.id} declares no policy packs.`));
130
+ }
131
+ for (const policyPackId of parsedManifest.governance.policy_packs) {
132
+ const policyPack = packById.get(policyPackId);
133
+ if (!policyPack) {
134
+ issues.push(deny('POLICY_PACK_NOT_AVAILABLE', `Policy pack ${policyPackId} is not available.`, policyPackId));
135
+ continue;
136
+ }
137
+ appliedPolicyPacks.push(policyPack.id);
138
+ issues.push(...evaluatePolicyPack(parsedManifest, policyPack));
139
+ }
140
+ return pluginPolicyPackEvaluationSchema.parse({
141
+ schema_version: 1,
142
+ plugin_ref: {
143
+ id: parsedManifest.id,
144
+ version: parsedManifest.version,
145
+ },
146
+ decision: issues.some((issue) => issue.severity === 'deny')
147
+ ? 'deny'
148
+ : issues.some((issue) => issue.severity === 'warn')
149
+ ? 'warn'
150
+ : 'allow',
151
+ declared_policy_packs: parsedManifest.governance.policy_packs,
152
+ applied_policy_packs: appliedPolicyPacks,
153
+ issues,
154
+ });
155
+ }
156
+ function evaluatePolicyPack(manifest, policyPack) {
157
+ const issues = [];
158
+ if (!policyPack.applies_to.trust_tiers.includes(manifest.governance.trust_tier)) {
159
+ issues.push(warn('POLICY_PACK_NOT_APPLICABLE', `Policy pack ${policyPack.id} does not target trust tier ${manifest.governance.trust_tier}.`, policyPack.id));
160
+ }
161
+ if (riskRank[manifest.governance.risk_tier] > riskRank[policyPack.requirements.max_risk_tier]) {
162
+ issues.push(deny('RISK_TIER_EXCEEDS_POLICY', `Plugin risk tier ${manifest.governance.risk_tier} exceeds policy maximum ${policyPack.requirements.max_risk_tier}.`, policyPack.id));
163
+ }
164
+ issues.push(...evaluateSupplyChainPolicy(manifest, policyPack));
165
+ issues.push(...evaluateValidationPolicy(manifest, policyPack));
166
+ issues.push(...evaluateExecutionPolicy(manifest, policyPack));
167
+ return issues;
168
+ }
169
+ function evaluateSupplyChainPolicy(manifest, policyPack) {
170
+ const requirements = policyPack.requirements.supply_chain;
171
+ const issues = [];
172
+ if (requirements.checksum && !manifest.supply_chain.checksum) {
173
+ issues.push(deny('CHECKSUM_REQUIRED', `Policy pack ${policyPack.id} requires a checksum.`, policyPack.id));
174
+ }
175
+ if (requirements.signature_or_provenance && !manifest.supply_chain.signature && !manifest.supply_chain.provenance) {
176
+ issues.push(deny('SIGNATURE_OR_PROVENANCE_REQUIRED', `Policy pack ${policyPack.id} requires signature or provenance.`, policyPack.id));
177
+ }
178
+ if (requirements.sbom && !manifest.supply_chain.sbom) {
179
+ issues.push(deny('SBOM_REQUIRED', `Policy pack ${policyPack.id} requires SBOM metadata.`, policyPack.id));
180
+ }
181
+ if (manifest.supply_chain.sbom && requirements.sbom_formats.length > 0) {
182
+ const format = resolveSbomFormat(manifest.supply_chain.sbom);
183
+ if (!requirements.sbom_formats.includes(format)) {
184
+ issues.push(deny('SBOM_FORMAT_NOT_ALLOWED', `SBOM format ${format} is not allowed by policy pack ${policyPack.id}.`, policyPack.id));
185
+ }
186
+ }
187
+ return issues;
188
+ }
189
+ function evaluateValidationPolicy(manifest, policyPack) {
190
+ const requirements = policyPack.requirements.validation;
191
+ const issues = [];
192
+ if (manifest.validation.coverage_target < requirements.min_coverage) {
193
+ issues.push(deny('COVERAGE_TARGET_TOO_LOW', `Coverage target ${manifest.validation.coverage_target}% is below policy minimum ${requirements.min_coverage}%.`, policyPack.id));
194
+ }
195
+ issues.push(...missingValues(requirements.security_checks, manifest.validation.security_checks).map((check) => deny('SECURITY_CHECK_REQUIRED', `Required security check ${check} is missing.`, policyPack.id)));
196
+ issues.push(...missingValues(requirements.dependency_checks, manifest.validation.dependency_checks).map((check) => deny('DEPENDENCY_CHECK_REQUIRED', `Required dependency check ${check} is missing.`, policyPack.id)));
197
+ return issues;
198
+ }
199
+ function evaluateExecutionPolicy(manifest, policyPack) {
200
+ const requirements = policyPack.requirements.execution;
201
+ const issues = [];
202
+ if (requirements.network && manifest.execution.network !== requirements.network) {
203
+ issues.push(deny('NETWORK_POLICY_MISMATCH', `Network policy ${manifest.execution.network} does not match required ${requirements.network}.`, policyPack.id));
204
+ }
205
+ if (requirements.process_spawn && manifest.execution.process_spawn !== requirements.process_spawn) {
206
+ issues.push(deny('PROCESS_SPAWN_POLICY_MISMATCH', `Process spawn policy ${manifest.execution.process_spawn} does not match required ${requirements.process_spawn}.`, policyPack.id));
207
+ }
208
+ return issues;
209
+ }
210
+ function resolveSbomFormat(sbom) {
211
+ const prefix = sbom.split(':', 1)[0]?.toLowerCase();
212
+ if (prefix === 'cyclonedx' || prefix === 'spdx') {
213
+ return prefix;
214
+ }
215
+ return 'custom';
216
+ }
217
+ function missingValues(required, actual) {
218
+ return required.filter((value) => !actual.includes(value));
219
+ }
220
+ function deny(code, message, policyPack) {
221
+ return {
222
+ code,
223
+ severity: 'deny',
224
+ message,
225
+ policy_pack: policyPack,
226
+ };
227
+ }
228
+ function warn(code, message, policyPack) {
229
+ return {
230
+ code,
231
+ severity: 'warn',
232
+ message,
233
+ policy_pack: policyPack,
234
+ };
235
+ }
236
+ //# sourceMappingURL=plugin-policy-pack.js.map
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { type PluginManifest } from './plugin-manifest.js';
3
+ export declare const pluginPolicyEvaluationRequestSchema: z.ZodObject<{
4
+ capability: z.ZodString;
5
+ mode: z.ZodDefault<z.ZodEnum<{
6
+ apply: "apply";
7
+ "dry-run": "dry-run";
8
+ rollback: "rollback";
9
+ }>>;
10
+ approval_grants: z.ZodDefault<z.ZodArray<z.ZodEnum<{
11
+ maintainer: "maintainer";
12
+ security: "security";
13
+ "architecture-board": "architecture-board";
14
+ }>>>;
15
+ source_checksum: z.ZodOptional<z.ZodString>;
16
+ requested_write_scope: z.ZodDefault<z.ZodArray<z.ZodString>>;
17
+ planned_writes: z.ZodDefault<z.ZodArray<z.ZodString>>;
18
+ requested_env: z.ZodDefault<z.ZodArray<z.ZodString>>;
19
+ network_domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
20
+ process_spawn_requested: z.ZodDefault<z.ZodBoolean>;
21
+ filesystem_checks: z.ZodDefault<z.ZodArray<z.ZodObject<{
22
+ path: z.ZodString;
23
+ real_path: z.ZodString;
24
+ project_root: z.ZodString;
25
+ is_symlink: z.ZodDefault<z.ZodBoolean>;
26
+ }, z.core.$strip>>>;
27
+ }, z.core.$strip>;
28
+ export declare const pluginPolicyIssueSchema: z.ZodObject<{
29
+ code: z.ZodString;
30
+ severity: z.ZodEnum<{
31
+ deny: "deny";
32
+ warn: "warn";
33
+ }>;
34
+ message: z.ZodString;
35
+ path: z.ZodOptional<z.ZodString>;
36
+ }, z.core.$strip>;
37
+ export declare const pluginPolicyEvaluationSchema: z.ZodObject<{
38
+ schema_version: z.ZodLiteral<1>;
39
+ plugin_ref: z.ZodObject<{
40
+ id: z.ZodString;
41
+ version: z.ZodString;
42
+ }, z.core.$strip>;
43
+ capability: z.ZodString;
44
+ mode: z.ZodEnum<{
45
+ apply: "apply";
46
+ "dry-run": "dry-run";
47
+ rollback: "rollback";
48
+ }>;
49
+ decision: z.ZodEnum<{
50
+ deny: "deny";
51
+ warn: "warn";
52
+ allow: "allow";
53
+ }>;
54
+ issues: z.ZodDefault<z.ZodArray<z.ZodObject<{
55
+ code: z.ZodString;
56
+ severity: z.ZodEnum<{
57
+ deny: "deny";
58
+ warn: "warn";
59
+ }>;
60
+ message: z.ZodString;
61
+ path: z.ZodOptional<z.ZodString>;
62
+ }, z.core.$strip>>>;
63
+ }, z.core.$strip>;
64
+ export type PluginPolicyEvaluationRequest = z.infer<typeof pluginPolicyEvaluationRequestSchema>;
65
+ export type PluginPolicyIssue = z.infer<typeof pluginPolicyIssueSchema>;
66
+ export type PluginPolicyEvaluation = z.infer<typeof pluginPolicyEvaluationSchema>;
67
+ export declare function evaluatePluginTrustPolicy(manifest: PluginManifest, request: PluginPolicyEvaluationRequest): PluginPolicyEvaluation;
68
+ //# sourceMappingURL=plugin-policy.d.ts.map
@@ -0,0 +1,212 @@
1
+ import path from 'node:path';
2
+ import { z } from 'zod';
3
+ import { pluginManifestSchema } from './plugin-manifest.js';
4
+ const APPROVAL_ORDER = ['none', 'maintainer', 'security', 'architecture-board'];
5
+ const SENSITIVE_ENV_NAME_PATTERN = /(SECRET|TOKEN|PASSWORD|PRIVATE|KEY|CREDENTIAL)/;
6
+ const SECRET_PATH_SEGMENTS = ['.env', 'secret', 'secrets', 'credential', 'credentials', 'token', '.aws', '.ssh', 'id_rsa'];
7
+ export const pluginPolicyEvaluationRequestSchema = z.object({
8
+ capability: z.string().min(1),
9
+ mode: z.enum(['dry-run', 'apply', 'rollback']).default('dry-run'),
10
+ approval_grants: z.array(z.enum(['maintainer', 'security', 'architecture-board'])).default([]),
11
+ source_checksum: z.string().optional(),
12
+ requested_write_scope: z.array(z.string().min(1)).default([]),
13
+ planned_writes: z.array(z.string().min(1)).default([]),
14
+ requested_env: z.array(z.string().min(1)).default([]),
15
+ network_domains: z.array(z.string().min(1)).default([]),
16
+ process_spawn_requested: z.boolean().default(false),
17
+ filesystem_checks: z
18
+ .array(z.object({
19
+ path: z.string().min(1),
20
+ real_path: z.string().min(1),
21
+ project_root: z.string().min(1),
22
+ is_symlink: z.boolean().default(false),
23
+ }))
24
+ .default([]),
25
+ });
26
+ export const pluginPolicyIssueSchema = z.object({
27
+ code: z.string().min(1),
28
+ severity: z.enum(['deny', 'warn']),
29
+ message: z.string().min(1),
30
+ path: z.string().optional(),
31
+ });
32
+ export const pluginPolicyEvaluationSchema = z.object({
33
+ schema_version: z.literal(1),
34
+ plugin_ref: z.object({
35
+ id: z.string().min(1),
36
+ version: z.string().min(1),
37
+ }),
38
+ capability: z.string().min(1),
39
+ mode: z.enum(['dry-run', 'apply', 'rollback']),
40
+ decision: z.enum(['allow', 'warn', 'deny']),
41
+ issues: z.array(pluginPolicyIssueSchema).default([]),
42
+ });
43
+ export function evaluatePluginTrustPolicy(manifest, request) {
44
+ const parsedManifest = pluginManifestSchema.parse(manifest);
45
+ const parsedRequest = pluginPolicyEvaluationRequestSchema.parse(request);
46
+ const issues = [];
47
+ const capability = parsedManifest.capabilities.find((candidate) => candidate.name === parsedRequest.capability);
48
+ if (!capability) {
49
+ issues.push(deny('CAPABILITY_NOT_FOUND', `Capability ${parsedRequest.capability} is not declared by the plugin.`));
50
+ }
51
+ else {
52
+ issues.push(...evaluateCapabilityPolicy(parsedManifest, capability, parsedRequest));
53
+ }
54
+ issues.push(...evaluateManifestPolicy(parsedManifest, parsedRequest));
55
+ return pluginPolicyEvaluationSchema.parse({
56
+ schema_version: 1,
57
+ plugin_ref: {
58
+ id: parsedManifest.id,
59
+ version: parsedManifest.version,
60
+ },
61
+ capability: parsedRequest.capability,
62
+ mode: parsedRequest.mode,
63
+ decision: issues.some((issue) => issue.severity === 'deny')
64
+ ? 'deny'
65
+ : issues.some((issue) => issue.severity === 'warn')
66
+ ? 'warn'
67
+ : 'allow',
68
+ issues,
69
+ });
70
+ }
71
+ function evaluateCapabilityPolicy(manifest, capability, request) {
72
+ const issues = [];
73
+ if (request.mode === 'apply') {
74
+ if (!capability.supports_apply) {
75
+ issues.push(deny('APPLY_NOT_SUPPORTED', `Capability ${capability.name} does not support apply mode.`));
76
+ }
77
+ if (!capability.supports_dry_run) {
78
+ issues.push(deny('APPLY_WITHOUT_DRY_RUN', `Capability ${capability.name} cannot apply without dry-run support.`));
79
+ }
80
+ if (!hasApprovalGrant(capability.approval, request.approval_grants)) {
81
+ issues.push(deny('APPROVAL_REQUIRED', `Capability ${capability.name} requires ${capability.approval} approval before apply.`));
82
+ }
83
+ }
84
+ if (request.mode === 'rollback' && !capability.supports_rollback) {
85
+ issues.push(deny('ROLLBACK_NOT_SUPPORTED', `Capability ${capability.name} does not support rollback mode.`));
86
+ }
87
+ for (const writePath of [...request.requested_write_scope, ...request.planned_writes]) {
88
+ if (!isSafeRelativePath(writePath)) {
89
+ issues.push(deny('UNSAFE_WRITE_PATH', `Write path ${writePath} must be project-root relative.`, writePath));
90
+ continue;
91
+ }
92
+ if (isProtectedStatePath(writePath)) {
93
+ issues.push(deny('STATE_WRITE_FORBIDDEN', `Write path ${writePath} cannot mutate canonical state files.`, writePath));
94
+ }
95
+ if (isSecretPath(writePath)) {
96
+ issues.push(deny('SECRET_PATH_BLOCKED', `Write path ${writePath} was blocked by secret-path policy.`, writePath));
97
+ }
98
+ if (!isWithinDeclaredScopes(writePath, capability.write_scope)) {
99
+ issues.push(deny('UNDECLARED_CAPABILITY_WRITE', `Write path ${writePath} is outside capability write scope.`, writePath));
100
+ }
101
+ if (!isWithinDeclaredScopes(writePath, manifest.artifacts.writes)) {
102
+ issues.push(deny('UNDECLARED_ARTIFACT_WRITE', `Write path ${writePath} is outside manifest artifact writes.`, writePath));
103
+ }
104
+ if (isWithinDeclaredScopes(writePath, manifest.artifacts.forbidden_writes)) {
105
+ issues.push(deny('FORBIDDEN_ARTIFACT_WRITE', `Write path ${writePath} is explicitly forbidden.`, writePath));
106
+ }
107
+ }
108
+ return issues;
109
+ }
110
+ function evaluateManifestPolicy(manifest, request) {
111
+ const issues = [];
112
+ if (manifest.governance.trust_tier === 'blocked') {
113
+ issues.push(deny('PLUGIN_BLOCKED', `Plugin ${manifest.id} is blocked by governance trust tier.`));
114
+ }
115
+ else if (manifest.governance.trust_tier === 'experimental') {
116
+ issues.push(warn('PLUGIN_EXPERIMENTAL', `Plugin ${manifest.id} is marked experimental by governance trust tier.`));
117
+ }
118
+ if (manifest.supply_chain.checksum) {
119
+ if (!request.source_checksum) {
120
+ issues.push(deny('SOURCE_CHECKSUM_REQUIRED', `Plugin ${manifest.id} requires source checksum verification.`));
121
+ }
122
+ else if (request.source_checksum !== manifest.supply_chain.checksum) {
123
+ issues.push(deny('SOURCE_CHECKSUM_MISMATCH', `Plugin ${manifest.id} source checksum does not match manifest.`));
124
+ }
125
+ }
126
+ for (const envName of request.requested_env) {
127
+ if (isSensitiveEnvironmentVariable(envName)) {
128
+ issues.push(deny('SECRET_ENV_NOT_ALLOWED', `Environment variable ${envName} is classified as sensitive for plugin execution.`));
129
+ }
130
+ if (!manifest.execution.env_allowlist.includes(envName)) {
131
+ issues.push(deny('ENV_NOT_ALLOWED', `Environment variable ${envName} is not allowed by the plugin manifest.`));
132
+ }
133
+ }
134
+ issues.push(...evaluateNetworkPolicy(manifest, request));
135
+ if (request.process_spawn_requested && manifest.execution.process_spawn === 'forbidden') {
136
+ issues.push(deny('PROCESS_SPAWN_FORBIDDEN', `Plugin ${manifest.id} does not allow process spawning.`));
137
+ }
138
+ for (const check of request.filesystem_checks) {
139
+ if (!isSafeRelativePath(check.path)) {
140
+ issues.push(deny('UNSAFE_FILESYSTEM_PATH', `Filesystem check path ${check.path} is not project-root relative.`, check.path));
141
+ continue;
142
+ }
143
+ if (!isWithinRoot(check.real_path, check.project_root)) {
144
+ issues.push(deny('SYMLINK_ESCAPE', `Path ${check.path} resolves outside project root${check.is_symlink ? ' through a symlink' : ''}.`, check.path));
145
+ }
146
+ }
147
+ return issues;
148
+ }
149
+ function evaluateNetworkPolicy(manifest, request) {
150
+ if (request.network_domains.length === 0) {
151
+ return [];
152
+ }
153
+ if (manifest.execution.network === 'disabled') {
154
+ return request.network_domains.map((domain) => deny('NETWORK_DISABLED', `Network access to ${domain} is denied because plugin network is disabled.`));
155
+ }
156
+ if (manifest.execution.network !== 'restricted') {
157
+ return [];
158
+ }
159
+ return request.network_domains
160
+ .filter((domain) => !isAllowedDomain(domain, manifest.governance.allowed_domains))
161
+ .map((domain) => deny('NETWORK_DOMAIN_NOT_ALLOWED', `Network domain ${domain} is not allowed by governance policy.`));
162
+ }
163
+ function hasApprovalGrant(required, grants) {
164
+ if (required === 'none') {
165
+ return true;
166
+ }
167
+ const requiredRank = APPROVAL_ORDER.indexOf(required);
168
+ return grants.some((grant) => APPROVAL_ORDER.indexOf(grant) >= requiredRank);
169
+ }
170
+ function isAllowedDomain(domain, allowedDomains) {
171
+ return allowedDomains.some((allowedDomain) => domain === allowedDomain || domain.endsWith(`.${allowedDomain}`));
172
+ }
173
+ function isSafeRelativePath(value) {
174
+ if (value.startsWith('/') || /^[A-Za-z]:[\\/]/.test(value)) {
175
+ return false;
176
+ }
177
+ return !value.split(/[\\/]+/).some((segment) => segment === '..');
178
+ }
179
+ function isWithinDeclaredScopes(value, scopes) {
180
+ return scopes.some((scope) => value === scope || value.startsWith(`${scope}/`));
181
+ }
182
+ function isWithinRoot(realPath, projectRoot) {
183
+ const relative = path.relative(projectRoot, realPath);
184
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
185
+ }
186
+ function isSensitiveEnvironmentVariable(envName) {
187
+ return SENSITIVE_ENV_NAME_PATTERN.test(envName);
188
+ }
189
+ function isProtectedStatePath(value) {
190
+ return value === '.sdd/state' || value.startsWith('.sdd/state/');
191
+ }
192
+ function isSecretPath(value) {
193
+ const lowerValue = value.toLowerCase();
194
+ return lowerValue.split(/[\\/]+/).some((segment) => SECRET_PATH_SEGMENTS.some((token) => segment.includes(token)));
195
+ }
196
+ function deny(code, message, issuePath) {
197
+ return {
198
+ code,
199
+ severity: 'deny',
200
+ message,
201
+ path: issuePath,
202
+ };
203
+ }
204
+ function warn(code, message, issuePath) {
205
+ return {
206
+ code,
207
+ severity: 'warn',
208
+ message,
209
+ path: issuePath,
210
+ };
211
+ }
212
+ //# sourceMappingURL=plugin-policy.js.map