@antomanc/aginit 0.4.1 → 0.5.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/CHANGELOG.md +28 -0
- package/README.md +108 -28
- package/THIRD_PARTY_NOTICES.md +92 -16
- package/dist/adapters/agent-docs.d.ts +32 -0
- package/dist/adapters/agent-docs.d.ts.map +1 -0
- package/dist/adapters/agent-docs.js +146 -0
- package/dist/adapters/agent-docs.js.map +1 -0
- package/dist/adapters/agents-md.d.ts +13 -1
- package/dist/adapters/agents-md.d.ts.map +1 -1
- package/dist/adapters/agents-md.js +137 -120
- package/dist/adapters/agents-md.js.map +1 -1
- package/dist/adapters/e2e.d.ts +15 -0
- package/dist/adapters/e2e.d.ts.map +1 -0
- package/dist/adapters/e2e.js +55 -0
- package/dist/adapters/e2e.js.map +1 -0
- package/dist/adapters/skills.d.ts +5 -0
- package/dist/adapters/skills.d.ts.map +1 -1
- package/dist/adapters/skills.js +17 -0
- package/dist/adapters/skills.js.map +1 -1
- package/dist/cli/capabilities.d.ts +17 -0
- package/dist/cli/capabilities.d.ts.map +1 -0
- package/dist/cli/capabilities.js +149 -0
- package/dist/cli/capabilities.js.map +1 -0
- package/dist/cli/doctor.d.ts +16 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +90 -70
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +117 -20
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/new.d.ts +15 -1
- package/dist/cli/new.d.ts.map +1 -1
- package/dist/cli/new.js +157 -68
- package/dist/cli/new.js.map +1 -1
- package/dist/cli/wizard.d.ts +5 -0
- package/dist/cli/wizard.d.ts.map +1 -1
- package/dist/cli/wizard.js +104 -102
- package/dist/cli/wizard.js.map +1 -1
- package/dist/config/defaults.d.ts +14 -6
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +38 -174
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +14 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validation.d.ts +1 -0
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +63 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/detect/index.d.ts +18 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +120 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/presets/cli.d.ts.map +1 -1
- package/dist/presets/cli.js +7 -0
- package/dist/presets/cli.js.map +1 -1
- package/dist/presets/generic.d.ts.map +1 -1
- package/dist/presets/generic.js +4 -1
- package/dist/presets/generic.js.map +1 -1
- package/dist/presets/testing.d.ts +1 -1
- package/dist/presets/testing.d.ts.map +1 -1
- package/dist/presets/testing.js +22 -8
- package/dist/presets/testing.js.map +1 -1
- package/dist/presets/web.d.ts.map +1 -1
- package/dist/presets/web.js +5 -2
- package/dist/presets/web.js.map +1 -1
- package/dist/registry/catalog.d.ts +13 -0
- package/dist/registry/catalog.d.ts.map +1 -0
- package/dist/registry/catalog.js +544 -0
- package/dist/registry/catalog.js.map +1 -0
- package/dist/registry/index.d.ts +84 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +309 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/setup.d.ts +14 -0
- package/dist/registry/setup.d.ts.map +1 -0
- package/dist/registry/setup.js +25 -0
- package/dist/registry/setup.js.map +1 -0
- package/dist/registry/types.d.ts +115 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/package.json +3 -2
- package/src/adapters/agent-docs.ts +184 -0
- package/src/adapters/agents-md.ts +160 -137
- package/src/adapters/e2e.ts +58 -0
- package/src/adapters/skills.ts +18 -0
- package/src/cli/capabilities.ts +176 -0
- package/src/cli/doctor.ts +83 -66
- package/src/cli/init.ts +1 -1
- package/src/cli/main.ts +125 -20
- package/src/cli/new.ts +195 -74
- package/src/cli/wizard.ts +130 -103
- package/src/config/defaults.ts +57 -179
- package/src/config/schema.ts +15 -0
- package/src/config/validation.ts +56 -0
- package/src/detect/index.ts +134 -0
- package/src/index.ts +5 -0
- package/src/presets/cli.ts +6 -0
- package/src/presets/generic.ts +4 -1
- package/src/presets/testing.ts +29 -12
- package/src/presets/web.ts +4 -2
- package/src/registry/catalog.ts +569 -0
- package/src/registry/index.ts +395 -0
- package/src/registry/setup.ts +40 -0
- package/src/registry/types.ts +109 -0
package/dist/cli/main.js
CHANGED
|
@@ -3,12 +3,13 @@ import { readFileSync } from 'node:fs';
|
|
|
3
3
|
import { createProject } from './new.js';
|
|
4
4
|
import { initCurrentDirectory } from './init.js';
|
|
5
5
|
import { runDoctor } from './doctor.js';
|
|
6
|
-
import {
|
|
6
|
+
import { ensureClaudeSkillLinks, updateSkills } from '../adapters/skills.js';
|
|
7
7
|
import { ignoreVendoredSkills } from '../adapters/tool-ignores.js';
|
|
8
|
-
import { setupClaudeMarkdown } from '../adapters/agents-md.js';
|
|
9
8
|
import { buildGraft } from '../adapters/graft.js';
|
|
10
9
|
import { readProjectConfig } from '../config/validation.js';
|
|
11
10
|
import { logger } from '../utils/logger.js';
|
|
11
|
+
import { changeCapabilities, listCapabilities } from './capabilities.js';
|
|
12
|
+
import { syncAgentDocs } from './new.js';
|
|
12
13
|
import { isInteractive, promptNewProject, promptInitProject, runInteractiveWizard } from './wizard.js';
|
|
13
14
|
/**
|
|
14
15
|
* Read the version from package.json so releases only bump one place.
|
|
@@ -23,23 +24,80 @@ function readVersion() {
|
|
|
23
24
|
return '0.0.0';
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
const list = (value, previous = []) => [
|
|
28
|
+
...previous,
|
|
29
|
+
...value
|
|
30
|
+
.split(',')
|
|
31
|
+
.map((item) => item.trim())
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
];
|
|
34
|
+
/** v2 profile options shared by the root command, `new` and `init`. */
|
|
35
|
+
function withProfileOptions(command) {
|
|
36
|
+
return command
|
|
37
|
+
.option('--platform <platform>', 'Platform: auto | web | mobile-native | mobile-rn | backend | cli')
|
|
38
|
+
.option('--methodology <preset>', 'Workflow skills: pocock | superpowers | minimal')
|
|
39
|
+
.option('--design <design>', 'Design system: impeccable | none')
|
|
40
|
+
.option('--testing <engine>', 'Testing: e2e | playwright | vitest | native')
|
|
41
|
+
.option('--ui-driver <driver>', 'UI driver: auto | agent-browser | agent-device | none')
|
|
42
|
+
.option('--addons <ids>', 'Add-ons: context-mode, worktrunk, chrome-devtools-mcp, browserskill', list)
|
|
43
|
+
.option('--add-skill <owner/repo>', 'Add a skill repository as a custom capability (repeatable)', list)
|
|
44
|
+
.option('--without <id>', 'Disable a capability, e.g. graft or humanizer (repeatable)', list);
|
|
45
|
+
}
|
|
46
|
+
function profileFlags(options) {
|
|
47
|
+
return {
|
|
48
|
+
platform: options.platform === 'auto' ? undefined : options.platform,
|
|
49
|
+
methodology: options.methodology,
|
|
50
|
+
design: options.design,
|
|
51
|
+
testing: options.testing,
|
|
52
|
+
uiDriver: options.uiDriver,
|
|
53
|
+
addons: options.addons,
|
|
54
|
+
addSkills: options.addSkill,
|
|
55
|
+
without: options.without
|
|
56
|
+
};
|
|
57
|
+
}
|
|
26
58
|
export function createCliProgram() {
|
|
27
59
|
const program = new Command();
|
|
28
60
|
program
|
|
29
61
|
.name('aginit')
|
|
30
62
|
.description('Set up a new or existing project for AI coding agents')
|
|
31
|
-
.version(readVersion())
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
63
|
+
.version(readVersion())
|
|
64
|
+
.enablePositionalOptions()
|
|
65
|
+
.option('-p, --preset <preset>', 'Project preset: web | cli | generic')
|
|
66
|
+
.option('-f, --framework <framework>', 'Web framework: none | vite | next | existing')
|
|
67
|
+
.option('-m, --package-manager <pm>', 'Package manager: pnpm | npm | yarn | bun')
|
|
68
|
+
.option('--no-skills', 'Skip installing AI skills')
|
|
69
|
+
.option('--no-graft', 'Skip codebase graph (Graft) setup')
|
|
70
|
+
.option('--no-git', 'Skip git repository initialization')
|
|
71
|
+
.option('--dry-run', 'Simulate setup without writing changes to disk')
|
|
72
|
+
.option('-y, --yes', 'Initialize the current directory without prompts (saved or detected settings)');
|
|
73
|
+
withProfileOptions(program);
|
|
74
|
+
// Root action: `aginit [options]` initializes the current directory. Bare
|
|
75
|
+
// `aginit` opens the wizard in a TTY and prints help otherwise, so a stray
|
|
76
|
+
// invocation in CI never rewrites a project.
|
|
77
|
+
program.action(async (options, command) => {
|
|
78
|
+
const explicit = command.options.some((option) => command.getOptionValueSource(option.attributeName()) === 'cli');
|
|
79
|
+
if (!explicit) {
|
|
80
|
+
if (isInteractive())
|
|
81
|
+
await runInteractiveWizard();
|
|
82
|
+
else
|
|
83
|
+
program.outputHelp();
|
|
84
|
+
return;
|
|
39
85
|
}
|
|
86
|
+
const complete = await initCurrentDirectory({
|
|
87
|
+
preset: options.preset,
|
|
88
|
+
framework: options.framework,
|
|
89
|
+
packageManager: options.packageManager,
|
|
90
|
+
skills: options.skills,
|
|
91
|
+
graft: options.graft,
|
|
92
|
+
git: options.git,
|
|
93
|
+
dryRun: options.dryRun,
|
|
94
|
+
profile: profileFlags(options)
|
|
95
|
+
});
|
|
96
|
+
if (!complete && !options.dryRun)
|
|
97
|
+
process.exitCode = 1;
|
|
40
98
|
});
|
|
41
99
|
// Command: new
|
|
42
|
-
program
|
|
100
|
+
const newCommand = program
|
|
43
101
|
.command('new [projectName]')
|
|
44
102
|
.description('Create a brand new AI-first project')
|
|
45
103
|
.option('-p, --preset <preset>', 'Project preset: web | cli | generic', 'generic')
|
|
@@ -48,12 +106,14 @@ export function createCliProgram() {
|
|
|
48
106
|
.option('--no-skills', 'Skip installing AI skills')
|
|
49
107
|
.option('--no-graft', 'Skip codebase graph (Graft) setup')
|
|
50
108
|
.option('--no-git', 'Skip git repository initialization')
|
|
51
|
-
.option('--dry-run', 'Simulate creation without writing changes to disk')
|
|
109
|
+
.option('--dry-run', 'Simulate creation without writing changes to disk');
|
|
110
|
+
withProfileOptions(newCommand)
|
|
52
111
|
.action(async (projectName, options, command) => {
|
|
53
112
|
let finalName = projectName;
|
|
54
113
|
let finalPreset = options.preset;
|
|
55
114
|
let finalFramework = options.framework;
|
|
56
115
|
let finalPackageManager = options.packageManager;
|
|
116
|
+
let finalProfile = profileFlags(options);
|
|
57
117
|
if (!finalName) {
|
|
58
118
|
if (!isInteractive()) {
|
|
59
119
|
program.error("error: missing required argument 'projectName'");
|
|
@@ -67,12 +127,14 @@ export function createCliProgram() {
|
|
|
67
127
|
: undefined,
|
|
68
128
|
packageManager: command.getOptionValueSource('packageManager') === 'cli'
|
|
69
129
|
? options.packageManager
|
|
70
|
-
: undefined
|
|
130
|
+
: undefined,
|
|
131
|
+
profile: finalProfile
|
|
71
132
|
});
|
|
72
133
|
finalName = answers.projectName;
|
|
73
134
|
finalPreset = answers.preset;
|
|
74
135
|
finalFramework = answers.framework;
|
|
75
136
|
finalPackageManager = answers.packageManager;
|
|
137
|
+
finalProfile = answers.profile;
|
|
76
138
|
}
|
|
77
139
|
const complete = await createProject(finalName, {
|
|
78
140
|
preset: finalPreset,
|
|
@@ -81,13 +143,14 @@ export function createCliProgram() {
|
|
|
81
143
|
skills: options.skills,
|
|
82
144
|
graft: options.graft,
|
|
83
145
|
git: options.git,
|
|
84
|
-
dryRun: options.dryRun
|
|
146
|
+
dryRun: options.dryRun,
|
|
147
|
+
profile: finalProfile
|
|
85
148
|
});
|
|
86
149
|
if (!complete && !options.dryRun)
|
|
87
150
|
process.exitCode = 1;
|
|
88
151
|
});
|
|
89
152
|
// Command: init
|
|
90
|
-
program
|
|
153
|
+
const initCommand = program
|
|
91
154
|
.command('init')
|
|
92
155
|
.description('Initialize or update AI-first capabilities in the current directory')
|
|
93
156
|
.option('-p, --preset <preset>', 'Project preset: web | cli | generic')
|
|
@@ -97,23 +160,28 @@ export function createCliProgram() {
|
|
|
97
160
|
.option('--no-graft', 'Skip codebase graph (Graft) setup')
|
|
98
161
|
.option('--no-git', 'Skip git repository initialization')
|
|
99
162
|
.option('--dry-run', 'Simulate setup without writing changes to disk')
|
|
163
|
+
.option('-y, --yes', 'Skip the prompts and use saved or detected settings');
|
|
164
|
+
withProfileOptions(initCommand)
|
|
100
165
|
.action(async (options, command) => {
|
|
101
166
|
let finalPreset = options.preset;
|
|
102
167
|
let finalFramework = options.framework;
|
|
103
168
|
let finalPackageManager = options.packageManager;
|
|
169
|
+
let finalProfile = profileFlags(options);
|
|
104
170
|
const isPresetExplicit = command.getOptionValueSource('preset') === 'cli';
|
|
105
171
|
const isFrameworkExplicit = command.getOptionValueSource('framework') === 'cli';
|
|
106
172
|
const isPmExplicit = command.getOptionValueSource('packageManager') === 'cli';
|
|
107
173
|
const savedConfig = readProjectConfig(process.cwd());
|
|
108
|
-
if (isInteractive() && !isPresetExplicit && !options.dryRun && !savedConfig) {
|
|
174
|
+
if (isInteractive() && !isPresetExplicit && !options.dryRun && !options.yes && !savedConfig) {
|
|
109
175
|
const answers = await promptInitProject({
|
|
110
176
|
preset: isPresetExplicit ? options.preset : undefined,
|
|
111
177
|
framework: isFrameworkExplicit ? options.framework : undefined,
|
|
112
|
-
packageManager: isPmExplicit ? options.packageManager : undefined
|
|
178
|
+
packageManager: isPmExplicit ? options.packageManager : undefined,
|
|
179
|
+
profile: finalProfile
|
|
113
180
|
});
|
|
114
181
|
finalPreset = answers.preset;
|
|
115
182
|
finalFramework = answers.framework;
|
|
116
183
|
finalPackageManager = answers.packageManager;
|
|
184
|
+
finalProfile = answers.profile;
|
|
117
185
|
}
|
|
118
186
|
const complete = await initCurrentDirectory({
|
|
119
187
|
preset: finalPreset,
|
|
@@ -122,11 +190,40 @@ export function createCliProgram() {
|
|
|
122
190
|
skills: options.skills,
|
|
123
191
|
graft: options.graft,
|
|
124
192
|
git: options.git,
|
|
125
|
-
dryRun: options.dryRun
|
|
193
|
+
dryRun: options.dryRun,
|
|
194
|
+
profile: finalProfile
|
|
126
195
|
});
|
|
127
196
|
if (!complete && !options.dryRun)
|
|
128
197
|
process.exitCode = 1;
|
|
129
198
|
});
|
|
199
|
+
// Command: list
|
|
200
|
+
program
|
|
201
|
+
.command('list')
|
|
202
|
+
.description('List every capability in the registry and which ones this project enables')
|
|
203
|
+
.option('-d, --dir <path>', 'Project directory', process.cwd())
|
|
204
|
+
.action((options) => listCapabilities(options.dir));
|
|
205
|
+
// Command: add
|
|
206
|
+
program
|
|
207
|
+
.command('add <capabilities...>')
|
|
208
|
+
.description('Enable capabilities (registry ids or owner/repo skill repositories)')
|
|
209
|
+
.option('--dry-run', 'Simulate the change')
|
|
210
|
+
.action(async (ids, options) => {
|
|
211
|
+
const ok = await changeCapabilities(process.cwd(), { add: ids.flatMap((id) => list(id)) }, {
|
|
212
|
+
dryRun: options.dryRun
|
|
213
|
+
});
|
|
214
|
+
if (!ok && !options.dryRun)
|
|
215
|
+
process.exitCode = 1;
|
|
216
|
+
});
|
|
217
|
+
// Command: remove
|
|
218
|
+
program
|
|
219
|
+
.command('remove <capabilities...>')
|
|
220
|
+
.description('Disable capabilities and remove the skills they installed')
|
|
221
|
+
.option('--dry-run', 'Simulate the change')
|
|
222
|
+
.action(async (ids, options) => {
|
|
223
|
+
const ok = await changeCapabilities(process.cwd(), { remove: ids.flatMap((id) => list(id)) }, { dryRun: options.dryRun });
|
|
224
|
+
if (!ok && !options.dryRun)
|
|
225
|
+
process.exitCode = 1;
|
|
226
|
+
});
|
|
130
227
|
// Command: doctor
|
|
131
228
|
program
|
|
132
229
|
.command('doctor')
|
|
@@ -148,8 +245,8 @@ export function createCliProgram() {
|
|
|
148
245
|
? true
|
|
149
246
|
: await updateSkills(targetDir, { dryRun: options.dryRun })) &&
|
|
150
247
|
(config ? await ensureClaudeSkillLinks(targetDir, config, { dryRun: options.dryRun }) : true);
|
|
151
|
-
if (config
|
|
152
|
-
|
|
248
|
+
if (config)
|
|
249
|
+
syncAgentDocs(targetDir, config, { dryRun: options.dryRun });
|
|
153
250
|
if (config?.skills.sources.length !== 0) {
|
|
154
251
|
const advice = ignoreVendoredSkills(targetDir, { dryRun: options.dryRun, silent: true });
|
|
155
252
|
for (const line of advice)
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7F,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,QAAQ,GAAa,EAAE,EAAE,EAAE,CAAC;IACvD,GAAG,QAAQ;IACX,GAAG,KAAK;SACL,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;CACnB,CAAC;AAEF,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,OAAO,OAAO;SACX,MAAM,CAAC,uBAAuB,EAAE,kEAAkE,CAAC;SACnG,MAAM,CAAC,wBAAwB,EAAE,iDAAiD,CAAC;SACnF,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;SAC3E,MAAM,CAAC,sBAAsB,EAAE,uDAAuD,CAAC;SACvF,MAAM,CAAC,gBAAgB,EAAE,qEAAqE,EAAE,IAAI,CAAC;SACrG,MAAM,CAAC,0BAA0B,EAAE,4DAA4D,EAAE,IAAI,CAAC;SACtG,MAAM,CAAC,gBAAgB,EAAE,4DAA4D,EAAE,IAAI,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,YAAY,CAAC,OAAY;IAChC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,OAAO,CAAC,QAAiC;QAC9F,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAoC;QACrD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,uDAAuD,CAAC;SACpE,OAAO,CAAC,WAAW,EAAE,CAAC;SACtB,uBAAuB,EAAE;SACzB,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;SACtE,MAAM,CAAC,6BAA6B,EAAE,8CAA8C,CAAC;SACrF,MAAM,CAAC,4BAA4B,EAAE,0CAA0C,CAAC;SAChF,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;SAClD,MAAM,CAAC,YAAY,EAAE,mCAAmC,CAAC;SACzD,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;SACxD,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,+EAA+E,CAAC,CAAC;IACxG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5B,0EAA0E;IAC1E,2EAA2E;IAC3E,6CAA6C;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAY,EAAE,OAAgB,EAAE,EAAE;QACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CACnC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,KAAK,KAAK,CAC3E,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,aAAa,EAAE;gBAAE,MAAM,oBAAoB,EAAE,CAAC;;gBAC7C,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;YAC1C,MAAM,EAAE,OAAO,CAAC,MAAgC;YAChD,SAAS,EAAE,OAAO,CAAC,SAAqC;YACxD,cAAc,EAAE,OAAO,CAAC,cAA4C;YACpE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,EAAE,SAAS,CAAC;SACjF,MAAM,CAAC,6BAA6B,EAAE,8CAA8C,EAAE,MAAM,CAAC;SAC7F,MAAM,CAAC,4BAA4B,EAAE,0CAA0C,EAAE,MAAM,CAAC;SACxF,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;SAClD,MAAM,CAAC,YAAY,EAAE,mCAAmC,CAAC;SACzD,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;SACxD,MAAM,CAAC,WAAW,EAAE,mDAAmD,CAAC,CAAC;IAC5E,kBAAkB,CAAC,UAAU,CAAC;SAC3B,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAAY,EAAE,OAAgB,EAAE,EAAE;QAChF,IAAI,SAAS,GAAG,WAAW,CAAC;QAC5B,IAAI,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;QACvC,IAAI,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;QACjD,IAAI,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC;gBACrC,MAAM,EACJ,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,KAAK;oBAC9C,CAAC,CAAE,OAAO,CAAC,MAAqB;oBAChC,CAAC,CAAC,SAAS;gBACf,SAAS,EACP,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,KAAK;oBACjD,CAAC,CAAE,OAAO,CAAC,SAA0B;oBACrC,CAAC,CAAC,SAAS;gBACf,cAAc,EACZ,OAAO,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,KAAK,KAAK;oBACtD,CAAC,CAAE,OAAO,CAAC,cAAiC;oBAC5C,CAAC,CAAC,SAAS;gBACf,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;YACH,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;YAChC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;YACnC,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;YAC7C,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE;YAC9C,MAAM,EAAE,WAAyB;YACjC,SAAS,EAAE,cAA8B;YACzC,cAAc,EAAE,mBAAqC;YACrD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,gBAAgB;IAChB,MAAM,WAAW,GAAG,OAAO;SACxB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;SACtE,MAAM,CAAC,6BAA6B,EAAE,8CAA8C,CAAC;SACrF,MAAM,CAAC,4BAA4B,EAAE,0CAA0C,CAAC;SAChF,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;SAClD,MAAM,CAAC,YAAY,EAAE,mCAAmC,CAAC;SACzD,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;SACxD,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,qDAAqD,CAAC,CAAC;IAC9E,kBAAkB,CAAC,WAAW,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,OAAY,EAAE,OAAgB,EAAE,EAAE;QAC/C,IAAI,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;QACvC,IAAI,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;QACjD,IAAI,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC;QAC1E,MAAM,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,KAAK,CAAC;QAChF,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,KAAK,KAAK,CAAC;QAE9E,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,IAAI,aAAa,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5F,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;gBACtC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAE,OAAO,CAAC,MAAqB,CAAC,CAAC,CAAC,SAAS;gBACrE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAE,OAAO,CAAC,SAA0B,CAAC,CAAC,CAAC,SAAS;gBAChF,cAAc,EAAE,YAAY,CAAC,CAAC,CAAE,OAAO,CAAC,cAAiC,CAAC,CAAC,CAAC,SAAS;gBACrF,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;YACH,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;YACnC,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;YAC7C,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;YAC1C,MAAM,EAAE,WAAyB;YACjC,SAAS,EAAE,cAA8B;YACzC,cAAc,EAAE,mBAAqC;YACrD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,gBAAgB;IAChB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC9D,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3D,eAAe;IACf,OAAO;SACJ,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,GAAa,EAAE,OAAY,EAAE,EAAE;QAC5C,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACzF,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEL,kBAAkB;IAClB,OAAO;SACJ,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,GAAa,EAAE,OAAY,EAAE,EAAE;QAC5C,MAAM,EAAE,GAAG,MAAM,kBAAkB,CACjC,OAAO,CAAC,GAAG,EAAE,EACb,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EACzC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAC3B,CAAC;QACF,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEL,kBAAkB;IAClB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,OAAY,EAAE,EAAE;QAC7B,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEL,kBAAkB;IAClB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,OAAY,EAAE,EAAE;QAC7B,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,QAAQ,GACZ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAClC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChG,IAAI,MAAM;YAAE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,IAAI,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,OAAO,GACX,MAAM,EAAE,QAAQ,CAAC,KAAK,KAAK,KAAK;YAC9B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,IAAI,QAAQ,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;aACvD,CAAC;YACJ,IAAI,CAAC,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC3F,IAAI,CAAC,OAAO;gBACV,MAAM,CAAC,IAAI,CACT,yFAAyF,CAC1F,CAAC;YACJ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/cli/new.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { PresetType, WebFramework, PackageManager } from '../config/schema.js';
|
|
1
|
+
import { AginitConfig, PresetType, WebFramework, PackageManager } from '../config/schema.js';
|
|
2
|
+
import { CapabilityDescriptor, MicroDoc, ProfileFlags } from '../registry/index.js';
|
|
2
3
|
export interface NewProjectOptions {
|
|
3
4
|
preset?: PresetType;
|
|
4
5
|
framework?: WebFramework;
|
|
@@ -9,6 +10,19 @@ export interface NewProjectOptions {
|
|
|
9
10
|
dryRun?: boolean;
|
|
10
11
|
targetDir?: string;
|
|
11
12
|
silent?: boolean;
|
|
13
|
+
/** v2 profile flags: --platform, --methodology, --design, --testing, --ui-driver, ... */
|
|
14
|
+
profile?: ProfileFlags;
|
|
12
15
|
}
|
|
13
16
|
export declare function createProject(projectName: string, options?: NewProjectOptions): Promise<boolean>;
|
|
17
|
+
/** Binaries of active capabilities that are not on PATH (setups report their own). */
|
|
18
|
+
export declare function missingBinaries(active: CapabilityDescriptor[], setups: string[]): Promise<Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
bin: string;
|
|
21
|
+
install: string;
|
|
22
|
+
}>>;
|
|
23
|
+
/** Refresh AGENTS.md, CLAUDE.md and docs/agents/ from the config. */
|
|
24
|
+
export declare function syncAgentDocs(targetDir: string, config: AginitConfig, options?: {
|
|
25
|
+
dryRun?: boolean;
|
|
26
|
+
silent?: boolean;
|
|
27
|
+
}): MicroDoc[];
|
|
14
28
|
//# sourceMappingURL=new.d.ts.map
|
package/dist/cli/new.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/cli/new.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/cli/new.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EAEZ,UAAU,EACV,YAAY,EACZ,cAAc,EACf,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAGL,oBAAoB,EAKpB,QAAQ,EAGR,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAe9B,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yFAAyF;IACzF,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAiGD,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA+IlB;AAED,sFAAsF;AACtF,wBAAsB,eAAe,CACnC,MAAM,EAAE,oBAAoB,EAAE,EAC9B,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAUhE;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACnD,QAAQ,EAAE,CAMZ"}
|
package/dist/cli/new.js
CHANGED
|
@@ -1,17 +1,99 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
-
import { getDefaultConfig, upgradeLegacySkillConfig } from '../config/defaults.js';
|
|
3
|
+
import { getDefaultConfig, presetPlatform, upgradeLegacySkillConfig } from '../config/defaults.js';
|
|
4
4
|
import { AGINIT_CONFIG_FILENAME } from '../config/schema.js';
|
|
5
5
|
import { getPreset } from '../presets/registry.js';
|
|
6
6
|
import { setupGit } from '../adapters/git.js';
|
|
7
7
|
import { setupAgentsMarkdown, setupClaudeMarkdown } from '../adapters/agents-md.js';
|
|
8
8
|
import { claudeCodeEnabled, installAllSkills, skillAgents } from '../adapters/skills.js';
|
|
9
|
-
import { initGraft } from '../adapters/graft.js';
|
|
10
9
|
import { ignoreVendoredSkills } from '../adapters/tool-ignores.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
10
|
+
import { agentBrowserStubInstalled } from '../adapters/agent-browser.js';
|
|
11
|
+
import { microDocPath, projectProfile, resolvePlatformStack, setupMicroDocs } from '../adapters/agent-docs.js';
|
|
12
|
+
import { detectProject } from '../detect/index.js';
|
|
13
|
+
import { activeCapabilities, applyResolvedProfile, e2eDirFor, hasProfileFlags, inferCapabilities, isNodeStack, PLATFORMS, resolveCapabilities } from '../registry/index.js';
|
|
14
|
+
import { SETUP_LABELS, SETUPS } from '../registry/setup.js';
|
|
15
|
+
import { commandExists } from '../utils/shell.js';
|
|
16
|
+
import { ensureDir, fileExists, writeJsonFile } from '../utils/fs.js';
|
|
13
17
|
import { readProjectConfig, readPackageManifest, validateConfig, validateProjectName, PRESETS, FRAMEWORKS, SUPPORTED_PACKAGE_MANAGERS } from '../config/validation.js';
|
|
14
18
|
import { logger } from '../utils/logger.js';
|
|
19
|
+
/**
|
|
20
|
+
* Work out the config to save. A saved config is reused as written, so plain
|
|
21
|
+
* reruns are deterministic; profile flags (and --preset/--framework for the
|
|
22
|
+
* browser switches) are applied on top of it.
|
|
23
|
+
*/
|
|
24
|
+
function resolveConfig(projectName, targetDir, options, existingConfig, manifest) {
|
|
25
|
+
const flags = options.profile ?? {};
|
|
26
|
+
const detected = detectProject(targetDir);
|
|
27
|
+
const saved = existingConfig ? resolvePlatformStack(existingConfig, targetDir) : null;
|
|
28
|
+
const presetHint = options.preset ?? existingConfig?.preset;
|
|
29
|
+
const platform = flags.platform ??
|
|
30
|
+
existingConfig?.platform ??
|
|
31
|
+
(options.preset && options.preset !== 'generic'
|
|
32
|
+
? presetPlatform(options.preset)
|
|
33
|
+
: (saved?.platform ?? detected.platform ?? presetPlatform(presetHint ?? 'generic')));
|
|
34
|
+
const stack = existingConfig?.stack ??
|
|
35
|
+
(detected.stack !== 'unknown'
|
|
36
|
+
? detected.stack
|
|
37
|
+
: platform === 'mobile-native'
|
|
38
|
+
? 'unknown'
|
|
39
|
+
: 'node');
|
|
40
|
+
const presetName = options.preset ?? existingConfig?.preset ?? 'generic';
|
|
41
|
+
const framework = options.framework ?? (presetName === 'web' ? existingConfig?.framework : undefined);
|
|
42
|
+
if (presetName !== 'web' && framework && framework !== 'none' && framework !== 'existing')
|
|
43
|
+
throw new Error('A web framework requires --preset web.');
|
|
44
|
+
if (presetName === 'web' && framework === 'existing' && !manifest)
|
|
45
|
+
throw new Error('An existing web framework requires an existing package.json. Use --framework none for a new baseline.');
|
|
46
|
+
if (!isNodeStack(stack) && options.preset && options.preset !== 'generic')
|
|
47
|
+
throw new Error(`--preset ${options.preset} scaffolds a Node.js project, but this is a ${stack} project. ` +
|
|
48
|
+
'Use --preset generic (the default) to keep the project root free of package.json.');
|
|
49
|
+
const packageManager = options.packageManager ?? existingConfig?.packageManager ?? 'pnpm';
|
|
50
|
+
const defaults = getDefaultConfig(projectName, presetName, {
|
|
51
|
+
framework,
|
|
52
|
+
packageManager,
|
|
53
|
+
platform,
|
|
54
|
+
stack,
|
|
55
|
+
flags,
|
|
56
|
+
skills: options.skills !== false,
|
|
57
|
+
// A generic preset leaves an existing package.json (and its test runner) alone.
|
|
58
|
+
harness: !(presetName === 'generic' && manifest !== null)
|
|
59
|
+
});
|
|
60
|
+
if (!existingConfig)
|
|
61
|
+
return validateConfig(defaults);
|
|
62
|
+
let config = {
|
|
63
|
+
...existingConfig,
|
|
64
|
+
name: projectName,
|
|
65
|
+
preset: presetName,
|
|
66
|
+
...(isNodeStack(stack) || existingConfig.packageManager !== undefined ? { packageManager } : {}),
|
|
67
|
+
...(presetName === 'web' ? { framework: framework ?? 'none' } : {}),
|
|
68
|
+
browser: options.framework !== undefined || options.preset !== undefined
|
|
69
|
+
? { ...existingConfig.browser, ...defaults.browser }
|
|
70
|
+
: existingConfig.browser,
|
|
71
|
+
skills: upgradeLegacySkillConfig(existingConfig.skills)
|
|
72
|
+
};
|
|
73
|
+
if (hasProfileFlags(flags)) {
|
|
74
|
+
const base = existingConfig.capabilities ?? inferCapabilities(existingConfig);
|
|
75
|
+
const profile = resolveCapabilities({
|
|
76
|
+
platform,
|
|
77
|
+
stack,
|
|
78
|
+
framework,
|
|
79
|
+
base,
|
|
80
|
+
basePlatform: saved.platform,
|
|
81
|
+
flags,
|
|
82
|
+
custom: existingConfig.customCapabilities
|
|
83
|
+
}, existingConfig.disabledCapabilities);
|
|
84
|
+
config = applyResolvedProfile({ ...config, platform, stack }, profile, {
|
|
85
|
+
skills: true,
|
|
86
|
+
previous: [...base, ...(existingConfig.customCapabilities ?? []).map((c) => c.id)]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else if (config.capabilities && config.browser.playwright !== existingConfig.browser.playwright) {
|
|
90
|
+
// --framework turned the Playwright switch; keep the capability list in step.
|
|
91
|
+
config.capabilities = config.browser.playwright
|
|
92
|
+
? [...config.capabilities, 'playwright']
|
|
93
|
+
: config.capabilities.filter((id) => id !== 'playwright');
|
|
94
|
+
}
|
|
95
|
+
return validateConfig(config);
|
|
96
|
+
}
|
|
15
97
|
export async function createProject(projectName, options = {}) {
|
|
16
98
|
validateProjectName(projectName);
|
|
17
99
|
if (options.preset !== undefined && !PRESETS.includes(options.preset))
|
|
@@ -21,52 +103,41 @@ export async function createProject(projectName, options = {}) {
|
|
|
21
103
|
if (options.packageManager !== undefined &&
|
|
22
104
|
!SUPPORTED_PACKAGE_MANAGERS.includes(options.packageManager))
|
|
23
105
|
throw new Error('Invalid package manager.');
|
|
106
|
+
if (options.profile?.platform !== undefined && !PLATFORMS.includes(options.profile.platform))
|
|
107
|
+
throw new Error(`Invalid platform. Valid platforms are: ${PLATFORMS.join(', ')}`);
|
|
24
108
|
const defaultDir = projectName.startsWith('@') && projectName.includes('/')
|
|
25
109
|
? projectName.split('/').pop()
|
|
26
110
|
: projectName;
|
|
27
111
|
const targetDir = path.resolve(options.targetDir || path.join(process.cwd(), defaultDir));
|
|
28
112
|
const existingConfig = readProjectConfig(targetDir);
|
|
29
113
|
const manifest = readPackageManifest(targetDir); // Validate before creating or modifying anything.
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
if (presetName !== 'web' && framework && framework !== 'none' && framework !== 'existing')
|
|
33
|
-
throw new Error('A web framework requires --preset web.');
|
|
34
|
-
if (presetName === 'web' && framework === 'existing' && !manifest)
|
|
35
|
-
throw new Error('An existing web framework requires an existing package.json. Use --framework none for a new baseline.');
|
|
36
|
-
const packageManager = options.packageManager ?? existingConfig?.packageManager ?? 'pnpm';
|
|
37
|
-
const dryRun = !!options.dryRun;
|
|
38
|
-
const silent = !!options.silent;
|
|
39
|
-
const presetHandler = getPreset(presetName);
|
|
40
|
-
const defaults = getDefaultConfig(projectName, presetName, {
|
|
41
|
-
framework,
|
|
42
|
-
packageManager
|
|
43
|
-
});
|
|
44
|
-
const config = validateConfig(existingConfig
|
|
45
|
-
? {
|
|
46
|
-
...existingConfig,
|
|
47
|
-
name: projectName,
|
|
48
|
-
preset: presetName,
|
|
49
|
-
packageManager,
|
|
50
|
-
...(presetName === 'web' ? { framework: framework ?? 'none' } : {}),
|
|
51
|
-
browser: options.framework !== undefined || options.preset !== undefined
|
|
52
|
-
? { ...existingConfig.browser, ...defaults.browser }
|
|
53
|
-
: existingConfig.browser,
|
|
54
|
-
skills: upgradeLegacySkillConfig(existingConfig.skills)
|
|
55
|
-
}
|
|
56
|
-
: defaults);
|
|
57
|
-
if (presetName !== 'web')
|
|
114
|
+
const config = resolveConfig(projectName, targetDir, options, existingConfig, manifest);
|
|
115
|
+
if (config.preset !== 'web')
|
|
58
116
|
delete config.framework;
|
|
59
117
|
if (options.graft === false)
|
|
60
118
|
config.codebase = { ...config.codebase, graft: false };
|
|
61
119
|
if (options.skills === false && !existingConfig)
|
|
62
120
|
config.skills.sources = [];
|
|
121
|
+
const presetName = config.preset;
|
|
122
|
+
const packageManager = config.packageManager ?? 'pnpm';
|
|
123
|
+
const { platform, stack } = resolvePlatformStack(config, targetDir);
|
|
124
|
+
const dryRun = !!options.dryRun;
|
|
125
|
+
const silent = !!options.silent;
|
|
126
|
+
const presetHandler = getPreset(presetName);
|
|
127
|
+
const active = activeCapabilities(config);
|
|
63
128
|
if (!silent)
|
|
64
|
-
logger.banner(`Aginit — ${projectName}`, `Preset: ${presetName} | PM: ${packageManager} | Target: ${targetDir}${dryRun ? ' (DRY RUN)' : ''}`);
|
|
129
|
+
logger.banner(`Aginit — ${projectName}`, `Preset: ${presetName} | Platform: ${platform} (${stack})${isNodeStack(stack) ? ` | PM: ${packageManager}` : ''} | Target: ${targetDir}${dryRun ? ' (DRY RUN)' : ''}`);
|
|
130
|
+
if (!silent)
|
|
131
|
+
logger.dim(`Capabilities: ${active.map((c) => c.id).join(', ') || 'none'}`);
|
|
65
132
|
let complete = true;
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
const
|
|
133
|
+
const installSkills = options.skills !== false && config.skills.sources.length > 0;
|
|
134
|
+
// Upstream setups (agent-browser runtime, e2e, Graft) in registry order, Graft last
|
|
135
|
+
// so its first index sees every generated file.
|
|
136
|
+
const setups = active
|
|
137
|
+
.flatMap((capability) => capability.install.flatMap((step) => (step.kind === 'setup' ? [step.setup] : [])))
|
|
138
|
+
.filter((setup) => !(setup === 'graft' && options.graft === false))
|
|
139
|
+
.sort((a, b) => Number(a === 'graft') - Number(b === 'graft'));
|
|
140
|
+
const totalSteps = 6 + setups.length;
|
|
70
141
|
let currentStep = 1;
|
|
71
142
|
// Scaffold into the clean directory before Git adds files that upstream tools reject.
|
|
72
143
|
if (!silent)
|
|
@@ -93,18 +164,16 @@ export async function createProject(projectName, options = {}) {
|
|
|
93
164
|
});
|
|
94
165
|
if (!silent)
|
|
95
166
|
logger.success(`Wrote ${AGINIT_CONFIG_FILENAME}`);
|
|
96
|
-
// Step 4:
|
|
167
|
+
// Step 4: AGENTS.md (task routing) and the docs/agents/ micro-docs it routes to
|
|
97
168
|
if (!silent)
|
|
98
|
-
logger.step(currentStep++, totalSteps, 'Generating AGENTS.md
|
|
99
|
-
|
|
100
|
-
if (claudeCodeEnabled(config))
|
|
101
|
-
setupClaudeMarkdown(targetDir, { dryRun, silent });
|
|
169
|
+
logger.step(currentStep++, totalSteps, 'Generating AGENTS.md and docs/agents/');
|
|
170
|
+
const docs = syncAgentDocs(targetDir, config, { dryRun, silent });
|
|
102
171
|
if (!silent)
|
|
103
|
-
logger.success(
|
|
172
|
+
logger.success(`Configured AGENTS.md${docs.length ? ` and ${docs.map(microDocPath).join(', ')}` : ''}`);
|
|
104
173
|
// Step 5: Install skills via skills.sh engine
|
|
105
174
|
if (!silent)
|
|
106
175
|
logger.step(currentStep++, totalSteps, 'Installing upstream skills via skills.sh');
|
|
107
|
-
if (
|
|
176
|
+
if (installSkills) {
|
|
108
177
|
const { installed, failed } = await installAllSkills(targetDir, config.skills.sources, {
|
|
109
178
|
agents: skillAgents(config),
|
|
110
179
|
dryRun,
|
|
@@ -123,37 +192,33 @@ export async function createProject(projectName, options = {}) {
|
|
|
123
192
|
else if (!silent) {
|
|
124
193
|
logger.dim('Skills installation skipped (--no-skills or empty configuration)');
|
|
125
194
|
}
|
|
126
|
-
|
|
195
|
+
const agentBrowserStub = agentBrowserStubInstalled(targetDir);
|
|
196
|
+
if (installSkills || agentBrowserStub) {
|
|
127
197
|
const advice = ignoreVendoredSkills(targetDir, { dryRun, silent: true });
|
|
128
198
|
if (!silent)
|
|
129
199
|
for (const line of advice)
|
|
130
200
|
logger.warn(line);
|
|
131
201
|
}
|
|
132
|
-
//
|
|
133
|
-
if (
|
|
202
|
+
// A stub installed earlier still needs its runtime, even when skills are skipped now.
|
|
203
|
+
if (agentBrowserStub && !setups.includes('agent-browser'))
|
|
204
|
+
setups.unshift('agent-browser');
|
|
205
|
+
for (const setup of setups) {
|
|
134
206
|
if (!silent)
|
|
135
|
-
logger.step(currentStep++, totalSteps,
|
|
136
|
-
const
|
|
137
|
-
complete &&=
|
|
138
|
-
if (
|
|
139
|
-
logger.success(
|
|
207
|
+
logger.step(currentStep++, totalSteps, SETUP_LABELS[setup]);
|
|
208
|
+
const ok = await SETUPS[setup]({ targetDir, config, platform, stack, dryRun, silent });
|
|
209
|
+
complete &&= ok;
|
|
210
|
+
if (ok && !silent)
|
|
211
|
+
logger.success(`${setup} ready`);
|
|
140
212
|
}
|
|
141
|
-
//
|
|
213
|
+
// CLIs aginit does not install: report the missing ones with their install command.
|
|
142
214
|
if (!silent)
|
|
143
|
-
logger.step(currentStep++, totalSteps, '
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
complete &&= graftOk;
|
|
151
|
-
if (graftOk && !silent) {
|
|
152
|
-
logger.success('Graft context graph initialized');
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
else if (!silent) {
|
|
156
|
-
logger.dim('Graft setup skipped (--no-graft or codebase.graft: false)');
|
|
215
|
+
logger.step(currentStep++, totalSteps, 'Checking capability CLIs');
|
|
216
|
+
const missing = await missingBinaries(active, setups);
|
|
217
|
+
if (!silent) {
|
|
218
|
+
if (missing.length === 0)
|
|
219
|
+
logger.success('Every capability CLI is available');
|
|
220
|
+
for (const { name, bin, install } of missing)
|
|
221
|
+
logger.warn(`${name} needs the \`${bin}\` CLI: ${install}`);
|
|
157
222
|
}
|
|
158
223
|
if (!silent) {
|
|
159
224
|
console.log();
|
|
@@ -166,11 +231,35 @@ export async function createProject(projectName, options = {}) {
|
|
|
166
231
|
const relativeTarget = path.relative(process.cwd(), targetDir);
|
|
167
232
|
if (relativeTarget)
|
|
168
233
|
console.log(pc.cyan(` cd ${relativeTarget}`));
|
|
169
|
-
|
|
234
|
+
if (isNodeStack(stack) && (manifest || fileExists(path.join(targetDir, 'package.json')) || dryRun))
|
|
235
|
+
console.log(pc.cyan(` ${packageManager} install`));
|
|
236
|
+
if (active.some((c) => c.id === 'e2e') && e2eDirFor(stack))
|
|
237
|
+
console.log(pc.cyan(` (cd ${e2eDirFor(stack)} && npm install)`));
|
|
170
238
|
console.log(pc.cyan(' Open the repository in your AI coding agent'));
|
|
171
239
|
console.log(pc.dim(' Prompt the agent: ') + pc.bold(pc.green('"bootstrap this project"')));
|
|
172
240
|
console.log();
|
|
173
241
|
}
|
|
174
242
|
return complete;
|
|
175
243
|
}
|
|
244
|
+
/** Binaries of active capabilities that are not on PATH (setups report their own). */
|
|
245
|
+
export async function missingBinaries(active, setups) {
|
|
246
|
+
const missing = [];
|
|
247
|
+
for (const capability of active) {
|
|
248
|
+
if (capability.install.some((step) => step.kind === 'setup' && setups.includes(step.setup)))
|
|
249
|
+
continue;
|
|
250
|
+
for (const step of capability.install)
|
|
251
|
+
if (step.kind === 'binary' && !(await commandExists(step.bin)))
|
|
252
|
+
missing.push({ name: capability.name, bin: step.bin, install: step.install });
|
|
253
|
+
}
|
|
254
|
+
return missing;
|
|
255
|
+
}
|
|
256
|
+
/** Refresh AGENTS.md, CLAUDE.md and docs/agents/ from the config. */
|
|
257
|
+
export function syncAgentDocs(targetDir, config, options = {}) {
|
|
258
|
+
const scripts = readPackageManifest(targetDir)?.scripts;
|
|
259
|
+
const docs = setupMicroDocs(targetDir, projectProfile(config, { targetDir, scripts }), options);
|
|
260
|
+
setupAgentsMarkdown(targetDir, config, { ...options, docs });
|
|
261
|
+
if (claudeCodeEnabled(config))
|
|
262
|
+
setupClaudeMarkdown(targetDir, options);
|
|
263
|
+
return docs;
|
|
264
|
+
}
|
|
176
265
|
//# sourceMappingURL=new.js.map
|