@mison/ag-kit-cn 3.0.0-beta.0 → 3.0.0

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 (254) hide show
  1. package/CHANGELOG.md +13 -11
  2. package/README.md +70 -35
  3. package/bin/adapters/codex.js +105 -372
  4. package/bin/adapters/gemini.js +133 -13
  5. package/bin/ag-kit.js +557 -155
  6. package/bin/core/builder.js +1 -1
  7. package/bin/core/generator.js +4 -4
  8. package/bin/core/resource-loader.js +2 -2
  9. package/bin/interactive.js +36 -81
  10. package/bin/utils/manifest.js +3 -3
  11. package/bin/utils.js +8 -3
  12. package/docs/PLAN.md +39 -0
  13. package/docs/TECH.md +136 -0
  14. package/package.json +11 -10
  15. package/scripts/ci-verify.js +95 -0
  16. package/scripts/clean.js +123 -0
  17. package/scripts/health-check.js +132 -0
  18. package/scripts/health-check.sh +6 -0
  19. package/tests/atomic-writer.test.js +47 -0
  20. package/tests/clean-script.test.js +77 -0
  21. package/tests/cli-smoke.test.js +479 -0
  22. package/tests/codex-adapter.test.js +132 -0
  23. package/tests/doctor.test.js +94 -0
  24. package/tests/gemini-adapter.test.js +30 -0
  25. package/tests/generator.test.js +48 -0
  26. package/tests/git-helper.test.js +53 -0
  27. package/tests/global-sync.test.js +133 -0
  28. package/tests/health-check-script.test.js +30 -0
  29. package/tests/managed-block.test.js +41 -0
  30. package/tests/manifest.test.js +97 -0
  31. package/tests/package-tarball.test.js +27 -0
  32. package/tests/phase-c.test.js +107 -0
  33. package/tests/standards-compliance.test.js +266 -0
  34. package/tests/transformer.test.js +74 -0
  35. package/docs/codex-rules-template.md +0 -36
  36. package/docs/mapping-spec.md +0 -62
  37. package/docs/multi-target-adapter.md +0 -46
  38. package/docs/official/README.md +0 -45
  39. package/docs/official/antigravity/agent-modes-settings.md +0 -64
  40. package/docs/official/antigravity/rules-workflows.md +0 -96
  41. package/docs/official/antigravity/skills.md +0 -147
  42. package/docs/official/codex/agents-md.md +0 -119
  43. package/docs/official/codex/config-advanced.md +0 -358
  44. package/docs/official/codex/config-basic.md +0 -141
  45. package/docs/official/codex/config-reference.md +0 -223
  46. package/docs/official/codex/config-sample.md +0 -216
  47. package/docs/official/codex/mcp.md +0 -107
  48. package/docs/official/codex/rules.md +0 -79
  49. package/docs/official/codex/skills.md +0 -114
  50. package/docs/official/mechanism-compat-audit-2026-03-04.md +0 -36
  51. package/docs/official/rules-baseline.md +0 -67
  52. package/docs/official/sources-index.md +0 -79
  53. package/docs/operations.md +0 -75
  54. package/docs/terminology-style-guide.md +0 -69
  55. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/charts.csv +0 -0
  56. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/colors.csv +0 -0
  57. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/icons.csv +0 -0
  58. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/landing.csv +0 -0
  59. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/products.csv +0 -0
  60. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/prompts.csv +0 -0
  61. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/react-performance.csv +0 -0
  62. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -0
  63. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -0
  64. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -0
  65. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -0
  66. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -0
  67. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -0
  68. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -0
  69. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -0
  70. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -0
  71. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -0
  72. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -0
  73. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -0
  74. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/styles.csv +0 -0
  75. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/typography.csv +0 -0
  76. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -0
  77. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -0
  78. /package/{.agent → .agents}/.shared/ui-ux-pro-max/data/web-interface.csv +0 -0
  79. /package/{.agent → .agents}/.shared/ui-ux-pro-max/scripts/core.py +0 -0
  80. /package/{.agent → .agents}/.shared/ui-ux-pro-max/scripts/design_system.py +0 -0
  81. /package/{.agent → .agents}/.shared/ui-ux-pro-max/scripts/search.py +0 -0
  82. /package/{.agent → .agents}/ARCHITECTURE.md +0 -0
  83. /package/{.agent → .agents}/agents/backend-specialist.md +0 -0
  84. /package/{.agent → .agents}/agents/code-archaeologist.md +0 -0
  85. /package/{.agent → .agents}/agents/database-architect.md +0 -0
  86. /package/{.agent → .agents}/agents/debugger.md +0 -0
  87. /package/{.agent → .agents}/agents/devops-engineer.md +0 -0
  88. /package/{.agent → .agents}/agents/documentation-writer.md +0 -0
  89. /package/{.agent → .agents}/agents/explorer-agent.md +0 -0
  90. /package/{.agent → .agents}/agents/frontend-specialist.md +0 -0
  91. /package/{.agent → .agents}/agents/game-developer.md +0 -0
  92. /package/{.agent → .agents}/agents/mobile-developer.md +0 -0
  93. /package/{.agent → .agents}/agents/orchestrator.md +0 -0
  94. /package/{.agent → .agents}/agents/penetration-tester.md +0 -0
  95. /package/{.agent → .agents}/agents/performance-optimizer.md +0 -0
  96. /package/{.agent → .agents}/agents/product-manager.md +0 -0
  97. /package/{.agent → .agents}/agents/product-owner.md +0 -0
  98. /package/{.agent → .agents}/agents/project-planner.md +0 -0
  99. /package/{.agent → .agents}/agents/qa-automation-engineer.md +0 -0
  100. /package/{.agent → .agents}/agents/security-auditor.md +0 -0
  101. /package/{.agent → .agents}/agents/seo-specialist.md +0 -0
  102. /package/{.agent → .agents}/agents/test-engineer.md +0 -0
  103. /package/{.agent → .agents}/mcp_config.json +0 -0
  104. /package/{.agent → .agents}/rules/GEMINI.md +0 -0
  105. /package/{.agent → .agents}/scripts/auto_preview.py +0 -0
  106. /package/{.agent → .agents}/scripts/checklist.py +0 -0
  107. /package/{.agent → .agents}/scripts/session_manager.py +0 -0
  108. /package/{.agent → .agents}/scripts/verify_all.py +0 -0
  109. /package/{.agent → .agents}/skills/api-patterns/SKILL.md +0 -0
  110. /package/{.agent → .agents}/skills/api-patterns/api-style.md +0 -0
  111. /package/{.agent → .agents}/skills/api-patterns/auth.md +0 -0
  112. /package/{.agent → .agents}/skills/api-patterns/documentation.md +0 -0
  113. /package/{.agent → .agents}/skills/api-patterns/graphql.md +0 -0
  114. /package/{.agent → .agents}/skills/api-patterns/rate-limiting.md +0 -0
  115. /package/{.agent → .agents}/skills/api-patterns/response.md +0 -0
  116. /package/{.agent → .agents}/skills/api-patterns/rest.md +0 -0
  117. /package/{.agent → .agents}/skills/api-patterns/scripts/api_validator.py +0 -0
  118. /package/{.agent → .agents}/skills/api-patterns/security-testing.md +0 -0
  119. /package/{.agent → .agents}/skills/api-patterns/trpc.md +0 -0
  120. /package/{.agent → .agents}/skills/api-patterns/versioning.md +0 -0
  121. /package/{.agent → .agents}/skills/app-builder/SKILL.md +0 -0
  122. /package/{.agent → .agents}/skills/app-builder/agent-coordination.md +0 -0
  123. /package/{.agent → .agents}/skills/app-builder/feature-building.md +0 -0
  124. /package/{.agent → .agents}/skills/app-builder/project-detection.md +0 -0
  125. /package/{.agent → .agents}/skills/app-builder/scaffolding.md +0 -0
  126. /package/{.agent → .agents}/skills/app-builder/tech-stack.md +0 -0
  127. /package/{.agent → .agents}/skills/app-builder/templates/SKILL.md +0 -0
  128. /package/{.agent → .agents}/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -0
  129. /package/{.agent → .agents}/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -0
  130. /package/{.agent → .agents}/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -0
  131. /package/{.agent → .agents}/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -0
  132. /package/{.agent → .agents}/skills/app-builder/templates/express-api/TEMPLATE.md +0 -0
  133. /package/{.agent → .agents}/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -0
  134. /package/{.agent → .agents}/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -0
  135. /package/{.agent → .agents}/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -0
  136. /package/{.agent → .agents}/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -0
  137. /package/{.agent → .agents}/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -0
  138. /package/{.agent → .agents}/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -0
  139. /package/{.agent → .agents}/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -0
  140. /package/{.agent → .agents}/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -0
  141. /package/{.agent → .agents}/skills/architecture/SKILL.md +0 -0
  142. /package/{.agent → .agents}/skills/architecture/context-discovery.md +0 -0
  143. /package/{.agent → .agents}/skills/architecture/examples.md +0 -0
  144. /package/{.agent → .agents}/skills/architecture/pattern-selection.md +0 -0
  145. /package/{.agent → .agents}/skills/architecture/patterns-reference.md +0 -0
  146. /package/{.agent → .agents}/skills/architecture/trade-off-analysis.md +0 -0
  147. /package/{.agent → .agents}/skills/bash-linux/SKILL.md +0 -0
  148. /package/{.agent → .agents}/skills/behavioral-modes/SKILL.md +0 -0
  149. /package/{.agent → .agents}/skills/brainstorming/SKILL.md +0 -0
  150. /package/{.agent → .agents}/skills/brainstorming/dynamic-questioning.md +0 -0
  151. /package/{.agent → .agents}/skills/clean-code/SKILL.md +0 -0
  152. /package/{.agent → .agents}/skills/code-review-checklist/SKILL.md +0 -0
  153. /package/{.agent → .agents}/skills/database-design/SKILL.md +0 -0
  154. /package/{.agent → .agents}/skills/database-design/database-selection.md +0 -0
  155. /package/{.agent → .agents}/skills/database-design/indexing.md +0 -0
  156. /package/{.agent → .agents}/skills/database-design/migrations.md +0 -0
  157. /package/{.agent → .agents}/skills/database-design/optimization.md +0 -0
  158. /package/{.agent → .agents}/skills/database-design/orm-selection.md +0 -0
  159. /package/{.agent → .agents}/skills/database-design/schema-design.md +0 -0
  160. /package/{.agent → .agents}/skills/database-design/scripts/schema_validator.py +0 -0
  161. /package/{.agent → .agents}/skills/deployment-procedures/SKILL.md +0 -0
  162. /package/{.agent → .agents}/skills/doc.md +0 -0
  163. /package/{.agent → .agents}/skills/documentation-templates/SKILL.md +0 -0
  164. /package/{.agent → .agents}/skills/frontend-design/SKILL.md +0 -0
  165. /package/{.agent → .agents}/skills/frontend-design/animation-guide.md +0 -0
  166. /package/{.agent → .agents}/skills/frontend-design/color-system.md +0 -0
  167. /package/{.agent → .agents}/skills/frontend-design/decision-trees.md +0 -0
  168. /package/{.agent → .agents}/skills/frontend-design/motion-graphics.md +0 -0
  169. /package/{.agent → .agents}/skills/frontend-design/scripts/accessibility_checker.py +0 -0
  170. /package/{.agent → .agents}/skills/frontend-design/scripts/ux_audit.py +0 -0
  171. /package/{.agent → .agents}/skills/frontend-design/typography-system.md +0 -0
  172. /package/{.agent → .agents}/skills/frontend-design/ux-psychology.md +0 -0
  173. /package/{.agent → .agents}/skills/frontend-design/visual-effects.md +0 -0
  174. /package/{.agent → .agents}/skills/game-development/2d-games/SKILL.md +0 -0
  175. /package/{.agent → .agents}/skills/game-development/3d-games/SKILL.md +0 -0
  176. /package/{.agent → .agents}/skills/game-development/SKILL.md +0 -0
  177. /package/{.agent → .agents}/skills/game-development/game-art/SKILL.md +0 -0
  178. /package/{.agent → .agents}/skills/game-development/game-audio/SKILL.md +0 -0
  179. /package/{.agent → .agents}/skills/game-development/game-design/SKILL.md +0 -0
  180. /package/{.agent → .agents}/skills/game-development/mobile-games/SKILL.md +0 -0
  181. /package/{.agent → .agents}/skills/game-development/multiplayer/SKILL.md +0 -0
  182. /package/{.agent → .agents}/skills/game-development/pc-games/SKILL.md +0 -0
  183. /package/{.agent → .agents}/skills/game-development/vr-ar/SKILL.md +0 -0
  184. /package/{.agent → .agents}/skills/game-development/web-games/SKILL.md +0 -0
  185. /package/{.agent → .agents}/skills/geo-fundamentals/SKILL.md +0 -0
  186. /package/{.agent → .agents}/skills/geo-fundamentals/scripts/geo_checker.py +0 -0
  187. /package/{.agent → .agents}/skills/i18n-localization/SKILL.md +0 -0
  188. /package/{.agent → .agents}/skills/i18n-localization/scripts/i18n_checker.py +0 -0
  189. /package/{.agent → .agents}/skills/intelligent-routing/SKILL.md +0 -0
  190. /package/{.agent → .agents}/skills/lint-and-validate/SKILL.md +0 -0
  191. /package/{.agent → .agents}/skills/lint-and-validate/scripts/lint_runner.py +0 -0
  192. /package/{.agent → .agents}/skills/lint-and-validate/scripts/type_coverage.py +0 -0
  193. /package/{.agent → .agents}/skills/mcp-builder/SKILL.md +0 -0
  194. /package/{.agent → .agents}/skills/mobile-design/SKILL.md +0 -0
  195. /package/{.agent → .agents}/skills/mobile-design/decision-trees.md +0 -0
  196. /package/{.agent → .agents}/skills/mobile-design/mobile-backend.md +0 -0
  197. /package/{.agent → .agents}/skills/mobile-design/mobile-color-system.md +0 -0
  198. /package/{.agent → .agents}/skills/mobile-design/mobile-debugging.md +0 -0
  199. /package/{.agent → .agents}/skills/mobile-design/mobile-design-thinking.md +0 -0
  200. /package/{.agent → .agents}/skills/mobile-design/mobile-navigation.md +0 -0
  201. /package/{.agent → .agents}/skills/mobile-design/mobile-performance.md +0 -0
  202. /package/{.agent → .agents}/skills/mobile-design/mobile-testing.md +0 -0
  203. /package/{.agent → .agents}/skills/mobile-design/mobile-typography.md +0 -0
  204. /package/{.agent → .agents}/skills/mobile-design/platform-android.md +0 -0
  205. /package/{.agent → .agents}/skills/mobile-design/platform-ios.md +0 -0
  206. /package/{.agent → .agents}/skills/mobile-design/scripts/mobile_audit.py +0 -0
  207. /package/{.agent → .agents}/skills/mobile-design/touch-psychology.md +0 -0
  208. /package/{.agent → .agents}/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -0
  209. /package/{.agent → .agents}/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -0
  210. /package/{.agent → .agents}/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -0
  211. /package/{.agent → .agents}/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -0
  212. /package/{.agent → .agents}/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -0
  213. /package/{.agent → .agents}/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -0
  214. /package/{.agent → .agents}/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -0
  215. /package/{.agent → .agents}/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -0
  216. /package/{.agent → .agents}/skills/nextjs-react-expert/SKILL.md +0 -0
  217. /package/{.agent → .agents}/skills/nextjs-react-expert/scripts/convert_rules.py +0 -0
  218. /package/{.agent → .agents}/skills/nextjs-react-expert/scripts/react_performance_checker.py +0 -0
  219. /package/{.agent → .agents}/skills/nodejs-best-practices/SKILL.md +0 -0
  220. /package/{.agent → .agents}/skills/parallel-agents/SKILL.md +0 -0
  221. /package/{.agent → .agents}/skills/performance-profiling/SKILL.md +0 -0
  222. /package/{.agent → .agents}/skills/performance-profiling/scripts/lighthouse_audit.py +0 -0
  223. /package/{.agent → .agents}/skills/plan-writing/SKILL.md +0 -0
  224. /package/{.agent → .agents}/skills/powershell-windows/SKILL.md +0 -0
  225. /package/{.agent → .agents}/skills/python-patterns/SKILL.md +0 -0
  226. /package/{.agent → .agents}/skills/red-team-tactics/SKILL.md +0 -0
  227. /package/{.agent → .agents}/skills/refactoring-patterns/SKILL.md +0 -0
  228. /package/{.agent → .agents}/skills/rust-pro/SKILL.md +0 -0
  229. /package/{.agent → .agents}/skills/seo-fundamentals/SKILL.md +0 -0
  230. /package/{.agent → .agents}/skills/seo-fundamentals/scripts/seo_checker.py +0 -0
  231. /package/{.agent → .agents}/skills/server-management/SKILL.md +0 -0
  232. /package/{.agent → .agents}/skills/systematic-debugging/SKILL.md +0 -0
  233. /package/{.agent → .agents}/skills/tailwind-patterns/SKILL.md +0 -0
  234. /package/{.agent → .agents}/skills/tdd-workflow/SKILL.md +0 -0
  235. /package/{.agent → .agents}/skills/testing-patterns/SKILL.md +0 -0
  236. /package/{.agent → .agents}/skills/testing-patterns/scripts/test_runner.py +0 -0
  237. /package/{.agent → .agents}/skills/vulnerability-scanner/SKILL.md +0 -0
  238. /package/{.agent → .agents}/skills/vulnerability-scanner/checklists.md +0 -0
  239. /package/{.agent → .agents}/skills/vulnerability-scanner/scripts/security_scan.py +0 -0
  240. /package/{.agent → .agents}/skills/web-design-guidelines/SKILL.md +0 -0
  241. /package/{.agent → .agents}/skills/webapp-testing/SKILL.md +0 -0
  242. /package/{.agent → .agents}/skills/webapp-testing/scripts/playwright_runner.py +0 -0
  243. /package/{.agent → .agents}/workflows/brainstorm.md +0 -0
  244. /package/{.agent → .agents}/workflows/create.md +0 -0
  245. /package/{.agent → .agents}/workflows/debug.md +0 -0
  246. /package/{.agent → .agents}/workflows/deploy.md +0 -0
  247. /package/{.agent → .agents}/workflows/enhance.md +0 -0
  248. /package/{.agent → .agents}/workflows/orchestrate.md +0 -0
  249. /package/{.agent → .agents}/workflows/plan.md +0 -0
  250. /package/{.agent → .agents}/workflows/preview.md +0 -0
  251. /package/{.agent → .agents}/workflows/restore-localize-compat.md +0 -0
  252. /package/{.agent → .agents}/workflows/status.md +0 -0
  253. /package/{.agent → .agents}/workflows/test.md +0 -0
  254. /package/{.agent → .agents}/workflows/ui-ux-pro-max.md +0 -0
