ai-factory 1.9.1 → 2.1.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 (169) hide show
  1. package/README.md +41 -14
  2. package/dist/cli/commands/init.d.ts.map +1 -1
  3. package/dist/cli/commands/init.js +106 -51
  4. package/dist/cli/commands/init.js.map +1 -1
  5. package/dist/cli/commands/update.d.ts.map +1 -1
  6. package/dist/cli/commands/update.js +32 -21
  7. package/dist/cli/commands/update.js.map +1 -1
  8. package/dist/cli/commands/upgrade.d.ts +2 -0
  9. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  10. package/dist/cli/commands/upgrade.js +179 -0
  11. package/dist/cli/commands/upgrade.js.map +1 -0
  12. package/dist/cli/index.js +5 -0
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/cli/wizard/detector.d.ts.map +1 -1
  15. package/dist/cli/wizard/detector.js +10 -11
  16. package/dist/cli/wizard/detector.js.map +1 -1
  17. package/dist/cli/wizard/prompts.d.ts +7 -5
  18. package/dist/cli/wizard/prompts.d.ts.map +1 -1
  19. package/dist/cli/wizard/prompts.js +65 -62
  20. package/dist/cli/wizard/prompts.js.map +1 -1
  21. package/dist/core/agents.d.ts +1 -0
  22. package/dist/core/agents.d.ts.map +1 -1
  23. package/dist/core/agents.js +24 -1
  24. package/dist/core/agents.js.map +1 -1
  25. package/dist/core/config.d.ts +14 -9
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +48 -10
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/installer.d.ts +2 -2
  30. package/dist/core/installer.d.ts.map +1 -1
  31. package/dist/core/installer.js +4 -4
  32. package/dist/core/installer.js.map +1 -1
  33. package/dist/core/template.d.ts +1 -0
  34. package/dist/core/template.d.ts.map +1 -1
  35. package/dist/core/template.js +2 -1
  36. package/dist/core/template.js.map +1 -1
  37. package/dist/core/transformer.d.ts.map +1 -1
  38. package/dist/core/transformer.js +12 -12
  39. package/dist/core/transformer.js.map +1 -1
  40. package/dist/core/transformers/antigravity.js +19 -19
  41. package/dist/core/transformers/antigravity.js.map +1 -1
  42. package/dist/core/transformers/codex.d.ts +6 -0
  43. package/dist/core/transformers/codex.d.ts.map +1 -0
  44. package/dist/core/transformers/codex.js +20 -0
  45. package/dist/core/transformers/codex.js.map +1 -0
  46. package/dist/core/transformers/kilocode.d.ts +3 -2
  47. package/dist/core/transformers/kilocode.d.ts.map +1 -1
  48. package/dist/core/transformers/kilocode.js +14 -3
  49. package/dist/core/transformers/kilocode.js.map +1 -1
  50. package/dist/core/transformers/qwen.d.ts +6 -0
  51. package/dist/core/transformers/qwen.d.ts.map +1 -0
  52. package/dist/core/transformers/qwen.js +21 -0
  53. package/dist/core/transformers/qwen.js.map +1 -0
  54. package/dist/utils/fs.d.ts +2 -0
  55. package/dist/utils/fs.d.ts.map +1 -1
  56. package/dist/utils/fs.js +6 -0
  57. package/dist/utils/fs.js.map +1 -1
  58. package/package.json +4 -1
  59. package/skills/{ai-factory → aif}/SKILL.md +55 -30
  60. package/skills/aif-architecture/SKILL.md +338 -0
  61. package/skills/{best-practices → aif-best-practices}/SKILL.md +11 -8
  62. package/skills/{build-automation → aif-build-automation}/SKILL.md +5 -166
  63. package/skills/aif-build-automation/references/DOC-INTEGRATION.md +103 -0
  64. package/skills/aif-build-automation/references/SUMMARY-FORMAT.md +69 -0
  65. package/skills/{ci → aif-ci}/SKILL.md +15 -352
  66. package/skills/aif-ci/references/AUDIT-REPORT.md +79 -0
  67. package/skills/aif-ci/references/GITLAB-PATTERNS.md +65 -0
  68. package/skills/aif-ci/references/SERVICE-CONTAINERS.md +37 -0
  69. package/skills/aif-ci/references/TOOL-COMMANDS.md +119 -0
  70. package/skills/{commit → aif-commit}/SKILL.md +10 -3
  71. package/skills/{deploy → aif-deploy}/SKILL.md +6 -6
  72. package/skills/{dockerize → aif-dockerize}/SKILL.md +31 -431
  73. package/skills/aif-dockerize/references/AUDIT-GUIDE.md +125 -0
  74. package/skills/aif-dockerize/references/COMPOSE-PATTERNS.md +31 -0
  75. package/skills/aif-dockerize/references/DEPLOY-SCRIPTS.md +60 -0
  76. package/skills/aif-dockerize/references/FILE-ORGANIZATION.md +106 -0
  77. package/skills/aif-dockerize/references/SUMMARY-FORMAT.md +54 -0
  78. package/skills/{docs → aif-docs}/SKILL.md +9 -222
  79. package/skills/aif-docs/references/REVIEW-CHECKLISTS.md +95 -0
  80. package/skills/aif-docs/templates/html-template.html +103 -0
  81. package/skills/{evolve → aif-evolve}/SKILL.md +28 -29
  82. package/skills/{fix → aif-fix}/SKILL.md +43 -17
  83. package/skills/aif-grounded/SKILL.md +90 -0
  84. package/skills/{implement → aif-implement}/SKILL.md +84 -161
  85. package/skills/aif-implement/references/IMPLEMENTATION-GUIDE.md +90 -0
  86. package/skills/aif-implement/references/LOGGING-GUIDE.md +65 -0
  87. package/skills/{improve → aif-improve}/SKILL.md +19 -19
  88. package/skills/aif-loop/SKILL.md +464 -0
  89. package/skills/aif-loop/references/CRITERIA-TEMPLATES.md +86 -0
  90. package/skills/aif-loop/references/PHASE-CONTRACTS.md +178 -0
  91. package/skills/aif-loop/references/RULE-SCHEMA.md +111 -0
  92. package/skills/aif-plan/SKILL.md +480 -0
  93. package/skills/aif-plan/references/EXAMPLES.md +104 -0
  94. package/skills/aif-plan/references/TASK-FORMAT.md +70 -0
  95. package/skills/{review → aif-review}/SKILL.md +4 -4
  96. package/skills/aif-roadmap/SKILL.md +273 -0
  97. package/skills/aif-rules/SKILL.md +105 -0
  98. package/skills/aif-security-checklist/SKILL.md +463 -0
  99. package/skills/aif-security-checklist/references/AUTH-PATTERNS.md +67 -0
  100. package/skills/aif-security-checklist/references/PROMPT-INJECTION.md +87 -0
  101. package/skills/aif-security-checklist/references/RACE-CONDITIONS.md +139 -0
  102. package/skills/{security-checklist → aif-security-checklist}/scripts/audit.sh +1 -1
  103. package/skills/{skill-generator → aif-skill-generator}/SKILL.md +26 -68
  104. package/skills/{skill-generator → aif-skill-generator}/references/LEARN-MODE.md +9 -9
  105. package/skills/aif-skill-generator/references/SECURITY-SCANNING.md +61 -0
  106. package/skills/{skill-generator → aif-skill-generator}/scripts/search-skills.py +1 -0
  107. package/skills/{skill-generator → aif-skill-generator}/scripts/validate.sh +16 -32
  108. package/skills/{verify → aif-verify}/SKILL.md +37 -25
  109. package/dist/core/transformers/spec-compliant.d.ts +0 -12
  110. package/dist/core/transformers/spec-compliant.d.ts.map +0 -1
  111. package/dist/core/transformers/spec-compliant.js +0 -22
  112. package/dist/core/transformers/spec-compliant.js.map +0 -1
  113. package/skills/architecture/SKILL.md +0 -364
  114. package/skills/feature/SKILL.md +0 -429
  115. package/skills/security-checklist/SKILL.md +0 -846
  116. package/skills/task/SKILL.md +0 -313
  117. /package/skills/{build-automation → aif-build-automation}/references/BEST-PRACTICES.md +0 -0
  118. /package/skills/{build-automation → aif-build-automation}/templates/justfile-go +0 -0
  119. /package/skills/{build-automation → aif-build-automation}/templates/justfile-node +0 -0
  120. /package/skills/{build-automation → aif-build-automation}/templates/justfile-php +0 -0
  121. /package/skills/{build-automation → aif-build-automation}/templates/justfile-python +0 -0
  122. /package/skills/{build-automation → aif-build-automation}/templates/magefile-basic.go +0 -0
  123. /package/skills/{build-automation → aif-build-automation}/templates/magefile-full.go +0 -0
  124. /package/skills/{build-automation → aif-build-automation}/templates/makefile-go.mk +0 -0
  125. /package/skills/{build-automation → aif-build-automation}/templates/makefile-node.mk +0 -0
  126. /package/skills/{build-automation → aif-build-automation}/templates/makefile-php.mk +0 -0
  127. /package/skills/{build-automation → aif-build-automation}/templates/makefile-python.mk +0 -0
  128. /package/skills/{build-automation → aif-build-automation}/templates/taskfile-go.yml +0 -0
  129. /package/skills/{build-automation → aif-build-automation}/templates/taskfile-node.yml +0 -0
  130. /package/skills/{build-automation → aif-build-automation}/templates/taskfile-php.yml +0 -0
  131. /package/skills/{build-automation → aif-build-automation}/templates/taskfile-python.yml +0 -0
  132. /package/skills/{ci → aif-ci}/references/BEST-PRACTICES.md +0 -0
  133. /package/skills/{ci → aif-ci}/templates/github/go.yml +0 -0
  134. /package/skills/{ci → aif-ci}/templates/github/java.yml +0 -0
  135. /package/skills/{ci → aif-ci}/templates/github/node.yml +0 -0
  136. /package/skills/{ci → aif-ci}/templates/github/php.yml +0 -0
  137. /package/skills/{ci → aif-ci}/templates/github/python.yml +0 -0
  138. /package/skills/{ci → aif-ci}/templates/github/rust.yml +0 -0
  139. /package/skills/{ci → aif-ci}/templates/gitlab/go.yml +0 -0
  140. /package/skills/{ci → aif-ci}/templates/gitlab/java.yml +0 -0
  141. /package/skills/{ci → aif-ci}/templates/gitlab/node.yml +0 -0
  142. /package/skills/{ci → aif-ci}/templates/gitlab/php.yml +0 -0
  143. /package/skills/{ci → aif-ci}/templates/gitlab/python.yml +0 -0
  144. /package/skills/{ci → aif-ci}/templates/gitlab/rust.yml +0 -0
  145. /package/skills/{dockerize → aif-dockerize}/references/BEST-PRACTICES.md +0 -0
  146. /package/skills/{dockerize → aif-dockerize}/references/SECURITY-CHECKLIST.md +0 -0
  147. /package/skills/{dockerize → aif-dockerize}/templates/backup.sh +0 -0
  148. /package/skills/{dockerize → aif-dockerize}/templates/compose-base.yml +0 -0
  149. /package/skills/{dockerize → aif-dockerize}/templates/compose-override-dev.yml +0 -0
  150. /package/skills/{dockerize → aif-dockerize}/templates/compose-production.yml +0 -0
  151. /package/skills/{dockerize → aif-dockerize}/templates/deploy.sh +0 -0
  152. /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-go +0 -0
  153. /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-node +0 -0
  154. /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-php +0 -0
  155. /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-python +0 -0
  156. /package/skills/{dockerize → aif-dockerize}/templates/dockerignore +0 -0
  157. /package/skills/{dockerize → aif-dockerize}/templates/health-check.sh +0 -0
  158. /package/skills/{dockerize → aif-dockerize}/templates/logs.sh +0 -0
  159. /package/skills/{dockerize → aif-dockerize}/templates/rollback.sh +0 -0
  160. /package/skills/{dockerize → aif-dockerize}/templates/update.sh +0 -0
  161. /package/skills/{skill-generator → aif-skill-generator}/references/BEST-PRACTICES.md +0 -0
  162. /package/skills/{skill-generator → aif-skill-generator}/references/EXAMPLES.md +0 -0
  163. /package/skills/{skill-generator → aif-skill-generator}/references/SPECIFICATION.md +0 -0
  164. /package/skills/{skill-generator → aif-skill-generator}/scripts/security-scan.py +0 -0
  165. /package/skills/{skill-generator → aif-skill-generator}/templates/basic.md +0 -0
  166. /package/skills/{skill-generator → aif-skill-generator}/templates/dynamic-context.md +0 -0
  167. /package/skills/{skill-generator → aif-skill-generator}/templates/research.md +0 -0
  168. /package/skills/{skill-generator → aif-skill-generator}/templates/task.md +0 -0
  169. /package/skills/{skill-generator → aif-skill-generator}/templates/visual.md +0 -0
