prizmkit 1.1.100 → 1.1.102

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 (317) hide show
  1. package/bin/create-prizmkit.js +4 -4
  2. package/bundled/VERSION.json +3 -3
  3. package/bundled/dev-pipeline/.env.example +3 -3
  4. package/bundled/dev-pipeline/README.md +110 -90
  5. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +1 -1
  6. package/bundled/dev-pipeline/cli.py +27 -0
  7. package/bundled/dev-pipeline/prizmkit_runtime/__init__.py +13 -0
  8. package/bundled/dev-pipeline/prizmkit_runtime/__main__.py +9 -0
  9. package/bundled/dev-pipeline/prizmkit_runtime/cli.py +193 -0
  10. package/bundled/dev-pipeline/prizmkit_runtime/commands.py +313 -0
  11. package/bundled/dev-pipeline/prizmkit_runtime/compat.py +32 -0
  12. package/bundled/dev-pipeline/prizmkit_runtime/config.py +410 -0
  13. package/bundled/dev-pipeline/prizmkit_runtime/daemon.py +478 -0
  14. package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +734 -0
  15. package/bundled/dev-pipeline/prizmkit_runtime/heartbeat.py +256 -0
  16. package/bundled/dev-pipeline/prizmkit_runtime/interoperability.py +109 -0
  17. package/bundled/dev-pipeline/prizmkit_runtime/paths.py +110 -0
  18. package/bundled/dev-pipeline/prizmkit_runtime/processes.py +373 -0
  19. package/bundled/dev-pipeline/prizmkit_runtime/reset.py +389 -0
  20. package/bundled/dev-pipeline/prizmkit_runtime/runner_bookkeeping.py +51 -0
  21. package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +179 -0
  22. package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +355 -0
  23. package/bundled/dev-pipeline/prizmkit_runtime/runner_prompts.py +118 -0
  24. package/bundled/dev-pipeline/prizmkit_runtime/runner_recovery.py +187 -0
  25. package/bundled/dev-pipeline/prizmkit_runtime/runner_status.py +153 -0
  26. package/bundled/dev-pipeline/prizmkit_runtime/runners.py +425 -0
  27. package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +560 -0
  28. package/bundled/dev-pipeline/prizmkit_runtime/status.py +71 -0
  29. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +51 -36
  30. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +20 -5
  31. package/bundled/dev-pipeline/scripts/generate-recovery-prompt.py +2 -2
  32. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +39 -0
  33. package/bundled/dev-pipeline/templates/agent-prompts/dev-implement.md +8 -2
  34. package/bundled/dev-pipeline/templates/agent-prompts/reviewer-review.md +1 -1
  35. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +6 -2
  36. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +14 -6
  37. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +14 -4
  38. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +14 -4
  39. package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +2 -0
  40. package/bundled/dev-pipeline/templates/sections/log-size-awareness.md +9 -30
  41. package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-agent-suffix.md +15 -7
  42. package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +42 -29
  43. package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +41 -39
  44. package/bundled/dev-pipeline/templates/sections/phase-implement-lite.md +8 -17
  45. package/bundled/dev-pipeline/templates/sections/phase-prizmkit-test.md +2 -2
  46. package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +1 -3
  47. package/bundled/dev-pipeline/templates/sections/phase-review-full.md +1 -3
  48. package/bundled/dev-pipeline/templates/sections/phase0-test-baseline.md +3 -8
  49. package/bundled/dev-pipeline/templates/sections/test-failure-recovery-agent.md +6 -2
  50. package/bundled/dev-pipeline/templates/sections/test-failure-recovery-lite.md +5 -1
  51. package/bundled/dev-pipeline/tests/test_auto_skip.py +436 -14
  52. package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +115 -7
  53. package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +40 -0
  54. package/bundled/dev-pipeline/tests/test_python_runner_parity.py +1226 -0
  55. package/bundled/dev-pipeline/tests/test_unified_cli.py +1045 -0
  56. package/bundled/skills/_metadata.json +1 -1
  57. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +29 -34
  58. package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +6 -5
  59. package/bundled/skills/feature-pipeline-launcher/SKILL.md +29 -35
  60. package/bundled/skills/feature-pipeline-launcher/references/configuration.md +7 -6
  61. package/bundled/skills/feature-workflow/SKILL.md +3 -6
  62. package/bundled/skills/recovery-workflow/SKILL.md +23 -32
  63. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +29 -35
  64. package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +7 -6
  65. package/bundled/skills/refactor-workflow/SKILL.md +3 -6
  66. package/bundled/templates/hooks/commit-intent.json +2 -2
  67. package/bundled/templates/hooks/diff-prizm-docs.py +226 -0
  68. package/bundled/templates/hooks/prizm-pre-commit.py +45 -0
  69. package/bundled/templates/hooks/validate-prizm-docs.py +240 -0
  70. package/package.json +1 -1
  71. package/src/config.js +42 -19
  72. package/src/external-skills.js +14 -14
  73. package/src/index.js +3 -6
  74. package/src/manifest.js +11 -5
  75. package/src/metadata.js +7 -18
  76. package/src/platforms.js +25 -0
  77. package/src/prompts.js +0 -12
  78. package/src/runtimes.js +18 -11
  79. package/src/scaffold.js +144 -122
  80. package/src/upgrade.js +12 -3
  81. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +0 -500
  82. package/bundled/dev-pipeline/launch-feature-daemon.sh +0 -657
  83. package/bundled/dev-pipeline/launch-refactor-daemon.sh +0 -502
  84. package/bundled/dev-pipeline/lib/branch.sh +0 -326
  85. package/bundled/dev-pipeline/lib/common.sh +0 -1476
  86. package/bundled/dev-pipeline/lib/heartbeat.sh +0 -469
  87. package/bundled/dev-pipeline/reset-bug.sh +0 -425
  88. package/bundled/dev-pipeline/reset-feature.sh +0 -436
  89. package/bundled/dev-pipeline/reset-refactor.sh +0 -423
  90. package/bundled/dev-pipeline/run-bugfix.sh +0 -1430
  91. package/bundled/dev-pipeline/run-feature.sh +0 -1718
  92. package/bundled/dev-pipeline/run-recovery.sh +0 -648
  93. package/bundled/dev-pipeline/run-refactor.sh +0 -1463
  94. package/bundled/dev-pipeline/tests/test-path-resolution.sh +0 -100
  95. package/bundled/dev-pipeline-windows/.env.example +0 -36
  96. package/bundled/dev-pipeline-windows/README.md +0 -30
  97. package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +0 -533
  98. package/bundled/dev-pipeline-windows/assets/feature-list-example.json +0 -146
  99. package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +0 -137
  100. package/bundled/dev-pipeline-windows/launch-bugfix-daemon.ps1 +0 -9
  101. package/bundled/dev-pipeline-windows/launch-feature-daemon.ps1 +0 -9
  102. package/bundled/dev-pipeline-windows/launch-refactor-daemon.ps1 +0 -9
  103. package/bundled/dev-pipeline-windows/lib/branch.ps1 +0 -235
  104. package/bundled/dev-pipeline-windows/lib/common.ps1 +0 -991
  105. package/bundled/dev-pipeline-windows/lib/daemon.ps1 +0 -140
  106. package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +0 -1051
  107. package/bundled/dev-pipeline-windows/lib/reset.ps1 +0 -121
  108. package/bundled/dev-pipeline-windows/reset-bug.ps1 +0 -10
  109. package/bundled/dev-pipeline-windows/reset-feature.ps1 +0 -10
  110. package/bundled/dev-pipeline-windows/reset-refactor.ps1 +0 -10
  111. package/bundled/dev-pipeline-windows/run-bugfix.ps1 +0 -9
  112. package/bundled/dev-pipeline-windows/run-feature.ps1 +0 -9
  113. package/bundled/dev-pipeline-windows/run-recovery.ps1 +0 -179
  114. package/bundled/dev-pipeline-windows/run-refactor.ps1 +0 -9
  115. package/bundled/dev-pipeline-windows/scripts/check-session-status.py +0 -301
  116. package/bundled/dev-pipeline-windows/scripts/continuation.py +0 -374
  117. package/bundled/dev-pipeline-windows/scripts/detect-stuck.py +0 -530
  118. package/bundled/dev-pipeline-windows/scripts/generate-bootstrap-prompt.py +0 -2279
  119. package/bundled/dev-pipeline-windows/scripts/generate-bugfix-prompt.py +0 -763
  120. package/bundled/dev-pipeline-windows/scripts/generate-recovery-prompt.py +0 -805
  121. package/bundled/dev-pipeline-windows/scripts/generate-refactor-prompt.py +0 -841
  122. package/bundled/dev-pipeline-windows/scripts/init-bugfix-pipeline.py +0 -316
  123. package/bundled/dev-pipeline-windows/scripts/init-dev-team.py +0 -134
  124. package/bundled/dev-pipeline-windows/scripts/init-pipeline.py +0 -382
  125. package/bundled/dev-pipeline-windows/scripts/init-refactor-pipeline.py +0 -399
  126. package/bundled/dev-pipeline-windows/scripts/parse-stream-progress.py +0 -1362
  127. package/bundled/dev-pipeline-windows/scripts/patch-completion-notes.py +0 -191
  128. package/bundled/dev-pipeline-windows/scripts/prizmkit-test-gate.py +0 -446
  129. package/bundled/dev-pipeline-windows/scripts/update-bug-status.py +0 -1121
  130. package/bundled/dev-pipeline-windows/scripts/update-checkpoint.py +0 -173
  131. package/bundled/dev-pipeline-windows/scripts/update-feature-status.py +0 -1789
  132. package/bundled/dev-pipeline-windows/scripts/update-refactor-status.py +0 -1327
  133. package/bundled/dev-pipeline-windows/scripts/utils.py +0 -542
  134. package/bundled/dev-pipeline-windows/templates/agent-prompts/critic-plan-challenge.md +0 -7
  135. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-fix.md +0 -7
  136. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-implement.md +0 -65
  137. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-resume.md +0 -5
  138. package/bundled/dev-pipeline-windows/templates/agent-prompts/reviewer-review.md +0 -7
  139. package/bundled/dev-pipeline-windows/templates/bootstrap-prompt.md +0 -73
  140. package/bundled/dev-pipeline-windows/templates/bootstrap-tier1.md +0 -589
  141. package/bundled/dev-pipeline-windows/templates/bootstrap-tier2.md +0 -710
  142. package/bundled/dev-pipeline-windows/templates/bootstrap-tier3.md +0 -791
  143. package/bundled/dev-pipeline-windows/templates/bug-fix-list-schema.json +0 -263
  144. package/bundled/dev-pipeline-windows/templates/bugfix-bootstrap-prompt.md +0 -326
  145. package/bundled/dev-pipeline-windows/templates/feature-list-schema.json +0 -237
  146. package/bundled/dev-pipeline-windows/templates/refactor-bootstrap-prompt.md +0 -340
  147. package/bundled/dev-pipeline-windows/templates/refactor-list-schema.json +0 -270
  148. package/bundled/dev-pipeline-windows/templates/sections/ac-verification-checklist.md +0 -7
  149. package/bundled/dev-pipeline-windows/templates/sections/checkpoint-system.md +0 -91
  150. package/bundled/dev-pipeline-windows/templates/sections/context-budget-rules.md +0 -34
  151. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-agent.md +0 -10
  152. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-full.md +0 -12
  153. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-lite.md +0 -7
  154. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-agent.md +0 -8
  155. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-full.md +0 -9
  156. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-lite.md +0 -6
  157. package/bundled/dev-pipeline-windows/templates/sections/failure-capture.md +0 -21
  158. package/bundled/dev-pipeline-windows/templates/sections/feature-context.md +0 -21
  159. package/bundled/dev-pipeline-windows/templates/sections/log-size-awareness.md +0 -41
  160. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-auto.md +0 -283
  161. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-opencli.md +0 -112
  162. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification.md +0 -168
  163. package/bundled/dev-pipeline-windows/templates/sections/phase-commit-full.md +0 -82
  164. package/bundled/dev-pipeline-windows/templates/sections/phase-commit.md +0 -75
  165. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-agent-suffix.md +0 -23
  166. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-base.md +0 -14
  167. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-lite-suffix.md +0 -19
  168. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan-full.md +0 -63
  169. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan.md +0 -42
  170. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-agent.md +0 -44
  171. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-full.md +0 -59
  172. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-lite.md +0 -39
  173. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-agent.md +0 -27
  174. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-lite.md +0 -27
  175. package/bundled/dev-pipeline-windows/templates/sections/phase-prizmkit-test.md +0 -39
  176. package/bundled/dev-pipeline-windows/templates/sections/phase-review-agent.md +0 -35
  177. package/bundled/dev-pipeline-windows/templates/sections/phase-review-full.md +0 -35
  178. package/bundled/dev-pipeline-windows/templates/sections/phase-specify-plan-full.md +0 -73
  179. package/bundled/dev-pipeline-windows/templates/sections/phase0-init.md +0 -13
  180. package/bundled/dev-pipeline-windows/templates/sections/phase0-test-baseline.md +0 -21
  181. package/bundled/dev-pipeline-windows/templates/sections/session-context.md +0 -5
  182. package/bundled/dev-pipeline-windows/templates/sections/subagent-timeout-recovery.md +0 -6
  183. package/bundled/dev-pipeline-windows/templates/sections/task-contract.md +0 -34
  184. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-agent.md +0 -48
  185. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-lite.md +0 -48
  186. package/bundled/dev-pipeline-windows/templates/session-status-schema.json +0 -83
  187. package/bundled/skills-windows/app-planner/SKILL.md +0 -296
  188. package/bundled/skills-windows/app-planner/assets/app-design-guide.md +0 -101
  189. package/bundled/skills-windows/app-planner/references/architecture-decisions.md +0 -52
  190. package/bundled/skills-windows/app-planner/references/brainstorm-guide.md +0 -101
  191. package/bundled/skills-windows/app-planner/references/frontend-design-guide.md +0 -71
  192. package/bundled/skills-windows/app-planner/references/infrastructure-convention-discovery.md +0 -108
  193. package/bundled/skills-windows/app-planner/references/project-brief-guide.md +0 -82
  194. package/bundled/skills-windows/app-planner/references/project-conventions-discovery.md +0 -59
  195. package/bundled/skills-windows/app-planner/references/project-state-detection.md +0 -90
  196. package/bundled/skills-windows/app-planner/references/red-team-checklist.md +0 -40
  197. package/bundled/skills-windows/app-planner/references/rules/backend/derivation-rules.md +0 -619
  198. package/bundled/skills-windows/app-planner/references/rules/backend/fixed-rules.md +0 -285
  199. package/bundled/skills-windows/app-planner/references/rules/backend/question-bank.md +0 -249
  200. package/bundled/skills-windows/app-planner/references/rules/backend/question-manifest.json +0 -46
  201. package/bundled/skills-windows/app-planner/references/rules/backend/template.md +0 -173
  202. package/bundled/skills-windows/app-planner/references/rules/database/derivation-rules.md +0 -382
  203. package/bundled/skills-windows/app-planner/references/rules/database/fixed-rules.md +0 -211
  204. package/bundled/skills-windows/app-planner/references/rules/database/question-bank.md +0 -184
  205. package/bundled/skills-windows/app-planner/references/rules/database/question-manifest.json +0 -39
  206. package/bundled/skills-windows/app-planner/references/rules/database/template.md +0 -158
  207. package/bundled/skills-windows/app-planner/references/rules/frontend/derivation-rules.md +0 -820
  208. package/bundled/skills-windows/app-planner/references/rules/frontend/fixed-rules.md +0 -188
  209. package/bundled/skills-windows/app-planner/references/rules/frontend/question-bank.md +0 -319
  210. package/bundled/skills-windows/app-planner/references/rules/frontend/question-manifest.json +0 -51
  211. package/bundled/skills-windows/app-planner/references/rules/frontend/template.md +0 -339
  212. package/bundled/skills-windows/app-planner/references/rules/mobile/derivation-rules.md +0 -649
  213. package/bundled/skills-windows/app-planner/references/rules/mobile/fixed-rules.md +0 -290
  214. package/bundled/skills-windows/app-planner/references/rules/mobile/question-bank.md +0 -232
  215. package/bundled/skills-windows/app-planner/references/rules/mobile/question-manifest.json +0 -47
  216. package/bundled/skills-windows/app-planner/references/rules/mobile/template.md +0 -175
  217. package/bundled/skills-windows/app-planner/references/rules-configuration.md +0 -46
  218. package/bundled/skills-windows/bug-fix-workflow/SKILL.md +0 -379
  219. package/bundled/skills-windows/bug-fix-workflow/references/bug-diagnosis.md +0 -41
  220. package/bundled/skills-windows/bug-planner/SKILL.md +0 -402
  221. package/bundled/skills-windows/bug-planner/assets/bug-confirmation-template.md +0 -43
  222. package/bundled/skills-windows/bug-planner/references/critic-and-verification.md +0 -44
  223. package/bundled/skills-windows/bug-planner/references/error-recovery.md +0 -73
  224. package/bundled/skills-windows/bug-planner/references/input-formats.md +0 -53
  225. package/bundled/skills-windows/bug-planner/references/schema-validation.md +0 -25
  226. package/bundled/skills-windows/bug-planner/references/severity-rules.md +0 -16
  227. package/bundled/skills-windows/bug-planner/scripts/validate-bug-list.py +0 -322
  228. package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +0 -304
  229. package/bundled/skills-windows/bugfix-pipeline-launcher/references/configuration.md +0 -84
  230. package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +0 -381
  231. package/bundled/skills-windows/feature-pipeline-launcher/references/configuration.md +0 -67
  232. package/bundled/skills-windows/feature-pipeline-launcher/scripts/preflight-check.py +0 -462
  233. package/bundled/skills-windows/feature-planner/SKILL.md +0 -397
  234. package/bundled/skills-windows/feature-planner/assets/evaluation-guide.md +0 -64
  235. package/bundled/skills-windows/feature-planner/assets/planning-guide.md +0 -214
  236. package/bundled/skills-windows/feature-planner/references/browser-interaction.md +0 -59
  237. package/bundled/skills-windows/feature-planner/references/completeness-review.md +0 -57
  238. package/bundled/skills-windows/feature-planner/references/decomposition-patterns.md +0 -75
  239. package/bundled/skills-windows/feature-planner/references/error-recovery.md +0 -90
  240. package/bundled/skills-windows/feature-planner/references/incremental-feature-planning.md +0 -112
  241. package/bundled/skills-windows/feature-planner/references/new-project-planning.md +0 -85
  242. package/bundled/skills-windows/feature-planner/scripts/validate-and-generate.py +0 -1020
  243. package/bundled/skills-windows/feature-workflow/SKILL.md +0 -374
  244. package/bundled/skills-windows/feature-workflow/references/brainstorm-guide.md +0 -137
  245. package/bundled/skills-windows/prizm-kit/SKILL.md +0 -93
  246. package/bundled/skills-windows/prizmkit-code-review/SKILL.md +0 -161
  247. package/bundled/skills-windows/prizmkit-code-review/references/dev-agent-prompt.md +0 -30
  248. package/bundled/skills-windows/prizmkit-code-review/references/review-report-template.md +0 -31
  249. package/bundled/skills-windows/prizmkit-code-review/references/reviewer-agent-prompt.md +0 -66
  250. package/bundled/skills-windows/prizmkit-code-review/scripts/check_loop.py +0 -186
  251. package/bundled/skills-windows/prizmkit-committer/SKILL.md +0 -89
  252. package/bundled/skills-windows/prizmkit-deploy/SKILL.md +0 -444
  253. package/bundled/skills-windows/prizmkit-deploy/references/ci-cd-workflows.md +0 -115
  254. package/bundled/skills-windows/prizmkit-deploy/references/cloud-platform-deploy.md +0 -93
  255. package/bundled/skills-windows/prizmkit-deploy/references/data-safety-examples.md +0 -120
  256. package/bundled/skills-windows/prizmkit-deploy/references/database-setup.md +0 -46
  257. package/bundled/skills-windows/prizmkit-deploy/references/deploy-config-schema.md +0 -148
  258. package/bundled/skills-windows/prizmkit-deploy/references/deploy-history-schema.md +0 -62
  259. package/bundled/skills-windows/prizmkit-deploy/references/deployment-modes.md +0 -50
  260. package/bundled/skills-windows/prizmkit-deploy/references/direct-upload.md +0 -26
  261. package/bundled/skills-windows/prizmkit-deploy/references/dns-setup.md +0 -42
  262. package/bundled/skills-windows/prizmkit-deploy/references/docker-deploy.md +0 -31
  263. package/bundled/skills-windows/prizmkit-deploy/references/firewall-setup.md +0 -37
  264. package/bundled/skills-windows/prizmkit-deploy/references/live-validation-notes.md +0 -21
  265. package/bundled/skills-windows/prizmkit-deploy/references/nginx-blue-green.md +0 -59
  266. package/bundled/skills-windows/prizmkit-deploy/references/ssh-bootstrap-flow.md +0 -49
  267. package/bundled/skills-windows/prizmkit-deploy/references/ssh-execution-flow.md +0 -41
  268. package/bundled/skills-windows/prizmkit-deploy/references/ssh-takeover.md +0 -20
  269. package/bundled/skills-windows/prizmkit-deploy/references/ssl-setup.md +0 -56
  270. package/bundled/skills-windows/prizmkit-implement/SKILL.md +0 -71
  271. package/bundled/skills-windows/prizmkit-init/SKILL.md +0 -356
  272. package/bundled/skills-windows/prizmkit-init/assets/project-brief-template.md +0 -82
  273. package/bundled/skills-windows/prizmkit-init/references/config-schema.md +0 -70
  274. package/bundled/skills-windows/prizmkit-init/references/rules/layer-detection.md +0 -41
  275. package/bundled/skills-windows/prizmkit-init/references/tech-stack-catalog.md +0 -13
  276. package/bundled/skills-windows/prizmkit-init/references/update-supplement.md +0 -9
  277. package/bundled/skills-windows/prizmkit-plan/SKILL.md +0 -102
  278. package/bundled/skills-windows/prizmkit-plan/assets/plan-template.md +0 -115
  279. package/bundled/skills-windows/prizmkit-plan/assets/spec-template.md +0 -73
  280. package/bundled/skills-windows/prizmkit-plan/references/clarify-guide.md +0 -67
  281. package/bundled/skills-windows/prizmkit-plan/references/examples.md +0 -85
  282. package/bundled/skills-windows/prizmkit-plan/references/verification-checklist.md +0 -60
  283. package/bundled/skills-windows/prizmkit-prizm-docs/SKILL.md +0 -129
  284. package/bundled/skills-windows/prizmkit-prizm-docs/assets/prizm-docs-format.md +0 -613
  285. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-init.md +0 -45
  286. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-rebuild.md +0 -15
  287. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-status.md +0 -14
  288. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-update.md +0 -19
  289. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-validate.md +0 -17
  290. package/bundled/skills-windows/prizmkit-retrospective/SKILL.md +0 -87
  291. package/bundled/skills-windows/prizmkit-retrospective/references/knowledge-injection-steps.md +0 -50
  292. package/bundled/skills-windows/prizmkit-retrospective/references/structural-sync-steps.md +0 -43
  293. package/bundled/skills-windows/prizmkit-test/SKILL.md +0 -227
  294. package/bundled/skills-windows/prizmkit-test/references/boundary-coverage-protocol.md +0 -220
  295. package/bundled/skills-windows/prizmkit-test/references/examples.md +0 -143
  296. package/bundled/skills-windows/prizmkit-test/references/service-boundary-test-catalog.md +0 -225
  297. package/bundled/skills-windows/prizmkit-test/references/test-generation-steps.md +0 -109
  298. package/bundled/skills-windows/prizmkit-test/references/test-report-template.md +0 -111
  299. package/bundled/skills-windows/prizmkit-test/scripts/validate_boundary_report.py +0 -347
  300. package/bundled/skills-windows/recovery-workflow/SKILL.md +0 -355
  301. package/bundled/skills-windows/recovery-workflow/evals/evals.json +0 -46
  302. package/bundled/skills-windows/recovery-workflow/references/detection.md +0 -58
  303. package/bundled/skills-windows/recovery-workflow/scripts/detect-recovery-state.py +0 -544
  304. package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +0 -346
  305. package/bundled/skills-windows/refactor-pipeline-launcher/references/configuration.md +0 -72
  306. package/bundled/skills-windows/refactor-planner/SKILL.md +0 -398
  307. package/bundled/skills-windows/refactor-planner/assets/planning-guide.md +0 -292
  308. package/bundled/skills-windows/refactor-planner/references/behavior-preservation.md +0 -301
  309. package/bundled/skills-windows/refactor-planner/references/fast-path.md +0 -59
  310. package/bundled/skills-windows/refactor-planner/references/planning-phases.md +0 -135
  311. package/bundled/skills-windows/refactor-planner/references/refactor-scoping-guide.md +0 -221
  312. package/bundled/skills-windows/refactor-planner/scripts/validate-and-generate-refactor.py +0 -858
  313. package/bundled/skills-windows/refactor-workflow/SKILL.md +0 -343
  314. package/bundled/skills-windows/refactor-workflow/references/brainstorm-guide.md +0 -116
  315. package/bundled/templates/hooks/diff-prizm-docs.sh +0 -158
  316. package/bundled/templates/hooks/prizm-pre-commit.sh +0 -108
  317. package/bundled/templates/hooks/validate-prizm-docs.sh +0 -139
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env python3
2
+ """Validate .prizmkit/prizm-docs files for PrizmKit projects."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import re
7
+ import subprocess
8
+ import sys
9
+ from pathlib import Path, PurePosixPath
10
+
11
+ DOCS_ROOT = Path(".prizmkit/prizm-docs")
12
+ ROOT_PRIZM = DOCS_ROOT / "root.prizm"
13
+ VALID_MODES = {"--all", "--staged"}
14
+
15
+ AUXILIARY_METADATA_RE = re.compile(
16
+ r"^[ \t]*[-*]?[ \t]*(CHANGELOG|CREATED([ _-]?(AT|ON|DATE))?|"
17
+ r"UPDATED([ _-]?(AT|ON|DATE))?|MODIFIED([ _-]?(AT|ON|DATE))?|"
18
+ r"LAST[ _-]?(UPDATED|MODIFIED)([ _-]?(AT|ON|DATE))?|DATE|TIMESTAMP):",
19
+ re.IGNORECASE | re.MULTILINE,
20
+ )
21
+ WORKFLOW_ID_RE = re.compile(
22
+ r"(^|[^A-Za-z0-9_])([FBR]-[0-9]{3}|T-[0-9]{3})(-[A-Z])?([^A-Za-z0-9_]|$)",
23
+ re.IGNORECASE,
24
+ )
25
+ WORKFLOW_FIELD_RE = re.compile(
26
+ r"^[ \t]*[-*]?[ \t]*((bug|feature|refactor|task)[ _-]?id|"
27
+ r"(session|run|pipeline|workflow)([ _-]?id)?)([ \t]*(:|=)|[ \t]+)",
28
+ re.IGNORECASE | re.MULTILINE,
29
+ )
30
+ WORKFLOW_COMPOUND_FIELD_RE = re.compile(
31
+ r"^[ \t]*[-*]?[ \t]*(bug|feature|refactor|task|session|run|pipeline|workflow)"
32
+ r"([ _-](bug|feature|refactor|task|session|run|pipeline|workflow|id))+"
33
+ r"([ \t]*(:|=)|[ \t]+)",
34
+ re.IGNORECASE | re.MULTILINE,
35
+ )
36
+ ARTIFACT_PATH_RE = re.compile(
37
+ r"(^|[^A-Za-z0-9_.-])\.prizmkit/(specs|dev-pipeline)($|/|[^A-Za-z0-9_.-])"
38
+ )
39
+ ABSOLUTE_PATH_RE = re.compile(
40
+ r"(^|[^A-Za-z0-9_./:-])"
41
+ r"(/Users/|/home/|/tmp/|/private/tmp/|/var/folders/|/workspace/|/workspaces/|"
42
+ r"/opt/|/srv/|/root/|/var/tmp/|/Volumes/|/mnt/[A-Za-z]/|[A-Za-z]:/)"
43
+ )
44
+ BRANCH_EXACT_FIELD_RE = re.compile(
45
+ r"^[ \t]*[-*]?[ \t]*(BRANCH|BRANCH_NAME|CURRENT_BRANCH|SOURCE_BRANCH|BASE_BRANCH|"
46
+ r"HEAD_BRANCH|GIT_BRANCH|TARGET_BRANCH)[ \t_-]*(:|=|[ \t])",
47
+ re.MULTILINE,
48
+ )
49
+ BRANCH_UPPER_FIELD_RE = re.compile(
50
+ r"^[ \t]*[-*]?[ \t]*[A-Z][A-Z0-9_]*_BRANCH[ \t_-]*(:|=|[ \t])"
51
+ r"[ \t]*(main|master|develop|development|trunk|[A-Za-z0-9._-]+/[A-Za-z0-9._/-]+|"
52
+ r"(feature|fix|bugfix|hotfix|release|chore|refactor|task|dev)[/_-][A-Za-z0-9._/-]+)"
53
+ r"[ \t]*(#.*)?$",
54
+ re.MULTILINE,
55
+ )
56
+ BRANCH_NAME_FIELD_RE = re.compile(
57
+ r"^[ \t]*[-*]?[ \t]*(branch[ _-]*name|current[ _-]*branch|source[ _-]*branch|"
58
+ r"base[ _-]*branch|head[ _-]*branch|git[ _-]*branch|target[ _-]*branch)"
59
+ r"[ \t_-]*(:|=|[ \t])",
60
+ re.IGNORECASE | re.MULTILINE,
61
+ )
62
+ BRANCH_TITLE_FIELD_RE = re.compile(
63
+ r"^[ \t]*[-*]?[ \t]*([A-Za-z0-9]+[ _-]+)+branch([ \t]*(:|=)|[ \t]+)"
64
+ r"[ \t]*(main|master|develop|development|trunk|[A-Za-z0-9._-]+/[A-Za-z0-9._/-]+|"
65
+ r"(feature|fix|bugfix|hotfix|release|chore|refactor|task|dev)[/_-][A-Za-z0-9._/-]+)"
66
+ r"[ \t]*(#.*)?$",
67
+ re.IGNORECASE | re.MULTILINE,
68
+ )
69
+ BRANCH_SIMPLE_FIELD_RE = re.compile(
70
+ r"^[ \t]*[-*]?[ \t]*branch[ \t_-]*(:|=|[ \t])"
71
+ r"[ \t]*(main|master|develop|development|trunk|[A-Za-z0-9._-]+/[A-Za-z0-9._/-]+|"
72
+ r"(feature|fix|bugfix|hotfix|release|chore|refactor|task|dev)[/_-][A-Za-z0-9._/-]+)"
73
+ r"[ \t]*(#.*)?$",
74
+ re.IGNORECASE | re.MULTILINE,
75
+ )
76
+
77
+
78
+ def emit_error(file_path: str, message: str) -> None:
79
+ print(f"ERROR: {file_path} {message}", file=sys.stderr)
80
+
81
+
82
+ def run_git(args: list[str], *, capture: bool = True) -> subprocess.CompletedProcess[str]:
83
+ return subprocess.run(
84
+ ["git", *args],
85
+ text=True,
86
+ encoding="utf-8",
87
+ errors="replace",
88
+ stdout=subprocess.PIPE if capture else subprocess.DEVNULL,
89
+ stderr=subprocess.DEVNULL,
90
+ check=False,
91
+ )
92
+
93
+
94
+ def collect_files(mode: str) -> list[str]:
95
+ if mode == "--all":
96
+ return sorted(path.as_posix() for path in DOCS_ROOT.rglob("*.prizm") if path.is_file())
97
+
98
+ result = run_git(["diff", "--cached", "--name-only"])
99
+ if result.returncode != 0:
100
+ return []
101
+ return [line.strip() for line in result.stdout.splitlines() if line.strip().endswith(".prizm")]
102
+
103
+
104
+ def read_check_content(file_path: str, mode: str) -> tuple[bytes, str] | None:
105
+ if mode == "--staged":
106
+ exists = run_git(["cat-file", "-e", f":{file_path}"], capture=False)
107
+ if exists.returncode != 0:
108
+ return None
109
+ blob = subprocess.run(
110
+ ["git", "show", f":{file_path}"],
111
+ stdout=subprocess.PIPE,
112
+ stderr=subprocess.DEVNULL,
113
+ check=False,
114
+ )
115
+ if blob.returncode != 0:
116
+ return None
117
+ raw = blob.stdout
118
+ else:
119
+ path = Path(file_path)
120
+ if not path.is_file():
121
+ return None
122
+ raw = path.read_bytes()
123
+
124
+ return raw, raw.decode("utf-8", errors="replace")
125
+
126
+
127
+ def is_l1_doc(file_path: str) -> bool:
128
+ parent = PurePosixPath(file_path).parent.as_posix()
129
+ return parent == DOCS_ROOT.as_posix()
130
+
131
+
132
+ def size_limit(file_path: str) -> tuple[int, str, str]:
133
+ if file_path.endswith("root.prizm"):
134
+ return 4096, "L0", "Consolidate MODULE_INDEX, keep top-5 RULES."
135
+ if is_l1_doc(file_path):
136
+ return 3072, "L1", "Move implementation details to L2."
137
+ return 5120, "L2", "Remove stale or trivially derivable entries."
138
+
139
+
140
+ def contains_root_field(text: str, field: str) -> bool:
141
+ return re.search(rf"^{re.escape(field)}:", text, re.MULTILINE) is not None
142
+
143
+
144
+ def validate_file(file_path: str, raw: bytes, text: str) -> int:
145
+ errors = 0
146
+
147
+ if re.search(r"^#{1,6} ", text, re.MULTILINE):
148
+ emit_error(file_path, "contains markdown headers (##). Use KEY: value format.")
149
+ errors += 1
150
+
151
+ if re.search(r"^```", text, re.MULTILINE):
152
+ emit_error(file_path, "contains code blocks. Use file_path:line_number reference.")
153
+ errors += 1
154
+
155
+ base_name = PurePosixPath(file_path).name.lower()
156
+ if base_name in {"changelog.prizm", "changelog-archive.prizm"} or (
157
+ "changelog" in base_name and base_name.endswith(".prizm")
158
+ ):
159
+ emit_error(file_path, "is auxiliary history. Use git history instead of changelog .prizm files.")
160
+ errors += 1
161
+
162
+ if AUXILIARY_METADATA_RE.search(text):
163
+ emit_error(
164
+ file_path,
165
+ "contains auxiliary history metadata. Use durable KEY: value sections only; git tracks history.",
166
+ )
167
+ errors += 1
168
+
169
+ if WORKFLOW_ID_RE.search(text) or WORKFLOW_FIELD_RE.search(text) or WORKFLOW_COMPOUND_FIELD_RE.search(text):
170
+ emit_error(
171
+ file_path,
172
+ "contains workflow metadata. Translate IDs, branch names, worktree paths, and pipeline artifacts into durable product/domain language.",
173
+ )
174
+ errors += 1
175
+
176
+ normalized_text = text.replace("\\", "/")
177
+ if ARTIFACT_PATH_RE.search(normalized_text):
178
+ emit_error(
179
+ file_path,
180
+ "contains PrizmKit artifact paths. Translate specs/dev-pipeline references into durable product/domain language.",
181
+ )
182
+ errors += 1
183
+
184
+ if ABSOLUTE_PATH_RE.search(normalized_text):
185
+ emit_error(file_path, "contains absolute worktree paths. Use repository-relative source paths only.")
186
+ errors += 1
187
+
188
+ if (
189
+ BRANCH_EXACT_FIELD_RE.search(text)
190
+ or BRANCH_UPPER_FIELD_RE.search(text)
191
+ or BRANCH_NAME_FIELD_RE.search(text)
192
+ or BRANCH_TITLE_FIELD_RE.search(text)
193
+ or BRANCH_SIMPLE_FIELD_RE.search(text)
194
+ ):
195
+ emit_error(file_path, "contains branch names. Describe durable product/domain context instead.")
196
+ errors += 1
197
+
198
+ limit, level, hint = size_limit(file_path)
199
+ size = len(raw)
200
+ if size > limit:
201
+ emit_error(file_path, f"exceeds {level} limit ({size}B > {limit}B). {hint}")
202
+ errors += 1
203
+
204
+ if file_path.endswith("root.prizm"):
205
+ for field in ["PRIZM_VERSION", "PROJECT", "LANG", "RULES"]:
206
+ if not contains_root_field(text, field):
207
+ emit_error(file_path, f"missing required field {field}:")
208
+ errors += 1
209
+ if not contains_root_field(text, "MODULE_INDEX") and not contains_root_field(text, "MODULE_GROUPS"):
210
+ emit_error(file_path, "missing required field MODULE_INDEX: or MODULE_GROUPS:")
211
+ errors += 1
212
+
213
+ return errors
214
+
215
+
216
+ def main(argv: list[str]) -> int:
217
+ mode = argv[1] if len(argv) > 1 else "--staged"
218
+ if len(argv) > 2 or mode not in VALID_MODES:
219
+ print("Usage: validate-prizm-docs.py [--all | --staged]", file=sys.stderr)
220
+ return 1
221
+
222
+ if not ROOT_PRIZM.is_file():
223
+ return 0
224
+
225
+ errors = 0
226
+ for file_path in collect_files(mode):
227
+ content = read_check_content(file_path, mode)
228
+ if content is None:
229
+ continue
230
+ raw, text = content
231
+ errors += validate_file(file_path, raw, text)
232
+
233
+ if errors > 0:
234
+ print(f"PrizmKit: {errors} format error(s) in .prizm files. Fix before committing.", file=sys.stderr)
235
+ return 1
236
+ return 0
237
+
238
+
239
+ if __name__ == "__main__":
240
+ raise SystemExit(main(sys.argv))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prizmkit",
3
- "version": "1.1.100",
3
+ "version": "1.1.102",
4
4
  "description": "Create a new PrizmKit-powered project with clean initialization — no framework dev files, just what you need.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/config.js CHANGED
@@ -36,6 +36,8 @@ import {
36
36
  resolveSkillList,
37
37
  resolvePipelineFileList,
38
38
  resolveRuleNamesForRuntime,
39
+ findStaleManagedPipelineFiles,
40
+ removeStaleManagedPipelineFiles,
39
41
  } from './scaffold.js';
40
42
  import {
41
43
  removeSkillFiles,
@@ -47,13 +49,12 @@ import { detectPlatform } from './detect-platform.js';
47
49
  import {
48
50
  selectPlatform,
49
51
  selectAiCli,
50
- selectRuntime,
51
52
  selectSkillSuite,
52
53
  selectRulesPreset,
53
54
  confirmTeamMode,
54
55
  confirmPipeline,
55
56
  } from './prompts.js';
56
- import { expandPlatforms, isKnownPlatform, platformLabel, projectMemoryFile } from './platforms.js';
57
+ import { isKnownPlatform, platformLabel, projectMemoryFile, resolvePayloadPlatforms } from './platforms.js';
57
58
  import { normalizeRuntime, runtimeLabel } from './runtimes.js';
58
59
 
59
60
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -350,11 +351,17 @@ export async function runConfig(directory, options = {}) {
350
351
 
351
352
  // Existing manifests are the source of truth. Filesystem detection is only a
352
353
  // legacy fallback for manifests created before platform was recorded.
353
- const detectedPlatform = oldManifest.platform || await detectInstalledPlatforms(projectRoot) || 'claude';
354
+ const detectedPlatformRaw = oldManifest.platform || await detectInstalledPlatforms(projectRoot) || 'claude';
355
+ const detectedPlatform = detectedPlatformRaw === 'both' ? 'all' : detectedPlatformRaw;
356
+
357
+ const rawManifestRuntime = oldManifest.runtime;
358
+ const normalizedManifestRuntime = normalizeRuntime(rawManifestRuntime);
359
+ const runtimeManifestNeedsNormalization = rawManifestRuntime !== normalizedManifestRuntime;
360
+ const platformManifestNeedsNormalization = detectedPlatformRaw !== detectedPlatform;
354
361
 
355
362
  const currentConfig = {
356
363
  platform: detectedPlatform,
357
- runtime: normalizeRuntime(oldManifest.runtime || 'unix'),
364
+ runtime: normalizedManifestRuntime,
358
365
  suite: oldManifest.suite || 'core',
359
366
  rules: oldManifest.options?.rules || 'recommended',
360
367
  team: oldManifest.options?.team ?? true,
@@ -369,7 +376,7 @@ export async function runConfig(directory, options = {}) {
369
376
  // Display current config
370
377
  console.log(chalk.bold(' 当前配置:'));
371
378
  console.log(` 平台: ${chalk.cyan(platformLabel(currentConfig.platform))}`);
372
- console.log(` 运行系统: ${chalk.cyan(runtimeLabel(currentConfig.runtime))}`);
379
+ console.log(` 运行时: ${chalk.cyan(runtimeLabel(currentConfig.runtime))}`);
373
380
  console.log(` AI CLI: ${currentConfig.aiCli ? chalk.cyan(currentConfig.aiCli) : chalk.gray('(未设置)')}`);
374
381
  console.log(` 技能套件: ${chalk.cyan(currentConfig.suite)}`);
375
382
  console.log(` 规则: ${chalk.cyan(currentConfig.rules)}`);
@@ -381,10 +388,11 @@ export async function runConfig(directory, options = {}) {
381
388
 
382
389
  let newConfig;
383
390
  const optionRuntime = options.runtime !== undefined ? normalizeRuntime(options.runtime) : undefined;
391
+ const runtimeOptionNeedsNormalization = options.runtime !== undefined && options.runtime !== optionRuntime;
384
392
 
385
393
  if (nonInteractive) {
386
394
  // Non-interactive: only change what's explicitly specified via CLI options
387
- if (!options.platform && !options.skills && !options.rules && options.runtime === undefined
395
+ if (!platformManifestNeedsNormalization && !runtimeManifestNeedsNormalization && !runtimeOptionNeedsNormalization && !options.platform && !options.skills && !options.rules && options.runtime === undefined
388
396
  && options.aiCli === undefined && options.team === undefined && options.pipeline === undefined) {
389
397
  console.log(chalk.yellow(' ⚠ 非交互式模式下未指定任何变更。'));
390
398
  console.log(chalk.gray(' 使用 --platform, --runtime, --skills, --rules, --ai-cli, --team/--no-team, --pipeline/--no-pipeline'));
@@ -407,7 +415,7 @@ export async function runConfig(directory, options = {}) {
407
415
  try {
408
416
  console.log(chalk.bold(' 选择新配置(按 Enter 保持当前值):\n'));
409
417
 
410
- const newRuntime = optionRuntime || await selectRuntime(currentConfig.runtime);
418
+ const newRuntime = optionRuntime || currentConfig.runtime;
411
419
  const newPlatform = await selectPlatform(currentConfig.platform, detected);
412
420
  const newAiCli = await selectAiCli(currentConfig.aiCli, detected);
413
421
 
@@ -442,11 +450,15 @@ export async function runConfig(directory, options = {}) {
442
450
  // ── Phase 3: COMPUTE DIFF ────────────────────────────────────────────────
443
451
 
444
452
  const changes = [];
445
- if (newConfig.platform !== currentConfig.platform) {
453
+ if (platformManifestNeedsNormalization) {
454
+ changes.push(`平台: ${platformLabel(detectedPlatformRaw)} → ${platformLabel(newConfig.platform)}`);
455
+ } else if (newConfig.platform !== currentConfig.platform) {
446
456
  changes.push(`平台: ${platformLabel(currentConfig.platform)} → ${platformLabel(newConfig.platform)}`);
447
457
  }
448
- if (newConfig.runtime !== currentConfig.runtime) {
449
- changes.push(`运行系统: ${runtimeLabel(currentConfig.runtime)} → ${runtimeLabel(newConfig.runtime)}`);
458
+ if (runtimeManifestNeedsNormalization || runtimeOptionNeedsNormalization) {
459
+ changes.push(`运行时: ${runtimeLabel(rawManifestRuntime)} → ${runtimeLabel(newConfig.runtime)}`);
460
+ } else if (newConfig.runtime !== currentConfig.runtime) {
461
+ changes.push(`运行时: ${runtimeLabel(currentConfig.runtime)} → ${runtimeLabel(newConfig.runtime)}`);
450
462
  }
451
463
  if (newConfig.aiCli !== currentConfig.aiCli) {
452
464
  changes.push(`AI CLI: ${currentConfig.aiCli || '(未设置)'} → ${newConfig.aiCli || '(未设置)'}`);
@@ -478,9 +490,9 @@ export async function runConfig(directory, options = {}) {
478
490
  }
479
491
 
480
492
  // Warn about destructive changes
481
- if (newConfig.platform !== currentConfig.platform) {
482
- const oldPlatforms = expandPlatforms(currentConfig.platform);
483
- const newPlatforms = expandPlatforms(newConfig.platform);
493
+ if (newConfig.platform !== currentConfig.platform || newConfig.aiCli !== currentConfig.aiCli) {
494
+ const oldPlatforms = resolvePayloadPlatforms(currentConfig.platform, currentConfig.aiCli);
495
+ const newPlatforms = resolvePayloadPlatforms(newConfig.platform, newConfig.aiCli);
484
496
  const dropping = oldPlatforms.filter(p => !newPlatforms.includes(p));
485
497
  if (dropping.length) {
486
498
  console.log(chalk.yellow(`\n ⚠ 将移除 ${dropping.map(platformLabel).join(', ')} 的 PrizmKit 文件`));
@@ -509,8 +521,8 @@ export async function runConfig(directory, options = {}) {
509
521
 
510
522
  console.log(chalk.bold('\n 应用配置变更...\n'));
511
523
 
512
- const oldPlatforms = expandPlatforms(currentConfig.platform);
513
- const newPlatforms = expandPlatforms(newConfig.platform);
524
+ const oldPlatforms = resolvePayloadPlatforms(currentConfig.platform, currentConfig.aiCli);
525
+ const newPlatforms = resolvePayloadPlatforms(newConfig.platform, newConfig.aiCli);
514
526
  const platformsToRemove = oldPlatforms.filter(p => !newPlatforms.includes(p));
515
527
  const platformsToAdd = newPlatforms.filter(p => !oldPlatforms.includes(p));
516
528
  const platformsToUpdate = newPlatforms.filter(p => oldPlatforms.includes(p));
@@ -542,7 +554,7 @@ export async function runConfig(directory, options = {}) {
542
554
  version: pkg.version, platform: newConfig.platform, suite: newConfig.suite,
543
555
  skills: newSkillList, agents: newAgentFiles, rules: newRuleFiles,
544
556
  pipeline: newPipelineFiles, team: newConfig.team, aiCli: newConfig.aiCli,
545
- runtime: newConfig.runtime, rulesPreset: newConfig.rules, extras: oldManifest?.files?.extras || [],
557
+ runtime: newConfig.runtime, rulesPreset: newConfig.rules, extras: oldManifest?.files?.extras || [], payloadPlatforms: newPlatforms,
546
558
  });
547
559
  const diff = diffManifest(oldManifest, newTempManifest);
548
560
 
@@ -562,9 +574,13 @@ export async function runConfig(directory, options = {}) {
562
574
  // 5d. Install/update files for new + existing platforms
563
575
  const allTargetPlatforms = [...platformsToAdd, ...platformsToUpdate];
564
576
  const needsReinstall = newConfig.platform !== currentConfig.platform
577
+ || platformManifestNeedsNormalization
578
+ || runtimeManifestNeedsNormalization
579
+ || runtimeOptionNeedsNormalization
565
580
  || newConfig.runtime !== currentConfig.runtime
566
581
  || newConfig.suite !== currentConfig.suite
567
582
  || newConfig.rules !== currentConfig.rules
583
+ || newConfig.aiCli !== currentConfig.aiCli
568
584
  || newConfig.team !== currentConfig.team;
569
585
 
570
586
  for (const p of allTargetPlatforms) {
@@ -595,7 +611,7 @@ export async function runConfig(directory, options = {}) {
595
611
  }
596
612
 
597
613
  // 5e. Pipeline changes
598
- if (newConfig.pipeline !== currentConfig.pipeline || (newConfig.pipeline && newConfig.runtime !== currentConfig.runtime)) {
614
+ if (newConfig.pipeline !== currentConfig.pipeline || (newConfig.pipeline && (newConfig.runtime !== currentConfig.runtime || runtimeManifestNeedsNormalization || runtimeOptionNeedsNormalization))) {
599
615
  if (newConfig.pipeline) {
600
616
  console.log(chalk.blue('\n 安装 Pipeline:'));
601
617
  await installPipeline(projectRoot, false, {
@@ -609,6 +625,12 @@ export async function runConfig(directory, options = {}) {
609
625
  await removePipelineFiles(projectRoot, oldPipelineFiles, false);
610
626
  }
611
627
  }
628
+ } else if (newConfig.pipeline) {
629
+ const staleManagedPipelineFiles = await findStaleManagedPipelineFiles(projectRoot, newConfig.runtime);
630
+ if (staleManagedPipelineFiles.length) {
631
+ console.log(chalk.blue('\n 移除过期 Pipeline 框架文件:'));
632
+ await removeStaleManagedPipelineFiles(projectRoot, staleManagedPipelineFiles, false);
633
+ }
612
634
  }
613
635
 
614
636
  // 5f. Update .gitignore
@@ -616,7 +638,7 @@ export async function runConfig(directory, options = {}) {
616
638
  await installGitignore(projectRoot, { pipeline: newConfig.pipeline }, false);
617
639
 
618
640
  // 5g. Runtime-aware git hook and PrizmKit helper scripts
619
- if (newConfig.runtime !== currentConfig.runtime) {
641
+ if (newConfig.runtime !== currentConfig.runtime || runtimeManifestNeedsNormalization || runtimeOptionNeedsNormalization) {
620
642
  console.log(chalk.blue('\n Git Hook:'));
621
643
  await installGitHook(projectRoot, false, newConfig.runtime);
622
644
 
@@ -654,6 +676,7 @@ export async function runConfig(directory, options = {}) {
654
676
  team: newConfig.team,
655
677
  aiCli: newConfig.aiCli,
656
678
  rulesPreset: newConfig.rules,
679
+ payloadPlatforms: newPlatforms,
657
680
  extras: oldManifest?.files?.extras || [],
658
681
  });
659
682
 
@@ -675,7 +698,7 @@ export async function runConfig(directory, options = {}) {
675
698
 
676
699
  console.log(chalk.gray(' 新配置:'));
677
700
  console.log(chalk.gray(` 平台: ${platformLabel(newConfig.platform)}`));
678
- console.log(chalk.gray(` 运行系统: ${runtimeLabel(newConfig.runtime)}`));
701
+ console.log(chalk.gray(` 运行时: ${runtimeLabel(newConfig.runtime)}`));
679
702
  console.log(chalk.gray(` AI CLI: ${newConfig.aiCli || '(未设置)'}`));
680
703
  console.log(chalk.gray(` 技能套件: ${newConfig.suite}`));
681
704
  console.log(chalk.gray(` 规则: ${newConfig.rules}`));
@@ -14,7 +14,7 @@
14
14
  import { execSync } from 'node:child_process';
15
15
  import path from 'path';
16
16
  import fs from 'fs-extra';
17
- import { expandPlatforms } from './platforms.js';
17
+ import { resolvePayloadPlatforms } from './platforms.js';
18
18
 
19
19
  /**
20
20
  * @param {Object} skill - Skill definition from external_skills.known
@@ -23,9 +23,9 @@ import { expandPlatforms } from './platforms.js';
23
23
  * skill.installAll {boolean} - If true, install all skills from the repo
24
24
  * @param {string} platform - 'claude' | 'codebuddy' | 'codex' | 'all' ('both' supported only for legacy manifests)
25
25
  * @param {string} projectRoot - Target project root
26
- * @param {boolean} dryRun
26
+ * @param {string} [aiCli] - optional AI CLI command that may require an additional payload platform
27
27
  */
28
- export async function installExternalSkill(skill, platform, projectRoot, dryRun) {
28
+ export async function installExternalSkill(skill, platform, projectRoot, dryRun, aiCli = '') {
29
29
  if (!skill.repo) {
30
30
  throw new Error(`Skill "${skill.name}" has no repo URL defined`);
31
31
  }
@@ -40,7 +40,7 @@ export async function installExternalSkill(skill, platform, projectRoot, dryRun)
40
40
  if (skill.installAll) {
41
41
  console.log(` [dry-run] → all skills from ${skill.repo}`);
42
42
  } else {
43
- const targets = getTargetDirs(platform, projectRoot)
43
+ const targets = getTargetDirs(platform, projectRoot, aiCli)
44
44
  .map(d => path.relative(projectRoot, path.join(d, skill.name, 'SKILL.md')));
45
45
  for (const t of targets) console.log(` [dry-run] → ${t}`);
46
46
  }
@@ -61,7 +61,7 @@ export async function installExternalSkill(skill, platform, projectRoot, dryRun)
61
61
  .filter(d => d.isDirectory())
62
62
  .map(d => d.name);
63
63
 
64
- for (const targetDir of getTargetDirs(platform, projectRoot)) {
64
+ for (const targetDir of getTargetDirs(platform, projectRoot, aiCli)) {
65
65
  for (const skillName of skillDirs) {
66
66
  const srcDir = path.join(agentsSkillsDir, skillName);
67
67
  const destDir = path.join(targetDir, skillName);
@@ -81,7 +81,7 @@ export async function installExternalSkill(skill, platform, projectRoot, dryRun)
81
81
 
82
82
  const content = await fs.readFile(canonicalSkillMd, 'utf8');
83
83
 
84
- for (const targetDir of getTargetDirs(platform, projectRoot)) {
84
+ for (const targetDir of getTargetDirs(platform, projectRoot, aiCli)) {
85
85
  const skillDir = path.join(targetDir, skill.name);
86
86
  if (path.resolve(skillDir) === path.resolve(path.dirname(canonicalSkillMd))) {
87
87
  continue;
@@ -94,7 +94,7 @@ export async function installExternalSkill(skill, platform, projectRoot, dryRun)
94
94
 
95
95
  // Clean up npx skills artifacts after copying. Preserve .agents/skills when
96
96
  // Codex is selected because it is the official repository skill location.
97
- if (!expandPlatforms(platform).includes('codex')) {
97
+ if (!resolvePayloadPlatforms(platform, aiCli).includes('codex')) {
98
98
  await fs.remove(path.join(projectRoot, '.agents')).catch(() => {});
99
99
  }
100
100
  await fs.remove(path.join(projectRoot, 'skills-lock.json')).catch(() => {});
@@ -104,15 +104,15 @@ export async function installExternalSkill(skill, platform, projectRoot, dryRun)
104
104
  * Remove all artifacts created by `npx skills` that are not needed by PrizmKit.
105
105
  * Call this once after all external skills have been installed.
106
106
  *
107
- * @param {string} projectRoot
108
107
  * @param {string} platform - 'claude' | 'codebuddy' | 'codex' | 'all' ('both' supported only for legacy manifests)
108
+ * @param {string} [aiCli] - optional AI CLI command that may require an additional payload platform
109
109
  */
110
- export async function cleanExternalSkillArtifacts(projectRoot, platform) {
110
+ export async function cleanExternalSkillArtifacts(projectRoot, platform, aiCli = '') {
111
111
  const keepDirs = new Set(
112
- getTargetDirs(platform, projectRoot).map(d => path.resolve(d))
112
+ getTargetDirs(platform, projectRoot, aiCli).map(d => path.resolve(d))
113
113
  );
114
114
 
115
- const selectedPlatforms = expandPlatforms(platform);
115
+ const selectedPlatforms = resolvePayloadPlatforms(platform, aiCli);
116
116
  const dirsToCheck = [
117
117
  selectedPlatforms.includes('codex') ? null : '.agents',
118
118
  '.agent',
@@ -152,7 +152,7 @@ export async function cleanExternalSkillArtifacts(projectRoot, platform) {
152
152
  const abs = path.join(projectRoot, dir);
153
153
  if (!await fs.pathExists(abs)) continue;
154
154
  // Only remove if this platform dir is entirely unneeded
155
- const isKept = getTargetDirs(platform, projectRoot)
155
+ const isKept = getTargetDirs(platform, projectRoot, aiCli)
156
156
  .some(d => path.resolve(d).startsWith(path.resolve(abs) + path.sep));
157
157
  if (isKept) continue;
158
158
  try {
@@ -166,8 +166,8 @@ export async function cleanExternalSkillArtifacts(projectRoot, platform) {
166
166
  await fs.remove(path.join(projectRoot, 'skills-lock.json')).catch(() => {});
167
167
  }
168
168
 
169
- function getTargetDirs(platform, projectRoot) {
170
- return expandPlatforms(platform).map(p => {
169
+ function getTargetDirs(platform, projectRoot, aiCli = '') {
170
+ return resolvePayloadPlatforms(platform, aiCli).map(p => {
171
171
  if (p === 'codebuddy') return path.join(projectRoot, '.codebuddy', 'skills');
172
172
  if (p === 'codex') return path.join(projectRoot, '.agents', 'skills');
173
173
  return path.join(projectRoot, '.claude', 'skills');
package/src/index.js CHANGED
@@ -16,7 +16,6 @@ import { scaffold } from './scaffold.js';
16
16
  import { loadMetadata } from './metadata.js';
17
17
  import { platformLabel } from './platforms.js';
18
18
  import { normalizeRuntime, runtimeLabel } from './runtimes.js';
19
- import { selectRuntime } from './prompts.js';
20
19
 
21
20
  export { runUpgrade } from './upgrade.js';
22
21
 
@@ -85,10 +84,8 @@ export async function runScaffold(directory, options) {
85
84
 
86
85
  // === 交互式模式 ===
87
86
  try {
88
- // 1. 选择运行系统(控制安装的流水线和编排技能)
89
- const runtime = options.runtime !== undefined
90
- ? normalizeRuntime(options.runtime)
91
- : await selectRuntime();
87
+ // 1. 统一 Python runtime(旧 runtime 参数仅作为兼容别名归一)
88
+ const runtime = normalizeRuntime(options.runtime);
92
89
 
93
90
  // 2. 选择平台(控制安装的目录结构)
94
91
  const platform = await select({
@@ -243,7 +240,7 @@ export async function runScaffold(directory, options) {
243
240
 
244
241
  console.log('');
245
242
  console.log(chalk.bold(' 安装摘要:'));
246
- console.log(` 运行系统: ${chalk.cyan(runtimeLabel(runtime))}`);
243
+ console.log(` 运行时: ${chalk.cyan(runtimeLabel(runtime))}`);
247
244
  console.log(` 平台: ${chalk.cyan(selectedPlatformLabel)}`);
248
245
  console.log(` 技能: ${chalk.cyan(suiteLabel)}`);
249
246
  console.log(` 团队模式: ${team ? chalk.green('启用') : chalk.gray('禁用')}`);
package/src/manifest.js CHANGED
@@ -9,7 +9,8 @@
9
9
 
10
10
  import fs from 'fs-extra';
11
11
  import path from 'path';
12
- import { expandPlatforms, projectMemoryFile } from './platforms.js';
12
+ import { projectMemoryFile, resolvePayloadPlatforms } from './platforms.js';
13
+ import { normalizeRuntime } from './runtimes.js';
13
14
 
14
15
  const MANIFEST_FILE = 'manifest.json';
15
16
  const MANIFEST_DIR = '.prizmkit';
@@ -48,7 +49,7 @@ export async function writeManifest(projectRoot, data) {
48
49
  * @param {Object} params
49
50
  * @param {string} params.version - PrizmKit version
50
51
  * @param {string} params.platform - 'codebuddy' | 'claude' | 'codex' | 'all' ('both' supported only for legacy manifests)
51
- * @param {string} [params.runtime] - 'unix' | 'windows'
52
+ * @param {string} [params.runtime] - canonical Python runtime id or compatibility alias
52
53
  * @param {string} params.suite - skill suite name
53
54
  * @param {string[]} params.skills - resolved skill name list
54
55
  * @param {string[]} params.agents - agent file names (e.g. ['prizm-dev-team-dev.md'])
@@ -57,7 +58,7 @@ export async function writeManifest(projectRoot, data) {
57
58
  * @param {boolean} params.team - whether team config was installed
58
59
  * @param {string} [params.aiCli] - AI CLI command
59
60
  * @param {string} [params.rulesPreset] - rules preset name
60
- * @param {string[]} [params.extras] - installed extras (e.g. ['playwright-cli'])
61
+ * @param {string[]} [params.payloadPlatforms] - concrete platform payloads installed for platform + aiCli
61
62
  * @returns {Object} manifest
62
63
  */
63
64
  export function buildManifest({
@@ -73,14 +74,18 @@ export function buildManifest({
73
74
  aiCli,
74
75
  rulesPreset,
75
76
  extras,
77
+ payloadPlatforms,
76
78
  }) {
77
79
  const now = new Date().toISOString();
80
+ const installedPayloadPlatforms = payloadPlatforms?.length
81
+ ? [...new Set(payloadPlatforms)]
82
+ : resolvePayloadPlatforms(platform, aiCli);
78
83
  return {
79
84
  version,
80
85
  installedAt: now,
81
86
  updatedAt: now,
82
87
  platform,
83
- runtime: runtime || 'unix',
88
+ runtime: normalizeRuntime(runtime),
84
89
  suite,
85
90
  options: {
86
91
  team: Boolean(team),
@@ -94,7 +99,8 @@ export function buildManifest({
94
99
  rules: [...rules],
95
100
  pipeline: pipeline ? [...pipeline] : [],
96
101
  extras: extras ? [...extras] : [],
97
- other: [...new Set(expandPlatforms(platform).map(projectMemoryFile).filter(Boolean))],
102
+ payloadPlatforms: installedPayloadPlatforms,
103
+ other: [...new Set(installedPayloadPlatforms.map(projectMemoryFile).filter(Boolean))],
98
104
  },
99
105
  };
100
106
  }
package/src/metadata.js CHANGED
@@ -9,7 +9,7 @@
9
9
  import fs from 'fs-extra';
10
10
  import path from 'path';
11
11
  import { fileURLToPath } from 'url';
12
- import { normalizeRuntime, RUNTIME_WINDOWS } from './runtimes.js';
12
+ import { normalizeRuntime } from './runtimes.js';
13
13
 
14
14
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
15
 
@@ -72,25 +72,14 @@ export function getSkillsDir() {
72
72
 
73
73
  /**
74
74
  * Return candidate source directories for a skill in priority order.
75
- * Windows orchestration skills are intentionally sourced from a separate
76
- * tree so macOS/Linux content remains untouched.
75
+ * Retired Windows runtime aliases resolve to the canonical skill tree.
77
76
  */
78
- export function getSkillCandidatePaths(skillName, skillDef = {}, runtime = 'unix') {
79
- const normalizedRuntime = normalizeRuntime(runtime);
77
+ export function getSkillCandidatePaths(skillName, skillDef = {}, runtime = 'python') {
78
+ normalizeRuntime(runtime);
80
79
  const category = skillDef.category;
81
80
  const subcategory = skillDef.subcategory;
82
81
  const candidates = [];
83
82
 
84
- if (normalizedRuntime === RUNTIME_WINDOWS && category) {
85
- const windowsCategory = `${category}-windows`;
86
- candidates.push(path.join(getBundledRoot(), 'skills-windows', skillName));
87
- candidates.push(
88
- subcategory
89
- ? path.join(getFrameworkRoot(), 'core', 'skills', windowsCategory, subcategory, skillName)
90
- : path.join(getFrameworkRoot(), 'core', 'skills', windowsCategory, skillName)
91
- );
92
- }
93
-
94
83
  candidates.push(path.join(getBundledRoot(), 'skills', skillName));
95
84
 
96
85
  if (category) {
@@ -147,9 +136,9 @@ export function getTemplatesDir() {
147
136
  /**
148
137
  * 获取 dev-pipeline 目录路径
149
138
  */
150
- export function getPipelineDir(runtime = 'unix') {
151
- const normalizedRuntime = normalizeRuntime(runtime);
152
- const dirName = normalizedRuntime === RUNTIME_WINDOWS ? 'dev-pipeline-windows' : 'dev-pipeline';
139
+ export function getPipelineDir(runtime = 'python') {
140
+ normalizeRuntime(runtime);
141
+ const dirName = 'dev-pipeline';
153
142
  const bundledDir = path.join(getBundledRoot(), dirName);
154
143
  const coreDir = path.join(getFrameworkRoot(), dirName);
155
144