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.
- package/README.md +41 -14
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +106 -51
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +32 -21
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +2 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +179 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/wizard/detector.d.ts.map +1 -1
- package/dist/cli/wizard/detector.js +10 -11
- package/dist/cli/wizard/detector.js.map +1 -1
- package/dist/cli/wizard/prompts.d.ts +7 -5
- package/dist/cli/wizard/prompts.d.ts.map +1 -1
- package/dist/cli/wizard/prompts.js +65 -62
- package/dist/cli/wizard/prompts.js.map +1 -1
- package/dist/core/agents.d.ts +1 -0
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +24 -1
- package/dist/core/agents.js.map +1 -1
- package/dist/core/config.d.ts +14 -9
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +48 -10
- package/dist/core/config.js.map +1 -1
- package/dist/core/installer.d.ts +2 -2
- package/dist/core/installer.d.ts.map +1 -1
- package/dist/core/installer.js +4 -4
- package/dist/core/installer.js.map +1 -1
- package/dist/core/template.d.ts +1 -0
- package/dist/core/template.d.ts.map +1 -1
- package/dist/core/template.js +2 -1
- package/dist/core/template.js.map +1 -1
- package/dist/core/transformer.d.ts.map +1 -1
- package/dist/core/transformer.js +12 -12
- package/dist/core/transformer.js.map +1 -1
- package/dist/core/transformers/antigravity.js +19 -19
- package/dist/core/transformers/antigravity.js.map +1 -1
- package/dist/core/transformers/codex.d.ts +6 -0
- package/dist/core/transformers/codex.d.ts.map +1 -0
- package/dist/core/transformers/codex.js +20 -0
- package/dist/core/transformers/codex.js.map +1 -0
- package/dist/core/transformers/kilocode.d.ts +3 -2
- package/dist/core/transformers/kilocode.d.ts.map +1 -1
- package/dist/core/transformers/kilocode.js +14 -3
- package/dist/core/transformers/kilocode.js.map +1 -1
- package/dist/core/transformers/qwen.d.ts +6 -0
- package/dist/core/transformers/qwen.d.ts.map +1 -0
- package/dist/core/transformers/qwen.js +21 -0
- package/dist/core/transformers/qwen.js.map +1 -0
- package/dist/utils/fs.d.ts +2 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +6 -0
- package/dist/utils/fs.js.map +1 -1
- package/package.json +4 -1
- package/skills/{ai-factory → aif}/SKILL.md +55 -30
- package/skills/aif-architecture/SKILL.md +338 -0
- package/skills/{best-practices → aif-best-practices}/SKILL.md +11 -8
- package/skills/{build-automation → aif-build-automation}/SKILL.md +5 -166
- package/skills/aif-build-automation/references/DOC-INTEGRATION.md +103 -0
- package/skills/aif-build-automation/references/SUMMARY-FORMAT.md +69 -0
- package/skills/{ci → aif-ci}/SKILL.md +15 -352
- package/skills/aif-ci/references/AUDIT-REPORT.md +79 -0
- package/skills/aif-ci/references/GITLAB-PATTERNS.md +65 -0
- package/skills/aif-ci/references/SERVICE-CONTAINERS.md +37 -0
- package/skills/aif-ci/references/TOOL-COMMANDS.md +119 -0
- package/skills/{commit → aif-commit}/SKILL.md +10 -3
- package/skills/{deploy → aif-deploy}/SKILL.md +6 -6
- package/skills/{dockerize → aif-dockerize}/SKILL.md +31 -431
- package/skills/aif-dockerize/references/AUDIT-GUIDE.md +125 -0
- package/skills/aif-dockerize/references/COMPOSE-PATTERNS.md +31 -0
- package/skills/aif-dockerize/references/DEPLOY-SCRIPTS.md +60 -0
- package/skills/aif-dockerize/references/FILE-ORGANIZATION.md +106 -0
- package/skills/aif-dockerize/references/SUMMARY-FORMAT.md +54 -0
- package/skills/{docs → aif-docs}/SKILL.md +9 -222
- package/skills/aif-docs/references/REVIEW-CHECKLISTS.md +95 -0
- package/skills/aif-docs/templates/html-template.html +103 -0
- package/skills/{evolve → aif-evolve}/SKILL.md +28 -29
- package/skills/{fix → aif-fix}/SKILL.md +43 -17
- package/skills/aif-grounded/SKILL.md +90 -0
- package/skills/{implement → aif-implement}/SKILL.md +84 -161
- package/skills/aif-implement/references/IMPLEMENTATION-GUIDE.md +90 -0
- package/skills/aif-implement/references/LOGGING-GUIDE.md +65 -0
- package/skills/{improve → aif-improve}/SKILL.md +19 -19
- package/skills/aif-loop/SKILL.md +464 -0
- package/skills/aif-loop/references/CRITERIA-TEMPLATES.md +86 -0
- package/skills/aif-loop/references/PHASE-CONTRACTS.md +178 -0
- package/skills/aif-loop/references/RULE-SCHEMA.md +111 -0
- package/skills/aif-plan/SKILL.md +480 -0
- package/skills/aif-plan/references/EXAMPLES.md +104 -0
- package/skills/aif-plan/references/TASK-FORMAT.md +70 -0
- package/skills/{review → aif-review}/SKILL.md +4 -4
- package/skills/aif-roadmap/SKILL.md +273 -0
- package/skills/aif-rules/SKILL.md +105 -0
- package/skills/aif-security-checklist/SKILL.md +463 -0
- package/skills/aif-security-checklist/references/AUTH-PATTERNS.md +67 -0
- package/skills/aif-security-checklist/references/PROMPT-INJECTION.md +87 -0
- package/skills/aif-security-checklist/references/RACE-CONDITIONS.md +139 -0
- package/skills/{security-checklist → aif-security-checklist}/scripts/audit.sh +1 -1
- package/skills/{skill-generator → aif-skill-generator}/SKILL.md +26 -68
- package/skills/{skill-generator → aif-skill-generator}/references/LEARN-MODE.md +9 -9
- package/skills/aif-skill-generator/references/SECURITY-SCANNING.md +61 -0
- package/skills/{skill-generator → aif-skill-generator}/scripts/search-skills.py +1 -0
- package/skills/{skill-generator → aif-skill-generator}/scripts/validate.sh +16 -32
- package/skills/{verify → aif-verify}/SKILL.md +37 -25
- package/dist/core/transformers/spec-compliant.d.ts +0 -12
- package/dist/core/transformers/spec-compliant.d.ts.map +0 -1
- package/dist/core/transformers/spec-compliant.js +0 -22
- package/dist/core/transformers/spec-compliant.js.map +0 -1
- package/skills/architecture/SKILL.md +0 -364
- package/skills/feature/SKILL.md +0 -429
- package/skills/security-checklist/SKILL.md +0 -846
- package/skills/task/SKILL.md +0 -313
- /package/skills/{build-automation → aif-build-automation}/references/BEST-PRACTICES.md +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/justfile-go +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/justfile-node +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/justfile-php +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/justfile-python +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/magefile-basic.go +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/magefile-full.go +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/makefile-go.mk +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/makefile-node.mk +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/makefile-php.mk +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/makefile-python.mk +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/taskfile-go.yml +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/taskfile-node.yml +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/taskfile-php.yml +0 -0
- /package/skills/{build-automation → aif-build-automation}/templates/taskfile-python.yml +0 -0
- /package/skills/{ci → aif-ci}/references/BEST-PRACTICES.md +0 -0
- /package/skills/{ci → aif-ci}/templates/github/go.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/github/java.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/github/node.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/github/php.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/github/python.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/github/rust.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/gitlab/go.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/gitlab/java.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/gitlab/node.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/gitlab/php.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/gitlab/python.yml +0 -0
- /package/skills/{ci → aif-ci}/templates/gitlab/rust.yml +0 -0
- /package/skills/{dockerize → aif-dockerize}/references/BEST-PRACTICES.md +0 -0
- /package/skills/{dockerize → aif-dockerize}/references/SECURITY-CHECKLIST.md +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/backup.sh +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/compose-base.yml +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/compose-override-dev.yml +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/compose-production.yml +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/deploy.sh +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-go +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-node +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-php +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/dockerfile-python +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/dockerignore +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/health-check.sh +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/logs.sh +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/rollback.sh +0 -0
- /package/skills/{dockerize → aif-dockerize}/templates/update.sh +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/references/BEST-PRACTICES.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/references/EXAMPLES.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/references/SPECIFICATION.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/scripts/security-scan.py +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/templates/basic.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/templates/dynamic-context.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/templates/research.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/templates/task.md +0 -0
- /package/skills/{skill-generator → aif-skill-generator}/templates/visual.md +0 -0
package/README.md
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
|
|
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
|
+

