@antomanc/aginit 0.4.1 → 0.5.1

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 (112) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -34
  3. package/THIRD_PARTY_NOTICES.md +92 -16
  4. package/dist/adapters/agent-docs.d.ts +35 -0
  5. package/dist/adapters/agent-docs.d.ts.map +1 -0
  6. package/dist/adapters/agent-docs.js +156 -0
  7. package/dist/adapters/agent-docs.js.map +1 -0
  8. package/dist/adapters/agents-md.d.ts +15 -1
  9. package/dist/adapters/agents-md.d.ts.map +1 -1
  10. package/dist/adapters/agents-md.js +146 -120
  11. package/dist/adapters/agents-md.js.map +1 -1
  12. package/dist/adapters/e2e.d.ts +15 -0
  13. package/dist/adapters/e2e.d.ts.map +1 -0
  14. package/dist/adapters/e2e.js +55 -0
  15. package/dist/adapters/e2e.js.map +1 -0
  16. package/dist/adapters/skills.d.ts +5 -0
  17. package/dist/adapters/skills.d.ts.map +1 -1
  18. package/dist/adapters/skills.js +17 -0
  19. package/dist/adapters/skills.js.map +1 -1
  20. package/dist/cli/capabilities.d.ts +17 -0
  21. package/dist/cli/capabilities.d.ts.map +1 -0
  22. package/dist/cli/capabilities.js +149 -0
  23. package/dist/cli/capabilities.js.map +1 -0
  24. package/dist/cli/doctor.d.ts +16 -0
  25. package/dist/cli/doctor.d.ts.map +1 -1
  26. package/dist/cli/doctor.js +90 -70
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/init.js +1 -1
  29. package/dist/cli/init.js.map +1 -1
  30. package/dist/cli/main.d.ts.map +1 -1
  31. package/dist/cli/main.js +117 -20
  32. package/dist/cli/main.js.map +1 -1
  33. package/dist/cli/new.d.ts +15 -1
  34. package/dist/cli/new.d.ts.map +1 -1
  35. package/dist/cli/new.js +157 -68
  36. package/dist/cli/new.js.map +1 -1
  37. package/dist/cli/wizard.d.ts +5 -0
  38. package/dist/cli/wizard.d.ts.map +1 -1
  39. package/dist/cli/wizard.js +104 -102
  40. package/dist/cli/wizard.js.map +1 -1
  41. package/dist/config/defaults.d.ts +14 -6
  42. package/dist/config/defaults.d.ts.map +1 -1
  43. package/dist/config/defaults.js +38 -174
  44. package/dist/config/defaults.js.map +1 -1
  45. package/dist/config/schema.d.ts +14 -0
  46. package/dist/config/schema.d.ts.map +1 -1
  47. package/dist/config/schema.js.map +1 -1
  48. package/dist/config/validation.d.ts +1 -0
  49. package/dist/config/validation.d.ts.map +1 -1
  50. package/dist/config/validation.js +63 -0
  51. package/dist/config/validation.js.map +1 -1
  52. package/dist/detect/index.d.ts +18 -0
  53. package/dist/detect/index.d.ts.map +1 -0
  54. package/dist/detect/index.js +120 -0
  55. package/dist/detect/index.js.map +1 -0
  56. package/dist/index.d.ts +5 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +5 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/presets/cli.d.ts.map +1 -1
  61. package/dist/presets/cli.js +7 -0
  62. package/dist/presets/cli.js.map +1 -1
  63. package/dist/presets/generic.d.ts.map +1 -1
  64. package/dist/presets/generic.js +4 -1
  65. package/dist/presets/generic.js.map +1 -1
  66. package/dist/presets/testing.d.ts +1 -1
  67. package/dist/presets/testing.d.ts.map +1 -1
  68. package/dist/presets/testing.js +22 -8
  69. package/dist/presets/testing.js.map +1 -1
  70. package/dist/presets/web.d.ts.map +1 -1
  71. package/dist/presets/web.js +5 -2
  72. package/dist/presets/web.js.map +1 -1
  73. package/dist/registry/catalog.d.ts +13 -0
  74. package/dist/registry/catalog.d.ts.map +1 -0
  75. package/dist/registry/catalog.js +544 -0
  76. package/dist/registry/catalog.js.map +1 -0
  77. package/dist/registry/index.d.ts +84 -0
  78. package/dist/registry/index.d.ts.map +1 -0
  79. package/dist/registry/index.js +309 -0
  80. package/dist/registry/index.js.map +1 -0
  81. package/dist/registry/setup.d.ts +14 -0
  82. package/dist/registry/setup.d.ts.map +1 -0
  83. package/dist/registry/setup.js +25 -0
  84. package/dist/registry/setup.js.map +1 -0
  85. package/dist/registry/types.d.ts +115 -0
  86. package/dist/registry/types.d.ts.map +1 -0
  87. package/dist/registry/types.js +2 -0
  88. package/dist/registry/types.js.map +1 -0
  89. package/package.json +3 -2
  90. package/src/adapters/agent-docs.ts +197 -0
  91. package/src/adapters/agents-md.ts +171 -137
  92. package/src/adapters/e2e.ts +58 -0
  93. package/src/adapters/skills.ts +18 -0
  94. package/src/cli/capabilities.ts +176 -0
  95. package/src/cli/doctor.ts +83 -66
  96. package/src/cli/init.ts +1 -1
  97. package/src/cli/main.ts +125 -20
  98. package/src/cli/new.ts +195 -74
  99. package/src/cli/wizard.ts +130 -103
  100. package/src/config/defaults.ts +57 -179
  101. package/src/config/schema.ts +15 -0
  102. package/src/config/validation.ts +56 -0
  103. package/src/detect/index.ts +134 -0
  104. package/src/index.ts +5 -0
  105. package/src/presets/cli.ts +6 -0
  106. package/src/presets/generic.ts +4 -1
  107. package/src/presets/testing.ts +29 -12
  108. package/src/presets/web.ts +4 -2
  109. package/src/registry/catalog.ts +569 -0
  110. package/src/registry/index.ts +395 -0
  111. package/src/registry/setup.ts +40 -0
  112. package/src/registry/types.ts +109 -0
