@antomanc/aginit 0.1.0 → 0.2.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 (54) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +1 -1
  3. package/README.md +60 -183
  4. package/THIRD_PARTY_NOTICES.md +5 -0
  5. package/dist/adapters/agents-md.d.ts.map +1 -1
  6. package/dist/adapters/agents-md.js +47 -23
  7. package/dist/adapters/agents-md.js.map +1 -1
  8. package/dist/adapters/browser.js.map +1 -1
  9. package/dist/adapters/git.d.ts.map +1 -1
  10. package/dist/adapters/git.js +2 -0
  11. package/dist/adapters/git.js.map +1 -1
  12. package/dist/adapters/graft.js.map +1 -1
  13. package/dist/adapters/package-manager.js.map +1 -1
  14. package/dist/adapters/skills.d.ts.map +1 -1
  15. package/dist/adapters/skills.js +11 -7
  16. package/dist/adapters/skills.js.map +1 -1
  17. package/dist/cli/doctor.d.ts.map +1 -1
  18. package/dist/cli/doctor.js +10 -7
  19. package/dist/cli/doctor.js.map +1 -1
  20. package/dist/cli/init.js.map +1 -1
  21. package/dist/cli/main.d.ts.map +1 -1
  22. package/dist/cli/main.js +17 -16
  23. package/dist/cli/main.js.map +1 -1
  24. package/dist/cli/new.d.ts +0 -1
  25. package/dist/cli/new.d.ts.map +1 -1
  26. package/dist/cli/new.js +7 -18
  27. package/dist/cli/new.js.map +1 -1
  28. package/dist/cli/wizard.d.ts +0 -4
  29. package/dist/cli/wizard.d.ts.map +1 -1
  30. package/dist/cli/wizard.js +4 -50
  31. package/dist/cli/wizard.js.map +1 -1
  32. package/dist/config/defaults.d.ts +16 -1
  33. package/dist/config/defaults.d.ts.map +1 -1
  34. package/dist/config/defaults.js +79 -10
  35. package/dist/config/defaults.js.map +1 -1
  36. package/dist/config/schema.d.ts +5 -0
  37. package/dist/config/schema.d.ts.map +1 -1
  38. package/dist/config/schema.js.map +1 -1
  39. package/dist/config/validation.d.ts +3 -3
  40. package/dist/config/validation.d.ts.map +1 -1
  41. package/dist/presets/adr.js.map +1 -1
  42. package/dist/utils/fs.js.map +1 -1
  43. package/dist/utils/logger.d.ts.map +1 -1
  44. package/dist/utils/shell.js.map +1 -1
  45. package/package.json +10 -9
  46. package/src/adapters/agents-md.ts +53 -26
  47. package/src/adapters/git.ts +2 -0
  48. package/src/adapters/skills.ts +10 -7
  49. package/src/cli/doctor.ts +8 -6
  50. package/src/cli/main.ts +17 -25
  51. package/src/cli/new.ts +6 -22
  52. package/src/cli/wizard.ts +4 -56
  53. package/src/config/defaults.ts +97 -12
  54. package/src/config/schema.ts +5 -0