@@ -9,7 +9,7 @@ const pkg = require("../../package.json");
9
9
  class CodexBuilder {
10
10
  /**
11
11
  * Build a Codex structure from a legacy/source repository
12
- * @param {string} sourceRoot Root of the repo (containing .agent/)
12
+ * @param {string} sourceRoot Root of the repo (containing .agents/)
13
13
  * @param {string} outputDir Directory to output the built .agents-compatible structure
14
14
  */
15
15
  static build(sourceRoot, outputDir) {
@@ -22,8 +22,8 @@ class RuleGenerator {
22
22
  };
23
23
 
24
24
  // 2. Generate AGENTS.md managed section content
25
- let agentsMd = `# AI Agent Capabilities (AG-Kit Managed)\n\n`;
26
- agentsMd += `> **Auto-generated by Antigravity Kit (Full Mode)**\n`;
25
+ let agentsMd = `# AI Agent Capabilities (Codex Managed)\n\n`;
26
+ agentsMd += `> **Auto-generated by Antigravity Kit (Codex)**\n`;
27
27
  agentsMd += `> Version: ${version}\n\n`;
28
28
 
29
29
  agentsMd += `## Available Skills\n\n`;
@@ -36,7 +36,7 @@ class RuleGenerator {
36
36
  agentsMd += `\n## Usage Rules\n\n`;
37
37
  agentsMd += `1. Managed resources are synchronized under \`.agents/skills\`.\n`;
38
38
  agentsMd += `2. Do not rename managed skill folders manually.\n`;
39
- agentsMd += `3. Use \`ag-kit doctor --fix\` to recover missing managed artifacts.\n`;
39
+ agentsMd += `3. Use \`ag-kit doctor --target codex --fix\` to recover missing managed artifacts.\n`;
40
40
 
41
41
  // 3. Generate risk controls
42
42
  let antigravityRules = `# Antigravity Risk Controls (Codex Managed)\n\n`;
@@ -45,7 +45,7 @@ class RuleGenerator {
45
45
  antigravityRules += `## Controls\n`;
46
46
  antigravityRules += `- Managed skills are stored under \`.agents/skills\`.\n`;
47
47
  antigravityRules += `- Keep generated skill IDs stable to avoid selector drift.\n`;
48
- antigravityRules += `- If integrity checks fail, run \`ag-kit doctor --fix\`.\n`;
48
+ antigravityRules += `- If integrity checks fail, run \`ag-kit doctor --target codex --fix\`.\n`;
49
49
  antigravityRules += `- Before destructive updates, preserve manual edits in source control.\n`;
50
50
 
51
51
  return {
@@ -4,8 +4,8 @@ const path = require("path");
4
4
  class ResourceLoader {
5
5
  constructor(rootDir) {
6
6
  this.rootDir = rootDir;
7
- this.skillsDir = path.join(rootDir, ".agent", "skills");
8
- this.workflowsDir = path.join(rootDir, ".agent", "workflows");
7
+ this.skillsDir = path.join(rootDir, ".agents", "skills");
8
+ this.workflowsDir = path.join(rootDir, ".agents", "workflows");
9
9
  }
10
10
 
11
11
  /**
@@ -15,96 +15,51 @@ function askQuestion(rl, query) {
15
15
  });
16
16
  }
17
17
 
18
- async function askChoice(promptTitle, options) {
18
+ /**
19
+ * Prompt user to select targets from a list.
20
+ * Supports multiple selection by comma separated numbers or names.
21
+ * Currently simplified for 'gemini' and 'codex'.
22
+ * @param {object} options CLI options
23
+ * @returns {Promise<string[]>} List of selected targets
24
+ */
25
+ async function selectTargets(options) {
26
+ if (options.nonInteractive) {
27
+ throw new Error("非交互模式下必须通过 --target 或 --targets 指定目标");
28
+ }
29
+
19
30
  const rl = createInterface();
31
+
20
32
  try {
21
- console.log(`\n${promptTitle}`);
22
- for (let i = 0; i < options.length; i++) {
23
- const item = options[i];
24
- console.log(` ${i + 1}. ${item.label}`);
25
- if (item.hint) {
26
- console.log(` ${item.hint}`);
27
- }
28
- }
29
-
30
- while (true) {
31
- const answer = (await askQuestion(rl, "\n请输入序号(必填): ")).trim();
32
- if (!answer) {
33
- console.log(" 请输入有效序号。");
34
- continue;
35
- }
33
+ console.log("\n🎯 请选择要安装的目标 (多选请用逗号分隔):");
34
+ console.log(" 1. Gemini (适用于 Cursor/VSCode)");
35
+ console.log(" 2. Codex (兼容性增强版)");
36
+
37
+ const answer = await askQuestion(rl, "\n请输入序号或名称(必填): ");
38
+ const input = answer.trim();
36
39
 
37
- const index = Number.parseInt(answer, 10);
38
- if (!Number.isFinite(index) || index < 1 || index > options.length) {
39
- console.log(` 无效输入: ${answer}`);
40
- continue;
41
- }
40
+ if (!input) {
41
+ throw new Error("必须选择至少一个目标");
42
+ }
43
+
44
+ const selection = [];
45
+ const parts = input.split(/[,,\s]+/);
46
+
47
+ for (const part of parts) {
48
+ const p = part.toLowerCase();
49
+ if (p === "1" || p === "gemini") selection.push("gemini");
50
+ else if (p === "2" || p === "codex") selection.push("codex");
51
+ }
42
52
 
43
- return options[index - 1].value;
53
+ if (selection.length === 0) {
54
+ throw new Error("无效的目标选择,请输入 1 / 2 / gemini / codex(可多选)");
44
55
  }
56
+
57
+ return [...new Set(selection)];
45
58
  } finally {
46
59
  rl.close();
47
60
  }
48
61
  }
49
62
 
50
- /**
51
- * 统一 full 安装模式下,保留兼容返回。
52
- * @returns {Promise<string[]>}
53
- */
54
- async function selectTargets() {
55
- return ["full"];
56
- }
57
-
58
- /**
59
- * 冲突:已有 .agent 且无法确定是否托管时,询问处理策略。
60
- * @returns {Promise<"backup_replace"|"keep"|"rename_disable">}
61
- */
62
- async function selectAgentConflictPolicy() {
63
- return askChoice("检测到已有 .agent 目录,请选择处理方式:", [
64
- {
65
- value: "backup_replace",
66
- label: "备份后替换(推荐)",
67
- hint: "将现有 .agent 备份到 .agents-backup 后,用 .agents 投影覆盖",
68
- },
69
- {
70
- value: "keep",
71
- label: "保留不动",
72
- hint: "跳过 .agent 投影,继续安装 .agents",
73
- },
74
- {
75
- value: "rename_disable",
76
- label: "改名失效后创建新投影",
77
- hint: "把原目录改名为 .agent.user.<ts>,再生成新的 .agent 投影",
78
- },
79
- ]);
80
- }
81
-
82
- /**
83
- * 冲突:已有 .gemini/agents 时,询问处理策略。
84
- * @returns {Promise<"append"|"backup_replace"|"skip">}
85
- */
86
- async function selectGeminiAgentsPolicy() {
87
- return askChoice("检测到已有 .gemini/agents 目录,请选择处理方式:", [
88
- {
89
- value: "append",
90
- label: "追加 ag-kit-*.md(推荐)",
91
- hint: "保留用户文件,仅追加/更新本项目 namespaced agents",
92
- },
93
- {
94
- value: "backup_replace",
95
- label: "备份后替换",
96
- hint: "备份现有 .gemini/agents 后,仅写入本项目 agents",
97
- },
98
- {
99
- value: "skip",
100
- label: "跳过写入",
101
- hint: "不触碰 .gemini/agents",
102
- },
103
- ]);
104
- }
105
-
106
63
  module.exports = {
107
- selectTargets,
108
- selectAgentConflictPolicy,
109
- selectGeminiAgentsPolicy,
64
+ selectTargets
110
65
  };
@@ -7,7 +7,7 @@ class ManifestManager {
7
7
  this.manifestPath = manifestPath;
8
8
  this.options = options;
9
9
  this.manifest = {
10
- version: 3,
10
+ version: 2,
11
11
  target: typeof options.target === "string" ? options.target : "",
12
12
  kitVersion: typeof options.kitVersion === "string" ? options.kitVersion : "",
13
13
  updatedAt: "",
@@ -52,7 +52,7 @@ class ManifestManager {
52
52
 
53
53
  static normalizeManifestShape(input) {
54
54
  const output = {
55
- version: typeof input.version === "number" ? input.version : 3,
55
+ version: typeof input.version === "number" ? input.version : 2,
56
56
  target: typeof input.target === "string" ? input.target : "",
57
57
  kitVersion: typeof input.kitVersion === "string" ? input.kitVersion : "",
58
58
  updatedAt: typeof input.updatedAt === "string" ? input.updatedAt : "",
@@ -86,7 +86,7 @@ class ManifestManager {
86
86
  } catch (err) {
87
87
  this.lastLoadError = err;
88
88
  this.manifest = {
89
- version: 3,
89
+ version: 2,
90
90
  target: typeof this.options.target === "string" ? this.options.target : "",
91
91
  kitVersion: typeof this.options.kitVersion === "string" ? this.options.kitVersion : "",
92
92
  updatedAt: "",
package/bin/utils.js CHANGED
@@ -65,14 +65,19 @@ function cloneBranchAgentDir(branch, options) {
65
65
 
66
66
  const clonedAgentsDir = path.join(tempDir, ".agents");
67
67
  const clonedAgentDir = path.join(tempDir, ".agent");
68
- const selectedDir = fs.existsSync(clonedAgentsDir) ? clonedAgentsDir : clonedAgentDir;
69
- if (!fs.existsSync(selectedDir)) {
68
+ let templateDir = "";
69
+
70
+ if (fs.existsSync(clonedAgentsDir)) {
71
+ templateDir = clonedAgentsDir;
72
+ } else if (fs.existsSync(clonedAgentDir)) {
73
+ templateDir = clonedAgentDir;
74
+ } else {
70
75
  fs.rmSync(tempDir, { recursive: true, force: true });
71
76
  throw new Error(`分支 ${safeBranch} 中未找到 .agents 或 .agent 目录`);
72
77
  }
73
78
 
74
79
  return {
75
- agentDir: selectedDir,
80
+ agentDir: templateDir,
76
81
  cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
77
82
  };
78
83
  }
package/docs/PLAN.md ADDED
@@ -0,0 +1,39 @@
1
+ # Ag-Kit 规划(PLAN)
2
+
3
+ ## 一句话
4
+ Ag-Kit 只做一件事:把仓库内统一的 `.agents/` 模板,优雅地投影到不同平台(Gemini/Antigravity 与 Codex),并提供安全、可回滚的更新机制。
5
+
6
+ ## 设计原则
7
+ - 命令面少而强:用 `sync` 统一“首次安装 + 更新”,避免双心智。
8
+ - 默认安全:不做全局清理、不自动写入高风险全局规则。
9
+ - 模板源单一:仓库 Canonical 为 `.agents/`;旧 `.agent/` 只作为输入兼容,不作为主路径。
10
+
11
+ ## 能力边界(项目 vs 全局)
12
+ ### 项目安装(功能最完整)
13
+ - 命令:`ag-kit init` / `ag-kit update` / `ag-kit status` / `ag-kit doctor`
14
+ - 目标输出:
15
+ - `gemini` -> 项目内 `.agent/`(兼容 Gemini/Antigravity 工作区规范)
16
+ - `codex` -> 项目内 `.agents/`(受管目录)+ 注入工作区 `AGENTS.md` / `antigravity.rules` 托管区块
17
+
18
+ ### 全局安装(跨项目复用 Skills)
19
+ - 命令:`ag-kit global sync` / `ag-kit global status`
20
+ - 默认行为:`ag-kit global sync` 未指定 `--target/--targets` 时,同步 `codex + gemini`
21
+ - 目标路径:
22
+ - `codex` -> `$HOME/.codex/skills/`
23
+ - `gemini` -> 同时写入 `$HOME/.gemini/skills/` 与 `$HOME/.gemini/antigravity/skills/`
24
+ - 安全边界:全局只同步 Skills,不写入全局 Rules/Agents/Workflows。
25
+
26
+ ## 覆盖与回滚(全局同步)
27
+ - 覆盖单位:每个 Skill 目录。
28
+ - 覆盖策略:只覆盖同名 Skill;不清理用户已有的其他 Skill。
29
+ - 覆盖前备份:每次覆盖同名 Skill 前备份到 `$HOME/.ag-kit/backups/global/<timestamp>/...`。
30
+
31
+ ## 兼容策略
32
+ - Gemini/Antigravity:输出 `.agent/`,保持与官方工作区机制一致。
33
+ - Codex:受管目录为 `.agents/`,并使用 `manifest.json` 做完整性与漂移检测;识别并迁移遗留 `.codex/`。
34
+ - 全局同步遵循真实消费端目录,而不是仓库模板源目录;仓库内仍以 `.agents/` 作为唯一 Canonical。
35
+
36
+ ## 成功标准
37
+ - `ag-kit global sync` 一条命令即可完成全局 Skills 安装/更新(默认 codex + gemini,其中 gemini 同步到 gemini-cli 与 antigravity)。
38
+ - 覆盖可回滚:每次覆盖同名 Skill 都有可用备份。
39
+ - 跨平台 CI(Linux/macOS/Windows)验证主链路通过。
package/docs/TECH.md ADDED
@@ -0,0 +1,136 @@
1
+ # Ag-Kit 技术说明(TECH)
2
+
3
+ ## 快速验证(维护者)
4
+ ```bash
5
+ bun install
6
+ bun run test
7
+ bun run ci:verify
8
+ bun run health-check
9
+ cd web && bun install && bun run lint
10
+ ```
11
+
12
+ ## 核心目录与职责
13
+ - `.agents/`:仓库模板源(Canonical)
14
+ - `bin/ag-kit.js`:CLI 入口与命令分发
15
+ - `bin/adapters/`:目标差异(`gemini` / `codex`)
16
+ - `bin/core/`:构建/转换(将 Workflows 投影为 Codex Skills 等)
17
+ - `bin/utils/`:原子写入、manifest、托管区块等通用能力
18
+
19
+ ## 路径映射(最重要)
20
+ ### 项目级(功能最完整)
21
+ - `gemini`:项目根目录 `.agent/`
22
+ - `codex`:项目根目录 `.agents/`(受管)+ `.agents-backup/`(漂移覆盖备份)
23
+
24
+ ### 全局级(仅同步 Skills)
25
+ - `codex`:`$HOME/.codex/skills/`
26
+ - `gemini-cli`:`$HOME/.gemini/skills/`
27
+ - `antigravity`:`$HOME/.gemini/antigravity/skills/`
28
+
29
+ > 说明:仓库内 Skills 源路径为 `.agents/skills/`,全局同步会将其投影到真实工具读取的全局目录;仓库 Canonical 仍是 `.agents/`。
30
+
31
+ ## 端到端链路(简述)
32
+ ### 项目安装 / 更新
33
+ - `init`:选择目标 -> 适配器 `install()` -> 落盘目标目录(Gemini: `.agent/`;Codex: `.agents/`)->(Codex)注入托管区块到工作区 `AGENTS.md` 与 `antigravity.rules`
34
+ - `update`:自动检测已安装目标(或通过 `--target/--targets` 指定)-> 适配器 `update()` ->(Codex)漂移检测与备份 -> 原子替换
35
+ - `doctor`:检查完整性;`--fix` 尝试修复(Codex 支持迁移 `.codex/` 与重写托管区块)
36
+
37
+ ### Codex 构建(Workflow -> Skill)
38
+ - 输入:`.agents/skills/` 与 `.agents/workflows/`
39
+ - 规则:每个 Workflow `<name>.md` 会转换为一个 Skill:`workflow-<name>/SKILL.md`
40
+ - 输出(受管目录 `.agents/` 内):`skills/`、`codex.json`、`AGENTS.md`、`antigravity.rules`、`manifest.json`
41
+
42
+ ## 全局同步:`ag-kit global sync/status`
43
+ ### 默认目标
44
+ - 未指定 `--target/--targets`:默认同步 `codex + gemini`
45
+ - `--target gemini` / `--targets codex,gemini` 中的 `gemini` 会同时写入 gemini-cli 与 antigravity 两个消费端目录
46
+
47
+ ### 来源与覆盖策略
48
+ - 来源:默认使用本包内置 `.agents/`;也可用 `--branch <name>` 从远端分支拉取模板源
49
+ - 覆盖单位:每个 Skill 目录
50
+ - 覆盖策略:只覆盖同名 Skill,不清理其他 Skill
51
+ - 原子替换:按 Skill 目录原子替换,避免半写状态
52
+ - 覆盖前备份:覆盖同名 Skill 前备份到 `$HOME/.ag-kit/backups/global/<timestamp>/<consumer>/<skill>/...`
53
+ - `consumer` 可能是 `codex`、`gemini-cli`、`antigravity`
54
+
55
+ ### 测试隔离
56
+ - `AG_KIT_GLOBAL_ROOT`:替代 `$HOME`(用于测试与 CI,避免污染真实用户目录)
57
+
58
+ ## 状态契约(自动化)
59
+ - `ag-kit status --quiet` / `ag-kit global status --quiet` 只输出三态:
60
+ - `installed`:检测到目标且完整性正常
61
+ - `broken`:检测到目标但存在残缺、漂移或结构异常
62
+ - `missing`:未检测到任何已安装目标
63
+ - 退出码固定为:
64
+ - `0` = `installed`
65
+ - `1` = `broken`
66
+ - `2` = `missing`
67
+ - 若需要问题明细,使用 `ag-kit doctor`;`status` 负责健康状态,`doctor` 负责诊断细节。
68
+
69
+ ## 手动回滚(全局 Skills)
70
+ 1. 找到备份目录:`$HOME/.ag-kit/backups/global/<timestamp>/...`
71
+ 2. 按 Skill 回滚(推荐一次只处理一个 Skill 目录):
72
+ - Codex 目标:恢复到 `$HOME/.codex/skills/<skill>/`
73
+ - Gemini CLI:恢复到 `$HOME/.gemini/skills/<skill>/`
74
+ - Antigravity:恢复到 `$HOME/.gemini/antigravity/skills/<skill>/`
75
+
76
+ macOS / Linux 示例(把某个 Skill 回滚为备份版本):
77
+ ```bash
78
+ ts="2026-03-12T12-00-00-000Z"
79
+ skill="clean-code"
80
+ rm -rf "$HOME/.codex/skills/$skill"
81
+ cp -a "$HOME/.ag-kit/backups/global/$ts/codex/$skill" "$HOME/.codex/skills/$skill"
82
+ ```
83
+
84
+ Windows PowerShell 示例:
85
+ ```powershell
86
+ $ts = "2026-03-12T12-00-00-000Z"
87
+ $skill = "clean-code"
88
+ Remove-Item "$HOME\\.codex\\skills\\$skill" -Recurse -Force -ErrorAction SilentlyContinue
89
+ Copy-Item "$HOME\\.ag-kit\\backups\\global\\$ts\\codex\\$skill" "$HOME\\.codex\\skills\\$skill" -Recurse -Force
90
+ ```
91
+
92
+ Gemini CLI 回滚示例:
93
+ ```bash
94
+ ts="2026-03-12T12-00-00-000Z"
95
+ skill="clean-code"
96
+ rm -rf "$HOME/.gemini/skills/$skill"
97
+ cp -a "$HOME/.ag-kit/backups/global/$ts/gemini-cli/$skill" "$HOME/.gemini/skills/$skill"
98
+ ```
99
+
100
+ Antigravity 回滚示例:
101
+ ```bash
102
+ ts="2026-03-12T12-00-00-000Z"
103
+ skill="clean-code"
104
+ rm -rf "$HOME/.gemini/antigravity/skills/$skill"
105
+ cp -a "$HOME/.ag-kit/backups/global/$ts/antigravity/$skill" "$HOME/.gemini/antigravity/skills/$skill"
106
+ ```
107
+
108
+ ## 环境变量
109
+ - `AG_KIT_INDEX_PATH`:工作区索引文件路径(默认 `~/.ag-kit/workspaces.json`)
110
+ - `AG_KIT_GLOBAL_ROOT`:全局目录根(替代 `$HOME`)
111
+ - `AG_KIT_SKIP_UPSTREAM_CHECK`:跳过上游同名包安装提示(测试用)
112
+
113
+ ## 安装提示机制
114
+ - npm 全局安装:`postinstall` 会尽力检测并提示上游英文版 `@vudovn/ag-kit` 冲突。
115
+ - Bun 全局安装:Bun 默认会阻止本包 `postinstall`;因此冲突提示以内置 CLI 运行期检查为准,会在 `init` / `update` / `update-all` / `global sync` 时提示。
116
+ - 冲突提示只负责提醒,不会自动修改当前安装状态;如需清理可执行 `npm uninstall -g @vudovn/ag-kit`。
117
+
118
+ ## 常见故障
119
+ - 更新中断:原子替换保证不会出现半写状态;重新运行 `update`/`global sync` 即可。
120
+ - Windows `EPERM/EBUSY`:通常是目录被占用;关闭占用 `.agents/` 或目标 Skill 目录的进程后重试。
121
+ - 漂移覆盖:Codex 若检测到用户修改受管文件,会在覆盖前写入 `.agents-backup/<timestamp>/`。
122
+
123
+ ## Codex 官方 `.rules`(手动配置)
124
+ Ag-Kit 不会自动写入全局 `~/.codex/rules/default.rules`,避免引入不可预期的全局副作用。若你需要启用 Codex 官方命令审批策略(如 `prefix_rule()`),可按需手动创建:
125
+
126
+ ```python
127
+ # default.rules
128
+ load("builtin://rules/rules.star", "prefix_rule")
129
+
130
+ rules = [
131
+ prefix_rule(["ls"], action="allow"),
132
+ prefix_rule(["cat"], action="allow"),
133
+ prefix_rule(["rg"], action="allow"),
134
+ prefix_rule(["git", "status"], action="allow"),
135
+ ]
136
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mison/ag-kit-cn",
3
- "version": "3.0.0-beta.0",
3
+ "version": "3.0.0",
4
4
  "description": "AI Agent templates - Skills, Agents, and Workflows for enhanced coding assistance",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,28 +23,29 @@
23
23
  "scripts": {
24
24
  "clean": "node scripts/clean.js",
25
25
  "clean:dry-run": "node scripts/clean.js --dry-run",
26
- "health-check": "bash scripts/health-check.sh",
26
+ "health-check": "node scripts/health-check.js",
27
27
  "postinstall": "node scripts/postinstall-check.js",
28
- "test": "node --test \"tests/**/*.test.js\""
28
+ "test": "node --test \"tests/**/*.test.js\"",
29
+ "ci:verify": "node scripts/ci-verify.js"
29
30
  },
30
31
  "publishConfig": {
31
32
  "access": "public"
32
33
  },
33
34
  "files": [
34
35
  ".agents/**",
35
- ".agent/**",
36
36
  "bin/**",
37
+ "scripts/clean.js",
38
+ "scripts/ci-verify.js",
39
+ "scripts/health-check.js",
40
+ "scripts/health-check.sh",
37
41
  "scripts/postinstall-check.js",
42
+ "tests/**/*.test.js",
38
43
  "README.md",
39
44
  "LICENSE",
40
45
  "CHANGELOG.md",
41
46
  "AGENT_FLOW.md",
42
- "docs/codex-rules-template.md",
43
- "docs/mapping-spec.md",
44
- "docs/multi-target-adapter.md",
45
- "docs/operations.md",
46
- "docs/terminology-style-guide.md",
47
- "docs/official/**"
47
+ "docs/PLAN.md",
48
+ "docs/TECH.md"
48
49
  ],
49
50
  "bin": {
50
51
  "ag-kit": "./bin/ag-kit.js"
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const os = require("os");
5
+ const path = require("path");
6
+ const { spawnSync } = require("node:child_process");
7
+
8
+ const REPO_ROOT = path.resolve(__dirname, "..");
9
+ const CLI_PATH = path.join(REPO_ROOT, "bin", "ag-kit.js");
10
+
11
+ function runCli(args, options = {}) {
12
+ const env = {
13
+ ...process.env,
14
+ AG_KIT_SKIP_UPSTREAM_CHECK: "1",
15
+ ...options.env,
16
+ };
17
+
18
+ const result = spawnSync(process.execPath, [CLI_PATH, ...args], {
19
+ cwd: REPO_ROOT,
20
+ env,
21
+ encoding: "utf8",
22
+ });
23
+
24
+ if (result.status !== 0) {
25
+ const message = result.stderr || result.stdout || "";
26
+ throw new Error(`命令失败: ag-kit ${args.join(" ")}\n${message}`);
27
+ }
28
+
29
+ return result.stdout || "";
30
+ }
31
+
32
+ function ensureExists(targetPath, label) {
33
+ if (!fs.existsSync(targetPath)) {
34
+ throw new Error(`缺少 ${label}: ${targetPath}`);
35
+ }
36
+ }
37
+
38
+ function main() {
39
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "ag-kit-ci-"));
40
+ const workspaceDir = path.join(tempRoot, "workspace");
41
+ const indexPath = path.join(tempRoot, "workspaces.json");
42
+ const globalRoot = path.join(tempRoot, "global-root");
43
+
44
+ fs.mkdirSync(workspaceDir, { recursive: true });
45
+
46
+ const env = {
47
+ AG_KIT_INDEX_PATH: indexPath,
48
+ AG_KIT_GLOBAL_ROOT: globalRoot,
49
+ };
50
+
51
+ runCli(["init", "--targets", "gemini,codex", "--path", workspaceDir, "--quiet"], { env });
52
+
53
+ const status = runCli(["status", "--path", workspaceDir, "--quiet"], { env }).trim();
54
+ if (status !== "installed") {
55
+ throw new Error(`status 结果异常: ${status}`);
56
+ }
57
+
58
+ runCli(["doctor", "--path", workspaceDir, "--quiet"], { env });
59
+ runCli(["update", "--path", workspaceDir, "--quiet"], { env });
60
+ runCli(["update-all", "--dry-run", "--quiet"], { env });
61
+
62
+ runCli(["exclude", "add", "--path", workspaceDir, "--quiet"], { env });
63
+ const excluded = runCli(["exclude", "list", "--quiet"], { env });
64
+ if (!excluded.split(/\r?\n/).includes(workspaceDir)) {
65
+ throw new Error("exclude add 未生效");
66
+ }
67
+ runCli(["exclude", "remove", "--path", workspaceDir, "--quiet"], { env });
68
+ const excludedAfter = runCli(["exclude", "list", "--quiet"], { env });
69
+ if (excludedAfter.split(/\r?\n/).includes(workspaceDir)) {
70
+ throw new Error("exclude remove 未生效");
71
+ }
72
+
73
+ runCli(["global", "sync", "--quiet"], { env });
74
+ const globalStatus = runCli(["global", "status", "--quiet"], { env }).trim();
75
+ if (globalStatus !== "installed") {
76
+ throw new Error(`global status 结果异常: ${globalStatus}`);
77
+ }
78
+
79
+ const codexSkill = path.join(globalRoot, ".codex", "skills", "workflow-plan", "SKILL.md");
80
+ const geminiCliSkill = path.join(globalRoot, ".gemini", "skills", "clean-code", "SKILL.md");
81
+ const antigravitySkill = path.join(globalRoot, ".gemini", "antigravity", "skills", "clean-code", "SKILL.md");
82
+ ensureExists(codexSkill, "全局 Codex workflow-plan Skill");
83
+ ensureExists(geminiCliSkill, "全局 Gemini CLI clean-code Skill");
84
+ ensureExists(antigravitySkill, "全局 Antigravity clean-code Skill");
85
+
86
+ fs.rmSync(tempRoot, { recursive: true, force: true });
87
+ }
88
+
89
+ try {
90
+ main();
91
+ console.log("✅ CI 全链路演练通过");
92
+ } catch (err) {
93
+ console.error(`❌ ${err.message}`);
94
+ process.exit(1);
95
+ }
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ const DEFAULT_RELATIVE_TARGETS = [
7
+ ".temp_ag_kit",
8
+ "coverage",
9
+ "web/.next",
10
+ "web/node_modules",
11
+ "web/out",
12
+ "web/.turbo",
13
+ ];
14
+
15
+ function parseArgs(argv) {
16
+ const options = {
17
+ dryRun: false,
18
+ quiet: false,
19
+ };
20
+
21
+ for (const arg of argv) {
22
+ if (arg === "--dry-run") {
23
+ options.dryRun = true;
24
+ continue;
25
+ }
26
+ if (arg === "--quiet") {
27
+ options.quiet = true;
28
+ continue;
29
+ }
30
+ if (arg === "--help" || arg === "-h") {
31
+ options.help = true;
32
+ continue;
33
+ }
34
+ throw new Error(`未知参数: ${arg}`);
35
+ }
36
+
37
+ return options;
38
+ }
39
+
40
+ function removeTarget(rootDir, relativePath, options) {
41
+ const absolutePath = path.join(rootDir, relativePath);
42
+ const exists = fs.existsSync(absolutePath);
43
+ const result = {
44
+ path: relativePath,
45
+ absolutePath,
46
+ action: "skipped",
47
+ reason: "",
48
+ };
49
+
50
+ if (!exists) {
51
+ result.reason = "not_found";
52
+ return result;
53
+ }
54
+
55
+ if (options.dryRun) {
56
+ result.action = "would_remove";
57
+ return result;
58
+ }
59
+
60
+ fs.rmSync(absolutePath, { recursive: true, force: true });
61
+ result.action = "removed";
62
+ return result;
63
+ }
64
+
65
+ function runClean(options = {}) {
66
+ const rootDir = path.resolve(options.rootDir || path.join(__dirname, ".."));
67
+ const targets = Array.isArray(options.targets) && options.targets.length > 0
68
+ ? options.targets
69
+ : DEFAULT_RELATIVE_TARGETS;
70
+
71
+ const normalizedOptions = {
72
+ dryRun: Boolean(options.dryRun),
73
+ quiet: Boolean(options.quiet),
74
+ };
75
+
76
+ const results = targets.map((targetPath) => removeTarget(rootDir, targetPath, normalizedOptions));
77
+ const removedCount = results.filter((item) => item.action === "removed").length;
78
+ const wouldRemoveCount = results.filter((item) => item.action === "would_remove").length;
79
+ const skippedCount = results.filter((item) => item.action === "skipped").length;
80
+
81
+ if (!normalizedOptions.quiet) {
82
+ for (const item of results) {
83
+ if (item.action === "removed") {
84
+ console.log(`🧹 已清理: ${item.path}`);
85
+ continue;
86
+ }
87
+ if (item.action === "would_remove") {
88
+ console.log(`[dry-run] 将清理: ${item.path}`);
89
+ continue;
90
+ }
91
+ console.log(`⏭️ 已跳过: ${item.path} (${item.reason})`);
92
+ }
93
+ console.log(`📊 清理完成: removed=${removedCount}, dryRun=${wouldRemoveCount}, skipped=${skippedCount}`);
94
+ }
95
+
96
+ return {
97
+ rootDir,
98
+ removedCount,
99
+ wouldRemoveCount,
100
+ skippedCount,
101
+ results,
102
+ };
103
+ }
104
+
105
+ if (require.main === module) {
106
+ try {
107
+ const options = parseArgs(process.argv.slice(2));
108
+ if (options.help) {
109
+ console.log("用法: node scripts/clean.js [--dry-run] [--quiet]");
110
+ process.exit(0);
111
+ }
112
+ runClean(options);
113
+ } catch (err) {
114
+ console.error(`❌ ${err.message}`);
115
+ process.exit(1);
116
+ }
117
+ }
118
+
119
+ module.exports = {
120
+ DEFAULT_RELATIVE_TARGETS,
121
+ parseArgs,
122
+ runClean,
123
+ };