@@ -1,181 +1,45 @@
1
+ import { applyResolvedProfile, isNodeStack, MATT_POCOCK_SKILLS, resolveCapabilities } from '../registry/index.js';
2
+ export { MATT_POCOCK_SKILLS };
3
+ export function presetPlatform(preset) {
4
+ return preset === 'web' ? 'web' : 'cli';
5
+ }
1
6
  /**
2
- * The stable skill set from mattpocock/skills installed by default:
3
- * every skill in the `engineering` and `productivity` categories.
4
- *
5
- * The `misc` (rarely used) and `in-progress` categories are deliberately
6
- * excluded. Re-evaluate when the upstream repository reshuffles categories.
7
+ * A fresh config: the preset's scaffolding settings plus the capabilities the
8
+ * registry enables for the platform, stack and profile flags.
7
9
  */
8
- export const MATT_POCOCK_SKILLS = [
9
- // engineering
10
- 'ask-matt',
11
- 'code-review',
12
- 'codebase-design',
13
- 'diagnosing-bugs',
14
- 'domain-modeling',
15
- 'grill-with-docs',
16
- 'implement',
17
- 'implement-spec',
18
- 'improve-codebase-architecture',
19
- 'pr',
20
- 'prototype',
21
- 'research',
22
- 'retro',
23
- 'setup-matt-pocock-skills',
24
- 'tdd',
25
- 'to-spec',
26
- 'to-tickets',
27
- 'triage',
28
- 'wayfinder',
29
- 'wizard',
30
- // productivity
31
- 'grill-me',
32
- 'grilling',
33
- 'handoff',
34
- 'teach',
35
- 'to-questionnaire',
36
- 'wait-what',
37
- 'writing-for-agents'
38
- ];
39
10
  export function getDefaultConfig(name, preset, options = {}) {
40
11
  const packageManager = options.packageManager || 'pnpm';
41
- switch (preset) {
42
- case 'web': {
43
- const framework = options.framework || 'none';
44
- const hasWebTarget = framework === 'vite' || framework === 'next';
45
- return {
46
- schemaVersion: '1.0.0',
47
- name,
48
- preset: 'web',
49
- framework,
50
- packageManager,
51
- agents: {
52
- primary: 'antigravity',
53
- secondary: 'codex',
54
- claudeCode: true
55
- },
56
- skills: {
57
- sources: [
58
- {
59
- package: 'mattpocock/skills',
60
- skills: [...MATT_POCOCK_SKILLS]
61
- },
62
- {
63
- package: 'blader/humanizer',
64
- skills: ['humanizer']
65
- },
66
- {
67
- package: 'dietrichgebert/ponytail',
68
- skills: ['ponytail']
69
- },
70
- {
71
- package: 'pbakaus/impeccable',
72
- skills: ['impeccable']
73
- },
74
- {
75
- package: 'vercel-labs/agent-browser',
76
- skills: ['agent-browser']
77
- }
78
- ]
79
- },
80
- codebase: {
81
- graft: true
82
- },
83
- browser: {
84
- visualAgent: true,
85
- playwright: hasWebTarget
86
- },
87
- docs: {
88
- adr: true
89
- },
90
- github: {
91
- ci: true
92
- }
93
- };
94
- }
95
- case 'cli':
96
- return {
97
- schemaVersion: '1.0.0',
98
- name,
99
- preset: 'cli',
100
- packageManager,
101
- agents: {
102
- primary: 'antigravity',
103
- secondary: 'codex',
104
- claudeCode: true
105
- },
106
- skills: {
107
- sources: [
108
- {
109
- package: 'mattpocock/skills',
110
- skills: [...MATT_POCOCK_SKILLS]
111
- },
112
- {
113
- package: 'blader/humanizer',
114
- skills: ['humanizer']
115
- },
116
- {
117
- package: 'dietrichgebert/ponytail',
118
- skills: ['ponytail']
119
- }
120
- ]
121
- },
122
- codebase: {
123
- graft: true
124
- },
125
- browser: {
126
- visualAgent: false,
127
- playwright: false
128
- },
129
- docs: {
130
- adr: true
131
- },
132
- github: {
133
- ci: true
134
- }
135
- };
136
- case 'generic':
137
- default:
138
- return {
139
- schemaVersion: '1.0.0',
140
- name,
141
- preset: 'generic',
142
- packageManager,
143
- agents: {
144
- primary: 'antigravity',
145
- secondary: 'codex',
146
- claudeCode: true
147
- },
148
- skills: {
149
- sources: [
150
- {
151
- package: 'mattpocock/skills',
152
- skills: [...MATT_POCOCK_SKILLS]
153
- },
154
- {
155
- package: 'blader/humanizer',
156
- skills: ['humanizer']
157
- },
158
- {
159
- package: 'dietrichgebert/ponytail',
160
- skills: ['ponytail']
161
- }
162
- ]
163
- },
164
- codebase: {
165
- graft: true
166
- },
167
- browser: {
168
- visualAgent: false,
169
- playwright: false
170
- },
171
- docs: {
172
- adr: true
173
- },
174
- github: {
175
- ci: false
176
- }
177
- };
178
- }
12
+ const platform = options.platform ?? presetPlatform(preset);
13
+ const stack = options.stack ?? 'node';
14
+ const framework = preset === 'web' ? options.framework || 'none' : undefined;
15
+ const base = {
16
+ schemaVersion: '1.0.0',
17
+ name,
18
+ preset,
19
+ ...(framework ? { framework } : {}),
20
+ // Only Node projects have a package manager; the others use their host toolchain.
21
+ ...(isNodeStack(stack) ? { packageManager } : {}),
22
+ platform,
23
+ stack,
24
+ agents: {
25
+ primary: 'antigravity',
26
+ secondary: 'codex',
27
+ claudeCode: true
28
+ },
29
+ skills: { sources: [] },
30
+ codebase: { graft: true },
31
+ browser: { visualAgent: false, playwright: false },
32
+ docs: { adr: true },
33
+ github: { ci: preset !== 'generic' }
34
+ };
35
+ const profile = resolveCapabilities({
36
+ platform,
37
+ stack,
38
+ framework,
39
+ harness: options.harness,
40
+ flags: options.flags
41
+ });
42
+ return applyResolvedProfile(base, profile, { skills: options.skills !== false });
179
43
  }