package/src/cli/new.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import pc from 'picocolors';
3
- import { getDefaultConfig } from '../config/defaults.js';
3
+ import { getDefaultConfig, upgradeLegacySkillConfig } from '../config/defaults.js';
4
4
  import {
5
5
  AGINIT_CONFIG_FILENAME,
6
6
  PresetType,
@@ -28,7 +28,6 @@ export interface NewProjectOptions {
28
28
  preset?: PresetType;
29
29
  framework?: WebFramework;
30
30
  packageManager?: PackageManager;
31
- specWorkflow?: boolean;
32
31
  skills?: boolean;
33
32
  graft?: boolean;
34
33
  git?: boolean;
@@ -73,8 +72,7 @@ export async function createProject(
73
72
  const presetHandler = getPreset(presetName);
74
73
  const defaults = getDefaultConfig(projectName, presetName, {
75
74
  framework,
76
- packageManager,
77
- specWorkflow: options.specWorkflow
75
+ packageManager
78
76
  });
79
77
  const config = validateConfig(
80
78
  existingConfig
@@ -88,22 +86,7 @@ export async function createProject(
88
86
  options.framework !== undefined || options.preset !== undefined
89
87
  ? { ...existingConfig.browser, ...defaults.browser }
90
88
  : existingConfig.browser,
91
- skills:
92
- options.specWorkflow !== undefined
93
- ? {
94
- ...existingConfig.skills,
95
- workflow: defaults.skills.workflow,
96
- sources: existingConfig.skills.sources.map((source) =>
97
- source.package === 'mattpocock/skills'
98
- ? {
99
- ...source,
100
- skills: defaults.skills.sources.find((s) => s.package === source.package)!
101
- .skills
102
- }
103
- : source
104
- )
105
- }
106
- : existingConfig.skills
89
+ skills: upgradeLegacySkillConfig(existingConfig.skills)
107
90
  }
108
91
  : defaults
109
92
  );
@@ -189,9 +172,10 @@ export async function createProject(
189
172
  );
190
173
  console.log();
191
174
  console.log('Next steps:');
192
- console.log(pc.cyan(` cd ${path.relative(process.cwd(), targetDir) || '.'}`));
175
+ const relativeTarget = path.relative(process.cwd(), targetDir);
176
+ if (relativeTarget) console.log(pc.cyan(` cd ${relativeTarget}`));
193
177
  console.log(pc.cyan(` ${packageManager} install`));
194
- console.log(pc.cyan(' Open the repository in T3 Code'));
178
+ console.log(pc.cyan(' Open the repository in your AI coding agent'));
195
179
  console.log(pc.dim(' Prompt the agent: ') + pc.bold(pc.green('"bootstrap this project"')));
196
180
  console.log();
197
181
  }
package/src/cli/wizard.ts CHANGED
@@ -23,14 +23,12 @@ export interface WizardNewAnswers {
23
23
  preset: PresetType;
24
24
  framework: WebFramework;
25
25
  packageManager: PackageManager;
26
- specWorkflow: boolean;
27
26
  }
28
27
 
29
28
  export interface WizardInitAnswers {
30
29
  preset: PresetType;
31
30
  framework: WebFramework;
32
31
  packageManager: PackageManager;
33
- specWorkflow: boolean;
34
32
  }
35
33
 
36
34
  export async function promptNewProject(defaults?: {
@@ -38,7 +36,6 @@ export async function promptNewProject(defaults?: {
38
36
  preset?: PresetType;
39
37
  framework?: WebFramework;
40
38
  packageManager?: PackageManager;
41
- specWorkflow?: boolean;
42
39
  }): Promise<WizardNewAnswers> {
43
40
  let projectName: string = defaults?.projectName || '';
44
41
  if (!projectName) {
@@ -101,28 +98,6 @@ export async function promptNewProject(defaults?: {
101
98
  framework = assertNotCancelled(res) as WebFramework;
102
99
  }
103
100
 
104
- let specWorkflow = defaults?.specWorkflow;
105
- if (specWorkflow === undefined) {
106
- const res = await p.select({
107
- message: 'Select AI engineering workflow:',
108
- initialValue: 'minimal',
109
- options: [
110
- {
111
- value: 'minimal',
112
- label: 'Standard Workflow (Recommended)',
113
- hint: 'TDD, Code Review, Diagnosing Bugs'
114
- },
115
- {
116
- value: 'spec',
117
- label: 'Spec & Tickets Workflow',
118
- hint: 'Adds to-spec, to-tickets, implement-spec'
119
- }
120
- ]
121
- });
122
- const selected = assertNotCancelled(res);
123
- specWorkflow = selected === 'spec';
124
- }
125
-
126
101
  let packageManager = defaults?.packageManager;
127
102
  if (!packageManager) {
128
103
  const res = await p.select({
@@ -146,8 +121,7 @@ export async function promptNewProject(defaults?: {
146
121
  projectName,
147
122
  preset,
148
123
  framework,
149
- packageManager,
150
- specWorkflow
124
+ packageManager
151
125
  };
152
126
  }
153
127
 
@@ -156,7 +130,6 @@ export async function promptInitProject(defaults?: {
156
130
  preset?: PresetType;
157
131
  framework?: WebFramework;
158
132
  packageManager?: PackageManager;
159
- specWorkflow?: boolean;
160
133
  }): Promise<WizardInitAnswers> {
161
134
  const targetDir = defaults?.targetDir || process.cwd();
162
135
 
@@ -197,28 +170,6 @@ export async function promptInitProject(defaults?: {
197
170
  framework = assertNotCancelled(res) as WebFramework;
198
171
  }
199
172
 
200
- let specWorkflow = defaults?.specWorkflow;
201
- if (specWorkflow === undefined) {
202
- const res = await p.select({
203
- message: 'Select AI engineering workflow:',
204
- initialValue: 'minimal',
205
- options: [
206
- {
207
- value: 'minimal',
208
- label: 'Standard Workflow (Recommended)',
209
- hint: 'TDD, Code Review, Diagnosing Bugs'
210
- },
211
- {
212
- value: 'spec',
213
- label: 'Spec & Tickets Workflow',
214
- hint: 'Adds to-spec, to-tickets, implement-spec'
215
- }
216
- ]
217
- });
218
- const selected = assertNotCancelled(res);
219
- specWorkflow = selected === 'spec';
220
- }
221
-
222
173
  // Auto-detect and preserve existing package manager without prompting
223
174
  let packageManager = defaults?.packageManager;
224
175
  if (!packageManager) {
@@ -243,8 +194,7 @@ export async function promptInitProject(defaults?: {
243
194
  return {
244
195
  preset,
245
196
  framework,
246
- packageManager,
247
- specWorkflow
197
+ packageManager
248
198
  };
249
199
  }
250
200
 
@@ -277,8 +227,7 @@ export async function runInteractiveWizard(): Promise<void> {
277
227
  complete = await createProject(answers.projectName, {
278
228
  preset: answers.preset,
279
229
  framework: answers.framework,
280
- packageManager: answers.packageManager,
281
- specWorkflow: answers.specWorkflow
230
+ packageManager: answers.packageManager
282
231
  });
283
232
  } else {
284
233
  const saved = readProjectConfig(process.cwd());
@@ -291,8 +240,7 @@ export async function runInteractiveWizard(): Promise<void> {
291
240
  complete = await initCurrentDirectory({
292
241
  preset: answers.preset,
293
242
  framework: answers.framework,
294
- packageManager: answers.packageManager,
295
- specWorkflow: answers.specWorkflow
243
+ packageManager: answers.packageManager
296
244
  });
297
245
  }
298
246
  }
@@ -1,21 +1,61 @@
1
- import { AginitConfig, PresetType, WebFramework, PackageManager } from './schema.js';
1
+ import {
2
+ AginitConfig,
3
+ PresetType,
4
+ WebFramework,
5
+ PackageManager,
6
+ SkillSourceConfig
7
+ } from './schema.js';
2
8
 
3
9
  export interface DefaultConfigOptions {
4
10
  framework?: WebFramework;
5
- specWorkflow?: boolean;
6
11
  packageManager?: PackageManager;
7
12
  }
8
13
 
14
+ /**
15
+ * The stable skill set from mattpocock/skills installed by default:
16
+ * every skill in the `engineering` and `productivity` categories.
17
+ *
18
+ * The `misc` (rarely used) and `in-progress` categories are deliberately
19
+ * excluded. Re-evaluate when the upstream repository reshuffles categories.
20
+ */
21
+ export const MATT_POCOCK_SKILLS = [
22
+ // engineering
23
+ 'ask-matt',
24
+ 'code-review',
25
+ 'codebase-design',
26
+ 'diagnosing-bugs',
27
+ 'domain-modeling',
28
+ 'grill-with-docs',
29
+ 'implement',
30
+ 'implement-spec',
31
+ 'improve-codebase-architecture',
32
+ 'pr',
33
+ 'prototype',
34
+ 'research',
35
+ 'retro',
36
+ 'setup-matt-pocock-skills',
37
+ 'tdd',
38
+ 'to-spec',
39
+ 'to-tickets',
40
+ 'triage',
41
+ 'wayfinder',
42
+ 'wizard',
43
+ // productivity
44
+ 'grill-me',
45
+ 'grilling',
46
+ 'handoff',
47
+ 'teach',
48
+ 'to-questionnaire',
49
+ 'wait-what',
50
+ 'writing-for-agents'
51
+ ] as const;
52
+
9
53
  export function getDefaultConfig(
10
54
  name: string,
11
55
  preset: PresetType,
12
56
  options: DefaultConfigOptions = {}
13
57
  ): AginitConfig {
14
- const specWorkflow = !!options.specWorkflow;
15
58
  const packageManager = options.packageManager || 'pnpm';
16
- const mattSkills = specWorkflow
17
- ? ['tdd', 'code-review', 'diagnosing-bugs', 'to-spec', 'to-tickets', 'implement-spec']
18
- : ['tdd', 'code-review', 'diagnosing-bugs'];
19
59
 
20
60
  switch (preset) {
21
61
  case 'web': {
@@ -33,11 +73,14 @@ export function getDefaultConfig(
33
73
  secondary: 'codex'
34
74
  },
35
75
  skills: {
36
- workflow: specWorkflow ? 'spec' : 'minimal',
37
76
  sources: [
38
77
  {
39
78
  package: 'mattpocock/skills',
40
- skills: mattSkills
79
+ skills: [...MATT_POCOCK_SKILLS]
80
+ },
81
+ {
82
+ package: 'blader/humanizer',
83
+ skills: ['humanizer']
41
84
  },
42
85
  {
43
86
  package: 'pbakaus/impeccable',
@@ -76,11 +119,14 @@ export function getDefaultConfig(
76
119
  secondary: 'codex'
77
120
  },
78
121
  skills: {
79
- workflow: specWorkflow ? 'spec' : 'minimal',
80
122
  sources: [
81
123
  {
82
124
  package: 'mattpocock/skills',
83
- skills: mattSkills
125
+ skills: [...MATT_POCOCK_SKILLS]
126
+ },
127
+ {
128
+ package: 'blader/humanizer',
129
+ skills: ['humanizer']
84
130
  }
85
131
  ]
86
132
  },
@@ -111,11 +157,14 @@ export function getDefaultConfig(
111
157
  secondary: 'codex'
112
158
  },
113
159
  skills: {
114
- workflow: specWorkflow ? 'spec' : 'minimal',
115
160
  sources: [
116
161
  {
117
162
  package: 'mattpocock/skills',
118
- skills: mattSkills
163
+ skills: [...MATT_POCOCK_SKILLS]
164
+ },
165
+ {
166
+ package: 'blader/humanizer',
167
+ skills: ['humanizer']
119
168
  }
120
169
  ]
121
170
  },
@@ -135,3 +184,39 @@ export function getDefaultConfig(
135
184
  };
136
185
  }
137
186
  }
187
+
188
+ /** The skill selections that older versions of aginit wrote as defaults. */
189
+ const LEGACY_MATT_SKILL_SELECTIONS: string[][] = [
190
+ ['tdd', 'code-review', 'diagnosing-bugs'],
191
+ ['tdd', 'code-review', 'diagnosing-bugs', 'to-spec', 'to-tickets', 'implement-spec']
192
+ ];
193
+
194
+ function matchesLegacySelection(skills: string[]): boolean {
195
+ return LEGACY_MATT_SKILL_SELECTIONS.some(
196
+ (selection) =>
197
+ selection.length === skills.length && selection.every((skill) => skills.includes(skill))
198
+ );
199
+ }
200
+
201
+ /**
202
+ * Bring a saved `skills` section forward to the current standard: install the
203
+ * full stable Matt Pocock set and drop the retired workflow selector.
204
+ *
205
+ * Only the exact selections aginit used to write are migrated, so a project
206
+ * whose skill list was narrowed by hand keeps the list its author chose.
207
+ */
208
+ export function upgradeLegacySkillConfig(
209
+ skills: AginitConfig['skills']
210
+ ): AginitConfig['skills'] {
211
+ const sources: SkillSourceConfig[] = skills.sources.map((source) =>
212
+ source.package === 'mattpocock/skills' && matchesLegacySelection(source.skills)
213
+ ? { ...source, skills: [...MATT_POCOCK_SKILLS] }
214
+ : source
215
+ );
216
+ const migrated = sources.some((source, index) => source !== skills.sources[index]);
217
+ if (!migrated) return skills;
218
+
219
+ const upgraded: AginitConfig['skills'] = { ...skills, sources };
220
+ delete upgraded.workflow;
221
+ return upgraded;
222
+ }
@@ -18,6 +18,11 @@ export interface AginitConfig {
18
18
  secondary: string;
19
19
  };
20
20
  skills: {
21
+ /**
22
+ * @deprecated Legacy selector from when only a subset of skills was
23
+ * installed. All standard skills are installed now, so this field is no
24
+ * longer written. It is still accepted so existing configs keep loading.
25
+ */
21
26
  workflow?: 'minimal' | 'spec';
22
27
  sources: SkillSourceConfig[];
23
28
  };