@antomanc/aginit 0.1.0 → 0.3.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 (64) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/LICENSE +1 -1
  3. package/README.md +96 -194
  4. package/THIRD_PARTY_NOTICES.md +11 -0
  5. package/dist/adapters/agent-browser.d.ts +54 -0
  6. package/dist/adapters/agent-browser.d.ts.map +1 -0
  7. package/dist/adapters/agent-browser.js +122 -0
  8. package/dist/adapters/agent-browser.js.map +1 -0
  9. package/dist/adapters/agents-md.d.ts.map +1 -1
  10. package/dist/adapters/agents-md.js +53 -23
  11. package/dist/adapters/agents-md.js.map +1 -1
  12. package/dist/adapters/browser.js.map +1 -1
  13. package/dist/adapters/git.d.ts.map +1 -1
  14. package/dist/adapters/git.js +2 -0
  15. package/dist/adapters/git.js.map +1 -1
  16. package/dist/adapters/graft.js.map +1 -1
  17. package/dist/adapters/package-manager.js.map +1 -1
  18. package/dist/adapters/skills.d.ts.map +1 -1
  19. package/dist/adapters/skills.js +11 -7
  20. package/dist/adapters/skills.js.map +1 -1
  21. package/dist/cli/doctor.d.ts.map +1 -1
  22. package/dist/cli/doctor.js +73 -7
  23. package/dist/cli/doctor.js.map +1 -1
  24. package/dist/cli/init.js.map +1 -1
  25. package/dist/cli/main.d.ts.map +1 -1
  26. package/dist/cli/main.js +17 -16
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/cli/new.d.ts +0 -1
  29. package/dist/cli/new.d.ts.map +1 -1
  30. package/dist/cli/new.js +22 -20
  31. package/dist/cli/new.js.map +1 -1
  32. package/dist/cli/wizard.d.ts +0 -4
  33. package/dist/cli/wizard.d.ts.map +1 -1
  34. package/dist/cli/wizard.js +4 -50
  35. package/dist/cli/wizard.js.map +1 -1
  36. package/dist/config/defaults.d.ts +16 -1
  37. package/dist/config/defaults.d.ts.map +1 -1
  38. package/dist/config/defaults.js +91 -10
  39. package/dist/config/defaults.js.map +1 -1
  40. package/dist/config/schema.d.ts +5 -0
  41. package/dist/config/schema.d.ts.map +1 -1
  42. package/dist/config/schema.js.map +1 -1
  43. package/dist/config/validation.d.ts +3 -3
  44. package/dist/config/validation.d.ts.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/presets/adr.js.map +1 -1
  50. package/dist/utils/fs.js.map +1 -1
  51. package/dist/utils/logger.d.ts.map +1 -1
  52. package/dist/utils/shell.js.map +1 -1
  53. package/package.json +22 -14
  54. package/src/adapters/agent-browser.ts +162 -0
  55. package/src/adapters/agents-md.ts +60 -26
  56. package/src/adapters/git.ts +2 -0
  57. package/src/adapters/skills.ts +10 -7
  58. package/src/cli/doctor.ts +81 -6
  59. package/src/cli/main.ts +17 -25
  60. package/src/cli/new.ts +25 -24
  61. package/src/cli/wizard.ts +4 -56
  62. package/src/config/defaults.ts +109 -12
  63. package/src/config/schema.ts +5 -0
  64. package/src/index.ts +1 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,55 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0 — 2026-10-10