180
44
  /** The skill selections that older versions of aginit wrote as defaults. */
181
45
  const LEGACY_MATT_SKILL_SELECTIONS = [
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { CustomCapabilityConfig, Platform, Stack } from '../registry/types.js';
1
2
  export type PresetType = 'web' | 'cli' | 'generic';
2
3
  export type WebFramework = 'none' | 'vite' | 'next' | 'existing';
3
4
  export type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
@@ -42,6 +43,19 @@ export interface AginitConfig {
42
43
  github: {
43
44
  ci: boolean;
44
45
  };
46
+ /** Target platform. Missing in pre-v2 configs; detected from the project then. */
47
+ platform?: Platform;
48
+ /** Host toolchain. Missing in pre-v2 configs; detected from the project then. */
49
+ stack?: Stack;
50
+ /**
51
+ * Enabled capability ids from the registry (src/registry/catalog.ts).
52
+ * Missing in pre-v2 configs; inferred from skills.sources and the switches above.
53
+ */
54
+ capabilities?: string[];
55
+ /** Skill repositories added on top of the registry; always enabled unless disabled. */
56
+ customCapabilities?: CustomCapabilityConfig[];
57
+ /** Capability ids to keep off, even when a preset or platform default would enable them. */
58
+ disabledCapabilities?: string[];
45
59
  }
46
60
  export type AIProjectConfig = AginitConfig;
47
61
  export declare const AGINIT_CONFIG_FILENAME = "aginit.config.json";
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AACjE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,MAAM,EAAE;QACN;;;;WAIG;QACH,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;QAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;KAC9B,CAAC;IACF,QAAQ,EAAE;QACR,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,OAAO,EAAE;QACP,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE,OAAO,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACN,EAAE,EAAE,OAAO,CAAC;KACb,CAAC;CACH;AAGD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAE3C,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AACvD,eAAO,MAAM,kBAAkB,uBAAyB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEpF,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AACjE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,MAAM,EAAE;QACN;;;;WAIG;QACH,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;QAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;KAC9B,CAAC;IACF,QAAQ,EAAE;QACR,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,OAAO,EAAE;QACP,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE,OAAO,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACN,EAAE,EAAE,OAAO,CAAC;KACb,CAAC;IACF,kFAAkF;IAClF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,iFAAiF;IACjF,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC9C,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAGD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAE3C,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AACvD,eAAO,MAAM,kBAAkB,uBAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAkEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}
@@ -2,6 +2,7 @@ import { AginitConfig } from './schema.js';
2
2
  export declare const PRESETS: readonly ['web', 'cli', 'generic'];