package/README.md CHANGED
@@ -1,4 +1,16 @@
1
- ![logo](https://github.com/lee-to/ai-factory/raw/main/art/promo.png)
1
+ <p align="center">
2
+ <a href="https://www.npmjs.com/package/ai-factory">
3
+ <img src="https://img.shields.io/npm/v/ai-factory?label=version" alt="Version" />
4
+ </a>
5
+ <a href="https://aif.cutcode.dev/">
6
+ <img src="https://img.shields.io/badge/official%20site-aif.cutcode.dev-0ea5e9" alt="Official Site" />
7
+ </a>
8
+ <a href="https://github.com/lee-to/ai-factory/actions/workflows/ci.yml">
9
+ <img src="https://img.shields.io/github/actions/workflow/status/lee-to/ai-factory/ci.yml?branch=2.x&label=tests" alt="Tests" />
10
+ </a>
11
+ </p>
12
+
13
+ ![logo](https://github.com/lee-to/ai-factory/raw/2.x/art/promo.png)
2
14
 
3
15
  # AI Factory
4
16
 
@@ -21,18 +33,20 @@ ai-factory init
21
33
  - **Spec-driven development** — AI follows plans, not random exploration. Predictable, resumable, reviewable
22
34
  - **Community skills** — leverage [skills.sh](https://skills.sh) ecosystem or generate custom skills
23
35
  - **Works with your stack** — Next.js, Laravel, Django, Express, and more
24
- - **Multi-agent support** — Claude Code, Cursor, Windsurf, Roo Code, Kilo Code, Antigravity, OpenCode, Warp, Zencoder, Codex CLI, GitHub Copilot, Gemini CLI, Junie, or [any agent](docs/getting-started.md#supported-agents)
36
+ - **Multi-agent support** — Claude Code, Cursor, Windsurf, Roo Code, Kilo Code, Antigravity, OpenCode, Warp, Zencoder, Codex CLI, GitHub Copilot, Gemini CLI, Junie, Qwen Code, or [any agent](docs/getting-started.md#supported-agents)
25
37
 
26
38
  ---
27
39
 
28
40
  ## Installation
29
41
 
30
42
  ### Using npm
43
+
31
44
  ```bash
32
45
  npm install -g ai-factory
33
46
  ```
34
47
 
35
48
  ### Using mise
49
+
36
50
  ```bash
37
51
  mise use -g npm:ai-factory
38
52
  ```
@@ -53,10 +67,9 @@ This will:
53
67
  Then open your AI agent and start working:
54
68
 
55
69
  ```
56
- /ai-factory
70
+ /aif
57
71
  ```
58
72
 
59
-
60
73
  ## Usage
61
74
 
62
75
  If the package is installed:
@@ -69,26 +82,38 @@ Or running without installation via `npx`:
69
82
  npx ai-factory init
70
83
  ```
71
84
 
85
+ ### Upgrading from v1 to v2
86
+
87
+ ```bash
88
+ # 1) Update the CLI package
89
+ npm install -g ai-factory@latest
90
+
91
+ # 2) Migrate existing skills to v2 naming
92
+ ai-factory upgrade
93
+ ```
94
+
95
+ `ai-factory upgrade` removes old bare-named skills (`commit`, `feature`, etc.) and installs new `aif-*` prefixed versions. Custom skills are preserved.
96
+
72
97
  ### Example Workflow
73
98
 
74
99
  ```bash
75
100
  # Plan a feature — creates branch, analyzes codebase, builds step-by-step plan
76
- /ai-factory.feature Add user authentication with OAuth
101
+ /aif-plan Add user authentication with OAuth
77
102
 
78
103
  # Optionally refine the plan with deeper analysis
79
- /ai-factory.improve
104
+ /aif-improve
80
105
 
81
106
  # Execute the plan — implements tasks one by one, commits at checkpoints
82
- /ai-factory.implement
107
+ /aif-implement
83
108
 
84
109
  # Fix a bug — AI learns from every fix and gets smarter over time
85
- /ai-factory.fix TypeError: Cannot read property 'name' of undefined
110
+ /aif-fix TypeError: Cannot read property 'name' of undefined
86
111
 
87
112
  # Set up CI pipeline — GitHub Actions or GitLab CI with linting, SA, tests
88
- /ai-factory.ci github
113
+ /aif-ci github
89
114
 
90
115
  # Generate project documentation — README + docs/ with topics
91
- /ai-factory.docs
116
+ /aif-docs
92
117
  ```
93
118
 
94
119
  See the full [Development Workflow](docs/workflow.md) with diagram and decision table.
@@ -98,13 +123,13 @@ See the full [Development Workflow](docs/workflow.md) with diagram and decision
98
123
  AI Factory can generate and maintain your project docs with a single command:
99
124
 
100
125
  ```bash
101
- /ai-factory.docs # Creates README + docs/ structure from your codebase
102
- /ai-factory.docs --web # Also generates a static HTML documentation site
126
+ /aif-docs # Creates README + docs/ structure from your codebase
127
+ /aif-docs --web # Also generates a static HTML documentation site
103
128
  ```
104
129
 
105
130
  - **Generates docs from scratch** — analyzes your codebase and creates a lean README + detailed `docs/` pages by topic
106
131
  - **Cleans up scattered files** — finds loose CONTRIBUTING.md, ARCHITECTURE.md, SETUP.md in your root and consolidates them into a structured `docs/` directory
107
- - **Keeps docs in sync** — integrates with `/ai-factory.implement` so documentation is updated automatically after each feature
132
+ - **Keeps docs in sync** — integrates with `/aif-implement` so documentation is updated automatically after each feature
108
133
  - **Builds a docs website** — `--web` generates a static HTML site with navigation and dark mode, ready to host
109
134
 
110
135
  ---
@@ -115,6 +140,7 @@ AI Factory can generate and maintain your project docs with a single command:
115
140
  |-------|-------------|
116
141
  | [Getting Started](docs/getting-started.md) | What is AI Factory, supported agents, CLI commands |
117
142
  | [Development Workflow](docs/workflow.md) | Workflow diagram, when to use what, spec-driven approach |
143
+ | [Reflex Loop](docs/loop.md) | Iterative generate → evaluate → critique → refine workflow |
118
144
  | [Core Skills](docs/skills.md) | All slash commands — feature, task, fix, implement, evolve, docs, and more |
119
145
  | [Plan Files](docs/plan-files.md) | Plan files, self-improvement patches, skill acquisition |
120
146
  | [Security](docs/security.md) | Two-level security scanning for external skills |
@@ -122,10 +148,11 @@ AI Factory can generate and maintain your project docs with a single command:
122
148
 
123
149
  ---
124
150
 
125
- ![happy](https://github.com/lee-to/ai-factory/raw/main/art/happy.png)
151
+ ![happy](https://github.com/lee-to/ai-factory/raw/2.x/art/happy.png)
126
152
 
127
153
  ## Links
128
154
 
155
+ - [Official Website](https://aif.cutcode.dev) - AI Factory website
129
156
  - [skills.sh](https://skills.sh) - Skill marketplace
130
157
  - [Agent Skills Spec](https://agentskills.io) - Skill specification
131
158
  - [Claude Code](https://claude.ai/code) - Anthropic's AI coding agent
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0FjD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAqCA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAiIjD"}
@@ -2,76 +2,131 @@ import chalk from 'chalk';
2
2
  import path from 'path';
3
3
  import { runWizard } from '../wizard/prompts.js';
4
4
  import { installSkills } from '../../core/installer.js';
5
- import { createDefaultConfig, saveConfig, configExists } from '../../core/config.js';
5
+ import { saveConfig, configExists, loadConfig, getCurrentVersion } from '../../core/config.js';
6
6
  import { configureMcp, getMcpInstructions } from '../../core/mcp.js';
7
7
  import { getAgentConfig } from '../../core/agents.js';
8
8
  import { getTransformer } from '../../core/transformer.js';
9
+ import { WORKFLOW_SKILLS } from '../../core/transformer.js';
10
+ import { fileExists, removeDirectory, removeFile } from '../../utils/fs.js';
11
+ async function removeAgentSetup(projectDir, agent) {
12
+ const agentConfig = getAgentConfig(agent.id);
13
+ await removeDirectory(path.join(projectDir, agent.skillsDir));
14
+ if (agent.id === 'antigravity') {
15
+ const workflowsDir = path.join(projectDir, agentConfig.configDir, 'workflows');
16
+ for (const workflow of WORKFLOW_SKILLS) {
17
+ const workflowFile = path.join(workflowsDir, `${workflow}.md`);
18
+ if (await fileExists(workflowFile)) {
19
+ await removeFile(workflowFile);
20
+ }
21
+ }
22
+ for (const ruleFile of ['aif-guardrails.md', 'aif-conventions.md']) {
23
+ const rulePath = path.join(projectDir, agentConfig.configDir, 'rules', ruleFile);
24
+ if (await fileExists(rulePath)) {
25
+ await removeFile(rulePath);
26
+ }
27
+ }
28
+ }
29
+ // Keep agent settings file intact: it may contain user-managed configuration
30
+ // unrelated to AI Factory.
31
+ }
9
32
  export async function initCommand() {
10
33
  const projectDir = process.cwd();
11
34
  console.log(chalk.bold.blue('\n🏭 AI Factory - Project Setup\n'));
12
- if (await configExists(projectDir)) {
35
+ const hasExistingConfig = await configExists(projectDir);
36
+ const existingConfig = hasExistingConfig ? await loadConfig(projectDir) : null;
37
+ if (hasExistingConfig) {
13
38
  console.log(chalk.yellow('Warning: .ai-factory.json already exists.'));
14
- console.log('Use "ai-factory update" to update existing skills.\n');
39
+ console.log('Running init will reconfigure selected agents (add/remove) and reinstall base skills.\n');
15
40
  }
16
41
  try {
17
- const answers = await runWizard(projectDir);
42
+ const existingAgentIds = existingConfig?.agents.map(agent => agent.id) ?? [];
43
+ const answers = await runWizard(projectDir, existingAgentIds);
44
+ const selectedAgentIds = new Set(answers.agents.map(agent => agent.id));
45
+ const removedAgents = (existingConfig?.agents ?? []).filter(agent => !selectedAgentIds.has(agent.id));
46
+ if (removedAgents.length > 0) {
47
+ console.log(chalk.dim('\nRemoving deselected agent setups...\n'));
48
+ for (const removedAgent of removedAgents) {
49
+ await removeAgentSetup(projectDir, removedAgent);
50
+ console.log(chalk.yellow(` Removed: ${removedAgent.id}`));
51
+ }
52
+ }
18
53
  console.log(chalk.dim('\nInstalling skills...\n'));
19
- const installedSkills = await installSkills({
20
- projectDir,
21
- skillsDir: answers.skillsDir,
22
- skills: answers.selectedSkills,
23
- stack: null, // Stack-specific skills generated by /ai-factory in Claude
24
- agentId: answers.agent,
25
- });
26
- const config = createDefaultConfig(answers.agent);
27
- config.installedSkills = installedSkills;
28
- config.mcp = {
29
- github: answers.mcpGithub,
30
- filesystem: answers.mcpFilesystem,
31
- postgres: answers.mcpPostgres,
32
- };
33
- await saveConfig(projectDir, config);
34
- console.log(chalk.green('✓ Configuration saved to .ai-factory.json'));
35
- let configuredMcp = [];
36
- if (answers.mcpGithub || answers.mcpFilesystem || answers.mcpPostgres || answers.mcpChromeDevtools) {
37
- configuredMcp = await configureMcp(projectDir, {
38
- github: answers.mcpGithub,
39
- filesystem: answers.mcpFilesystem,
40
- postgres: answers.mcpPostgres,
41
- chromeDevtools: answers.mcpChromeDevtools,
42
- }, answers.agent);
54
+ const installedAgents = [];
55
+ const mcpSummary = {};
56
+ for (const agentSelection of answers.agents) {
57
+ const agentConfig = getAgentConfig(agentSelection.id);
58
+ const installedSkills = await installSkills({
59
+ projectDir,
60
+ skillsDir: agentConfig.skillsDir,
61
+ skills: answers.selectedSkills,
62
+ stack: null, // Stack-specific skills generated by /aif in Claude
63
+ agentId: agentSelection.id,
64
+ });
65
+ const configuredMcp = await configureMcp(projectDir, {
66
+ github: agentSelection.mcpGithub,
67
+ filesystem: agentSelection.mcpFilesystem,
68
+ postgres: agentSelection.mcpPostgres,
69
+ chromeDevtools: agentSelection.mcpChromeDevtools,
70
+ }, agentSelection.id);
43
71
  if (configuredMcp.length > 0) {
44
- console.log(chalk.green(`✓ MCP servers configured: ${configuredMcp.join(', ')}`));
72
+ mcpSummary[agentSelection.id] = configuredMcp;
45
73
  }
74
+ installedAgents.push({
75
+ id: agentSelection.id,
76
+ skillsDir: agentConfig.skillsDir,
77
+ installedSkills,
78
+ mcp: {
79
+ github: agentSelection.mcpGithub,
80
+ filesystem: agentSelection.mcpFilesystem,
81
+ postgres: agentSelection.mcpPostgres,
82
+ chromeDevtools: agentSelection.mcpChromeDevtools,
83
+ },
84
+ });
46
85
  }
86
+ await saveConfig(projectDir, {
87
+ version: getCurrentVersion(),
88
+ agents: installedAgents,
89
+ });
90
+ console.log(chalk.green('✓ Configuration saved to .ai-factory.json'));
47
91
  console.log(chalk.bold.green('\n✅ Setup complete!\n'));
48
- console.log(chalk.bold('Installed skills:'));
49
- for (const skill of installedSkills) {
50
- console.log(chalk.dim(` - ${skill}`));
51
- }
52
- console.log('');
53
- console.log(chalk.dim(`Skills directory: ${path.join(projectDir, answers.skillsDir)}`));
54
- if (configuredMcp.length > 0) {
55
- console.log(chalk.bold('\nMCP Configuration:'));
56
- const instructions = getMcpInstructions(configuredMcp);
57
- for (const instruction of instructions) {
58
- console.log(chalk.dim(` ${instruction}`));
92
+ for (const agent of installedAgents) {
93
+ const agentConfig = getAgentConfig(agent.id);
94
+ console.log(chalk.bold(`${agentConfig.displayName}:`));
95
+ console.log(chalk.dim(` Skills directory: ${path.join(projectDir, agent.skillsDir)}`));
96
+ console.log(chalk.dim(` Installed skills: ${agent.installedSkills.length}`));
97
+ const configuredMcp = mcpSummary[agent.id];
98
+ if (configuredMcp && configuredMcp.length > 0) {
99
+ console.log(chalk.green(` MCP servers configured: ${configuredMcp.join(', ')}`));
100
+ const instructions = getMcpInstructions(configuredMcp);
101
+ for (const instruction of instructions) {
102
+ console.log(chalk.dim(` ${instruction}`));
103
+ }
59
104
  }
105
+ console.log('');
60
106
  }
61
- const agentConfig = getAgentConfig(answers.agent);
62
- const transformer = getTransformer(answers.agent);
63
107
  console.log(chalk.bold('\nNext steps:'));
64
- const welcomeMessage = transformer.getWelcomeMessage?.();
65
- if (welcomeMessage) {
66
- for (const line of welcomeMessage) {
67
- console.log(chalk.dim(` ${line}`));
108
+ const includesCodex = installedAgents.some(agent => agent.id === 'codex');
109
+ const includesQwen = installedAgents.some(agent => agent.id === 'qwen');
110
+ for (const [index, agent] of installedAgents.entries()) {
111
+ const agentConfig = getAgentConfig(agent.id);
112
+ const transformer = getTransformer(agent.id);
113
+ const welcomeMessage = transformer.getWelcomeMessage?.();
114
+ console.log(chalk.dim(` ${index + 1}. ${agentConfig.displayName}`));
115
+ if (welcomeMessage) {
116
+ for (const line of welcomeMessage) {
117
+ console.log(chalk.dim(` ${line}`));
118
+ }
119
+ }
120
+ else {
121
+ console.log(chalk.dim(' Open the agent in this directory'));
122
+ console.log(chalk.dim(' Run /aif to analyze project and generate stack-specific skills'));
68
123
  }
69
124
  }
70
- else {
71
- console.log(chalk.dim(` 1. Open ${agentConfig.displayName} in this directory`));
72
- console.log(chalk.dim(' 2. Run /ai-factory to analyze project and generate stack-specific skills'));
73
- console.log(chalk.dim(' 3. Use /ai-factory.feature to start new features, /ai-factory.commit to commit'));
74
- }
125
+ const invocationHints = [
126
+ includesCodex ? 'Codex CLI: $aif-plan, $aif-commit' : null,
127
+ includesQwen ? 'Qwen Code: /skills aif-plan, /skills aif-commit' : null,
128
+ ].filter(Boolean).join('; ');
129
+ console.log(chalk.dim(` ${installedAgents.length + 1}. Use /aif-plan and /aif-commit for daily workflow${invocationHints ? ` (${invocationHints})` : ''}`));
75
130
  console.log('');
76
131
  }
77
132
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DnD"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwEnD"}
@@ -13,33 +13,44 @@ export async function updateCommand() {
13
13
  const currentVersion = getCurrentVersion();
14
14
  console.log(chalk.dim(`Config version: ${config.version}`));
15
15
  console.log(chalk.dim(`Package version: ${currentVersion}\n`));
16
- // Check for new skills
17
- const availableSkills = await getAvailableSkills();
18
- const previousBaseSkills = config.installedSkills.filter(s => !s.includes('/'));
19
- const newSkills = availableSkills.filter(s => !previousBaseSkills.includes(s));
20
- if (newSkills.length > 0) {
21
- console.log(chalk.cyan(`📦 New skills available: ${newSkills.join(', ')}\n`));
22
- }
23
16
  console.log(chalk.dim('Updating skills...\n'));
24
17
  try {
25
- const updatedSkills = await updateSkills(config, projectDir);
18
+ const availableSkills = await getAvailableSkills();
19
+ const previousBaseSkillsByAgent = new Map();
20
+ for (const agent of config.agents) {
21
+ const previousBaseSkills = agent.installedSkills.filter(s => !s.includes('/'));
22
+ previousBaseSkillsByAgent.set(agent.id, previousBaseSkills);
23
+ const newSkills = availableSkills.filter(s => !previousBaseSkills.includes(s));
24
+ if (newSkills.length > 0) {
25
+ console.log(chalk.cyan(`📦 [${agent.id}] New skills available: ${newSkills.join(', ')}`));
26
+ }
27
+ }
28
+ if (config.agents.length > 0) {
29
+ console.log('');
30
+ }
31
+ for (const agent of config.agents) {
32
+ const updatedSkills = await updateSkills(agent, projectDir);
33
+ agent.installedSkills = updatedSkills;
34
+ }
26
35
  config.version = currentVersion;
27
- config.installedSkills = updatedSkills;
28
36
  await saveConfig(projectDir, config);
29
37
  console.log(chalk.green('✓ Skills updated successfully'));
30
38
  console.log(chalk.green('✓ Configuration updated'));
31
- // Separate base skills and custom skills for display
32
- const baseSkills = updatedSkills.filter(s => !s.includes('/'));
33
- const customSkills = updatedSkills.filter(s => s.includes('/'));
34
- console.log(chalk.bold('\nBase skills:'));
35
- for (const skill of baseSkills) {
36
- const isNew = newSkills.includes(skill);
37
- console.log(chalk.dim(` - ${skill}`) + (isNew ? chalk.green(' (new)') : ''));
38
- }
39
- if (customSkills.length > 0) {
40
- console.log(chalk.bold('\nCustom skills (preserved):'));
41
- for (const skill of customSkills) {
42
- console.log(chalk.dim(` - ${skill}`));
39
+ for (const agent of config.agents) {
40
+ const previousBaseSkills = previousBaseSkillsByAgent.get(agent.id) ?? [];
41
+ const newSkills = availableSkills.filter(s => !previousBaseSkills.includes(s));
42
+ const baseSkills = agent.installedSkills.filter(s => !s.includes('/'));
43
+ const customSkills = agent.installedSkills.filter(s => s.includes('/'));
44
+ console.log(chalk.bold(`\n[${agent.id}] Base skills:`));
45
+ for (const skill of baseSkills) {
46
+ const isNew = newSkills.includes(skill);
47
+ console.log(chalk.dim(` - ${skill}`) + (isNew ? chalk.green(' (new)') : ''));
48
+ }
49
+ if (customSkills.length > 0) {
50
+ console.log(chalk.bold(`[${agent.id}] Custom skills (preserved):`));
51
+ for (const skill of customSkills) {
52
+ console.log(chalk.dim(` - ${skill}`));
53
+ }
43
54
  }
44
55
  }
45
56
  console.log('');
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,cAAc,IAAI,CAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACnD,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAoB,CAAC;QAE9D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,kBAAkB,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/E,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,2BAA2B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC5D,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC;QACxC,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC;QAChC,MAAM,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAErC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAEpD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACzE,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACvE,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAExE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,8BAA8B,CAAC,CAAC,CAAC;gBACpE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function upgradeCommand(): Promise<void>;
2
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"AAqEA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuIpD"}
@@ -0,0 +1,179 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import { loadConfig, saveConfig, getCurrentVersion } from '../../core/config.js';
5
+ import { installSkills, getAvailableSkills } from '../../core/installer.js';
6
+ import { getAgentConfig } from '../../core/agents.js';
7
+ import { fileExists, removeDirectory, removeFile } from '../../utils/fs.js';
8
+ // Old v1 skill directory names that were renamed to aif-* in v2
9
+ const OLD_SKILL_NAMES = [
10
+ 'architecture',
11
+ 'best-practices',
12
+ 'build-automation',
13
+ 'ci',
14
+ 'commit',
15
+ 'deploy',
16
+ 'dockerize',
17
+ 'docs',
18
+ 'evolve',
19
+ 'feature',
20
+ 'fix',
21
+ 'implement',
22
+ 'improve',
23
+ 'review',
24
+ 'security-checklist',
25
+ 'skill-generator',
26
+ 'task',
27
+ 'verify',
28
+ ];
29
+ // Old v2 skill directory names before aif-* migration
30
+ const OLD_AIF_PREFIX_SKILL_NAMES = [
31
+ 'ai-factory',
32
+ 'ai-factory-architecture',
33
+ 'ai-factory-best-practices',
34
+ 'ai-factory-build-automation',
35
+ 'ai-factory-ci',
36
+ 'ai-factory-commit',
37
+ 'ai-factory-deploy',
38
+ 'ai-factory-dockerize',
39
+ 'ai-factory-docs',
40
+ 'ai-factory-evolve',
41
+ 'ai-factory-fix',
42
+ 'ai-factory-implement',
43
+ 'ai-factory-improve',
44
+ 'ai-factory-plan',
45
+ 'ai-factory-review',
46
+ 'ai-factory-roadmap',
47
+ 'ai-factory-rules',
48
+ 'ai-factory-security-checklist',
49
+ 'ai-factory-skill-generator',
50
+ 'ai-factory-verify',
51
+ // Transitional names that were removed earlier
52
+ 'ai-factory-task',
53
+ 'ai-factory-feature',
54
+ ];
55
+ // Old workflow skills stored as flat .md files by Antigravity transformer
56
+ const OLD_WORKFLOW_SKILLS = new Set([
57
+ 'commit',
58
+ 'deploy',
59
+ 'feature',
60
+ 'fix',
61
+ 'implement',
62
+ 'improve',
63
+ 'task',
64
+ 'verify',
65
+ ]);
66
+ export async function upgradeCommand() {
67
+ const projectDir = process.cwd();
68
+ console.log(chalk.bold.blue('\n🏭 AI Factory - Upgrade to v2\n'));
69
+ const config = await loadConfig(projectDir);
70
+ if (!config) {
71
+ console.log(chalk.red('Error: No .ai-factory.json found.'));
72
+ console.log(chalk.dim('Run "ai-factory init" to set up your project first.'));
73
+ process.exit(1);
74
+ }
75
+ if (config.agents.length === 0) {
76
+ console.log(chalk.red('Error: No agents configured in .ai-factory.json.'));
77
+ console.log(chalk.dim('Run "ai-factory init" to configure at least one agent.'));
78
+ process.exit(1);
79
+ }
80
+ // Step 1: Migrate legacy plan directories to .ai-factory/plans/
81
+ const featuresDir = path.join(projectDir, '.ai-factory', 'features');
82
+ const changesDir = path.join(projectDir, '.ai-factory', 'changes');
83
+ const plansDir = path.join(projectDir, '.ai-factory', 'plans');
84
+ if (await fileExists(changesDir) && !(await fileExists(plansDir))) {
85
+ await fs.move(changesDir, plansDir);
86
+ console.log(chalk.green('✓ Renamed .ai-factory/changes/ → .ai-factory/plans/\n'));
87
+ }
88
+ if (await fileExists(featuresDir) && !(await fileExists(plansDir))) {
89
+ await fs.move(featuresDir, plansDir);
90
+ console.log(chalk.green('✓ Renamed .ai-factory/features/ → .ai-factory/plans/\n'));
91
+ }
92
+ const availableSkills = await getAvailableSkills();
93
+ for (const agent of config.agents) {
94
+ const agentConfig = getAgentConfig(agent.id);
95
+ const skillsDir = path.join(projectDir, agent.skillsDir);
96
+ const isAntigravity = agent.id === 'antigravity';
97
+ let removedCount = 0;
98
+ console.log(chalk.dim(`Scanning for old-format skills [${agent.id}]...\n`));
99
+ for (const oldName of OLD_SKILL_NAMES) {
100
+ // Antigravity: old workflow skills were flat files in workflows/
101
+ if (isAntigravity && OLD_WORKFLOW_SKILLS.has(oldName)) {
102
+ const flatFile = path.join(projectDir, agentConfig.configDir, 'workflows', `${oldName}.md`);
103
+ if (await fileExists(flatFile)) {
104
+ await removeFile(flatFile);
105
+ console.log(chalk.yellow(` [${agent.id}] Removed workflow: ${oldName}.md`));
106
+ removedCount++;
107
+ }
108
+ }
109
+ // All agents: remove old skill directory
110
+ const oldDir = path.join(skillsDir, oldName);
111
+ if (await fileExists(oldDir)) {
112
+ await removeDirectory(oldDir);
113
+ console.log(chalk.yellow(` [${agent.id}] Removed skill: ${oldName}/`));
114
+ removedCount++;
115
+ }
116
+ }
117
+ // Remove old aif-task, aif-feature, and ai-factory-* skills
118
+ const obsoleteSkills = [
119
+ 'aif-task', 'aif-feature',
120
+ ...OLD_SKILL_NAMES.map(n => `ai-factory-${n}`),
121
+ ...OLD_AIF_PREFIX_SKILL_NAMES,
122
+ ];
123
+ for (const oldSkill of obsoleteSkills) {
124
+ const oldDir = path.join(skillsDir, oldSkill);
125
+ if (await fileExists(oldDir)) {
126
+ await removeDirectory(oldDir);
127
+ console.log(chalk.yellow(` [${agent.id}] Removed skill: ${oldSkill}/`));
128
+ removedCount++;
129
+ }
130
+ // Antigravity: remove flat workflow files
131
+ if (isAntigravity) {
132
+ const flatFile = path.join(projectDir, agentConfig.configDir, 'workflows', `${oldSkill}.md`);
133
+ if (await fileExists(flatFile)) {
134
+ await removeFile(flatFile);
135
+ console.log(chalk.yellow(` [${agent.id}] Removed workflow: ${oldSkill}.md`));
136
+ removedCount++;
137
+ }
138
+ }
139
+ }
140
+ if (removedCount === 0) {
141
+ console.log(chalk.dim(` [${agent.id}] No old-format skills found.\n`));
142
+ }
143
+ else {
144
+ console.log(chalk.dim(`\n [${agent.id}] Removed ${removedCount} old-format skill(s).\n`));
145
+ }
146
+ console.log(chalk.dim(`Installing new-format skills [${agent.id}]...\n`));
147
+ const customSkills = agent.installedSkills.filter(s => s.includes('/'));
148
+ const installedSkills = await installSkills({
149
+ projectDir,
150
+ skillsDir: agent.skillsDir,
151
+ skills: availableSkills,
152
+ stack: null,
153
+ agentId: agent.id,
154
+ });
155
+ agent.installedSkills = [...installedSkills, ...customSkills];
156
+ }
157
+ // Step 3: Update config to latest version and multi-agent schema
158
+ const currentVersion = getCurrentVersion();
159
+ config.version = currentVersion;
160
+ await saveConfig(projectDir, config);
161
+ // Step 4: Summary
162
+ console.log(chalk.green('✓ Upgrade to v2 complete!\n'));
163
+ for (const agent of config.agents) {
164
+ const baseSkills = agent.installedSkills.filter(s => !s.includes('/'));
165
+ const customSkills = agent.installedSkills.filter(s => s.includes('/'));
166
+ console.log(chalk.bold(`[${agent.id}] Installed skills:`));
167
+ for (const skill of baseSkills) {
168
+ console.log(chalk.dim(` - ${skill}`));
169
+ }
170
+ if (customSkills.length > 0) {
171
+ console.log(chalk.bold(`[${agent.id}] Custom skills (preserved):`));
172
+ for (const skill of customSkills) {
173
+ console.log(chalk.dim(` - ${skill}`));
174
+ }
175
+ }
176
+ console.log('');
177
+ }
178
+ }
179
+ //# sourceMappingURL=upgrade.js.map