4
+
5
+ ### Fixed
6
+
7
+ - Web projects no longer ship an agent-browser skill stub without its runtime: `aginit init` now installs the `agent-browser` CLI (`npm i -g agent-browser`) and its browser binaries (`agent-browser install`) when the skill is configured or already on disk, and reports a failed provisioning as an incomplete setup (#4).
8
+ - `aginit init` and `aginit doctor` detect the Linux restriction that blocks Chrome's sandbox (`kernel.apparmor_restrict_unprivileged_userns=1`) and report the persisted sysctl fix plus the narrower `--no-sandbox` alternative instead of failing later with `No usable sandbox!`.
9
+
10
+ ### Added
11
+
12
+ - The [ponytail](https://github.com/DietrichGebert/ponytail) skill installs by default in every preset, and AGENTS.md points agents to it for the smallest complete change (#5). Existing configs keep their skill sources as written; add `dietrichgebert/ponytail` to `skills.sources` to opt in.
13
+ - `aginit doctor` verifies the agent-browser runtime when the project ships the skill: CLI presence, upstream `agent-browser doctor --quick --offline --json` findings, and Chrome sandbox prerequisites.
14
+
15
+ ## 0.2.0 — 2026-10-09
16
+
17
+ ### Breaking
18
+
19
+ - Removed `--spec-workflow` from `aginit new` and `aginit init`, and removed the
20
+ wizard's "Select AI engineering workflow" prompt. The spec and tickets skills
21
+ are part of the standard set now, so the selector no longer had anything to
22
+ select.
23
+ - `skills.workflow` is no longer written to `aginit.config.json`. Existing
24
+ configs that still carry it keep loading unchanged.
25
+
26
+ ### Changed
27
+
28
+ - All 27 stable Matt Pocock skills install by default instead of the
29
+ `tdd` / `code-review` / `diagnosing-bugs` trio: the `engineering` and
30
+ `productivity` categories. The `misc` and `in-progress` categories stay out.
31
+ - Saved configs holding an old default skill selection are upgraded on
32
+ `aginit init`. A skill list narrowed by hand is preserved as written.
33
+ - AGENTS.md now lists the full standard skill set and the spec workflow.
34
+ - Dependency updates: TypeScript 7, Vitest 5, Commander 15, tsx 4.23,
35
+ pnpm 12.10. `@types/node` stays on the 22.x line so the types match the
36
+ `engines.node >= 22.12.0` support floor.
37
+ - Descriptions no longer mention T3 Code.
38
+
39
+ ### Fixed
40
+
41
+ - Generated AGENTS.md separates its sections with blank lines again; only
42
+ inapplicable lines are dropped.
43
+ - AGENTS.md no longer claims skills are disabled when a source installs every
44
+ skill it ships.
45
+ - `aginit init` in the current directory no longer prints `cd .`.
46
+ - `aginit doctor` no longer warns about missing skills when installation is
47
+ disabled in the configuration, and reports skills installed by hand even when
48
+ the lockfile records none.
49
+ - `aginit --version` and the smoke test read the version from `package.json`.
50
+
51
+ ### Added
52
+
53
+ - `pnpm typecheck` now type-checks `tests/` through `tsconfig.test.json`.
54
+ - `pnpm check:skills` and a weekly `Skill drift` CI job that fails when a
55
+ standard skill disappears upstream or a new stable skill is published.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Antonio Mancuso
3
+ Copyright (c) 2026 Antonio Mancini
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,245 +1,147 @@
1
- # Aginit
1
+ # aginit
2
2
 
3
- > **Public Beta (v0.1.0)** — Minimal, modular AI-first project bootstrapper for T3 Code, Antigravity, and Codex.
3
+ **Set up a new or existing project for AI coding agents with one command.**
4
4
 
5
- [![CI](https://github.com/antomanc/aginit/actions/workflows/ci.yml/badge.svg)](https://github.com/antomanc/aginit/actions)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
- [![npm version](https://img.shields.io/npm/v/@antomanc/aginit)](https://www.npmjs.com/package/@antomanc/aginit)
8
-
9
- ---
10
-
11
- ## Philosophy
12
-
13
- > **“We orchestrate the tools. We don’t replace them.”**
14
-
15
- Aginit initializes software projects ready for AI-assisted development in seconds. Instead of reinventing custom agent frameworks or vendoring brittle skills, Aginit ties together best-in-class upstream capabilities into a coherent, idempotent developer workflow.
16
-
17
- - **Zero vendoring**: Skills and codebase graphs are fetched and configured directly from upstream maintainers via standard package ecosystems (`skills.sh`, `graft`).
18
- - **Dual-agent parity**: Antigravity and Codex share the exact same `.agents/skills` and `AGENTS.md` conventions without conflicting configurations.
19
- - **Conservative & idempotent**: Never overwrites existing code destructively; respects your choice of framework, toolchain, and package manager.
20
-
21
- ---
22
-
23
- ## What Aginit Configures
24
-
25
- Every project bootstrapped with Aginit receives:
26
-
27
- 1. **Upstream Skills Engine (`skills.sh`)**:
28
- - Universal engineering trio: `tdd`, `code-review`, `diagnosing-bugs` (by Matt Pocock).
29
- - *Optional* spec workflow: `to-spec`, `to-tickets`, `implement-spec` (`--spec-workflow`).
30
- - Frontend craft & UI polish: `impeccable` (by Peter Bak-Hansen) for web presets.
31
- - Interactive visual inspection: `agent-browser` (by Vercel Labs) for web presets.
32
- 2. **Codebase Understanding (`graft`)**:
33
- - Deterministic structural code graph and fast token-efficient semantic map (`graft map`, `graft ask`).
34
- 3. **Agent Invariants (`AGENTS.md`)**:
35
- - A short, non-invasive intake contract and invariant guide that agents parse immediately upon opening the repository in T3 Code.
36
- 4. **Deterministic Testing Harness**:
37
- - Vitest for instant unit testing.
38
- - Playwright for browser testing when a web framework is selected. Its starter test is explicitly skipped until you supply an application URL and real assertions.
39
- 5. **Declarative State (`aginit.config.json`)**:
40
- - Versioned project manifest (`schemaVersion: "1.0.0"`) tracking active agents, skills, preset, and package manager.
41
-
42
- ---
43
-
44
- ## Quickstart
45
-
46
- ### Prerequisites
47
-
48
- - Node.js **22.12 or newer** (use a supported Node LTS release).
49
- - Git and npm/npx in `PATH`; install your selected package manager before using it.
50
- - Internet access for official framework scaffolders and upstream skills.
51
- - Optional Graft CLI: `npm install -g @nanonets/graft`. Use `--no-graft` to omit it.
52
-
53
- ### Interactive Wizard (Recommended)
54
-
55
- Simply run `aginit` or `npx @antomanc/aginit` with no arguments in your terminal to launch the interactive prompt:
5
+ aginit gives a repo what agents need to do good work from the first session: an `AGENTS.md`
6
+ that explains the project, a curated set of engineering skills, a codebase graph so agents
7
+ read less and understand more, and a test harness they can actually run. It wires up
8
+ upstream tools instead of reimplementing them.
56
9
 
57
10
  ```bash
58
- # Run directly without installation
59
11
  npx @antomanc/aginit
60
-
61
- # Or with pnpm dlx
62
- pnpm dlx @antomanc/aginit
63
-
64
- # Or install globally
65
- npm install -g @antomanc/aginit
66
- aginit
67
12
  ```
68
13
 
69
- The wizard prompts only for meaningful choices:
70
- 1. Action: *Create brand new project* vs *Initialize in current directory*
71
- 2. Project name (when creating a new project)
72
- 3. Preset (`web` | `cli` | `generic`)
73
- 4. Framework (for `web`: `none` | `vite` | `next` | `existing`)
74
- 5. Workflow (`minimal` | `spec`)
75
- 6. Package Manager (`pnpm (Recommended)` | `npm` | `yarn` | `bun`) — *auto-detected and preserved when initializing existing projects*
76
-
77
- ### Non-Interactive / Scriptable CLI
78
-
79
- All commands accept explicit flags for automated environments and CI:
80
-
81
- ```bash
82
- # Create a new web project directly with pnpm
83
- aginit new my-web-app --preset web --framework vite --package-manager pnpm
84
-
85
- # Or with npm, yarn, or bun
86
- aginit new my-app --preset web --package-manager bun
87
-
88
- # Or via npx
89
- npx @antomanc/aginit new my-web-app --preset web
90
- ```
14
+ [![CI](https://github.com/antomanc/aginit/actions/workflows/ci.yml/badge.svg)](https://github.com/antomanc/aginit/actions)
15
+ [![npm version](https://img.shields.io/npm/v/@antomanc/aginit)](https://www.npmjs.com/package/@antomanc/aginit)
16
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
91
17
 
92
- Then open the project in **T3 Code**, and tell Antigravity:
93
- > *"bootstrap this project"*
18
+ > **Beta.** Expect flags and defaults to change before 1.0.
94
19
 
95
- ---
20
+ ## Why
96
21
 
97
- ## Package Managers
22
+ Agents in a fresh repo usually start out blind:
23
+ - no instructions, so they guess at the build, test and package manager commands
24
+ - no shared workflow for specs, TDD, code review or bug hunting
25
+ - grep-and-read-everything to find their way around the code
26
+ - no test runner, so "it works" is never checked
27
+ - a different setup in every repo, done by hand
98
28
 
99
- Aginit provides centralized package manager orchestration:
100
- - **Supported Managers**: `pnpm` (recommended/default), `npm`, `yarn` (Classic or modern), `bun`.
101
- - **New Projects**: Prompted as the final wizard step, or configured via `--package-manager <pm>`. Stored in `aginit.config.json`.
102
- - **Existing Projects**: Automatically detects existing lockfiles (`pnpm-lock.yaml`, `bun.lockb`, `yarn.lock`, `package-lock.json`) and preserves your manager without prompting.
103
- - **Official Scaffolding**: Passes the selected package manager to upstream toolchains (e.g. `--use-pnpm`, `--use-npm`, `--use-yarn`, `--use-bun` for Next.js, and package manager specific create commands for Vite).
104
- - **Clean Toolchains**: `pnpm-workspace.yaml` and pnpm-specific lifecycle configs are only generated when `pnpm` is the active manager.
29
+ aginit sets all of this up the same way every time, and you can re-run it whenever you want.
105
30
 
106
- ---
31
+ ## What you get
107
32
 
108
- ## Presets & Frameworks
33
+ | | |
34
+ |---|---|
35
+ | **Instructions** | `AGENTS.md` with the project's real commands, invariants and a first-session playbook, shared by Antigravity, Codex and any agent that reads `AGENTS.md` |
36
+ | **Skills** | All 27 stable [Matt Pocock skills](https://github.com/mattpocock/skills) (`tdd`, `code-review`, `diagnosing-bugs`, `to-spec`, `to-tickets`, `implement-spec`, `pr`...) plus [humanizer](https://github.com/blader/humanizer) and [ponytail](https://github.com/DietrichGebert/ponytail), installed in `.agents/skills/` via the [Skills CLI](https://github.com/vercel-labs/skills) |
37
+ | **Codebase graph** | [Graft](https://www.npmjs.com/package/@nanonets/graft): `graft map` and `graft ask` give agents the relevant code spans before they grep |
38
+ | **Test tooling** | Vitest for TypeScript projects, plus Playwright when a web framework is selected |
39
+ | **Web extras** | [Impeccable](https://github.com/pbakaus/impeccable) for UI design and [agent-browser](https://github.com/vercel-labs/agent-browser) for visual QA, with its CLI and browser binaries installed so it works out of the box |
40
+ | **Scaffolding** | Official Vite and Next.js scaffolders, or a Commander-based TypeScript CLI |
41
+ | **Maintenance** | `aginit doctor` checks readiness; `aginit update` refreshes skills and the graph |
109
42
 
110
- ### 1. `web` Preset
43
+ ## Quick start
111
44
 
112
- Framework-agnostic by default:
45
+ Requires Node.js 22.12+, Git and internet access.
113
46
 
114
47
  ```bash
115
- # Agnostic baseline: clean TypeScript + Vitest, zero bundler lock-in
116
- aginit new my-app --preset web --framework none
117
-
118
- # Official Vite scaffolding
119
- aginit new my-vite-app --preset web --framework vite
120
-
121
- # Official Next.js scaffolding
122
- aginit new my-next-app --preset web --framework next
48
+ npx @antomanc/aginit # interactive wizard
49
+ pnpm dlx @antomanc/aginit # same, with pnpm
50
+ npm install -g @antomanc/aginit # or install globally and run `aginit`
123
51
  ```
124
52
 
125
- *Note: With `--framework none`, Aginit does not generate dummy or failing E2E configs until an actual web target is introduced.*
53
+ The wizard creates a new project or initializes the current directory, then asks for a
54
+ preset, framework and package manager. Existing projects keep the package manager they
55
+ already use.
126
56
 
127
- ### 2. `cli` Preset
57
+ Graft is installed separately (or skip it with `--no-graft`):
128
58
 
129
59
  ```bash
130
- aginit new my-cli --preset cli
60
+ npm install -g @nanonets/graft
131
61
  ```
132
- Configures an executable Node.js/TypeScript CLI with Commander, Picocolors, and Vitest.
133
62
 
134
- ### 3. `generic` Preset
63
+ ## Commands
135
64
 
136
- ```bash
137
- aginit new my-repo --preset generic
138
65
  ```
139
- Minimal AI readiness for any codebase: Git, `.agents/skills`, Graft context graph, and `AGENTS.md`.
140
-
141
- ---
142
-
143
- ## Adding Aginit to an Existing Project
144
-
145
- Run `aginit init` inside an existing repository:
146
-
147
- ```bash
148
- cd my-existing-project
149
- aginit init --preset web
66
+ aginit new [name] Create a new project
67
+ aginit init Add or update agent setup in the current directory
68
+ aginit doctor Check Node.js, package manager, Git, Graft, Codex, Skills CLI, agent-browser and config
69
+ aginit update Update installed skills and rebuild the Graft index
150
70
  ```
151
71
 
152
- Aginit preserves application source, custom scripts, dependency versions, and existing test configurations. The web and CLI presets add missing test tooling to `package.json`; custom test runners get a separate `test:unit` script. The generic preset leaves an existing project manifest untouched.
153
-
154
- Repeat `aginit init` preserves the saved preset, framework, agents, workflow, skill sources, and extension fields. Explicit options override the requested setting. Invalid JSON or configuration is reported before initialization changes files. `--no-skills` skips installation without erasing an existing configuration's sources.
155
-
156
- ---
157
-
158
- ## Diagnostics (`aginit doctor`)
159
-
160
- Run the health check at any time to inspect system tooling and repository agent readiness (it may download the upstream Skills CLI through npx):
72
+ Useful flags: `--preset web|cli|generic`, `--framework none|vite|next|existing`,
73
+ `--package-manager pnpm|npm|yarn|bun`, `--dry-run`, `--no-skills`, `--no-graft`, `--no-git`.
161
74
 
162
75
  ```bash
163
- aginit doctor
76
+ aginit new my-app --preset web --framework vite
77
+ aginit new my-app --preset web --framework next --package-manager npm
78
+ aginit new my-cli --preset cli
79
+ aginit init --preset generic --dry-run
164
80
  ```
165
81
 
166
- Checks:
167
- - Node.js runtime and active project package manager (`pnpm`, `npm`, `yarn`, or `bun`)
168
- - Git repository state
169
- - Global Graft CLI availability
170
- - Codex CLI availability (secondary reviewer)
171
- - Skills CLI engine functionality
172
- - `aginit.config.json` schema validation and package manager setting
173
- - `AGENTS.md` context and intake section
174
- - Installed `.agents/skills/` health
175
-
176
- ---
82
+ ## Presets
177
83
 
178
- ## Updating Upstream Capabilities (`aginit update`)
84
+ | Preset | Setup |
85
+ | --- | --- |
86
+ | `web` | TypeScript and Vitest, with optional Vite or Next.js scaffolding. Playwright is added when a web framework is selected. |
87
+ | `cli` | Node.js/TypeScript CLI with Commander, Picocolors and Vitest. |
88
+ | `generic` | Git, `AGENTS.md`, skills and Graft. Leaves an existing `package.json` untouched. |
179
89
 
180
- Keep your project's skills and codebase graph up to date:
90
+ The web preset's `--framework none` (default) creates a TypeScript baseline without a bundler
91
+ or browser tests. `existing` keeps the framework you already have.
181
92
 
182
- ```bash
183
- aginit update
184
- ```
185
-
186
- This runs the upstream project-scoped `skills update` and refreshes the Graft graph index. Disabled integrations are skipped; failed updates return a nonzero exit status.
187
-
188
- ---
93
+ Your choices (preset, framework, package manager, agents, skill sources) are saved in
94
+ `aginit.config.json`, so the next run starts from them. The package manager is also passed
95
+ to framework scaffolders.
189
96
 
190
- ## Safety & Dry Run
97
+ ## Existing projects
191
98
 
192
- Preview changes without touching the disk:
99
+ `aginit init` never replaces application code. It keeps your source, custom scripts,
100
+ dependency versions and test configs, and only adds what's missing. If you already use a
101
+ different test runner, aginit adds a separate `test:unit` script instead of touching yours.
193
102
 
194
- ```bash
195
- aginit new test-project --preset web --dry-run
196
- aginit init --dry-run
197
- ```
103
+ An existing `AGENTS.md` is preserved; aginit only appends its bootstrap section. Configs from
104
+ older versions that used the retired default skill selection are upgraded to the current
105
+ set, while a skill list you narrowed by hand stays as written.
198
106
 
199
- Existing application files are preserved. Manifest additions and explicit configuration changes are intentional; rerunning the same initialization is idempotent. Framework scaffold failures stop the command instead of generating a substitute app.
107
+ ## Design
200
108
 
201
- Missing Graft or failed skill installation produces an actionable warning and a nonzero exit status. The scaffold is retained so you can resolve the prerequisite and rerun `aginit init`.
109
+ - **Orchestrates, doesn't vendor.** Skills, Graft, Vite, Next.js and Playwright come from
110
+ their upstream tools. aginit picks good defaults and runs them.
111
+ - **Idempotent.** Re-running the same init is safe; explicit options override saved settings.
112
+ - **Honest dry-run.** `--dry-run` lists every planned operation without writing files or
113
+ downloading tools. (Files produced by upstream scaffolders are only known after they run.)
114
+ - **Fails loudly.** Invalid config is reported before any file changes. A failed scaffold
115
+ stops the command; missing Graft, a failed skill install or a failed agent-browser setup
116
+ exits nonzero and keeps the scaffold, so you can fix it and re-run `aginit init`.
117
+ - **Hands off your system.** If the Linux kernel blocks Chrome's sandbox (`No usable
118
+ sandbox!`), aginit tells you the sysctl fix and the narrower `--no-sandbox` option. It
119
+ never changes system settings for you.
202
120
 
203
- `--dry-run` prints planned operations without creating files or downloading framework tools. Upstream-generated files cannot be enumerated until the real scaffolder runs.
121
+ ## Related
204
122
 
205
- ---
123
+ [agbox](https://github.com/antomanc/agbox) prepares the *machine* for AI agents (toolchains,
124
+ Docker, Playwright, Tailscale, snapshots). aginit prepares the *project*. Use them together:
125
+ `agbox setup`, then `npx @antomanc/aginit` in a new project.
206
126
 
207
- ## Development & Release Verification
127
+ ## Development
208
128
 
209
129
  ```bash
210
130
  pnpm install --frozen-lockfile
211
- pnpm check # typecheck, tests, build, dependency audit
212
- pnpm smoke # install the tarball and verify generated consumer projects
213
- pnpm smoke --frameworks # additionally scaffold, test, build, and serve Vite and Next.js
214
- pnpm smoke --package-managers # verify native pnpm, Yarn, and Bun consumer commands
215
- npm pack --dry-run
131
+ pnpm check # typecheck (src + tests), tests, build, dependency audit
132
+ pnpm check:skills # compare the standard skill set with upstream (after pnpm build)
133
+ pnpm smoke # verify projects generated from the packed tarball
134
+ pnpm smoke --frameworks # also scaffold, test, build and serve Vite and Next.js
135
+ pnpm smoke --package-managers # verify pnpm, Yarn and Bun consumer commands
216
136
  ```
217
137
 
218
- The framework smoke test downloads upstream tools and dependencies. The generated generic project has a working Vitest starter harness; application-specific assertions remain yours to write. `npm publish` runs the checks and base consumer smoke test before publication.
219
-
220
- ---
221
-
222
- ## Upstream Licenses Notice
223
-
224
- Aginit integrates and configures independent open-source software and skills:
225
- - **Graft**: Copyright © NanoNets / Graft contributors
226
- - **skills.sh**: Copyright © Vercel Inc. and contributors
227
- - **Matt Pocock Skills**: Copyright © Matt Pocock
228
- - **Impeccable**: Copyright © Peter Bak-Hansen
229
- - **agent-browser**: Copyright © Vercel Labs
230
- - **Playwright**: Copyright © Microsoft Corporation
231
-
232
- Each upstream tool is governed by its own independent license. Aginit does not vendor, alter, or relicense upstream software. For details, see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
233
-
234
- ---
235
-
236
- ## Contributing & Security
237
-
238
- - **Contributing**: Please read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on development and submitting pull requests.
239
- - **Security**: See [SECURITY.md](SECURITY.md) for our vulnerability reporting policy.
240
-
241
- ---
138
+ `npm publish` runs `pnpm check` and the base smoke test first. See
139
+ [CHANGELOG.md](CHANGELOG.md), [CONTRIBUTING.md](CONTRIBUTING.md) and
140
+ [SECURITY.md](SECURITY.md).
242
141
 
243
142
  ## License
244
143
 
245
- [MIT](LICENSE) © 2026 Antonio Mancuso
144
+ [MIT](LICENSE) © 2026 Antonio Mancini
145
+
146
+ Upstream tools and skills keep their own licenses; aginit does not vendor or relicense them.
147
+ See [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
@@ -19,6 +19,17 @@ Each integrated upstream tool is governed by its respective authors and licenses
19
19
  - Author: Matt Pocock
20
20
  - Repository: https://github.com/mattpocock/skills
21
21
 
22
+ - **Humanizer**
23
+ - Project: Agent skill that removes signs of AI-generated writing from text
24
+ - Author: Blake Robbins / Humanizer contributors
25
+ - Repository: https://github.com/blader/humanizer
26
+
27
+ - **Ponytail**
28
+ - Project: Agent skill for the smallest complete change and less over-engineering
29
+ - Author: Dietrich Gebert
30
+ - License: MIT
31
+ - Repository: https://github.com/DietrichGebert/ponytail
32
+
22
33
  - **Impeccable**
23
34
  - Project: Frontend craft & design system review skill
24
35
  - Author: Peter Bak-Hansen
@@ -0,0 +1,54 @@
1
+ import { SkillSourceConfig } from '../config/schema.js';
2
+ /**
3
+ * Whether a configured skill source will install the agent-browser skill stub
4
+ * whose instructions assume the `agent-browser` CLI exists.
5
+ */
6
+ export declare function agentBrowserConfigured(sources: SkillSourceConfig[]): boolean;
7
+ /** Whether the agent-browser skill stub is already on disk. */
8
+ export declare function agentBrowserStubInstalled(targetDir: string): boolean;
9
+ export interface UsernsRestriction {
10
+ sysctl: string;
11
+ value: string;
12
+ fixValue: string;
13
+ }
14
+ /**
15
+ * Detect the Linux sysctls that block Chrome's sandbox when set to their
16
+ * restrictive value: Chrome's renderer sandbox runs on unprivileged user
17
+ * namespaces, so agent-browser launches die with "No usable sandbox!".
18
+ *
19
+ * Returns null when the kernel does not expose the knobs (other distros,
20
+ * macOS, Windows) or none of them is restrictive.
21
+ */
22
+ export declare function findUsernsRestriction(procRoot?: string): UsernsRestriction | null;
23
+ export interface AgentBrowserSetupOptions {
24
+ dryRun?: boolean;
25
+ silent?: boolean;
26
+ /** Working directory for the provisioning commands (defaults to cwd). */
27
+ cwd?: string;
28
+ /** Root of the proc filesystem; overridable for tests. */
29
+ procRoot?: string;
30
+ }
31
+ /**
32
+ * Provision the runtime the agent-browser skill stub depends on: the globally
33
+ * installed CLI (`npm i -g agent-browser`, matching the skill's own install
34
+ * line — npm ships with Node and works regardless of the project's package
35
+ * manager) and its browser binaries (`agent-browser install`, idempotent).
36
+ *
37
+ * A blocked Chrome sandbox is reported as a warning only: it needs a system
38
+ * change aginit must not make on the user's behalf. Returns false when the
39
+ * CLI or the browser binaries could not be provisioned.
40
+ */
41
+ export declare function setupAgentBrowser(options?: AgentBrowserSetupOptions): Promise<boolean>;
42
+ export interface AgentBrowserDiagnostic {
43
+ message: string;
44
+ fix?: string;
45
+ }
46
+ /**
47
+ * Run upstream's own diagnostics (`agent-browser doctor --quick --offline
48
+ * --json`) and return the failing checks, so aginit reports browser health
49
+ * instead of reimplementing it. Returns null when the report cannot be
50
+ * parsed (older CLI, unexpected output) — callers should then skip the check
51
+ * rather than guess.
52
+ */
53
+ export declare function runAgentBrowserDiagnostics(): Promise<AgentBrowserDiagnostic[] | null>;
54
+ //# sourceMappingURL=agent-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-browser.d.ts","sourceRoot":"","sources":["../../src/adapters/agent-browser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMxD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAO5E;AAED,+DAA+D;AAC/D,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,SAAU,GAAG,iBAAiB,GAAG,IAAI,CAYlF;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,OAAO,CAAC,CAiDhG;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,CAuB3F"}
@@ -0,0 +1,122 @@
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
+ const AGENT_BROWSER_SKILL = 'agent-browser';
6
+ const AGENT_BROWSER_CLI = 'agent-browser';
7
+ const AGENT_BROWSER_PACKAGE = 'vercel-labs/agent-browser';
8
+ /**
9
+ * Whether a configured skill source will install the agent-browser skill stub
10
+ * whose instructions assume the `agent-browser` CLI exists.
11
+ */
12
+ export function agentBrowserConfigured(sources) {
13
+ return sources.some((source) => source.skills.includes(AGENT_BROWSER_SKILL) ||
14
+ (source.package === AGENT_BROWSER_PACKAGE &&
15
+ (source.skills.length === 0 || source.skills.includes('*'))));
16
+ }
17
+ /** Whether the agent-browser skill stub is already on disk. */
18
+ export function agentBrowserStubInstalled(targetDir) {
19
+ return fileExists(path.join(targetDir, '.agents', 'skills', AGENT_BROWSER_SKILL, 'SKILL.md'));
20
+ }
21
+ /**
22
+ * Detect the Linux sysctls that block Chrome's sandbox when set to their
23
+ * restrictive value: Chrome's renderer sandbox runs on unprivileged user
24
+ * namespaces, so agent-browser launches die with "No usable sandbox!".
25
+ *
26
+ * Returns null when the kernel does not expose the knobs (other distros,
27
+ * macOS, Windows) or none of them is restrictive.
28
+ */
29
+ export function findUsernsRestriction(procRoot = '/proc') {
30
+ const knobs = [
31
+ ['kernel.apparmor_restrict_unprivileged_userns', '1', '0'],
32
+ ['kernel.unprivileged_userns_clone', '0', '1']
33
+ ];
34
+ for (const [sysctl, blockingValue, fixValue] of knobs) {
35
+ const raw = readTextFile(path.join(procRoot, 'sys', ...sysctl.split('.')));
36
+ if (raw !== null && raw.trim() === blockingValue) {
37
+ return { sysctl, value: raw.trim(), fixValue };
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ /**
43
+ * Provision the runtime the agent-browser skill stub depends on: the globally
44
+ * installed CLI (`npm i -g agent-browser`, matching the skill's own install
45
+ * line — npm ships with Node and works regardless of the project's package
46
+ * manager) and its browser binaries (`agent-browser install`, idempotent).
47
+ *
48
+ * A blocked Chrome sandbox is reported as a warning only: it needs a system
49
+ * change aginit must not make on the user's behalf. Returns false when the
50
+ * CLI or the browser binaries could not be provisioned.
51
+ */
52
+ export async function setupAgentBrowser(options = {}) {
53
+ const { dryRun = false, silent = false, cwd = process.cwd(), procRoot = '/proc' } = options;
54
+ const cliPresent = await commandExists('agent-browser');
55
+ if (!cliPresent) {
56
+ if (!silent)
57
+ logger.dim('Installing agent-browser CLI globally (npm -g)...');
58
+ const cli = await runExecutable('npm', ['install', '-g', AGENT_BROWSER_SKILL], {
59
+ cwd,
60
+ dryRun,
61
+ silent: true,
62
+ timeout: 600_000
63
+ });
64
+ if (!cli.ok && !dryRun) {
65
+ if (!silent) {
66
+ logger.warn(`Failed installing agent-browser CLI: ${cli.stderr || cli.stdout}`);
67
+ logger.dim(' Install it manually: npm i -g agent-browser && agent-browser install');
68
+ }
69
+ return false;
70
+ }
71
+ }
72
+ if (!silent)
73
+ logger.dim('Ensuring agent-browser browser binaries...');
74
+ const browser = await runExecutable(AGENT_BROWSER_CLI, ['install'], {
75
+ cwd,
76
+ dryRun,
77
+ silent: true,
78
+ timeout: 600_000
79
+ });
80
+ if (!browser.ok && !dryRun) {
81
+ if (!silent) {
82
+ logger.warn(`Failed downloading agent-browser browsers: ${browser.stderr || browser.stdout}`);
83
+ logger.dim(' Retry manually: agent-browser install');
84
+ }
85
+ return false;
86
+ }
87
+ const restriction = findUsernsRestriction(procRoot);
88
+ if (restriction && !silent) {
89
+ logger.warn(`Chrome's sandbox is blocked: ${restriction.sysctl}=${restriction.value} restricts unprivileged user namespaces, so agent-browser launches fail with "No usable sandbox!".`);
90
+ logger.dim(` → Fix (machine-wide): echo '${restriction.sysctl}=${restriction.fixValue}' | sudo tee /etc/sysctl.d/99-agent-browser-userns.conf && sudo sysctl --system`);
91
+ logger.dim(' → Narrower option: pass --args "--no-sandbox" to agent-browser for that launch (Chrome sandbox disabled for that session)');
92
+ }
93
+ return true;
94
+ }
95
+ /**
96
+ * Run upstream's own diagnostics (`agent-browser doctor --quick --offline
97
+ * --json`) and return the failing checks, so aginit reports browser health
98
+ * instead of reimplementing it. Returns null when the report cannot be
99
+ * parsed (older CLI, unexpected output) — callers should then skip the check
100
+ * rather than guess.
101
+ */
102
+ export async function runAgentBrowserDiagnostics() {
103
+ const res = await runExecutable(AGENT_BROWSER_CLI, ['doctor', '--quick', '--offline', '--json'], {
104
+ silent: true,
105
+ timeout: 60_000
106
+ });
107
+ try {
108
+ const parsed = JSON.parse(res.stdout);
109
+ if (!Array.isArray(parsed.checks))
110
+ return null;
111
+ return parsed.checks
112
+ .filter((check) => check?.status === 'fail')
113
+ .map((check) => ({
114
+ message: String(check?.message || 'check failed'),
115
+ ...(check?.fix ? { fix: String(check.fix) } : {})
116
+ }));
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ //# sourceMappingURL=agent-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-browser.js","sourceRoot":"","sources":["../../src/adapters/agent-browser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../../src/adapters/agents-md.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CA+FR;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACxE,OAAO,CA+BT"}
1
+ {"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../../src/adapters/agents-md.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAiIR;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACxE,OAAO,CA+BT"}