3
3
  export declare const FRAMEWORKS: readonly ['none', 'vite', 'next', 'existing'];
4
4
  export declare const SUPPORTED_PACKAGE_MANAGERS: readonly ['pnpm', 'npm', 'yarn', 'bun'];
5
+ export declare const STACKS: readonly ['node', 'react-native', 'flutter', 'swift', 'kotlin', 'rust', 'python', 'go', 'unknown'];
5
6
  export declare function isRecord(value: unknown): value is Record<string, any>;
6
7
  export declare function validateProjectName(name: string): void;
7
8
  export declare function validateUpstreamArgument(value: unknown, label: string): asserts value is string;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAkD,MAAM,aAAa,CAAC;AAE3F,eAAO,MAAM,OAAO,YAAI,KAAK,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAC1D,eAAO,MAAM,UAAU,YAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AACxE,eAAO,MAAM,0BAA0B,YAAI,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAClF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAErE;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMtD;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAW/F;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAsC3D;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYlE;AACD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAgB3E"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAkD,MAAM,aAAa,CAAC;AAI3F,eAAO,MAAM,OAAO,YAAI,KAAK,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAC1D,eAAO,MAAM,UAAU,YAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AACxE,eAAO,MAAM,0BAA0B,YAAI,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAClF,eAAO,MAAM,MAAM,YACjB,MAAM,EACN,cAAc,EACd,SAAS,EACT,OAAO,EACP,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,SAAS,CACD,CAAC;AAWX,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAErE;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMtD;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAW/F;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAuE3D;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYlE;AACD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAgB3E"}
@@ -1,9 +1,32 @@
1
1
  import path from 'node:path';
2
2
  import { fileExists, readJsonFile } from '../utils/fs.js';
3
3
  import { AGINIT_CONFIG_FILENAME, LEGACY_CONFIG_FILENAME } from './schema.js';