|
|
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
|
-
/
|
|
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
|
-
/
|
|
101
|
+
/aif-plan Add user authentication with OAuth
|
|
77
102
|
|
|
78
103
|
# Optionally refine the plan with deeper analysis
|
|
79
|
-
/
|
|
104
|
+
/aif-improve
|
|
80
105
|
|
|
81
106
|
# Execute the plan — implements tasks one by one, commits at checkpoints
|
|
82
|
-
/
|
|
107
|
+
/aif-implement
|
|
83
108
|
|
|
84
109
|
# Fix a bug — AI learns from every fix and gets smarter over time
|
|
85
|
-
/
|
|
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
|
-
/
|
|
113
|
+
/aif-ci github
|
|
89
114
|
|
|
90
115
|
# Generate project documentation — README + docs/ with topics
|
|
91
|
-
/
|
|
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
|
-
/
|
|
102
|
-
/
|
|
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 `/
|
|
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
|
-

|
|
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":"
|
|
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 {
|
|
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
|
-
|
|
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('
|
|
39
|
+
console.log('Running init will reconfigure selected agents (add/remove) and reinstall base skills.\n');
|
|
15
40
|
}
|
|
16
41
|
try {
|
|
17
|
-
const
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
console.log(chalk.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,
|
|
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,
|
|
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
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
console.log(chalk.
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|