@antomanc/aginit 0.2.0 → 0.4.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 +21 -0
- package/README.md +94 -67
- package/THIRD_PARTY_NOTICES.md +6 -0
- package/dist/adapters/agent-browser.d.ts +54 -0
- package/dist/adapters/agent-browser.d.ts.map +1 -0
- package/dist/adapters/agent-browser.js +122 -0
- package/dist/adapters/agent-browser.js.map +1 -0
- package/dist/adapters/agents-md.d.ts +12 -0
- package/dist/adapters/agents-md.d.ts.map +1 -1
- package/dist/adapters/agents-md.js +31 -1
- package/dist/adapters/agents-md.js.map +1 -1
- package/dist/adapters/graft.d.ts +1 -0
- package/dist/adapters/graft.d.ts.map +1 -1
- package/dist/adapters/graft.js +5 -3
- package/dist/adapters/graft.js.map +1 -1
- package/dist/adapters/skills.d.ts +20 -1
- package/dist/adapters/skills.d.ts.map +1 -1
- package/dist/adapters/skills.js +38 -1
- package/dist/adapters/skills.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +108 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +8 -4
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/new.d.ts.map +1 -1
- package/dist/cli/new.js +25 -6
- package/dist/cli/new.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +18 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +5 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +2 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +14 -7
- package/src/adapters/agent-browser.ts +162 -0
- package/src/adapters/agents-md.ts +37 -1
- package/src/adapters/graft.ts +6 -4
- package/src/adapters/skills.ts +46 -2
- package/src/cli/doctor.ts +128 -2
- package/src/cli/main.ts +8 -4
- package/src/cli/new.ts +28 -6
- package/src/config/defaults.ts +18 -3
- package/src/config/schema.ts +5 -0
- package/src/config/validation.ts +2 -0
- package/src/index.ts +1 -0
|
@@ -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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export * from './adapters/skills.js';
|
|
|
9
9
|
export * from './adapters/graft.js';
|
|
10
10
|
export * from './adapters/agents-md.js';
|
|
11
11
|
export * from './adapters/browser.js';
|
|
12
|
+
export * from './adapters/agent-browser.js';
|
|
12
13
|
export * from './cli/new.js';
|
|
13
14
|
export * from './cli/init.js';
|
|
14
15
|
export * from './cli/doctor.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,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"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ export * from './adapters/skills.js';
|
|
|
9
9
|
export * from './adapters/graft.js';
|
|
10
10
|
export * from './adapters/agents-md.js';
|
|
11
11
|
export * from './adapters/browser.js';
|
|
12
|
+
export * from './adapters/agent-browser.js';
|
|
12
13
|
export * from './cli/new.js';
|
|
13
14
|
export * from './cli/init.js';
|
|
14
15
|
export * from './cli/doctor.js';
|
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,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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antomanc/aginit",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Set up a new or existing project for AI coding agents in one command: AGENTS.md, Matt Pocock skills, Graft codebase graph, Vitest/Playwright. Orchestrates upstream tools, idempotent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"LICENSE",
|
|
24
24
|
"THIRD_PARTY_NOTICES.md"
|
|
25
25
|
],
|
|
26
|
-
"author": "Antonio
|
|
26
|
+
"author": "Antonio Mancini <an.manc25@gmail.com>",
|
|
27
27
|
"homepage": "https://github.com/antomanc/aginit#readme",
|
|
28
28
|
"bugs": {
|
|
29
29
|
"url": "https://github.com/antomanc/aginit/issues"
|
|
@@ -37,13 +37,20 @@
|
|
|
37
37
|
},
|
|
38
38
|
"keywords": [
|
|
39
39
|
"ai",
|
|
40
|
-
"agents",
|
|
41
|
-
"
|
|
40
|
+
"ai-agents",
|
|
41
|
+
"coding-agents",
|
|
42
|
+
"agents-md",
|
|
43
|
+
"agent-skills",
|
|
42
44
|
"codex",
|
|
43
|
-
"
|
|
45
|
+
"antigravity",
|
|
44
46
|
"graft",
|
|
47
|
+
"scaffolder",
|
|
45
48
|
"bootstrap",
|
|
46
|
-
"
|
|
49
|
+
"project-template",
|
|
50
|
+
"developer-tools",
|
|
51
|
+
"cli",
|
|
52
|
+
"vitest",
|
|
53
|
+
"playwright"
|
|
47
54
|
],
|
|
48
55
|
"dependencies": {
|
|
49
56
|
"@clack/prompts": "^1.8.1",
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileExists, readTextFile } from '../utils/fs.js';
|
|
3
|
+
import { commandExists, runExecutable } from '../utils/shell.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { SkillSourceConfig } from '../config/schema.js';
|
|
6
|
+
|
|
7
|
+
const AGENT_BROWSER_SKILL = 'agent-browser';
|
|
8
|
+
const AGENT_BROWSER_CLI = 'agent-browser';
|
|
9
|
+
const AGENT_BROWSER_PACKAGE = 'vercel-labs/agent-browser';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Whether a configured skill source will install the agent-browser skill stub
|
|
13
|
+
* whose instructions assume the `agent-browser` CLI exists.
|
|
14
|
+
*/
|
|
15
|
+
export function agentBrowserConfigured(sources: SkillSourceConfig[]): boolean {
|
|
16
|
+
return sources.some(
|
|
17
|
+
(source) =>
|
|
18
|
+
source.skills.includes(AGENT_BROWSER_SKILL) ||
|
|
19
|
+
(source.package === AGENT_BROWSER_PACKAGE &&
|
|
20
|
+
(source.skills.length === 0 || source.skills.includes('*')))
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Whether the agent-browser skill stub is already on disk. */
|
|
25
|
+
export function agentBrowserStubInstalled(targetDir: string): boolean {
|
|
26
|
+
return fileExists(path.join(targetDir, '.agents', 'skills', AGENT_BROWSER_SKILL, 'SKILL.md'));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface UsernsRestriction {
|
|
30
|
+
sysctl: string;
|
|
31
|
+
value: string;
|
|
32
|
+
fixValue: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Detect the Linux sysctls that block Chrome's sandbox when set to their
|
|
37
|
+
* restrictive value: Chrome's renderer sandbox runs on unprivileged user
|
|
38
|
+
* namespaces, so agent-browser launches die with "No usable sandbox!".
|
|
39
|
+
*
|
|
40
|
+
* Returns null when the kernel does not expose the knobs (other distros,
|
|
41
|
+
* macOS, Windows) or none of them is restrictive.
|
|
42
|
+
*/
|
|
43
|
+
export function findUsernsRestriction(procRoot = '/proc'): UsernsRestriction | null {
|
|
44
|
+
const knobs: Array<[sysctl: string, blockingValue: string, fixValue: string]> = [
|
|
45
|
+
['kernel.apparmor_restrict_unprivileged_userns', '1', '0'],
|
|
46
|
+
['kernel.unprivileged_userns_clone', '0', '1']
|
|
47
|
+
];
|
|
48
|
+
for (const [sysctl, blockingValue, fixValue] of knobs) {
|
|
49
|
+
const raw = readTextFile(path.join(procRoot, 'sys', ...sysctl.split('.')));
|
|
50
|
+
if (raw !== null && raw.trim() === blockingValue) {
|
|
51
|
+
return { sysctl, value: raw.trim(), fixValue };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface AgentBrowserSetupOptions {
|
|
58
|
+
dryRun?: boolean;
|
|
59
|
+
silent?: boolean;
|
|
60
|
+
/** Working directory for the provisioning commands (defaults to cwd). */
|
|
61
|
+
cwd?: string;
|
|
62
|
+
/** Root of the proc filesystem; overridable for tests. */
|
|
63
|
+
procRoot?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Provision the runtime the agent-browser skill stub depends on: the globally
|
|
68
|
+
* installed CLI (`npm i -g agent-browser`, matching the skill's own install
|
|
69
|
+
* line — npm ships with Node and works regardless of the project's package
|
|
70
|
+
* manager) and its browser binaries (`agent-browser install`, idempotent).
|
|
71
|
+
*
|
|
72
|
+
* A blocked Chrome sandbox is reported as a warning only: it needs a system
|
|
73
|
+
* change aginit must not make on the user's behalf. Returns false when the
|
|
74
|
+
* CLI or the browser binaries could not be provisioned.
|
|
75
|
+
*/
|
|
76
|
+
export async function setupAgentBrowser(options: AgentBrowserSetupOptions = {}): Promise<boolean> {
|
|
77
|
+
const { dryRun = false, silent = false, cwd = process.cwd(), procRoot = '/proc' } = options;
|
|
78
|
+
|
|
79
|
+
const cliPresent = await commandExists('agent-browser');
|
|
80
|
+
if (!cliPresent) {
|
|
81
|
+
if (!silent) logger.dim('Installing agent-browser CLI globally (npm -g)...');
|
|
82
|
+
const cli = await runExecutable('npm', ['install', '-g', AGENT_BROWSER_SKILL], {
|
|
83
|
+
cwd,
|
|
84
|
+
dryRun,
|
|
85
|
+
silent: true,
|
|
86
|
+
timeout: 600_000
|
|
87
|
+
});
|
|
88
|
+
if (!cli.ok && !dryRun) {
|
|
89
|
+
if (!silent) {
|
|
90
|
+
logger.warn(`Failed installing agent-browser CLI: ${cli.stderr || cli.stdout}`);
|
|
91
|
+
logger.dim(' Install it manually: npm i -g agent-browser && agent-browser install');
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!silent) logger.dim('Ensuring agent-browser browser binaries...');
|
|
98
|
+
const browser = await runExecutable(AGENT_BROWSER_CLI, ['install'], {
|
|
99
|
+
cwd,
|
|
100
|
+
dryRun,
|
|
101
|
+
silent: true,
|
|
102
|
+
timeout: 600_000
|
|
103
|
+
});
|
|
104
|
+
if (!browser.ok && !dryRun) {
|
|
105
|
+
if (!silent) {
|
|
106
|
+
logger.warn(`Failed downloading agent-browser browsers: ${browser.stderr || browser.stdout}`);
|
|
107
|
+
logger.dim(' Retry manually: agent-browser install');
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const restriction = findUsernsRestriction(procRoot);
|
|
113
|
+
if (restriction && !silent) {
|
|
114
|
+
logger.warn(
|
|
115
|
+
`Chrome's sandbox is blocked: ${restriction.sysctl}=${restriction.value} restricts unprivileged user namespaces, so agent-browser launches fail with "No usable sandbox!".`
|
|
116
|
+
);
|
|
117
|
+
logger.dim(
|
|
118
|
+
` → Fix (machine-wide): echo '${restriction.sysctl}=${restriction.fixValue}' | sudo tee /etc/sysctl.d/99-agent-browser-userns.conf && sudo sysctl --system`
|
|
119
|
+
);
|
|
120
|
+
logger.dim(
|
|
121
|
+
' → Narrower option: pass --args "--no-sandbox" to agent-browser for that launch (Chrome sandbox disabled for that session)'
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface AgentBrowserDiagnostic {
|
|
128
|
+
message: string;
|
|
129
|
+
fix?: string;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Run upstream's own diagnostics (`agent-browser doctor --quick --offline
|
|
134
|
+
* --json`) and return the failing checks, so aginit reports browser health
|
|
135
|
+
* instead of reimplementing it. Returns null when the report cannot be
|
|
136
|
+
* parsed (older CLI, unexpected output) — callers should then skip the check
|
|
137
|
+
* rather than guess.
|
|
138
|
+
*/
|
|
139
|
+
export async function runAgentBrowserDiagnostics(): Promise<AgentBrowserDiagnostic[] | null> {
|
|
140
|
+
const res = await runExecutable(
|
|
141
|
+
AGENT_BROWSER_CLI,
|
|
142
|
+
['doctor', '--quick', '--offline', '--json'],
|
|
143
|
+
{
|
|
144
|
+
silent: true,
|
|
145
|
+
timeout: 60_000
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
try {
|
|
149
|
+
const parsed = JSON.parse(res.stdout) as {
|
|
150
|
+
checks?: Array<{ status?: string; message?: string; fix?: string }>;
|
|
151
|
+
};
|
|
152
|
+
if (!Array.isArray(parsed.checks)) return null;
|
|
153
|
+
return parsed.checks
|
|
154
|
+
.filter((check) => check?.status === 'fail')
|
|
155
|
+
.map((check) => ({
|
|
156
|
+
message: String(check?.message || 'check failed'),
|
|
157
|
+
...(check?.fix ? { fix: String(check.fix) } : {})
|
|
158
|
+
}));
|
|
159
|
+
} catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -62,6 +62,12 @@ export function generateAgentsMarkdown(
|
|
|
62
62
|
'- **Prose & Copy**: Use `humanizer` skill to eliminate AI writing tells and refine documentation.';
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
let simplicityCapability = '';
|
|
66
|
+
if (skillInstalled('ponytail')) {
|
|
67
|
+
simplicityCapability =
|
|
68
|
+
'- **Simplicity**: Use `ponytail` skill for the smallest complete change and to cut over-engineering.';
|
|
69
|
+
}
|
|
70
|
+
|
|
65
71
|
let uiCapability = '';
|
|
66
72
|
if (isWeb && skillInstalled('impeccable')) {
|
|
67
73
|
uiCapability =
|
|
@@ -105,10 +111,13 @@ export function generateAgentsMarkdown(
|
|
|
105
111
|
'',
|
|
106
112
|
'## AI Capabilities & Skills',
|
|
107
113
|
hasSkills
|
|
108
|
-
?
|
|
114
|
+
? config.agents.claudeCode === false
|
|
115
|
+
? 'Configured skills install into `.agents/skills/` (shared by Antigravity and Codex):'
|
|
116
|
+
: 'Configured skills install into `.agents/skills/` (shared by Antigravity and Codex, linked into `.claude/skills/` for Claude Code):'
|
|
109
117
|
: 'Skills installation is disabled in this configuration.',
|
|
110
118
|
engineeringCapability || undefined,
|
|
111
119
|
proseCapability || undefined,
|
|
120
|
+
simplicityCapability || undefined,
|
|
112
121
|
specCapability || undefined,
|
|
113
122
|
uiCapability || undefined,
|
|
114
123
|
browserCapability || undefined,
|
|
@@ -168,3 +177,30 @@ export function setupAgentsMarkdown(
|
|
|
168
177
|
const content = generateAgentsMarkdown(config, readPackageManifest(targetDir)?.scripts);
|
|
169
178
|
return safeWriteFile(filePath, content, { overwrite: true, dryRun, silent });
|
|
170
179
|
}
|
|
180
|
+
|
|
181
|
+
export const CLAUDE_AGENTS_IMPORT = '@AGENTS.md';
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Point Claude Code at AGENTS.md through a one-line `@AGENTS.md` import. Recent
|
|
185
|
+
* Claude Code reads AGENTS.md on its own, but only without a CLAUDE.md and not
|
|
186
|
+
* in every session; the import works everywhere and never loads it twice.
|
|
187
|
+
* An existing CLAUDE.md is left alone (doctor reports a missing import).
|
|
188
|
+
*/
|
|
189
|
+
export function setupClaudeMarkdown(
|
|
190
|
+
targetDir: string,
|
|
191
|
+
options: { dryRun?: boolean; silent?: boolean } = {}
|
|
192
|
+
): boolean {
|
|
193
|
+
const { dryRun = false, silent = false } = options;
|
|
194
|
+
const filePath = path.join(targetDir, 'CLAUDE.md');
|
|
195
|
+
if (fileExists(filePath)) {
|
|
196
|
+
if (!silent) logger.dim('CLAUDE.md already exists, preserving content.');
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
return safeWriteFile(filePath, CLAUDE_AGENTS_IMPORT + '\n', { overwrite: false, dryRun, silent });
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function claudeMarkdownImportsAgents(content: string): boolean {
|
|
203
|
+
return content
|
|
204
|
+
.split(/\r?\n/)
|
|
205
|
+
.some((line) => ['@AGENTS.md', '@./AGENTS.md'].includes(line.trim()));
|
|
206
|
+
}
|
package/src/adapters/graft.ts
CHANGED
|
@@ -9,9 +9,9 @@ export async function isGraftInstalled(): Promise<boolean> {
|
|
|
9
9
|
|
|
10
10
|
export async function initGraft(
|
|
11
11
|
targetDir: string,
|
|
12
|
-
options: { dryRun?: boolean; silent?: boolean } = {}
|
|
12
|
+
options: { dryRun?: boolean; silent?: boolean; claude?: boolean } = {}
|
|
13
13
|
): Promise<boolean> {
|
|
14
|
-
const { dryRun = false, silent = false } = options;
|
|
14
|
+
const { dryRun = false, silent = false, claude = true } = options;
|
|
15
15
|
|
|
16
16
|
const installed = dryRun || (await isGraftInstalled());
|
|
17
17
|
if (!installed) {
|
|
@@ -25,10 +25,12 @@ export async function initGraft(
|
|
|
25
25
|
|
|
26
26
|
if (!silent) logger.dim('Initializing Graft context graph...');
|
|
27
27
|
|
|
28
|
-
//
|
|
28
|
+
// Wire Antigravity, AGENTS.md readers and (optionally) Claude Code's in-repo
|
|
29
|
+
// .claude/ + .mcp.json, without touching global system files (--no-global)
|
|
30
|
+
const agents = ['antigravity', 'agents', ...(claude ? ['claude'] : [])];
|
|
29
31
|
const res = await runExecutable(
|
|
30
32
|
'graft',
|
|
31
|
-
['init', '--no-global', '--agents',
|
|
33
|
+
['init', '--no-global', '--agents', ...agents, '-y'],
|
|
32
34
|
{
|
|
33
35
|
cwd: targetDir,
|
|
34
36
|
dryRun,
|
package/src/adapters/skills.ts
CHANGED
|
@@ -4,7 +4,21 @@ import { fileExists, readJsonFile } from '../utils/fs.js';
|
|
|
4
4
|
import { runExecutable } from '../utils/shell.js';
|
|
5
5
|
import { logger } from '../utils/logger.js';
|
|
6
6
|
import { validateUpstreamArgument } from '../config/validation.js';
|
|
7
|
-
import { SkillSourceConfig } from '../config/schema.js';
|
|
7
|
+
import { AginitConfig, SkillSourceConfig } from '../config/schema.js';
|
|
8
|
+
|
|
9
|
+
/** The skills CLI id for Claude Code; it links skills into `.claude/skills/`. */
|
|
10
|
+
export const CLAUDE_CODE_AGENT = 'claude-code';
|
|
11
|
+
|
|
12
|
+
export function claudeCodeEnabled(config: Pick<AginitConfig, 'agents'>): boolean {
|
|
13
|
+
return config.agents.claudeCode !== false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Agents the skills CLI installs into, deduplicated. */
|
|
17
|
+
export function skillAgents(config: Pick<AginitConfig, 'agents'>): string[] {
|
|
18
|
+
const agents = [config.agents.primary, config.agents.secondary];
|
|
19
|
+
if (claudeCodeEnabled(config)) agents.push(CLAUDE_CODE_AGENT);
|
|
20
|
+
return [...new Set(agents)];
|
|
21
|
+
}
|
|
8
22
|
|
|
9
23
|
export interface SkillsLockFile {
|
|
10
24
|
version: number;
|
|
@@ -30,7 +44,7 @@ export async function installSkillSource(
|
|
|
30
44
|
source: SkillSourceConfig,
|
|
31
45
|
options: SkillInstallOptions = {}
|
|
32
46
|
): Promise<{ ok: boolean; message?: string }> {
|
|
33
|
-
const { agents = ['antigravity', 'codex'], dryRun = false, silent = false } = options;
|
|
47
|
+
const { agents = ['antigravity', 'codex', CLAUDE_CODE_AGENT], dryRun = false, silent = false } = options;
|
|
34
48
|
|
|
35
49
|
validateUpstreamArgument(source.package, 'skill package');
|
|
36
50
|
for (const skill of source.skills) validateUpstreamArgument(skill, 'skill name');
|
|
@@ -105,6 +119,36 @@ export function getInstalledSkills(targetDir: string): string[] {
|
|
|
105
119
|
return [...installed];
|
|
106
120
|
}
|
|
107
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Installed skills Claude Code cannot see because `.claude/skills/<name>/SKILL.md`
|
|
124
|
+
* is missing (the skills CLI links them there when `claude-code` is an agent).
|
|
125
|
+
*/
|
|
126
|
+
export function getSkillsMissingForClaude(targetDir: string): string[] {
|
|
127
|
+
return getInstalledSkills(targetDir).filter(
|
|
128
|
+
(name) => !fileExists(path.join(targetDir, '.claude', 'skills', name, 'SKILL.md'))
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Bring projects set up before Claude Code support up to date: when Claude Code
|
|
134
|
+
* is enabled and some installed skill is not linked into `.claude/skills/`,
|
|
135
|
+
* reinstall the configured sources with the full agent list (idempotent).
|
|
136
|
+
*/
|
|
137
|
+
export async function ensureClaudeSkillLinks(
|
|
138
|
+
targetDir: string,
|
|
139
|
+
config: AginitConfig,
|
|
140
|
+
options: { dryRun?: boolean; silent?: boolean } = {}
|
|
141
|
+
): Promise<boolean> {
|
|
142
|
+
if (!claudeCodeEnabled(config) || config.skills.sources.length === 0) return true;
|
|
143
|
+
if (getSkillsMissingForClaude(targetDir).length === 0) return true;
|
|
144
|
+
if (!options.silent) logger.dim('Linking skills into .claude/skills/ for Claude Code...');
|
|
145
|
+
const { failed } = await installAllSkills(targetDir, config.skills.sources, {
|
|
146
|
+
...options,
|
|
147
|
+
agents: skillAgents(config)
|
|
148
|
+
});
|
|
149
|
+
return failed.length === 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
108
152
|
export async function updateSkills(
|
|
109
153
|
targetDir: string,
|
|
110
154
|
options: { dryRun?: boolean; silent?: boolean } = {}
|
package/src/cli/doctor.ts
CHANGED
|
@@ -9,7 +9,19 @@ import {
|
|
|
9
9
|
PackageManager
|
|
10
10
|
} from '../config/schema.js';
|
|
11
11
|
import { detectPackageManager } from '../adapters/package-manager.js';
|
|
12
|
-
import
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import {
|
|
14
|
+
claudeCodeEnabled,
|
|
15
|
+
getInstalledSkills,
|
|
16
|
+
getSkillsMissingForClaude
|
|
17
|
+
} from '../adapters/skills.js';
|
|
18
|
+
import { claudeMarkdownImportsAgents } from '../adapters/agents-md.js';
|
|
19
|
+
import {
|
|
20
|
+
agentBrowserConfigured,
|
|
21
|
+
agentBrowserStubInstalled,
|
|
22
|
+
findUsernsRestriction,
|
|
23
|
+
runAgentBrowserDiagnostics
|
|
24
|
+
} from '../adapters/agent-browser.js';
|
|
13
25
|
import { readProjectConfig } from '../config/validation.js';
|
|
14
26
|
import { logger } from '../utils/logger.js';
|
|
15
27
|
|
|
@@ -163,7 +175,7 @@ export async function runDoctor(targetDir: string = process.cwd()): Promise<void
|
|
|
163
175
|
category: 'Project Config',
|
|
164
176
|
ok: !!projectConfig,
|
|
165
177
|
detail: projectConfig
|
|
166
|
-
? `Preset: "${projectConfig.preset}" (v${projectConfig.schemaVersion || '1.0.0'}), pm: ${activePm}, agents: ${projectConfig.agents.primary}/${projectConfig.agents.secondary}`
|
|
178
|
+
? `Preset: "${projectConfig.preset}" (v${projectConfig.schemaVersion || '1.0.0'}), pm: ${activePm}, agents: ${projectConfig.agents.primary}/${projectConfig.agents.secondary}${claudeCodeEnabled(projectConfig) ? '/claude-code' : ''}`
|
|
167
179
|
: configError
|
|
168
180
|
? `Invalid configuration: ${configError}`
|
|
169
181
|
: 'No aginit.config.json found in current directory',
|
|
@@ -214,6 +226,120 @@ export async function runDoctor(targetDir: string = process.cwd()): Promise<void
|
|
|
214
226
|
: 'Run `aginit init` or `npx skills add ...` to install skills'
|
|
215
227
|
});
|
|
216
228
|
|
|
229
|
+
// 9b. Claude Code: skills linked into .claude/skills/ and AGENTS.md reachable
|
|
230
|
+
if (projectConfig !== null && claudeCodeEnabled(projectConfig)) {
|
|
231
|
+
if (!skillsDisabled && installedSkills.length > 0) {
|
|
232
|
+
const missing = getSkillsMissingForClaude(targetDir);
|
|
233
|
+
checks.push({
|
|
234
|
+
name: 'Claude Code Skills (.claude/skills/)',
|
|
235
|
+
category: 'Project Config',
|
|
236
|
+
ok: missing.length === 0,
|
|
237
|
+
detail:
|
|
238
|
+
missing.length === 0
|
|
239
|
+
? `All ${installedSkills.length} skills visible to Claude Code`
|
|
240
|
+
: `${missing.length} skills not linked for Claude Code: ${missing.join(', ')}`,
|
|
241
|
+
suggestion:
|
|
242
|
+
missing.length === 0
|
|
243
|
+
? undefined
|
|
244
|
+
: 'Run `aginit update` or `aginit init` to link skills into .claude/skills/ (or set agents.claudeCode: false)'
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const claudePath = path.join(targetDir, 'CLAUDE.md');
|
|
249
|
+
const claudeExists = fileExists(claudePath);
|
|
250
|
+
// A CLAUDE.md symlinked to AGENTS.md is as good as the import.
|
|
251
|
+
const claudeIsAgentsLink =
|
|
252
|
+
claudeExists &&
|
|
253
|
+
agentsExists &&
|
|
254
|
+
fs.realpathSync(claudePath) === fs.realpathSync(agentsPath);
|
|
255
|
+
const claudeOk =
|
|
256
|
+
!claudeExists ||
|
|
257
|
+
claudeIsAgentsLink ||
|
|
258
|
+
claudeMarkdownImportsAgents(readTextFile(claudePath) || '');
|
|
259
|
+
checks.push({
|
|
260
|
+
name: 'CLAUDE.md → AGENTS.md',
|
|
261
|
+
category: 'Project Config',
|
|
262
|
+
ok: claudeExists && claudeOk,
|
|
263
|
+
detail: !claudeExists
|
|
264
|
+
? 'No CLAUDE.md; only Claude Code v2.1.277+ reads AGENTS.md on its own'
|
|
265
|
+
: claudeOk
|
|
266
|
+
? 'CLAUDE.md imports AGENTS.md'
|
|
267
|
+
: 'CLAUDE.md exists without `@AGENTS.md`, so Claude Code ignores AGENTS.md',
|
|
268
|
+
suggestion: !claudeExists
|
|
269
|
+
? 'Run `aginit update` or `aginit init` to add a CLAUDE.md that imports AGENTS.md'
|
|
270
|
+
: claudeOk
|
|
271
|
+
? undefined
|
|
272
|
+
: 'Add a line `@AGENTS.md` to CLAUDE.md'
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 10. agent-browser runtime (only when the project ships the skill)
|
|
277
|
+
const agentBrowserWanted =
|
|
278
|
+
projectConfig !== null &&
|
|
279
|
+
(agentBrowserConfigured(projectConfig.skills.sources) || agentBrowserStubInstalled(targetDir));
|
|
280
|
+
if (agentBrowserWanted) {
|
|
281
|
+
const abExists = await commandExists('agent-browser');
|
|
282
|
+
let abVersion = '';
|
|
283
|
+
if (abExists) {
|
|
284
|
+
const av = await runExecutable('agent-browser', ['--version'], { silent: true });
|
|
285
|
+
abVersion = av.ok ? av.stdout : '';
|
|
286
|
+
}
|
|
287
|
+
checks.push({
|
|
288
|
+
name: 'agent-browser CLI',
|
|
289
|
+
category: 'AI Tooling',
|
|
290
|
+
ok: abExists,
|
|
291
|
+
version: abVersion,
|
|
292
|
+
detail: abExists
|
|
293
|
+
? `Installed globally (${abVersion || 'version unknown'})`
|
|
294
|
+
: 'agent-browser skill is installed but the CLI is not in PATH',
|
|
295
|
+
suggestion: abExists
|
|
296
|
+
? undefined
|
|
297
|
+
: 'Install the runtime: `npm i -g agent-browser && agent-browser install`'
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
if (abExists) {
|
|
301
|
+
const diagnostics = await runAgentBrowserDiagnostics();
|
|
302
|
+
if (diagnostics !== null) {
|
|
303
|
+
checks.push({
|
|
304
|
+
name: 'agent-browser browser runtime',
|
|
305
|
+
category: 'AI Tooling',
|
|
306
|
+
ok: diagnostics.length === 0,
|
|
307
|
+
detail:
|
|
308
|
+
diagnostics.length === 0
|
|
309
|
+
? 'Upstream doctor reports browser and launch environment healthy'
|
|
310
|
+
: diagnostics.map((d) => d.message).join('; '),
|
|
311
|
+
suggestion:
|
|
312
|
+
diagnostics.length === 0
|
|
313
|
+
? undefined
|
|
314
|
+
: (diagnostics.find((d) => d.fix)?.fix ?? 'Run `agent-browser doctor` for details')
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// 11. Chrome sandbox prerequisites — agent-browser and Playwright both
|
|
321
|
+
// launch Chrome from the same sandbox on Linux.
|
|
322
|
+
const sandboxRelevant = agentBrowserWanted || projectConfig?.browser.playwright === true;
|
|
323
|
+
if (sandboxRelevant) {
|
|
324
|
+
const restriction = findUsernsRestriction();
|
|
325
|
+
if (restriction) {
|
|
326
|
+
checks.push({
|
|
327
|
+
name: 'Chrome sandbox (unprivileged user namespaces)',
|
|
328
|
+
category: 'Environment',
|
|
329
|
+
ok: false,
|
|
330
|
+
detail: `${restriction.sysctl}=${restriction.value} blocks Chrome's sandbox: browser launches fail with "No usable sandbox!"`,
|
|
331
|
+
suggestion: `Lift it: echo '${restriction.sysctl}=${restriction.fixValue}' | sudo tee /etc/sysctl.d/99-agent-browser-userns.conf && sudo sysctl --system — or pass --args "--no-sandbox" per launch`
|
|
332
|
+
});
|
|
333
|
+
} else if (process.platform === 'linux') {
|
|
334
|
+
checks.push({
|
|
335
|
+
name: 'Chrome sandbox (unprivileged user namespaces)',
|
|
336
|
+
category: 'Environment',
|
|
337
|
+
ok: true,
|
|
338
|
+
detail: 'Unprivileged user namespaces available to Chrome'
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
217
343
|
// Print grouped results
|
|
218
344
|
const categories: Array<'Environment' | 'AI Tooling' | 'Project Config'> = [
|
|
219
345
|
'Environment',
|
package/src/cli/main.ts
CHANGED
|
@@ -3,7 +3,8 @@ 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 { updateSkills } from '../adapters/skills.js';
|
|
6
|
+
import { claudeCodeEnabled, ensureClaudeSkillLinks, updateSkills } from '../adapters/skills.js';
|
|
7
|
+
import { setupClaudeMarkdown } from '../adapters/agents-md.js';
|
|
7
8
|
import { buildGraft } from '../adapters/graft.js';
|
|
8
9
|
import { readProjectConfig } from '../config/validation.js';
|
|
9
10
|
import { logger } from '../utils/logger.js';
|
|
@@ -33,7 +34,7 @@ export function createCliProgram(): Command {
|
|
|
33
34
|
|
|
34
35
|
program
|
|
35
36
|
.name('aginit')
|
|
36
|
-
.description('
|
|
37
|
+
.description('Set up a new or existing project for AI coding agents')
|
|
37
38
|
.version(readVersion());
|
|
38
39
|
|
|
39
40
|
// Root action: interactive wizard when in TTY, else display help
|
|
@@ -161,9 +162,12 @@ export function createCliProgram(): Command {
|
|
|
161
162
|
const targetDir = process.cwd();
|
|
162
163
|
const config = readProjectConfig(targetDir);
|
|
163
164
|
const skillsOk =
|
|
164
|
-
config?.skills.sources.length === 0
|
|
165
|
+
(config?.skills.sources.length === 0
|
|
165
166
|
? true
|
|
166
|
-
: await updateSkills(targetDir, { dryRun: options.dryRun })
|
|
167
|
+
: await updateSkills(targetDir, { dryRun: options.dryRun })) &&
|
|
168
|
+
(config ? await ensureClaudeSkillLinks(targetDir, config, { dryRun: options.dryRun }) : true);
|
|
169
|
+
if (config && claudeCodeEnabled(config))
|
|
170
|
+
setupClaudeMarkdown(targetDir, { dryRun: options.dryRun });
|
|
167
171
|
const graftOk =
|
|
168
172
|
config?.codebase.graft === false
|
|
169
173
|
? true
|