4
+ import { CATALOG } from '../registry/catalog.js';
5
+ import { PLATFORMS } from '../registry/index.js';
4
6
  export const PRESETS = ['web', 'cli', 'generic'];
5
7
  export const FRAMEWORKS = ['none', 'vite', 'next', 'existing'];
6
8
  export const SUPPORTED_PACKAGE_MANAGERS = ['pnpm', 'npm', 'yarn', 'bun'];
9
+ export const STACKS = [
10
+ 'node',
11
+ 'react-native',
12
+ 'flutter',
13
+ 'swift',
14
+ 'kotlin',
15
+ 'rust',
16
+ 'python',
17
+ 'go',
18
+ 'unknown'
19
+ ];
20
+ const CATEGORIES = [
21
+ 'methodology',
22
+ 'discipline',
23
+ 'design',
24
+ 'codebase-graph',
25
+ 'ui-driver',
26
+ 'testing-engine',
27
+ 'context-guard',
28
+ 'custom'
29
+ ];
7
30
  export function isRecord(value) {
8
31
  return typeof value === 'object' && value !== null && !Array.isArray(value);
9
32
  }
@@ -54,6 +77,46 @@ export function validateConfig(value) {
54
77
  for (const skill of source.skills)
55
78
  validateUpstreamArgument(skill, 'skill name');
56
79
  }
