prizmkit 1.1.57 → 1.1.60

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 (188) hide show
  1. package/bin/create-prizmkit.js +8 -6
  2. package/bundled/VERSION.json +3 -3
  3. package/bundled/adapters/codex/agent-adapter.js +38 -0
  4. package/bundled/adapters/codex/paths.js +27 -0
  5. package/bundled/adapters/codex/rules-adapter.js +30 -0
  6. package/bundled/adapters/codex/settings-adapter.js +27 -0
  7. package/bundled/adapters/codex/skill-adapter.js +65 -0
  8. package/bundled/adapters/codex/team-adapter.js +37 -0
  9. package/bundled/dev-pipeline/.env.example +2 -1
  10. package/bundled/dev-pipeline/README.md +10 -7
  11. package/bundled/dev-pipeline/lib/common.sh +278 -37
  12. package/bundled/dev-pipeline/run-bugfix.sh +10 -61
  13. package/bundled/dev-pipeline/run-feature.sh +10 -78
  14. package/bundled/dev-pipeline/run-recovery.sh +10 -46
  15. package/bundled/dev-pipeline/run-refactor.sh +10 -61
  16. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +17 -7
  17. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +9 -3
  18. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +9 -3
  19. package/bundled/dev-pipeline/scripts/utils.py +6 -4
  20. package/bundled/dev-pipeline-windows/.env.example +28 -0
  21. package/bundled/dev-pipeline-windows/README.md +30 -0
  22. package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +525 -0
  23. package/bundled/dev-pipeline-windows/assets/feature-list-example.json +146 -0
  24. package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +138 -0
  25. package/bundled/dev-pipeline-windows/launch-bugfix-daemon.ps1 +9 -0
  26. package/bundled/dev-pipeline-windows/launch-feature-daemon.ps1 +9 -0
  27. package/bundled/dev-pipeline-windows/launch-refactor-daemon.ps1 +9 -0
  28. package/bundled/dev-pipeline-windows/lib/common.ps1 +432 -0
  29. package/bundled/dev-pipeline-windows/lib/daemon.ps1 +140 -0
  30. package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +446 -0
  31. package/bundled/dev-pipeline-windows/lib/reset.ps1 +87 -0
  32. package/bundled/dev-pipeline-windows/reset-bug.ps1 +9 -0
  33. package/bundled/dev-pipeline-windows/reset-feature.ps1 +9 -0
  34. package/bundled/dev-pipeline-windows/reset-refactor.ps1 +9 -0
  35. package/bundled/dev-pipeline-windows/run-bugfix.ps1 +9 -0
  36. package/bundled/dev-pipeline-windows/run-feature.ps1 +9 -0
  37. package/bundled/dev-pipeline-windows/run-recovery.ps1 +76 -0
  38. package/bundled/dev-pipeline-windows/run-refactor.ps1 +9 -0
  39. package/bundled/dev-pipeline-windows/scripts/check-session-status.py +228 -0
  40. package/bundled/dev-pipeline-windows/scripts/cleanup-logs.py +192 -0
  41. package/bundled/dev-pipeline-windows/scripts/detect-stuck.py +530 -0
  42. package/bundled/dev-pipeline-windows/scripts/generate-bootstrap-prompt.py +1737 -0
  43. package/bundled/dev-pipeline-windows/scripts/generate-bugfix-prompt.py +685 -0
  44. package/bundled/dev-pipeline-windows/scripts/generate-recovery-prompt.py +805 -0
  45. package/bundled/dev-pipeline-windows/scripts/generate-refactor-prompt.py +763 -0
  46. package/bundled/dev-pipeline-windows/scripts/init-bugfix-pipeline.py +316 -0
  47. package/bundled/dev-pipeline-windows/scripts/init-dev-team.py +134 -0
  48. package/bundled/dev-pipeline-windows/scripts/init-pipeline.py +380 -0
  49. package/bundled/dev-pipeline-windows/scripts/init-refactor-pipeline.py +399 -0
  50. package/bundled/dev-pipeline-windows/scripts/parse-stream-progress.py +388 -0
  51. package/bundled/dev-pipeline-windows/scripts/patch-completion-notes.py +191 -0
  52. package/bundled/dev-pipeline-windows/scripts/update-bug-status.py +864 -0
  53. package/bundled/dev-pipeline-windows/scripts/update-checkpoint.py +173 -0
  54. package/bundled/dev-pipeline-windows/scripts/update-feature-status.py +1501 -0
  55. package/bundled/dev-pipeline-windows/scripts/update-refactor-status.py +1073 -0
  56. package/bundled/dev-pipeline-windows/scripts/utils.py +542 -0
  57. package/bundled/dev-pipeline-windows/templates/agent-prompts/critic-plan-challenge.md +7 -0
  58. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-fix.md +7 -0
  59. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-implement.md +30 -0
  60. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-resume.md +5 -0
  61. package/bundled/dev-pipeline-windows/templates/agent-prompts/reviewer-review.md +7 -0
  62. package/bundled/dev-pipeline-windows/templates/bootstrap-prompt.md +46 -0
  63. package/bundled/dev-pipeline-windows/templates/bootstrap-tier1.md +43 -0
  64. package/bundled/dev-pipeline-windows/templates/bootstrap-tier2.md +43 -0
  65. package/bundled/dev-pipeline-windows/templates/bootstrap-tier3.md +43 -0
  66. package/bundled/dev-pipeline-windows/templates/bug-fix-list-schema.json +263 -0
  67. package/bundled/dev-pipeline-windows/templates/bugfix-bootstrap-prompt.md +320 -0
  68. package/bundled/dev-pipeline-windows/templates/feature-list-schema.json +237 -0
  69. package/bundled/dev-pipeline-windows/templates/refactor-bootstrap-prompt.md +331 -0
  70. package/bundled/dev-pipeline-windows/templates/refactor-list-schema.json +270 -0
  71. package/bundled/dev-pipeline-windows/templates/sections/ac-verification-checklist.md +13 -0
  72. package/bundled/dev-pipeline-windows/templates/sections/checkpoint-system.md +91 -0
  73. package/bundled/dev-pipeline-windows/templates/sections/context-budget-rules.md +33 -0
  74. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-agent.md +10 -0
  75. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-full.md +12 -0
  76. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-lite.md +7 -0
  77. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-agent.md +8 -0
  78. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-full.md +9 -0
  79. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-lite.md +6 -0
  80. package/bundled/dev-pipeline-windows/templates/sections/failure-capture.md +21 -0
  81. package/bundled/dev-pipeline-windows/templates/sections/feature-context.md +31 -0
  82. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-auto.md +72 -0
  83. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-opencli.md +63 -0
  84. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification.md +62 -0
  85. package/bundled/dev-pipeline-windows/templates/sections/phase-commit-full.md +71 -0
  86. package/bundled/dev-pipeline-windows/templates/sections/phase-commit.md +64 -0
  87. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-agent-suffix.md +23 -0
  88. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-base.md +24 -0
  89. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-lite-suffix.md +12 -0
  90. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan-full.md +53 -0
  91. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan.md +32 -0
  92. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-agent.md +37 -0
  93. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-full.md +50 -0
  94. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-lite.md +52 -0
  95. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-agent.md +27 -0
  96. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-lite.md +27 -0
  97. package/bundled/dev-pipeline-windows/templates/sections/phase-review-agent.md +27 -0
  98. package/bundled/dev-pipeline-windows/templates/sections/phase-review-full.md +29 -0
  99. package/bundled/dev-pipeline-windows/templates/sections/phase-specify-plan-full.md +77 -0
  100. package/bundled/dev-pipeline-windows/templates/sections/phase0-init.md +13 -0
  101. package/bundled/dev-pipeline-windows/templates/sections/phase0-test-baseline.md +23 -0
  102. package/bundled/dev-pipeline-windows/templates/sections/session-context.md +5 -0
  103. package/bundled/dev-pipeline-windows/templates/sections/subagent-timeout-recovery.md +6 -0
  104. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-agent.md +67 -0
  105. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-lite.md +58 -0
  106. package/bundled/dev-pipeline-windows/templates/session-status-schema.json +83 -0
  107. package/bundled/skills/_metadata.json +1 -1
  108. package/bundled/skills/app-planner/SKILL.md +26 -18
  109. package/bundled/skills/app-planner/references/architecture-decisions.md +9 -5
  110. package/bundled/skills/app-planner/references/frontend-design-guide.md +1 -1
  111. package/bundled/skills/feature-planner/SKILL.md +9 -2
  112. package/bundled/skills/prizmkit-init/SKILL.md +7 -6
  113. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +2 -0
  114. package/bundled/skills-windows/app-planner/SKILL.md +639 -0
  115. package/bundled/skills-windows/app-planner/assets/app-design-guide.md +101 -0
  116. package/bundled/skills-windows/app-planner/references/architecture-decisions.md +52 -0
  117. package/bundled/skills-windows/app-planner/references/brainstorm-guide.md +101 -0
  118. package/bundled/skills-windows/app-planner/references/frontend-design-guide.md +71 -0
  119. package/bundled/skills-windows/app-planner/references/project-brief-guide.md +82 -0
  120. package/bundled/skills-windows/app-planner/references/red-team-checklist.md +40 -0
  121. package/bundled/skills-windows/app-planner/references/rules/backend/derivation-rules.md +609 -0
  122. package/bundled/skills-windows/app-planner/references/rules/backend/fixed-rules.md +285 -0
  123. package/bundled/skills-windows/app-planner/references/rules/backend/question-bank.md +249 -0
  124. package/bundled/skills-windows/app-planner/references/rules/backend/template.md +173 -0
  125. package/bundled/skills-windows/app-planner/references/rules/database/derivation-rules.md +373 -0
  126. package/bundled/skills-windows/app-planner/references/rules/database/fixed-rules.md +211 -0
  127. package/bundled/skills-windows/app-planner/references/rules/database/question-bank.md +184 -0
  128. package/bundled/skills-windows/app-planner/references/rules/database/template.md +158 -0
  129. package/bundled/skills-windows/app-planner/references/rules/frontend/derivation-rules.md +810 -0
  130. package/bundled/skills-windows/app-planner/references/rules/frontend/fixed-rules.md +188 -0
  131. package/bundled/skills-windows/app-planner/references/rules/frontend/question-bank.md +302 -0
  132. package/bundled/skills-windows/app-planner/references/rules/frontend/template.md +320 -0
  133. package/bundled/skills-windows/app-planner/references/rules/mobile/derivation-rules.md +639 -0
  134. package/bundled/skills-windows/app-planner/references/rules/mobile/fixed-rules.md +290 -0
  135. package/bundled/skills-windows/app-planner/references/rules/mobile/question-bank.md +232 -0
  136. package/bundled/skills-windows/app-planner/references/rules/mobile/template.md +175 -0
  137. package/bundled/skills-windows/bug-fix-workflow/SKILL.md +415 -0
  138. package/bundled/skills-windows/bug-planner/SKILL.md +395 -0
  139. package/bundled/skills-windows/bug-planner/assets/bug-confirmation-template.md +43 -0
  140. package/bundled/skills-windows/bug-planner/references/critic-and-verification.md +44 -0
  141. package/bundled/skills-windows/bug-planner/references/error-recovery.md +73 -0
  142. package/bundled/skills-windows/bug-planner/references/input-formats.md +53 -0
  143. package/bundled/skills-windows/bug-planner/references/schema-validation.md +25 -0
  144. package/bundled/skills-windows/bug-planner/references/severity-rules.md +16 -0
  145. package/bundled/skills-windows/bug-planner/scripts/validate-bug-list.py +322 -0
  146. package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +380 -0
  147. package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +441 -0
  148. package/bundled/skills-windows/feature-pipeline-launcher/scripts/preflight-check.py +462 -0
  149. package/bundled/skills-windows/feature-planner/SKILL.md +401 -0
  150. package/bundled/skills-windows/feature-planner/assets/evaluation-guide.md +64 -0
  151. package/bundled/skills-windows/feature-planner/assets/planning-guide.md +214 -0
  152. package/bundled/skills-windows/feature-planner/references/browser-interaction.md +59 -0
  153. package/bundled/skills-windows/feature-planner/references/completeness-review.md +57 -0
  154. package/bundled/skills-windows/feature-planner/references/decomposition-patterns.md +75 -0
  155. package/bundled/skills-windows/feature-planner/references/error-recovery.md +90 -0
  156. package/bundled/skills-windows/feature-planner/references/incremental-feature-planning.md +112 -0
  157. package/bundled/skills-windows/feature-planner/references/new-project-planning.md +85 -0
  158. package/bundled/skills-windows/feature-planner/scripts/validate-and-generate.py +1029 -0
  159. package/bundled/skills-windows/feature-workflow/SKILL.md +531 -0
  160. package/bundled/skills-windows/prizmkit-init/SKILL.md +356 -0
  161. package/bundled/skills-windows/prizmkit-init/assets/project-brief-template.md +82 -0
  162. package/bundled/skills-windows/prizmkit-init/references/config-schema.md +68 -0
  163. package/bundled/skills-windows/prizmkit-init/references/rules/layer-detection.md +41 -0
  164. package/bundled/skills-windows/prizmkit-init/references/tech-stack-catalog.md +13 -0
  165. package/bundled/skills-windows/prizmkit-init/references/update-supplement.md +9 -0
  166. package/bundled/skills-windows/recovery-workflow/SKILL.md +456 -0
  167. package/bundled/skills-windows/recovery-workflow/evals/evals.json +46 -0
  168. package/bundled/skills-windows/recovery-workflow/scripts/detect-recovery-state.py +544 -0
  169. package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +406 -0
  170. package/bundled/skills-windows/refactor-planner/SKILL.md +540 -0
  171. package/bundled/skills-windows/refactor-planner/assets/planning-guide.md +292 -0
  172. package/bundled/skills-windows/refactor-planner/references/behavior-preservation.md +301 -0
  173. package/bundled/skills-windows/refactor-planner/references/refactor-scoping-guide.md +221 -0
  174. package/bundled/skills-windows/refactor-planner/scripts/validate-and-generate-refactor.py +858 -0
  175. package/bundled/skills-windows/refactor-workflow/SKILL.md +503 -0
  176. package/package.json +3 -2
  177. package/src/clean.js +73 -2
  178. package/src/config.js +159 -50
  179. package/src/detect-platform.js +16 -8
  180. package/src/external-skills.js +26 -19
  181. package/src/index.js +31 -9
  182. package/src/manifest.js +6 -2
  183. package/src/metadata.js +43 -5
  184. package/src/platforms.js +36 -0
  185. package/src/prompts.js +31 -6
  186. package/src/runtimes.js +20 -0
  187. package/src/scaffold.js +314 -110
  188. package/src/upgrade.js +81 -41
