@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.
Files changed (53) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +94 -67
  3. package/THIRD_PARTY_NOTICES.md +6 -0
  4. package/dist/adapters/agent-browser.d.ts +54 -0
  5. package/dist/adapters/agent-browser.d.ts.map +1 -0
  6. package/dist/adapters/agent-browser.js +122 -0
  7. package/dist/adapters/agent-browser.js.map +1 -0
  8. package/dist/adapters/agents-md.d.ts +12 -0
  9. package/dist/adapters/agents-md.d.ts.map +1 -1
  10. package/dist/adapters/agents-md.js +31 -1
  11. package/dist/adapters/agents-md.js.map +1 -1
  12. package/dist/adapters/graft.d.ts +1 -0
  13. package/dist/adapters/graft.d.ts.map +1 -1
  14. package/dist/adapters/graft.js +5 -3
  15. package/dist/adapters/graft.js.map +1 -1
  16. package/dist/adapters/skills.d.ts +20 -1
  17. package/dist/adapters/skills.d.ts.map +1 -1
  18. package/dist/adapters/skills.js +38 -1
  19. package/dist/adapters/skills.js.map +1 -1
  20. package/dist/cli/doctor.d.ts.map +1 -1
  21. package/dist/cli/doctor.js +108 -2
  22. package/dist/cli/doctor.js.map +1 -1
  23. package/dist/cli/main.d.ts.map +1 -1
  24. package/dist/cli/main.js +8 -4
  25. package/dist/cli/main.js.map +1 -1
  26. package/dist/cli/new.d.ts.map +1 -1
  27. package/dist/cli/new.js +25 -6
  28. package/dist/cli/new.js.map +1 -1
  29. package/dist/config/defaults.d.ts.map +1 -1
  30. package/dist/config/defaults.js +18 -3
  31. package/dist/config/defaults.js.map +1 -1
  32. package/dist/config/schema.d.ts +5 -0
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/config/schema.js.map +1 -1
  35. package/dist/config/validation.d.ts.map +1 -1
  36. package/dist/config/validation.js +2 -0
  37. package/dist/config/validation.js.map +1 -1
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/package.json +14 -7
  43. package/src/adapters/agent-browser.ts +162 -0
  44. package/src/adapters/agents-md.ts +37 -1
  45. package/src/adapters/graft.ts +6 -4
  46. package/src/adapters/skills.ts +46 -2
  47. package/src/cli/doctor.ts +128 -2
  48. package/src/cli/main.ts +8 -4
  49. package/src/cli/new.ts +28 -6
  50. package/src/config/defaults.ts +18 -3
  51. package/src/config/schema.ts +5 -0
  52. package/src/config/validation.ts +2 -0
  53. 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';
@@ -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.2.0",
4
- "description": "Minimal, modular AI-first project bootstrapper for AI coding agents",
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 Mancuso <an.manc25@gmail.com>",
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
- "antigravity",
40
+ "ai-agents",
41
+ "coding-agents",
42
+ "agents-md",
43
+ "agent-skills",
42
44
  "codex",
43
- "skills",
45
+ "antigravity",
44
46
  "graft",
47
+ "scaffolder",
45
48
  "bootstrap",
46
- "scaffolder"
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
- ? 'Configured skills install into `.agents/skills/` (shared by Antigravity and Codex):'
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
+ }
@@ -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
- // Run graft init with antigravity and agents, without touching global system files (--no-global)
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', 'antigravity', 'agents', '-y'],
33
+ ['init', '--no-global', '--agents', ...agents, '-y'],
32
34
  {
33
35
  cwd: targetDir,
34
36
  dryRun,
@@ -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 { getInstalledSkills } from '../adapters/skills.js';
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('Minimal, modular AI-first project bootstrapper for AI coding agents')
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