80
+ if (value.platform !== undefined && !PLATFORMS.includes(value.platform))
81
+ fail('platform');
82
+ if (value.stack !== undefined && !STACKS.includes(value.stack))
83
+ fail('stack');
84
+ for (const key of ['capabilities', 'disabledCapabilities']) {
85
+ if (value[key] === undefined)
86
+ continue;
87
+ if (!Array.isArray(value[key]))
88
+ fail(key);
89
+ for (const id of value[key])
90
+ validateUpstreamArgument(id, `${key} entry`);
91
+ }
92
+ if (value.customCapabilities !== undefined) {
93
+ if (!Array.isArray(value.customCapabilities))
94
+ fail('customCapabilities');
95
+ const seen = new Set();
96
+ for (const custom of value.customCapabilities) {
97
+ if (!isRecord(custom))
98
+ fail('customCapabilities entry');
99
+ validateUpstreamArgument(custom.id, 'custom capability id');
100
+ if (seen.has(custom.id) || CATALOG.some((entry) => entry.id === custom.id))
101
+ fail(`customCapabilities: duplicate id "${custom.id}"`);
102
+ seen.add(custom.id);
103
+ if (typeof custom.repo !== 'string' || !/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(custom.repo))
104
+ fail(`customCapabilities.${custom.id}.repo (expected owner/repo)`);
105
+ if (custom.skills !== undefined) {
106
+ if (!Array.isArray(custom.skills))
107
+ fail(`customCapabilities.${custom.id}.skills`);
108
+ for (const skill of custom.skills)
109
+ validateUpstreamArgument(skill, 'skill name');
110
+ }
111
+ if (custom.category !== undefined && !CATEGORIES.includes(custom.category))
112
+ fail(`customCapabilities.${custom.id}.category`);
113
+ if (custom.binary !== undefined &&
114
+ (!isRecord(custom.binary) ||
115
+ typeof custom.binary.install !== 'string' ||
116
+ !/^[a-zA-Z0-9._-]+$/.test(String(custom.binary.bin))))
117
+ fail(`customCapabilities.${custom.id}.binary`);
118
+ }
119
+ }
57
120
  for (const [section, keys] of Object.entries({
58
121
  codebase: ['graft'],
59
122
  browser: ['visualAgent', 'playwright'],
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { PackageManager } from '../config/schema.js';
2
+ import { Platform, ProjectCommands, Stack } from '../registry/types.js';
3
+ export interface DetectedProject {
4
+ /** null when nothing marks the platform (empty directory). */
5
+ platform: Platform | null;
6
+ stack: Stack;
7
+ }
8
+ /** Read the project's markers (pubspec.yaml, Package.swift, gradle, package.json, ...). */
9
+ export declare function detectProject(dir: string): DetectedProject;
10
+ /**
11
+ * The project's own commands: package scripts for Node projects, the host
12
+ * toolchain otherwise. Commands that would be guesses are left out.
13
+ */
14
+ export declare function projectCommands(dir: string, stack: Stack, options?: {
15
+ packageManager?: PackageManager;
16
+ scripts?: Record<string, string>;
17
+ }): ProjectCommands;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/detect/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;CACd;AAkCD,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAClF,eAAe,CAiDjB"}
@@ -0,0 +1,120 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readJsonFile, readTextFile } from '../utils/fs.js';
4
+ import { getPackageManagerAdapter } from '../adapters/package-manager.js';
5
+ const WEB_FRAMEWORKS = [
6
+ 'next',
7
+ 'vite',
8
+ 'astro',
9
+ 'react',
10
+ 'react-dom',
11
+ 'vue',
12
+ 'nuxt',
13
+ 'svelte',
14
+ '@sveltejs/kit',
15
+ '@angular/core',
16
+ 'solid-js',
17
+ '@remix-run/react',
18
+ 'preact'
19
+ ];
20
+ function entries(dir) {
21
+ try {
22
+ return fs.readdirSync(dir);
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ }
28
+ const hasXcodeProject = (dir) => entries(dir).some((name) => name.endsWith('.xcodeproj'));
29
+ function gradleFiles(dir) {
30
+ return ['build.gradle', 'build.gradle.kts', 'settings.gradle', 'settings.gradle.kts']
31
+ .map((name) => readTextFile(path.join(dir, name)))
32
+ .filter((text) => text !== null);
33
+ }
34
+ /** Read the project's markers (pubspec.yaml, Package.swift, gradle, package.json, ...). */
35
+ export function detectProject(dir) {
36
+ const exists = (file) => fs.existsSync(path.join(dir, file));
37
+ const pkg = readJsonFile(path.join(dir, 'package.json'));
38
+ const deps = { ...pkg?.dependencies, ...pkg?.devDependencies };
39
+ if (exists('pubspec.yaml'))
40
+ return { platform: 'mobile-native', stack: 'flutter' };
41
+ const expoApp = /"expo"\s*:/.test(readTextFile(path.join(dir, 'app.json')) ?? '');
42
+ if (deps['react-native'] || deps.expo || expoApp)
43
+ return { platform: 'mobile-rn', stack: 'react-native' };
44
+ if (exists('Package.swift') || hasXcodeProject(dir) || hasXcodeProject(path.join(dir, 'ios'))) {
45
+ const manifest = readTextFile(path.join(dir, 'Package.swift')) ?? '';
46
+ const apple = !exists('Package.swift') || /\.(iOS|macOS|tvOS|watchOS|visionOS)\(/.test(manifest);
47
+ return { platform: apple ? 'mobile-native' : 'cli', stack: 'swift' };
48
+ }
49
+ const androidGradle = gradleFiles(path.join(dir, 'android'));
50
+ const rootGradle = gradleFiles(dir);
51
+ if (androidGradle.length > 0 || rootGradle.some((text) => /com\.android|android\s*\{/.test(text)))
52
+ return { platform: 'mobile-native', stack: 'kotlin' };
53
+ if (pkg) {
54
+ const web = WEB_FRAMEWORKS.some((name) => deps[name]);
55
+ return { platform: web ? 'web' : 'cli', stack: 'node' };
56
+ }
57
+ if (rootGradle.length > 0)
58
+ return { platform: 'backend', stack: 'kotlin' };
59
+ if (exists('Cargo.toml'))
60
+ return { platform: 'cli', stack: 'rust' };
61
+ if (exists('go.mod'))
62
+ return { platform: 'backend', stack: 'go' };
63
+ if (exists('pyproject.toml') || exists('requirements.txt'))
64
+ return { platform: 'backend', stack: 'python' };
65
+ return { platform: null, stack: 'unknown' };
66
+ }
67
+ /**
68
+ * The project's own commands: package scripts for Node projects, the host
69
+ * toolchain otherwise. Commands that would be guesses are left out.
70
+ */
71
+ export function projectCommands(dir, stack, options = {}) {
72
+ const exists = (file) => fs.existsSync(path.join(dir, file));
73
+ switch (stack) {
74
+ case 'node':
75
+ case 'react-native': {
76
+ const scripts = options.scripts ??
77
+ readJsonFile(path.join(dir, 'package.json'))?.scripts ??
78
+ {};
79
+ const pm = getPackageManagerAdapter(options.packageManager);
80
+ const run = (name) => (Object.hasOwn(scripts, name) ? pm.runCmd(name) : undefined);
81
+ return {
82
+ dev: run('dev'),
83
+ build: run('build'),
84
+ typecheck: run('typecheck'),
85
+ lint: run('lint'),
86
+ test: run('test'),
87
+ unitTest: run('test:unit'),
88
+ e2e: run('test:e2e')
89
+ };
90
+ }
91
+ case 'flutter':
92
+ return { lint: 'flutter analyze', test: 'flutter test' };
93
+ case 'swift':
94
+ return exists('Package.swift')
95
+ ? { build: 'swift build', test: 'swift test' }
96
+ : {
97
+ build: 'xcodebuild build -scheme <Scheme>',
98
+ test: "xcodebuild test -scheme <Scheme> -destination 'platform=iOS Simulator,name=<Device>'"
99
+ };
100
+ case 'kotlin': {
101
+ const nested = fs.existsSync(path.join(dir, 'android'));
102
+ const android = nested || gradleFiles(dir).some((text) => /com\.android|android\s*\{/.test(text));
103
+ const gradlew = nested ? 'cd android && ./gradlew' : './gradlew';
104
+ return {
105
+ build: `${gradlew} build`,
106
+ ...(android ? { lint: `${gradlew} lint` } : {}),
107
+ test: `${gradlew} test`
108
+ };
109
+ }
110
+ case 'rust':
111
+ return { build: 'cargo build', typecheck: 'cargo check', lint: 'cargo clippy', test: 'cargo test' };
112
+ case 'go':
113
+ return { build: 'go build ./...', lint: 'go vet ./...', test: 'go test ./...' };
114
+ case 'python':
115
+ return { test: exists('uv.lock') ? 'uv run pytest' : 'pytest' };
116
+ case 'unknown':
117
+ return {};
118
+ }
119
+ }
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/detect/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -14,4 +14,9 @@ export * from './cli/new.js';
14
14
  export * from './cli/init.js';
15
15
  export * from './cli/doctor.js';
16
16
  export * from './cli/wizard.js';
17
+ export * from './registry/index.js';
18
+ export * from './detect/index.js';
19
+ export * from './adapters/agent-docs.js';
20
+ export * from './adapters/e2e.js';
21
+ export * from './cli/capabilities.js';
17
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -14,4 +14,9 @@ export * from './cli/new.js';
14
14
  export * from './cli/init.js';
15
15
  export * from './cli/doctor.js';
16
16
  export * from './cli/wizard.js';
17
+ export * from './registry/index.js';
18
+ export * from './detect/index.js';
19
+ export * from './adapters/agent-docs.js';
20
+ export * from './adapters/e2e.js';
21
+ export * from './cli/capabilities.js';
17
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/presets/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAK1D,eAAO,MAAM,SAAS,EAAE,aAgIvB,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/presets/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAM1D,eAAO,MAAM,SAAS,EAAE,aAqIvB,CAAC"}
@@ -3,6 +3,7 @@ import { fileExists, safeWriteFile, writeJsonFile } from '../utils/fs.js';
3
3
  import { readPackageManifest } from '../config/validation.js';
4
4
  import { addTestingDependencies, setupTesting, VITEST_VERSION } from './testing.js';
5
5
  import { setupAdr } from './adr.js';
6
+ import { activeIds } from '../registry/index.js';
6
7
  export const cliPreset = {
7
8
  name: 'cli',
8
9
  description: 'AI-first TypeScript CLI application with Commander, Picocolors, and Vitest',
@@ -11,6 +12,12 @@ export const cliPreset = {
11
12
  const pm = ctx.config.packageManager || 'pnpm';
12
13
  const existing = readPackageManifest(targetDir);
13
14
  if (existing) {
15
+ // An existing project keeps its own runner unless Vitest is a selected capability.
16
+ if (!activeIds(ctx.config).has('vitest')) {
17
+ if (ctx.config.docs.adr)
18
+ setupAdr(targetDir, { dryRun, silent });
19
+ return;
20
+ }
14
21
  const hadVitestScript = Object.values(existing.scripts || {}).some((script) => typeof script === 'string' && /^vitest(?:\s|$)/.test(script));
15
22
  addTestingDependencies(existing);
16
23
  writeJsonFile(path.join(targetDir, 'package.json'), existing, {