package/src/index.js CHANGED
@@ -14,6 +14,9 @@ import path from 'path';
14
14
  import { detectPlatform } from './detect-platform.js';
15
15
  import { scaffold } from './scaffold.js';
16
16
  import { loadMetadata } from './metadata.js';
17
+ import { platformLabel } from './platforms.js';
18
+ import { normalizeRuntime, runtimeLabel } from './runtimes.js';
19
+ import { selectRuntime } from './prompts.js';
17
20
 
18
21
  export { runUpgrade } from './upgrade.js';
19
22
 
@@ -47,6 +50,7 @@ export async function runScaffold(directory, options) {
47
50
  const cliStatus = [
48
51
  detected.cbc ? chalk.green('cbc ✓') : chalk.gray('cbc ✗'),
49
52
  detected.claude ? chalk.green('claude ✓') : chalk.gray('claude ✗'),
53
+ detected.codex ? chalk.green('codex ✓') : chalk.gray('codex ✗'),
50
54
  ].join(' ');
51
55
  console.log(` 检测到的 CLI 工具: ${cliStatus}`);
52
56
  console.log(` 目标目录: ${projectRoot}`);
@@ -54,7 +58,6 @@ export async function runScaffold(directory, options) {
54
58
 
55
59
  // 加载 Skill 元数据
56
60
  const metadata = await loadMetadata();
57
- const totalSkills = Object.keys(metadata.skills).length;
58
61
 
59
62
  // === 非交互式模式 ===
60
63
  if (options.nonInteractive) {
@@ -64,6 +67,7 @@ export async function runScaffold(directory, options) {
64
67
  }
65
68
  const config = {
66
69
  platform: options.platform,
70
+ runtime: normalizeRuntime(options.runtime),
67
71
  skills: options.skills || 'core',
68
72
  team: options.team !== false,
69
73
  pipeline: options.pipeline !== false,
@@ -81,7 +85,12 @@ export async function runScaffold(directory, options) {
81
85
 
82
86
  // === 交互式模式 ===
83
87
  try {
84
- // 1. 选择平台(控制安装的目录结构)
88
+ // 1. 选择运行系统(控制安装的流水线和编排技能)
89
+ const runtime = options.runtime !== undefined
90
+ ? normalizeRuntime(options.runtime)
91
+ : await selectRuntime();
92
+
93
+ // 2. 选择平台(控制安装的目录结构)
85
94
  const platform = await select({
86
95
  message: '选择目标平台 (决定安装的目录结构):',
87
96
  choices: [
@@ -94,14 +103,22 @@ export async function runScaffold(directory, options) {
94
103
  value: 'claude',
95
104
  },
96
105
  {
97
- name: '同时安装两个平台',
106
+ name: `Codex (AGENTS.md + .agents/skills + .codex/)${detected.codex ? chalk.green(' ← 已检测到 codex') : ''}`,
107
+ value: 'codex',
108
+ },
109
+ {
110
+ name: '同时安装 CodeBuddy + Claude Code',
98
111
  value: 'both',
99
112
  },
113
+ {
114
+ name: '同时安装全部平台',
115
+ value: 'all',
116
+ },
100
117
  ],
101
118
  default: detected.suggested,
102
119
  });
103
120
 
104
- // 1.5. AI CLI 命令配置(独立于平台,决定实际运行的可执行命令)
121
+ // 2.5. AI CLI 命令配置(独立于平台,决定实际运行的可执行命令)
105
122
  const cliChoices = [
106
123
  {
107
124
  name: `cbc — CodeBuddy CLI${detected.cbc ? chalk.green(' ✓ 已安装') : chalk.gray(' (未检测到)')}`,
@@ -111,6 +128,10 @@ export async function runScaffold(directory, options) {
111
128
  name: `claude — Claude Code${detected.claude ? chalk.green(' ✓ 已安装') : chalk.gray(' (未检测到)')}`,
112
129
  value: 'claude',
113
130
  },
131
+ {
132
+ name: `codex — Codex CLI${detected.codex ? chalk.green(' ✓ 已安装') : chalk.gray(' (未检测到)')}`,
133
+ value: 'codex',
134
+ },
114
135
  {
115
136
  name: '自定义 — 输入其他命令',
116
137
  value: '__custom__',
@@ -122,7 +143,7 @@ export async function runScaffold(directory, options) {
122
143
  ];
123
144
 
124
145
  // 如果检测到的推荐命令不在固定列表里,默认选"自定义"
125
- const knownCliValues = ['cbc', 'claude'];
146
+ const knownCliValues = ['cbc', 'claude', 'codex'];
126
147
  const cliDefault = knownCliValues.includes(detected.suggestedCli)
127
148
  ? detected.suggestedCli
128
149
  : (detected.suggestedCli ? '__custom__' : '');
@@ -219,15 +240,15 @@ export async function runScaffold(directory, options) {
219
240
  });
220
241
 
221
242
  // 显示安装摘要
222
- const platformLabel = platform === 'both' ? 'CodeBuddy + Claude Code'
223
- : platform === 'codebuddy' ? 'CodeBuddy' : 'Claude Code';
243
+ const selectedPlatformLabel = platformLabel(platform);
224
244
  const suiteLabel = skillSuite === 'core' ? `Core (${metadata.suites.core.skills.length} 个)`
225
245
  : skillSuite === 'minimal' ? `Minimal (${metadata.suites.minimal.skills.length} 个)`
226
246
  : `Recommended (${skillSuite})`;
227
247
 
228
248
  console.log('');
229
249
  console.log(chalk.bold(' 安装摘要:'));
230
- console.log(` 平台: ${chalk.cyan(platformLabel)}`);
250
+ console.log(` 运行系统: ${chalk.cyan(runtimeLabel(runtime))}`);
251
+ console.log(` 平台: ${chalk.cyan(selectedPlatformLabel)}`);
231
252
  console.log(` 技能: ${chalk.cyan(suiteLabel)}`);
232
253
  console.log(` 团队模式: ${team ? chalk.green('启用') : chalk.gray('禁用')}`);
233
254
  console.log(` 流水线: ${pipeline ? chalk.green('启用') : chalk.gray('禁用')}`);
@@ -252,6 +273,7 @@ export async function runScaffold(directory, options) {
252
273
 
253
274
  const config = {
254
275
  platform,
276
+ runtime,
255
277
  skills: skillSuite,
256
278
  team,
257
279
  pipeline,
@@ -274,4 +296,4 @@ export async function runScaffold(directory, options) {
274
296
  }
275
297
  throw err;
276
298
  }
277
- }
299
+ }
package/src/manifest.js CHANGED
@@ -9,6 +9,7 @@
9
9
 
10
10
  import fs from 'fs-extra';
11
11
  import path from 'path';
12
+ import { expandPlatforms, projectMemoryFile } from './platforms.js';
12
13
 
13
14
  const MANIFEST_FILE = 'manifest.json';
14
15
  const MANIFEST_DIR = '.prizmkit';
@@ -46,7 +47,8 @@ export async function writeManifest(projectRoot, data) {
46
47
  * Build a manifest object from installation config.
47
48
  * @param {Object} params
48
49
  * @param {string} params.version - PrizmKit version
49
- * @param {string} params.platform - 'codebuddy' | 'claude' | 'both'
50
+ * @param {string} params.platform - 'codebuddy' | 'claude' | 'codex' | 'both' | 'all'
51
+ * @param {string} [params.runtime] - 'unix' | 'windows'
50
52
  * @param {string} params.suite - skill suite name
51
53
  * @param {string[]} params.skills - resolved skill name list
52
54
  * @param {string[]} params.agents - agent file names (e.g. ['prizm-dev-team-dev.md'])
@@ -61,6 +63,7 @@ export async function writeManifest(projectRoot, data) {
61
63
  export function buildManifest({
62
64
  version,
63
65
  platform,
66
+ runtime,
64
67
  suite,
65
68
  skills,
66
69
  agents,
@@ -77,6 +80,7 @@ export function buildManifest({
77
80
  installedAt: now,
78
81
  updatedAt: now,
79
82
  platform,
83
+ runtime: runtime || 'unix',
80
84
  suite,
81
85
  options: {
82
86
  team: Boolean(team),
@@ -90,7 +94,7 @@ export function buildManifest({
90
94
  rules: [...rules],
91
95
  pipeline: pipeline ? [...pipeline] : [],
92
96
  extras: extras ? [...extras] : [],
93
- other: [platform === 'claude' ? 'CLAUDE.md' : platform === 'codebuddy' ? 'CODEBUDDY.md' : 'CLAUDE.md'],
97
+ other: [...new Set(expandPlatforms(platform).map(projectMemoryFile).filter(Boolean))],
94
98
  },
95
99
  };
96
100
  }
package/src/metadata.js CHANGED
@@ -9,6 +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
13
 
13
14
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
15
 
@@ -69,6 +70,41 @@ export function getSkillsDir() {
69
70
  throw new Error('无法找到 Skills 目录。');
70
71
  }
71
72
 
73
+ /**
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.
77
+ */
78
+ export function getSkillCandidatePaths(skillName, skillDef = {}, runtime = 'unix') {
79
+ const normalizedRuntime = normalizeRuntime(runtime);
80
+ const category = skillDef.category;
81
+ const subcategory = skillDef.subcategory;
82
+ const candidates = [];
83
+
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
+ candidates.push(path.join(getBundledRoot(), 'skills', skillName));
95
+
96
+ if (category) {
97
+ candidates.push(
98
+ subcategory
99
+ ? path.join(getFrameworkRoot(), 'core', 'skills', category, subcategory, skillName)
100
+ : path.join(getFrameworkRoot(), 'core', 'skills', category, skillName)
101
+ );
102
+ }
103
+
104
+ candidates.push(path.join(getFrameworkRoot(), 'core', 'skills', skillName));
105
+ return candidates;
106
+ }
107
+
72
108
  /**
73
109
  * 获取 core agents 目录路径
74
110
  */
@@ -111,14 +147,16 @@ export function getTemplatesDir() {
111
147
  /**
112
148
  * 获取 dev-pipeline 目录路径
113
149
  */
114
- export function getPipelineDir() {
115
- const bundledDir = path.join(getBundledRoot(), 'dev-pipeline');
116
- const coreDir = path.join(getFrameworkRoot(), 'dev-pipeline');
150
+ export function getPipelineDir(runtime = 'unix') {
151
+ const normalizedRuntime = normalizeRuntime(runtime);
152
+ const dirName = normalizedRuntime === RUNTIME_WINDOWS ? 'dev-pipeline-windows' : 'dev-pipeline';
153
+ const bundledDir = path.join(getBundledRoot(), dirName);
154
+ const coreDir = path.join(getFrameworkRoot(), dirName);
117
155
 
118
156
  if (fs.pathExistsSync(bundledDir)) return bundledDir;
119
157
  if (fs.pathExistsSync(coreDir)) return coreDir;
120
158
 
121
- throw new Error('无法找到 dev-pipeline 目录。');
159
+ throw new Error(`无法找到 ${dirName} 目录。`);
122
160
  }
123
161
 
124
162
  /**
@@ -167,4 +205,4 @@ export async function loadRulesMetadata() {
167
205
  '无法找到 Rules 元数据文件。\n' +
168
206
  `尝试路径:\n 1. ${bundledPath}\n 2. ${corePath}`
169
207
  );
170
- }
208
+ }
@@ -0,0 +1,36 @@
1
+ export const PLATFORM_IDS = ['codebuddy', 'claude', 'codex'];
2
+ export const PLATFORM_GROUPS = {
3
+ both: ['codebuddy', 'claude'],
4
+ all: PLATFORM_IDS,
5
+ };
6
+
7
+ export function expandPlatforms(platform) {
8
+ return PLATFORM_GROUPS[platform] || [platform];
9
+ }
10
+
11
+ export function isKnownPlatform(platform) {
12
+ return PLATFORM_IDS.includes(platform) || Object.hasOwn(PLATFORM_GROUPS, platform);
13
+ }
14
+
15
+ export function platformLabel(platform) {
16
+ if (platform === 'both') return 'CodeBuddy + Claude Code';
17
+ if (platform === 'all') return 'CodeBuddy + Claude Code + Codex';
18
+ if (platform === 'codebuddy') return 'CodeBuddy';
19
+ if (platform === 'claude') return 'Claude Code';
20
+ if (platform === 'codex') return 'Codex';
21
+ return platform;
22
+ }
23
+
24
+ export function projectMemoryFile(platform) {
25
+ if (platform === 'claude') return 'CLAUDE.md';
26
+ if (platform === 'codebuddy') return 'CODEBUDDY.md';
27
+ if (platform === 'codex') return 'AGENTS.md';
28
+ return null;
29
+ }
30
+
31
+ export function defaultCliForPlatform(platform) {
32
+ if (platform === 'claude') return 'claude';
33
+ if (platform === 'codebuddy') return 'cbc';
34
+ if (platform === 'codex') return 'codex';
35
+ return '';
36
+ }
package/src/prompts.js CHANGED
@@ -5,12 +5,25 @@
5
5
 
6
6
  import { select, confirm, checkbox, input } from '@inquirer/prompts';
7
7
  import chalk from 'chalk';
8
+ import { platformLabel } from './platforms.js';
9
+ import { normalizeRuntime } from './runtimes.js';
10
+
11
+ export async function selectRuntime(currentRuntime) {
12
+ return select({
13
+ message: '选择运行系统 (决定安装 macOS/Linux 或 Windows 版本的流水线与编排技能):',
14
+ choices: [
15
+ { name: 'macOS/Linux — 使用 Bash 流水线', value: 'unix' },
16
+ { name: 'Windows PowerShell — 使用原生 PowerShell 流水线', value: 'windows' },
17
+ ],
18
+ default: normalizeRuntime(currentRuntime),
19
+ });
20
+ }
8
21
 
9
22
  /**
10
- * Select target platform (codebuddy, claude, or both).
23
+ * Select target platform (codebuddy, claude, codex, both, or all).
11
24
  * @param {string} currentPlatform - current platform value
12
25
  * @param {Object} detected - detected environment info (e.g., { cbc: true, claude: false })
13
- * @returns {Promise<string>} - 'codebuddy', 'claude', or 'both'
26
+ * @returns {Promise<string>}
14
27
  */
15
28
  export async function selectPlatform(currentPlatform, detected = {}) {
16
29
  const platform = await select({
@@ -25,9 +38,17 @@ export async function selectPlatform(currentPlatform, detected = {}) {
25
38
  value: 'claude',
26
39
  },
27
40
  {
28
- name: '同时安装两个平台',
41
+ name: `Codex (AGENTS.md + .agents/skills + .codex/)${detected.codex ? chalk.green(' ← 已检测到 codex') : ''}`,
42
+ value: 'codex',
43
+ },
44
+ {
45
+ name: '同时安装 CodeBuddy + Claude Code',
29
46
  value: 'both',
30
47
  },
48
+ {
49
+ name: `同时安装全部平台 (${platformLabel('all')})`,
50
+ value: 'all',
51
+ },
31
52
  ],
32
53
  default: currentPlatform || detected.suggested || 'claude',
33
54
  });
@@ -35,10 +56,10 @@ export async function selectPlatform(currentPlatform, detected = {}) {
35
56
  }
36
57
 
37
58
  /**
38
- * Select AI CLI command (cbc, claude, custom, or skip).
59
+ * Select AI CLI command (cbc, claude, codex, custom, or skip).
39
60
  * @param {string} currentCommand - current AI CLI command
40
61
  * @param {Object} detected - detected environment info
41
- * @returns {Promise<string>} - 'cbc', 'claude', custom string, or ''
62
+ * @returns {Promise<string>} - known command, custom string, or ''
42
63
  */
43
64
  export async function selectAiCli(currentCommand, detected = {}) {
44
65
  const cliChoices = [
@@ -50,6 +71,10 @@ export async function selectAiCli(currentCommand, detected = {}) {
50
71
  name: `claude — Claude Code${detected.claude ? chalk.green(' ✓ 已安装') : chalk.gray(' (未检测到)')}`,
51
72
  value: 'claude',
52
73
  },
74
+ {
75
+ name: `codex — Codex CLI${detected.codex ? chalk.green(' ✓ 已安装') : chalk.gray(' (未检测到)')}`,
76
+ value: 'codex',
77
+ },
53
78
  {
54
79
  name: '自定义 — 输入其他命令',
55
80
  value: '__custom__',
@@ -60,7 +85,7 @@ export async function selectAiCli(currentCommand, detected = {}) {
60
85
  },
61
86
  ];
62
87
 
63
- const knownCliValues = ['cbc', 'claude'];
88
+ const knownCliValues = ['cbc', 'claude', 'codex'];
64
89
  const cliDefault = knownCliValues.includes(currentCommand)
65
90
  ? currentCommand
66
91
  : (currentCommand ? '__custom__' : (detected.suggestedCli || ''));
@@ -0,0 +1,20 @@
1
+ export const RUNTIME_UNIX = 'unix';
2
+ export const RUNTIME_WINDOWS = 'windows';
3
+ export const RUNTIME_IDS = [RUNTIME_UNIX, RUNTIME_WINDOWS];
4
+
5
+ export function detectDefaultRuntime() {
6
+ return process.platform === 'win32' ? RUNTIME_WINDOWS : RUNTIME_UNIX;
7
+ }
8
+
9
+ export function normalizeRuntime(runtime) {
10
+ if (!runtime || runtime === 'auto') return detectDefaultRuntime();
11
+ if (runtime === 'macos-linux' || runtime === 'macos' || runtime === 'linux') return RUNTIME_UNIX;
12
+ if (runtime === 'win' || runtime === 'powershell') return RUNTIME_WINDOWS;
13
+ if (RUNTIME_IDS.includes(runtime)) return runtime;
14
+ throw new Error(`Unknown runtime "${runtime}". Expected unix or windows.`);
15
+ }
16
+
17
+ export function runtimeLabel(runtime) {
18
+ const normalized = normalizeRuntime(runtime);
19
+ return normalized === RUNTIME_WINDOWS ? 'Windows PowerShell' : 'macOS/Linux';
20
+ }