agemon 0.1.0 → 6.0.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/README.md +732 -28
- package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
- package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
- package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
- package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
- package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
- package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
- package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
- package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
- package/assets/skills/design/agemon-design/LICENSE +21 -0
- package/assets/skills/design/agemon-design/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design/SKILL.md +391 -0
- package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
- package/assets/skills/design/agemon-design/references/agents.md +63 -0
- package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
- package/assets/skills/design/agemon-design/references/brief.md +186 -0
- package/assets/skills/design/agemon-design/references/color.md +216 -0
- package/assets/skills/design/agemon-design/references/components.md +91 -0
- package/assets/skills/design/agemon-design/references/copy.md +300 -0
- package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
- package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
- package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
- package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
- package/assets/skills/design/agemon-design/references/forms.md +192 -0
- package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
- package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
- package/assets/skills/design/agemon-design/references/layout.md +236 -0
- package/assets/skills/design/agemon-design/references/loops.md +155 -0
- package/assets/skills/design/agemon-design/references/metadata.md +98 -0
- package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
- package/assets/skills/design/agemon-design/references/motion.md +434 -0
- package/assets/skills/design/agemon-design/references/personas.md +206 -0
- package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
- package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
- package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
- package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
- package/assets/skills/design/agemon-design/references/responsive.md +168 -0
- package/assets/skills/design/agemon-design/references/review.md +340 -0
- package/assets/skills/design/agemon-design/references/sound.md +150 -0
- package/assets/skills/design/agemon-design/references/spec.md +123 -0
- package/assets/skills/design/agemon-design/references/stack.md +522 -0
- package/assets/skills/design/agemon-design/references/state-design.md +188 -0
- package/assets/skills/design/agemon-design/references/themes.md +229 -0
- package/assets/skills/design/agemon-design/references/tokens.md +350 -0
- package/assets/skills/design/agemon-design/references/typography.md +246 -0
- package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
- package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
- package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
- package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
- package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
- package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
- package/assets/skills/geo-seo/geo/LICENSE +21 -0
- package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
- package/assets/skills/geo-seo/geo/SKILL.md +145 -0
- package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
- package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
- package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
- package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
- package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
- package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
- package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
- package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
- package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
- package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
- package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
- package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
- package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
- package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
- package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
- package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
- package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
- package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
- package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
- package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
- package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
- package/assets/skills/security/agemon-security/LICENSE +21 -0
- package/assets/skills/security/agemon-security/NOTICE.md +8 -0
- package/assets/skills/security/agemon-security/SKILL.md +356 -0
- package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
- package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
- package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
- package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
- package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
- package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
- package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
- package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
- package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
- package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
- package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
- package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
- package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
- package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
- package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
- package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
- package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
- package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
- package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
- package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
- package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
- package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
- package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
- package/assets/tools/code-review-graph-constraints.txt +1418 -0
- package/assets/tools/package-lock.json +111 -0
- package/assets/tools/package.json +6 -0
- package/dist/chunk-5LATHJYU.js +4026 -0
- package/dist/chunk-5LATHJYU.js.map +1 -0
- package/dist/fake-subprocess-2BETWZVZ.js +666 -0
- package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
- package/dist/index.js +21101 -1956
- package/dist/index.js.map +1 -1
- package/package.json +30 -17
package/README.md
CHANGED
|
@@ -1,30 +1,263 @@
|
|
|
1
1
|
# agemon
|
|
2
2
|
|
|
3
|
+
[](https://github.com/Korak-997/agemon/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/Korak-997/agemon/releases/latest)
|
|
5
|
+
[](https://www.npmjs.com/package/agemon)
|
|
6
|
+
[](https://scorecard.dev/viewer/?uri=github.com/Korak-997/agemon)
|
|
7
|
+
|
|
3
8
|
Bootstrap and reverse an AI coding agent environment in a repository with one CLI.
|
|
4
9
|
|
|
5
10
|
`agemon` installs a curated plugin bundle, tracks all managed actions in a state manifest,
|
|
6
11
|
and can cleanly reverse those actions with `nuke`.
|
|
7
12
|
|
|
13
|
+
Documentation, the skill library and the installer: <https://agemon.korak-kurani.com>.
|
|
14
|
+
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
## Why agemon
|
|
18
|
+
|
|
19
|
+
- **One command, the same setup everywhere.** Agent rules, skills, subagents, the code
|
|
20
|
+
graph and its daemon land the same way in every repository, pinned to exact versions.
|
|
21
|
+
- **You approve every change first.** agemon shows a plan with diffs, asks before it
|
|
22
|
+
writes, and rolls back the whole run if any step fails.
|
|
23
|
+
- **Fully reversible.** Every change is recorded, and `agemon nuke` removes exactly what
|
|
24
|
+
agemon added, leaving your own files alone.
|
|
25
|
+
|
|
26
|
+
Want to help? Start with [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
27
|
+
|
|
8
28
|
## What It Does
|
|
9
29
|
|
|
10
|
-
|
|
30
|
+
agemon is plugin-driven and runs its plugins in this order:
|
|
11
31
|
|
|
12
32
|
1. `crg`: installs and verifies `code-review-graph`.
|
|
13
|
-
2. `daemon`: registers `
|
|
14
|
-
|
|
15
|
-
|
|
33
|
+
2. `daemon`: registers `code-review-graph watch` autostart via `systemd --user` (Linux) or
|
|
34
|
+
a launchd user agent (macOS), under a name derived from the repository's path — see
|
|
35
|
+
[Daemon naming](#daemon-naming).
|
|
36
|
+
3. `skills`: installs bundled skills with a pinned copy of the `skills` CLI. Always installs the `essentials` group;
|
|
37
|
+
additional groups (design, security, code quality, architecture, self-review, performance,
|
|
38
|
+
team lead) are selected interactively, via `--skill-groups`, or skipped entirely in a
|
|
39
|
+
non-interactive session — see [Skill Groups](#skill-groups).
|
|
40
|
+
4. `agents`: installs the Claude Code subagents that come with an installed skill group into
|
|
41
|
+
`.claude/agents/` — see [Subagents](#subagents). It depends on `skills`, so `--only agents`
|
|
42
|
+
also runs `skills`.
|
|
16
43
|
5. `cli-tool`: installs bundled global CLI tools.
|
|
17
44
|
6. `master-prompt`: consolidates agent rule files and pointer files.
|
|
18
45
|
|
|
19
46
|
Every mutating plugin action is recorded in `.agemon/state.json` and used by `nuke` for
|
|
20
47
|
targeted reversal.
|
|
21
48
|
|
|
49
|
+
### Re-running against an already-bootstrapped repo
|
|
50
|
+
|
|
51
|
+
Every plugin's `detect` + `verify` runs on each invocation, not just on first install:
|
|
52
|
+
|
|
53
|
+
- Not detected: fresh install, as above.
|
|
54
|
+
- Detected and healthy: reported and left alone — no reinstalling on every run.
|
|
55
|
+
- Detected but `verify` fails (e.g. a daemon stuck crash-looping): agemon reports what's
|
|
56
|
+
currently there and asks whether to rewrite/fix it. `--yes` answers yes automatically;
|
|
57
|
+
a non-interactive session (CI, piped output) answers no automatically and just reports
|
|
58
|
+
the problem, matching the [update check](#update-checks)'s non-interactive behavior.
|
|
59
|
+
|
|
60
|
+
### Skill Groups
|
|
61
|
+
|
|
62
|
+
The `skills` plugin installs one always-on group plus whichever optional groups you select:
|
|
63
|
+
|
|
64
|
+
| Group | Skills | What it covers |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `essentials` (always on) | `web-design-guidelines`, `writing-guidelines` | Vercel Labs' general web design and writing review guidelines. Not vendored/renamed — see note below. |
|
|
67
|
+
| `design` | `agemon-design` + 3 recipe variants (`agemon-design-minimal`, `agemon-design-editorial`, `agemon-design-dashboard`) | Design engineering: anti-slop rules, discovery, and outcome recipes (dashboard/landing/auth), covering both visual design and UI/UX. |
|
|
68
|
+
| `security` | `agemon-security` | Exploit-driven security review — no finding without a working proof-of-concept. |
|
|
69
|
+
| `code-quality` | `agemon-clean-code`, `agemon-house-rules` | Simplicity, DRY architecture, self-documenting naming, surgical scope control. |
|
|
70
|
+
| `architecture` | `agemon-architecture` | Clean Architecture review: dependency rule, layering, boundary crossing, SOLID. |
|
|
71
|
+
| `self-review` | `agemon-verify-before-done`, `agemon-review-intake`, `agemon-review-request`, `agemon-root-cause` | Verification before claiming completion, giving/receiving code review, root-cause debugging. |
|
|
72
|
+
| `performance` | `agemon-performance` | Algorithmic-complexity-first discipline: N+1 detection, hot-loop hygiene, when not to optimize. |
|
|
73
|
+
| `commit` | `agemon-commit` | Staging review, commit message structure, and splitting unrelated changes into separate commits. |
|
|
74
|
+
| `teamlead` | `agemon-plan-rfc`, `prd-generator`, `skill-headofit-audit`, `skill-incident-rca`, `skill-meeting-lifecycle`, `skill-obsidian-vault-sync`, `skill-prd-decomposer`, `skill-sec-check`, `skill-task-extractor`, `skill-techlead-reviewer`, `skill-tech-spike` | Team-lead workflows: RFC planning, PRD generation/decomposition, meeting lifecycle, task extraction, tech spikes, IT audits, incident RCA, security checks, tech-lead review, and Obsidian vault sync. |
|
|
75
|
+
| `geo-seo` | `geo` (`/geo audit <url>` and the other `/geo` commands), `geo-audit`, `geo-citability`, `geo-crawlers`, `geo-llmstxt`, `geo-brand-mentions`, `geo-platform-optimizer`, `geo-technical`, `geo-content`, `geo-report`, `geo-schema`, `geo-report-pdf` | GEO (generative engine optimization): audits how likely AI search (ChatGPT, Perplexity, Google AI Overviews) is to find and cite a website — citability, AI crawler access, llms.txt, schema, technical SEO, brand mentions — and writes client-ready reports. Upstream names kept; see [Vendored Skills](#vendored-skills--attribution). |
|
|
76
|
+
|
|
77
|
+
Selection order:
|
|
78
|
+
|
|
79
|
+
- `--skill-groups <ids>`: explicit, non-interactive. Comma-separated group ids, or the keywords
|
|
80
|
+
`all` / `none`. Always includes `essentials` regardless of what you pass.
|
|
81
|
+
- No flag, `--yes`: every group installs, the same way `--yes` answers every other prompt.
|
|
82
|
+
- No flag, interactive terminal: one multiselect over the optional groups (space toggles, enter
|
|
83
|
+
confirms), on top of `essentials`.
|
|
84
|
+
- No flag, non-interactive (CI, piped output, or `--dry-run`): only `essentials` installs —
|
|
85
|
+
pass `--skill-groups` explicitly to get optional groups without a prompt.
|
|
86
|
+
|
|
87
|
+
The group question comes first, while agemon builds the plan, so every group you picked is a
|
|
88
|
+
separate row (`skill-group:<id>`, or `custom-skill-group:<id>` for a project-defined group) in
|
|
89
|
+
the plan, the consent screen and `agemon status`, with each skill and its
|
|
90
|
+
pinned source. Groups you were shown and did not pick are recorded as declined once you approve
|
|
91
|
+
the install gate. Ctrl-C at the question leaves the repository untouched.
|
|
92
|
+
|
|
93
|
+
Re-running `agemon` in a repo only re-verifies the groups that repo already selected — it never
|
|
94
|
+
asks you about, or installs, groups you previously declined, even when `--skill-groups` or
|
|
95
|
+
`skill_groups` names them. A group added later (to agemon or to `agemon.toml`) is installed
|
|
96
|
+
when `--skill-groups` or `skill_groups` names it; otherwise it is offered once in an
|
|
97
|
+
interactive run. A non-interactive run without `--yes` leaves it pending; a non-interactive
|
|
98
|
+
`--yes` run records new agemon groups as declined and leaves project-defined groups pending.
|
|
99
|
+
|
|
100
|
+
#### Subagents
|
|
101
|
+
|
|
102
|
+
Some groups come with Claude Code subagents, which the `agents` capability installs into
|
|
103
|
+
the project's `.claude/agents/` together with the group. Today only `geo-seo` has any: the
|
|
104
|
+
five audit agents `geo-audit-ai-visibility`, `geo-audit-platform`, `geo-audit-technical`,
|
|
105
|
+
`geo-audit-content` and `geo-audit-schema`, which `/geo audit` launches in parallel.
|
|
106
|
+
|
|
107
|
+
- Each agent file has only `name`, `description` and `tools`. `tools` is an allowlist:
|
|
108
|
+
`WebFetch` for every agent, plus `Bash` (for one fixed, read-only `curl` you approve per
|
|
109
|
+
run) for the technical and schema agents. Nothing is pre-approved, and no agent sets a
|
|
110
|
+
permission mode, hooks or MCP servers.
|
|
111
|
+
- The agents have their own consent step, which names every agent with its tools. With
|
|
112
|
+
`--yes`, agemon prints that list instead of asking.
|
|
113
|
+
- Agent files are handled like rule files: an agent you edited is a conflict and is never
|
|
114
|
+
overwritten without a decision (`[conflict_decisions] "agent-file:<name>" = "keep"`,
|
|
115
|
+
`"replace"` or `"skip"`); a replaced file is backed up first; `nuke` removes the agents
|
|
116
|
+
agemon created and restores the files it replaced.
|
|
117
|
+
- An agent's group must be installed for the agent to be written; if you decline the group,
|
|
118
|
+
its agents are skipped.
|
|
119
|
+
- `agemon status` shows one row per agent: managed, adopted (identical but not written by
|
|
120
|
+
agemon on this machine), changed (your edit, kept), absent, or not a regular file. It
|
|
121
|
+
needs attention (exit 2) when agemon has a newer version of an agent you didn't change,
|
|
122
|
+
or when another file in `.claude/agents/` declares the same `name:` as one of agemon's
|
|
123
|
+
agents — Claude Code identifies agents by that name and may load the other file instead.
|
|
124
|
+
- Claude Code picks up a new `.claude/agents/` directory in sessions started after it exists.
|
|
125
|
+
|
|
126
|
+
**Bundled skill updates.** agemon compares each bundled skill in `.claude/skills/` with
|
|
127
|
+
every version it has shipped. A skill still identical to an older version is updated to
|
|
128
|
+
the current one on the next run, behind the same consent step as installing a group (the
|
|
129
|
+
preview marks it "update (bundled content changed)"); `agemon status` shows "update
|
|
130
|
+
available" until then. A skill that differs from every shipped version — for example one
|
|
131
|
+
you edited — is never replaced: `status` shows it as changed, with the reason, and says how
|
|
132
|
+
to get agemon's version (delete `.claude/skills/<name>` and run `agemon`). An update that
|
|
133
|
+
fails halfway removes the half-written copy, so the next run reinstalls it; a rollback keeps
|
|
134
|
+
an update it already made and says so. This is also how an older `geo-seo` install picks up
|
|
135
|
+
the `geo-audit` that launches the installed subagents.
|
|
136
|
+
|
|
137
|
+
Skills recorded for a custom group that `agemon.toml` no longer defines are listed in one
|
|
138
|
+
"skills of removed groups" row.
|
|
139
|
+
|
|
140
|
+
#### Project-defined skill groups
|
|
141
|
+
|
|
142
|
+
A project can define its own groups in `agemon.toml`:
|
|
143
|
+
|
|
144
|
+
```toml
|
|
145
|
+
skill_groups = "essentials,house-style"
|
|
146
|
+
|
|
147
|
+
[custom_skill_groups.house-style]
|
|
148
|
+
label = "House style"
|
|
149
|
+
skills = [
|
|
150
|
+
{ source = "./tools/skills/house-rules" },
|
|
151
|
+
{ source = "github:acme/agent-skills", ref = "<40-character commit sha>", skill = "lint-rules" },
|
|
152
|
+
]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- A **local** source is a directory in this repository (`./…`, not under `.agents/`, `.claude/`,
|
|
156
|
+
`.git/` or `.agemon/`, no symlinks anywhere in it, at most 200 entries and 8 MiB). The skill's
|
|
157
|
+
name is the directory name.
|
|
158
|
+
- A **GitHub** source names `github:<owner>/<repository>`, a full 40-character commit `ref` (no
|
|
159
|
+
branches, tags or short shas) and the `skill` to take from `skills/<skill>/` in that
|
|
160
|
+
repository. agemon fetches exactly that commit without your git credentials.
|
|
161
|
+
- Each skill's `SKILL.md` must declare the same `name`.
|
|
162
|
+
- A group id must not reuse a built-in group id, or be `all`/`none`; a skill name must not
|
|
163
|
+
reuse a built-in skill name or appear twice.
|
|
164
|
+
|
|
165
|
+
A custom group is installed only when you pick it in the interactive question or name it in
|
|
166
|
+
`--skill-groups` or `skill_groups`; `--yes` and `--skill-groups all` cover agemon's own groups
|
|
167
|
+
only. Custom groups get their own consent gate, which always prints every source (the local
|
|
168
|
+
content hash, or the GitHub repository and commit), even under `--yes`. A custom skill is
|
|
169
|
+
instructions for your agent from whoever wrote the repository's `agemon.toml`: review it like
|
|
170
|
+
code. A commit sha pins content, not origin — GitHub serves a commit from any fork under the
|
|
171
|
+
original repository's URL, so check the commit itself, not just the repository name.
|
|
172
|
+
|
|
173
|
+
Every non-essential skill is vendored into agemon's own repo under `assets/skills/`, rather than
|
|
174
|
+
fetched and installed under its original upstream name at bootstrap time — so installs don't
|
|
175
|
+
depend on GitHub being reachable and won't drift if an upstream repo changes. Vendored skills
|
|
176
|
+
sourced from a third-party project are renamed under an `agemon-*` identity so they read as
|
|
177
|
+
agemon's own; the `team-lead` skills beyond `agemon-plan-rfc` and `prd-generator` are original to
|
|
178
|
+
this project and keep their `skill-*` names, and `geo-seo` keeps its upstream `geo-*` names. See [Vendored Skills](#vendored-skills--attribution)
|
|
179
|
+
for sources and licenses.
|
|
180
|
+
|
|
181
|
+
`essentials` is the one exception: `vercel-labs/agent-skills` carries no detected license, so
|
|
182
|
+
agemon can't vendor (redistribute) a renamed copy of it. agemon fetches the skills under their
|
|
183
|
+
original names from one pinned commit of that repo, checks that the checkout really is that
|
|
184
|
+
commit, and installs from it.
|
|
185
|
+
|
|
186
|
+
### Daemon naming
|
|
187
|
+
|
|
188
|
+
The daemon's systemd unit is named `agemon-crg-daemon-<slug>-<hash>.service`. `<slug>` is
|
|
189
|
+
the repository directory's name, and `<hash>` is the first 8 hex digits of the SHA-256 of
|
|
190
|
+
the repository's real path. Two repositories with the same name therefore get separate
|
|
191
|
+
units, so one never overwrites and restarts the other's daemon.
|
|
192
|
+
|
|
193
|
+
The ledger records the unit name, and `nuke` removes the unit it recorded, even after the
|
|
194
|
+
repository was renamed or moved. A unit that now runs for another existing repository is
|
|
195
|
+
kept and reported. Units registered by older agemon versions (named without the hash) are
|
|
196
|
+
replaced on the next `agemon` run. User linger is shared by every repository: `nuke`
|
|
197
|
+
switches it off only in the repository that switched it on, once no other repository
|
|
198
|
+
uses it and no other agemon daemon unit is left.
|
|
199
|
+
|
|
200
|
+
On macOS the daemon is a launchd user agent, `~/Library/LaunchAgents/dev.agemon.crg.<slug>-<hash>.plist`
|
|
201
|
+
(mode `0644`), with the same `<slug>` and `<hash>`. It runs while you are logged in to the
|
|
202
|
+
desktop (launchd has no linger), so register it from a desktop session, not over SSH only.
|
|
203
|
+
launchd offers no per-service sandbox agemon can use, so the agent runs `code-review-graph
|
|
204
|
+
watch` with your normal user rights (like the Linux `compat` profile) and a `PATH` of system
|
|
205
|
+
directories only (`/usr/bin:/bin:/usr/sbin:/sbin`, so git is Apple's `/usr/bin/git`). An
|
|
206
|
+
entry registered on the other OS is never touched: `nuke` fails and names it, so run
|
|
207
|
+
`agemon nuke` on that machine.
|
|
208
|
+
|
|
209
|
+
### Daemon hardening and failures
|
|
210
|
+
|
|
211
|
+
On Linux, agemon first registers the unit with the `strict` profile: the system and your
|
|
212
|
+
home directory are read-only for code-review-graph, except the repository (its `.git/`
|
|
213
|
+
stays read-only) and `~/.code-review-graph`, and agemon's own state directory, which holds
|
|
214
|
+
its ledger key, is hidden. If the strict unit does not start, agemon falls back to
|
|
215
|
+
`compat`, which runs with your normal user rights. A repository that is or contains your
|
|
216
|
+
home directory goes straight to `compat`, and `AGEMON_DAEMON_HARDENING=compat` forces it.
|
|
217
|
+
The run prints the profile in use.
|
|
218
|
+
|
|
219
|
+
`strict` needs an unprivileged user namespace. On Ubuntu with
|
|
220
|
+
`kernel.apparmor_restrict_unprivileged_userns=1`, systemd can start the unit without the
|
|
221
|
+
sandbox. agemon checks for this once the unit runs and then prints
|
|
222
|
+
`daemon hardening: strict requested, not enforced on this host` (`status` and `inspect`
|
|
223
|
+
show the same). The daemon keeps running, without the sandbox.
|
|
224
|
+
|
|
225
|
+
A daemon that keeps crashing is stopped: systemd gives up after five starts within ten
|
|
226
|
+
minutes and the unit ends `failed`. `agemon status` reports it as failed, names
|
|
227
|
+
`journalctl --user -u <unit>` to see why, and exits 2; the next `agemon` run registers it
|
|
228
|
+
again. launchd has no such limit, so on macOS a crashing agent is restarted at most once a
|
|
229
|
+
minute.
|
|
230
|
+
|
|
231
|
+
agemon refuses to build the code graph or register the daemon when `.code-review-graph`
|
|
232
|
+
(or a root `.code-review-graph.db*` file) is tracked by git, is not a real directory, or
|
|
233
|
+
contains a symlink or special file, because code-review-graph would write through it to
|
|
234
|
+
wherever the link points. Remove it from the repository
|
|
235
|
+
(`git rm -r --cached .code-review-graph`) and run agemon again. On systemd the unit also
|
|
236
|
+
checks these paths each time it starts, so a link that arrives with a `git pull` stops the
|
|
237
|
+
daemon instead of being written through. launchd has no such start-time check; on macOS
|
|
238
|
+
only agemon's own checks at each run apply.
|
|
239
|
+
|
|
240
|
+
Daemon units registered before 6.0.0 get the start-time checks, the restart limit and the
|
|
241
|
+
current hardening only after `agemon nuke --only daemon` and a fresh `agemon` run.
|
|
242
|
+
|
|
22
243
|
## Requirements
|
|
23
244
|
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
245
|
+
- To install, apply or nuke: Ubuntu, Debian, a derivative whose `/etc/os-release`
|
|
246
|
+
`ID_LIKE` lists `ubuntu` or `debian` (Linux Mint, Pop!_OS, …), or macOS 11 or later.
|
|
247
|
+
On macOS, run agemon as your own user: it refuses to run as root there, because
|
|
248
|
+
everything it installs belongs to one user. `inspect`, `status` and `plan` are
|
|
249
|
+
read-only and run on any OS with Node.js.
|
|
250
|
+
- agnix (the `cli-tool` capability) has pinned builds for Linux x64, Linux arm64 and
|
|
251
|
+
Apple Silicon Macs. On other machines (Intel Macs, x64 Node under Rosetta, other Linux
|
|
252
|
+
architectures) agemon skips `cli-tool` and says so; `agemon.toml` keeps it.
|
|
253
|
+
- Without pipx, install it first: `sudo apt install pipx`, or on macOS
|
|
254
|
+
`brew install pipx` with Homebrew's bin directory on `PATH`.
|
|
255
|
+
- The daemon needs systemd on Linux, or launchd on macOS. Without systemd (most
|
|
256
|
+
containers, WSL without systemd), agemon skips the daemon and says so; `agemon.toml`
|
|
257
|
+
still lists it for machines that have systemd.
|
|
258
|
+
- Node.js `>=22.12` (used to run the installed CLI; no other Node tooling needed).
|
|
259
|
+
- `curl` and `tar` (used by the installer script only).
|
|
260
|
+
- Binaries checked at runtime: `python3`, `pip`, `pipx`, `uv`, `code-review-graph`.
|
|
28
261
|
|
|
29
262
|
Notes:
|
|
30
263
|
- The CLI reports binary availability but does not auto-install missing dependencies.
|
|
@@ -32,18 +265,163 @@ Notes:
|
|
|
32
265
|
|
|
33
266
|
## Install
|
|
34
267
|
|
|
35
|
-
|
|
268
|
+
There are two install routes. Both install the same file: the release's `agemon.tgz`,
|
|
269
|
+
whose SHA-256 is listed in that release's `SHA256SUMS`. The npm package carries npm
|
|
270
|
+
provenance; the GitHub Release asset carries a GitHub build attestation. The package has
|
|
271
|
+
no runtime dependencies (they are bundled), so npm fetches nothing else.
|
|
272
|
+
|
|
273
|
+
**With npm:**
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
npm install --global agemon
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Without npm**, with the installer script:
|
|
36
280
|
|
|
37
281
|
```bash
|
|
38
|
-
|
|
282
|
+
curl --proto '=https' --tlsv1.2 -fsSL https://github.com/Korak-997/agemon/releases/latest/download/install.sh | sh
|
|
39
283
|
```
|
|
40
284
|
|
|
41
|
-
|
|
285
|
+
This downloads the latest self-contained release build (no `node_modules` required),
|
|
286
|
+
checks it against the release's `SHA256SUMS`, and links it onto your `PATH` — as
|
|
287
|
+
`/usr/local/bin/agemon` when run as root, or `~/.local/bin/agemon` otherwise.
|
|
288
|
+
|
|
289
|
+
The one-liner runs `install.sh` without checking it first. To verify the installer too:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
cd "$(mktemp -d)"
|
|
293
|
+
curl --proto '=https' --tlsv1.2 -fsSLO https://github.com/Korak-997/agemon/releases/latest/download/install.sh
|
|
294
|
+
curl --proto '=https' --tlsv1.2 -fsSLO https://github.com/Korak-997/agemon/releases/latest/download/SHA256SUMS
|
|
295
|
+
grep ' install.sh$' SHA256SUMS | sha256sum -c - # macOS: shasum -a 256 -c -
|
|
296
|
+
gh attestation verify install.sh --repo Korak-997/agemon \
|
|
297
|
+
--signer-workflow Korak-997/agemon/.github/workflows/release.yml # optional: build provenance
|
|
298
|
+
sh install.sh
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
Or, from a local clone:
|
|
42
302
|
|
|
43
303
|
```bash
|
|
44
304
|
sh ./install.sh
|
|
45
305
|
```
|
|
46
306
|
|
|
307
|
+
**Trying it once with `npx`:** `npx agemon` works, but only run it in a repository you
|
|
308
|
+
trust. npx resolves and starts agemon using the repository's own `.npmrc` and
|
|
309
|
+
`node_modules`, so a hostile checkout can run its code before agemon starts. agemon also
|
|
310
|
+
ignores npm's injected configuration for the programs it runs itself in that mode,
|
|
311
|
+
including an `NPM_CONFIG_PREFIX` you exported. Install it with one of the routes above
|
|
312
|
+
for everyday use.
|
|
313
|
+
|
|
314
|
+
Then run it in any repository you want to bootstrap — plain `agemon` *is* the install
|
|
315
|
+
command, there is no separate `install` subcommand:
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
agemon
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Installer options
|
|
322
|
+
|
|
323
|
+
- `AGEMON_VERSION`: install a specific release tag instead of `latest` (e.g. `AGEMON_VERSION=6.0.0 sh install.sh`).
|
|
324
|
+
Releases up to 4.7.2 have no `SHA256SUMS` and can no longer be installed this way.
|
|
325
|
+
- `AGEMON_INSTALL_DIR`: override the install directory instead of the root/user default.
|
|
326
|
+
It must be an absolute path to a new or empty directory, or to one a previous agemon
|
|
327
|
+
install created. The installer refuses anything else (a symlink, your home directory, a
|
|
328
|
+
source checkout, a directory with other files) and changes nothing.
|
|
329
|
+
- `AGEMON_VERIFY_ATTESTATION=1`: also verify the tarball's build-provenance attestation
|
|
330
|
+
with `gh attestation verify`. This needs the GitHub CLI, logged in with `gh auth login`.
|
|
331
|
+
|
|
332
|
+
### What the installer verifies
|
|
333
|
+
|
|
334
|
+
- **Checksums** (always): the tarball must match the `SHA256SUMS` published with the same
|
|
335
|
+
release. This catches truncated or corrupted downloads and a CDN serving files from two
|
|
336
|
+
different releases. It does not catch a consistently stale `latest` alias (you would get
|
|
337
|
+
an older, still verified release), and a checksum from the same place as the file proves
|
|
338
|
+
nothing against an attacker who can replace both.
|
|
339
|
+
- **Attestations** (opt-in, above): prove the tarball was built by this repository's release
|
|
340
|
+
workflow, so they catch a tampered or swapped asset.
|
|
341
|
+
- **Neither** helps if the release workflow itself, a dependency it builds with, or the
|
|
342
|
+
maintainer's account is compromised: a tarball built from a poisoned dependency is still
|
|
343
|
+
correctly checksummed and attested.
|
|
344
|
+
- The CLI's self-update checks `install.sh` against `SHA256SUMS`; it verifies attestations
|
|
345
|
+
only if you export `AGEMON_VERIFY_ATTESTATION=1`, which the installer it runs honours.
|
|
346
|
+
|
|
347
|
+
### Upgrading and rolling back
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
agemon upgrade # install the latest release
|
|
351
|
+
agemon upgrade 6.0.0 # install that release (asks before a downgrade)
|
|
352
|
+
agemon upgrade --rollback # switch back to the install the last upgrade replaced
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
`agemon upgrade` works out how the running copy was installed and upgrades it the same
|
|
356
|
+
way:
|
|
357
|
+
|
|
358
|
+
- **Install script:** it runs that release's `install.sh` after checking it against the
|
|
359
|
+
release's `SHA256SUMS`, for the same install dir (a custom `AGEMON_INSTALL_DIR` is kept).
|
|
360
|
+
The installer keeps the replaced install as `<install dir>.prev`, and
|
|
361
|
+
`agemon upgrade --rollback` swaps the two (run it again to swap back). A downgrade
|
|
362
|
+
always runs the newest release's installer, with the older version as its target.
|
|
363
|
+
- **npm (`npm install --global`):** it downloads the release's `agemon.tgz`, checks it
|
|
364
|
+
against `SHA256SUMS` (and its attestation with `AGEMON_VERIFY_ATTESTATION=1`), and runs
|
|
365
|
+
`npm install --global --ignore-scripts --prefix <the running copy's prefix>` on that
|
|
366
|
+
file. `--print` prints these steps instead of running them. Upgrade with
|
|
367
|
+
`agemon upgrade`, not `npm update -g`: npm records the install as coming from a local
|
|
368
|
+
file. There is no `--rollback`; install the previous version by name.
|
|
369
|
+
- **npx:** npx runs the version you ask for (`npx agemon@6.0.0`).
|
|
370
|
+
- **A source checkout, Volta, `pnpm dlx`, `bun x` or a project-local install:** agemon
|
|
371
|
+
says it can't tell how it was installed; update it the way you installed it.
|
|
372
|
+
|
|
373
|
+
`upgrade` without a version never downgrades: if the latest release is not newer, it
|
|
374
|
+
reports that agemon is up to date. It refuses to replace an install another user owns
|
|
375
|
+
(run it as that user: `sudo` for a root install, no `sudo` for your own), and refuses to
|
|
376
|
+
run as root with another user's environment (`sudo -E`). Don't run two upgrades or
|
|
377
|
+
rollbacks of the same install at once.
|
|
378
|
+
|
|
379
|
+
### Uninstalling agemon itself
|
|
380
|
+
|
|
381
|
+
`agemon nuke` reverses changes `agemon` made *inside a repository* — it does not remove
|
|
382
|
+
the `agemon` binary. Run `agemon nuke` in each repository first, then remove agemon
|
|
383
|
+
itself:
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
agemon self-uninstall --dry-run # show what would be removed
|
|
387
|
+
agemon self-uninstall # asks once; --yes skips the question
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
For an install-script copy it removes the install dir, its `.prev` rollback copy, the
|
|
391
|
+
`agemon` link that points into it, the update-check cache, and agemon's machine state
|
|
392
|
+
(`${XDG_STATE_HOME:-~/.local/state}/agemon`, on macOS `~/Library/Application Support/agemon`
|
|
393
|
+
unless `XDG_STATE_HOME` is set: shared-tools ledger and tool caches). It
|
|
394
|
+
keeps the machine state while a repository still uses a shared tool, an interrupted
|
|
395
|
+
apply can still be recovered, or agemon is running somewhere else, and says which. It
|
|
396
|
+
lists the repositories it knows still have agemon-managed files; agemon only knows
|
|
397
|
+
repositories that use a shared tool, so check any others yourself. It never changes
|
|
398
|
+
files inside repositories. Machine state is per user: run it as the user who installed
|
|
399
|
+
agemon (with `sudo` for a root install).
|
|
400
|
+
|
|
401
|
+
It refuses to start while an interrupted apply can still be recovered (run
|
|
402
|
+
`agemon recover` first). For an npm install it prints
|
|
403
|
+
`npm uninstall --global --prefix <prefix> agemon`. A copy run through npx has nothing to
|
|
404
|
+
remove, and a source checkout or an install agemon can't identify is refused.
|
|
405
|
+
|
|
406
|
+
### Update checks
|
|
407
|
+
|
|
408
|
+
`agemon`, `agemon apply` and `agemon nuke` check once a day whether a newer GitHub Release
|
|
409
|
+
exists. The check never slows a command down:
|
|
410
|
+
|
|
411
|
+
- the lookup starts in the background when the command starts, and its result is shown
|
|
412
|
+
only **after** the command has finished and exited successfully. If the lookup has not
|
|
413
|
+
finished by then, it is cancelled and tried again on a later run;
|
|
414
|
+
- in an interactive terminal (without `--yes`), for an install-script or npm install,
|
|
415
|
+
agemon then asks whether to install the update. On yes, it upgrades exactly as
|
|
416
|
+
`agemon upgrade` would (see above). Nothing runs if a check fails;
|
|
417
|
+
- with `--yes`, without a terminal, or for any other install method, it prints a one-line
|
|
418
|
+
notice with the command to run instead of asking. A release candidate is offered its
|
|
419
|
+
final release; an older release is never offered.
|
|
420
|
+
|
|
421
|
+
There is no check at all for `inspect`, `status`, `plan` or `recover`, with `--dry-run` or
|
|
422
|
+
`--quiet`, when `CI` is set (to anything other than `0` or `false`), or when
|
|
423
|
+
`AGEMON_NO_UPDATE_CHECK=1` is set.
|
|
424
|
+
|
|
47
425
|
## CLI Usage
|
|
48
426
|
|
|
49
427
|
`install` is the default command:
|
|
@@ -55,7 +433,55 @@ agemon [options]
|
|
|
55
433
|
Reverse managed changes:
|
|
56
434
|
|
|
57
435
|
```bash
|
|
58
|
-
agemon nuke [
|
|
436
|
+
agemon nuke [--yes] [--dry-run] [--only <plugins>] [--skip-daemon] [--remove-shared <tools>]
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
`nuke` first lists everything it will reverse, including machine-wide steps such as
|
|
440
|
+
uninstalling a global npm package or disabling user linger. It then asks once. Notes:
|
|
441
|
+
|
|
442
|
+
- `--yes` skips the list and the question;
|
|
443
|
+
- without a terminal and without `--yes`, it prints the list and stops (exit 0), the
|
|
444
|
+
same way a first install previews. **Scripts that ran `agemon nuke` without `--yes`
|
|
445
|
+
must now pass it;**
|
|
446
|
+
- it never removes something another installed capability still needs. With
|
|
447
|
+
`--skip-daemon`, or when the daemon could not be removed, code-review-graph stays as
|
|
448
|
+
long as the daemon is installed. The list shows each such line as `kept: …`;
|
|
449
|
+
- if one capability cannot be reversed, `nuke` still reverses the others, then exits 1
|
|
450
|
+
and keeps the failed one's ledger entries so you can fix the cause and re-run;
|
|
451
|
+
- `agemon.toml` is deleted only when nothing failed and the ledger is empty afterwards. With
|
|
452
|
+
`--only` or `--skip-daemon`, that run must also have reversed at least one entry, so a
|
|
453
|
+
fresh clone's committed `agemon.toml` survives `nuke --only …`. Deleting it is always
|
|
454
|
+
listed and asked about like any other reversal;
|
|
455
|
+
- `nuke --dry-run` changes nothing, not even `.agemon/`.
|
|
456
|
+
- code-review-graph and agnix are shared by every repository on the machine. `nuke`
|
|
457
|
+
removes one only when this repository installed it and no other repository uses it
|
|
458
|
+
(`agemon status` lists the users under "Shared tools"). A tool agemon installed before
|
|
459
|
+
it tracked shared tools is kept unless you pass `--remove-shared code-review-graph,agnix`
|
|
460
|
+
(or one of them); the kept line prints the manual uninstall command. See
|
|
461
|
+
[Two Ledgers](docs/architecture-and-operations.md#two-ledgers).
|
|
462
|
+
- skills: `nuke` removes `.claude/skills/<name>` itself, without the skills CLI and
|
|
463
|
+
without network access, and only when its content is a version agemon installed; an
|
|
464
|
+
edited copy is kept and named. A custom group's skill counts as installed by agemon
|
|
465
|
+
only if it matched its source at install time, which agemon recorded then; a copy with
|
|
466
|
+
no such record is kept and named. It never deletes `.agents/skills/<name>`, which other
|
|
467
|
+
tools may use, and removes only agemon's skills from `skills-lock.json`.
|
|
468
|
+
- `.gitignore` and directories: every `nuke` removes the `.claude`, `.claude/skills` and
|
|
469
|
+
`.claude/agents` directories agemon created once they are empty (never their contents).
|
|
470
|
+
When the last capability goes, it also removes the `/.agemon/` and `/skills-lock.json`
|
|
471
|
+
lines agemon added (only the exact lines it appended and recorded; your own equivalent
|
|
472
|
+
lines stay), even in a committed `.gitignore`, and deletes a `.gitignore` agemon created
|
|
473
|
+
once it is empty. `/skills-lock.json` stays while `skills-lock.json` exists, and
|
|
474
|
+
`/.agemon/` stays while `.agemon/` exists. Installs made before agemon recorded these
|
|
475
|
+
lines keep them, and `nuke` says so.
|
|
476
|
+
|
|
477
|
+
> **Downgrading:** an older agemon's `nuke` does not know these records, so it keeps
|
|
478
|
+
> `agemon.toml` and `.agemon/`; a newer agemon's `nuke` then finishes the cleanup.
|
|
479
|
+
|
|
480
|
+
Restore the files an interrupted apply changed (see
|
|
481
|
+
[Interrupted applies](#interrupted-applies)):
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
agemon recover [--yes] [--dry-run]
|
|
59
485
|
```
|
|
60
486
|
|
|
61
487
|
### Global Options
|
|
@@ -63,46 +489,264 @@ agemon nuke [options]
|
|
|
63
489
|
- `--dry-run`: narrate actions without making changes.
|
|
64
490
|
- `--yes`: skip confirmation prompts.
|
|
65
491
|
- `--only <plugins>`: run only a comma-separated subset of plugins.
|
|
66
|
-
- `--skip-daemon`: skip daemon registration during install
|
|
492
|
+
- `--skip-daemon`: skip daemon registration during install; keep the daemon during `nuke`.
|
|
493
|
+
- `--skill-groups <groups>`: comma-separated skill group ids to install, or `all`/`none` — see
|
|
494
|
+
[Skill Groups](#skill-groups).
|
|
67
495
|
- `--no-color`: disable ANSI colors.
|
|
68
|
-
- `-v, --verbose`:
|
|
496
|
+
- `-v, --verbose`: print each subprocess's command line, exit code and the last 20 lines of
|
|
497
|
+
its stdout/stderr beneath the step. Secrets that look like tokens, keys, passwords,
|
|
498
|
+
`Authorization` values, credentials in URLs and PEM blocks are redacted; the environment
|
|
499
|
+
is never printed. `--quiet` wins over `--verbose`.
|
|
69
500
|
- `-q, --quiet`: reduce output to minimal step/final lines.
|
|
70
501
|
|
|
71
502
|
Examples:
|
|
72
503
|
|
|
73
504
|
```bash
|
|
74
505
|
# See planned actions only
|
|
75
|
-
|
|
506
|
+
agemon --dry-run
|
|
507
|
+
|
|
508
|
+
# Install every skill group non-interactively (e.g. in CI)
|
|
509
|
+
agemon --yes --skill-groups all
|
|
510
|
+
|
|
511
|
+
# Install only the security and architecture groups on top of essentials
|
|
512
|
+
agemon --yes --skill-groups security,architecture
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### Repository root
|
|
516
|
+
|
|
517
|
+
agemon works on the repository you are in, not on the directory you run it from. It looks
|
|
518
|
+
from the current directory upwards for the nearest `.git` (a directory, or a `gitdir:`
|
|
519
|
+
file as in a git worktree), and uses the directory that holds it for `agemon.toml`,
|
|
520
|
+
`.agemon/`, rule files and subprocesses. When that is not the current directory, it prints
|
|
521
|
+
`Using repository root <path> (not the current directory).` to stderr.
|
|
522
|
+
|
|
523
|
+
It falls back to the current directory, with a notice, when:
|
|
524
|
+
|
|
525
|
+
- there is no `.git` above it;
|
|
526
|
+
- the first `.git` it meets is something else (for example a symlink);
|
|
527
|
+
- that repository contains your home directory, e.g. a home directory tracked as a
|
|
528
|
+
dotfiles repo. Run `git init` in the project, or run agemon from the repository root;
|
|
529
|
+
- that repository, or its `.git`, belongs to another user (e.g. a `/tmp/.git` someone else
|
|
530
|
+
created).
|
|
531
|
+
|
|
532
|
+
agemon reads `.git` from the filesystem only, so git configuration (such as
|
|
533
|
+
`core.worktree`) cannot redirect where it writes.
|
|
534
|
+
|
|
535
|
+
> **Upgrading:** if you ran agemon from a subdirectory with an earlier release, its state
|
|
536
|
+
> is in that subdirectory. Before upgrading, run `agemon nuke` there with the earlier
|
|
537
|
+
> release, or delete that subdirectory's `.agemon/` and agemon-written files by hand.
|
|
76
538
|
|
|
77
|
-
|
|
78
|
-
npx agemon@latest install --only skills,workflow-scaffolder
|
|
539
|
+
### `agemon.toml`
|
|
79
540
|
|
|
80
|
-
|
|
81
|
-
|
|
541
|
+
The first successful run writes `agemon.toml` at the repository root; commit it so
|
|
542
|
+
teammates and CI reconcile the same way. It accepts exactly these keys. An unknown key, an
|
|
543
|
+
unknown capability id, or an empty `capabilities` list is an error, never a silent
|
|
544
|
+
fallback:
|
|
545
|
+
|
|
546
|
+
```toml
|
|
547
|
+
capabilities = ["crg", "daemon", "skills", "agents", "cli-tool", "master-prompt"]
|
|
548
|
+
known_capabilities = ["crg", "daemon", "skills", "agents", "cli-tool", "master-prompt"]
|
|
549
|
+
skill_groups = "essentials,security" # optional
|
|
550
|
+
|
|
551
|
+
[custom_skill_groups.house-style] # optional — see Project-defined skill groups
|
|
552
|
+
label = "House style"
|
|
553
|
+
skills = [{ source = "./tools/skills/house-rules" }]
|
|
554
|
+
|
|
555
|
+
[conflict_decisions] # optional
|
|
556
|
+
"rule-file:CLAUDE.md" = "keep" # keep | replace | skip
|
|
82
557
|
```
|
|
83
558
|
|
|
559
|
+
`known_capabilities` lists the capabilities the agemon that wrote the file knew about. When
|
|
560
|
+
a later release adds a capability that existing repositories should get (so far only
|
|
561
|
+
`agents`, and only when `skills` is listed), agemon includes it in the run and then adds
|
|
562
|
+
it to `capabilities` once, rewriting `agemon.toml`. All values are kept, but comments and
|
|
563
|
+
layout are not; if anything like that would be lost, the original is saved under
|
|
564
|
+
`.agemon/backups/` and the message names the file. Each such rewrite keeps its own saved
|
|
565
|
+
original; a later one never overwrites an earlier one. The rewrite happens only in an
|
|
566
|
+
interactive or `--yes` run that did not roll back, and never with `--dry-run`, `--only` or
|
|
567
|
+
`agemon plan`. To opt out, remove the capability from `capabilities` afterwards; because it
|
|
568
|
+
is now in `known_capabilities`, agemon does not add it again. Older agemon releases reject a
|
|
569
|
+
file with `known_capabilities` or `agents`, so upgrade agemon in CI before committing it. The
|
|
570
|
+
rewrite is skipped while `/.agemon/` is not git-ignored, and a full `agemon nuke` deletes
|
|
571
|
+
`.agemon/`, including that saved original.
|
|
572
|
+
|
|
573
|
+
A conflict is a rule file that holds your own rules where agemon would write a pointer.
|
|
574
|
+
It needs a decision. `--yes` never picks one for you, so record it under
|
|
575
|
+
`conflict_decisions`:
|
|
576
|
+
|
|
577
|
+
- `keep` and `skip` apply in any session;
|
|
578
|
+
- `replace` applies with `--yes` (so a committed `replace` overwrites that pointer file in
|
|
579
|
+
`--yes` runs; agemon backs up the original first), and is asked again in an
|
|
580
|
+
interactive terminal;
|
|
581
|
+
- without a decision, a non-interactive run exits 2 (see below).
|
|
582
|
+
|
|
583
|
+
### Exit codes
|
|
584
|
+
|
|
585
|
+
| Code | Meaning |
|
|
586
|
+
|---|---|
|
|
587
|
+
| `0` | Success, nothing to do, preview only (`--dry-run`, or a first run without consent), or you declined. |
|
|
588
|
+
| `1` | Error, or the apply failed and was rolled back. |
|
|
589
|
+
| `2` | Drift found, consent was missing (operations or conflicts pending in a non-interactive run), or the apply finished but verification found problems. |
|
|
590
|
+
| `130` / `143` / `129` | Interrupted by SIGINT / SIGTERM / SIGHUP (see [Interrupted applies](#interrupted-applies)). |
|
|
591
|
+
|
|
592
|
+
`agemon status` exits 2 when it finds a problem in a repository where agemon has state (a
|
|
593
|
+
ledger or an interrupted apply). In a repository agemon never touched, it reports what it
|
|
594
|
+
sees and exits 0. An invalid `agemon.toml` is always reported, and `status` then exits 2;
|
|
595
|
+
`inspect` reports it too (`configError` in `--json`) and still exits 0.
|
|
596
|
+
|
|
597
|
+
If `git ls-files` cannot run (git missing, or "dubious ownership" in a CI container),
|
|
598
|
+
`status`, `inspect` and install print `could not check whether .agemon/ is tracked by git`.
|
|
599
|
+
This is a warning only, and it does not change the exit code.
|
|
600
|
+
|
|
601
|
+
Whether `/.agemon/` is git-ignored is decided by git itself
|
|
602
|
+
(`git check-ignore --no-index .agemon/`), so a later `!.agemon` rule in `.gitignore` counts as
|
|
603
|
+
not ignored. Inside a repository where git cannot answer, agemon treats `.agemon/` as not
|
|
604
|
+
ignored: an interactive run asks before adding `/.agemon/` to `.gitignore`, a
|
|
605
|
+
non-interactive run without `--yes` stops, and the git error is printed as
|
|
606
|
+
`could not ask git whether .agemon/ is ignored: …` (in `inspect --json` it is part of
|
|
607
|
+
`isolation.trackingCheckError`).
|
|
608
|
+
|
|
609
|
+
Before installing code-review-graph or its daemon, agemon reads the repository's own git
|
|
610
|
+
configuration (`.git/config`, `config.worktree`, `.gitmodules`, and the same files of
|
|
611
|
+
populated submodules) and checks every key against a short allowlist of settings that
|
|
612
|
+
cannot name a program. If any key falls outside it, the install goes to a separate
|
|
613
|
+
**trust gate** that lists every such key and value (secrets redacted):
|
|
614
|
+
|
|
615
|
+
- interactively, you approve or decline that gate like any other;
|
|
616
|
+
- `--yes` alone does **not** approve it: the operations are skipped with the keys listed,
|
|
617
|
+
and the run exits 2;
|
|
618
|
+
- `--yes --trust-repo-git-config` approves it for that run only (the keys are still
|
|
619
|
+
printed). The flag is never read from `agemon.toml` or any file in the repository, so a
|
|
620
|
+
repository cannot opt itself in; read the printed keys before you pass it.
|
|
621
|
+
|
|
622
|
+
More than 20 such keys, keys that cannot be shown safely, and a git configuration agemon
|
|
623
|
+
cannot read are always skipped, with no override. On an existing install, `status` shows
|
|
624
|
+
the keys as needing attention and exits 2, and a daemon unit written before these
|
|
625
|
+
safeguards is reported until you run `agemon nuke --only daemon`, then
|
|
626
|
+
`agemon --only daemon`.
|
|
627
|
+
|
|
628
|
+
### Agent Detection (`agemon inspect`)
|
|
629
|
+
|
|
630
|
+
`agemon inspect` reports, read-only, which coding-agent ecosystems the repo is set up for
|
|
631
|
+
and which are actually present on the machine. Three ecosystems are covered: **Claude
|
|
632
|
+
Code**, **Gemini CLI**, and **VS Code/GitHub Copilot**. For each, the report shows:
|
|
633
|
+
|
|
634
|
+
- **configured** — recognizable config exists in the repo (e.g. `CLAUDE.md`,
|
|
635
|
+
`.claude/settings.json`, `GEMINI.md`, `.gemini/settings.json`, or Copilot instruction
|
|
636
|
+
files), independent of anything installed on the machine.
|
|
637
|
+
- **installed** — a real executable resolved on `PATH` and reported a version via a
|
|
638
|
+
`--version`-style probe. The report always shows the resolved absolute path, never just
|
|
639
|
+
the bare command name, so it's clear exactly what agemon ran. Copilot has no standalone
|
|
640
|
+
executable, so it never advances past `configured`.
|
|
641
|
+
- **usable** — opt-in only, never run by default. Pass `--check-agents-usable` to also run
|
|
642
|
+
a non-mutating dry-run check (e.g. listing config) for adapters that define one.
|
|
643
|
+
|
|
644
|
+
Detection never executes an agent with a prompt or tool access — only version/dry-run
|
|
645
|
+
probes. The first time it looks for installed executables, agemon asks for one-time
|
|
646
|
+
confirmation ("May agemon look for AI coding agents installed on this machine?"); declining
|
|
647
|
+
still returns full `configured` results, just without the installed/usable checks.
|
|
648
|
+
|
|
649
|
+
```bash
|
|
650
|
+
# Table report, including the Agents section
|
|
651
|
+
agemon inspect
|
|
652
|
+
|
|
653
|
+
# Same, plus an opt-in non-mutating usability probe
|
|
654
|
+
agemon inspect --check-agents-usable
|
|
655
|
+
|
|
656
|
+
# Machine-readable report (agents included under `agents`)
|
|
657
|
+
agemon inspect --json
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
`agemon status` includes a one-line agent summary (counts configured/installed) alongside
|
|
661
|
+
its usual health/drift output.
|
|
662
|
+
|
|
84
663
|
## Reversibility Guarantees
|
|
85
664
|
|
|
86
|
-
- `nuke` removes only agemon-managed artifacts tracked in `.agemon/state.json
|
|
665
|
+
- `nuke` removes only agemon-managed artifacts tracked in `.agemon/state.json`, and among
|
|
666
|
+
those, it removes skills, subagents, shared tools, daemon units and the code graph only
|
|
667
|
+
when this machine wrote the entry (each entry carries a receipt keyed by
|
|
668
|
+
`${XDG_STATE_HOME:-~/.local/state}/agemon/ledger-key`). Entries from an agemon before
|
|
669
|
+
receipts, from another machine or from a committed ledger are kept and reported, with
|
|
670
|
+
what to remove by hand; `status` counts them. See
|
|
671
|
+
[Ledger receipts](docs/architecture-and-operations.md#ledger-receipts).
|
|
87
672
|
- Pre-existing tools/files are detected and preserved.
|
|
88
|
-
-
|
|
89
|
-
|
|
673
|
+
- The `.gitignore` lines and empty directories agemon added are recorded too, so a full
|
|
674
|
+
`nuke` leaves the repository as it was before agemon (see `nuke` above).
|
|
675
|
+
- Master-prompt file edits are backed up in `.agemon/backups/` and restored on uninstall,
|
|
676
|
+
but only when the backup provably matches the file agemon found (checksum check).
|
|
677
|
+
- A managed file you edited after agemon wrote it is never overwritten or deleted: agemon
|
|
678
|
+
removes only its own block, or leaves the file as is, saves the earlier contents beside it
|
|
679
|
+
as `<file>.agemon-original`, and prints `manual cleanup needed: …`.
|
|
680
|
+
- agemon writes files atomically, keeps their permissions, and refuses to write through a
|
|
681
|
+
symlink, a special file or a read-only file. A symlinked rule file (for example
|
|
682
|
+
`CLAUDE.md -> AGENTS.md`) is reported as a conflict and left alone.
|
|
683
|
+
- A failed apply rolls back every file it touched; anything it could not restore is listed,
|
|
684
|
+
and the apply's journal is kept so `agemon recover` can retry.
|
|
685
|
+
- `.agemon/` content (plans, the ledger, backups) is treated as untrusted, because it may
|
|
686
|
+
have been committed by someone else. `agemon apply --plan <id>` accepts only a valid
|
|
687
|
+
16-character plan id, refuses a malformed plan or one made by another agemon version, and
|
|
688
|
+
never touches a path outside the repository, inside `.git/`, or under a symlinked
|
|
689
|
+
directory. It also plans again with this run's options (`--only`, `--skip-daemon`,
|
|
690
|
+
`--skill-groups`, `agemon.toml`) and refuses unless the result is identical to the stored
|
|
691
|
+
plan, so it applies exactly what you reviewed — never an edited preview, risk class or
|
|
692
|
+
operation. Pass the same options you gave `agemon plan`. agemon refuses to use `.agemon/` (or any directory in it) when it is a symlink.
|
|
693
|
+
- `inspect`, `status` and `plan` never follow a symlinked or special file and never read a
|
|
694
|
+
file larger than 8 MiB; such a file is reported as present but unread.
|
|
695
|
+
|
|
696
|
+
### Interrupted applies
|
|
697
|
+
|
|
698
|
+
Before an apply changes anything, agemon writes a journal with the pre-apply contents of
|
|
699
|
+
every file it will write and a copy of the ledger. The journal lives outside the
|
|
700
|
+
repository, in `${XDG_STATE_HOME:-~/.local/state}/agemon/journals/` (macOS:
|
|
701
|
+
`~/Library/Application Support/agemon/journals/`; directory mode `0700`,
|
|
702
|
+
file mode `0600`), so repository contents cannot forge one. It is deleted when the apply
|
|
703
|
+
succeeds or rolls back cleanly.
|
|
704
|
+
|
|
705
|
+
- **Ctrl-C, `SIGTERM` or `SIGHUP` during an apply:** agemon finishes the current step, rolls
|
|
706
|
+
back, and exits `130`, `143` or `129`. Press Ctrl-C a second time to stop at once.
|
|
707
|
+
- **The process was killed or the machine lost power:** the journal stays behind. Every
|
|
708
|
+
later `agemon`, `agemon apply` and `agemon nuke` in that repository refuses to start and
|
|
709
|
+
points to `agemon recover`.
|
|
710
|
+
- **`agemon recover`** shows what it will restore, then asks (or proceeds with `--yes`;
|
|
711
|
+
`--dry-run` only shows). It restores files the apply wrote, reverts what the apply
|
|
712
|
+
recorded in the ledger, and restores the ledger. A file you edited after the interruption
|
|
713
|
+
is kept as is, with agemon's ledger entry for it, and its pre-apply contents are saved
|
|
714
|
+
beside it as `<file>.agemon-original`. A failed apply treats a file edited during the run
|
|
715
|
+
the same way.
|
|
716
|
+
- **Limit:** work a capability had started but not yet recorded when the process died is not
|
|
717
|
+
undone; check `agemon status` afterwards. Interrupted writes can leave
|
|
718
|
+
`<file>.tmp-<pid>-<id>` files next to their targets; delete them if present.
|
|
90
719
|
|
|
91
720
|
## Managed Outputs
|
|
92
721
|
|
|
93
722
|
By default, agemon may manage these paths:
|
|
94
723
|
|
|
95
724
|
- `.agemon/state.json`
|
|
96
|
-
- `.agemon/backups
|
|
97
|
-
-
|
|
98
|
-
- `.github/workflows/code-review-graph-action.yml`
|
|
725
|
+
- `.agemon/backups/*.bak`
|
|
726
|
+
- `<rule file>.agemon-original` (only when an edited file is preserved on uninstall)
|
|
99
727
|
- `AGENTS.md`
|
|
100
728
|
- `CLAUDE.md`
|
|
101
729
|
- `GEMINI.md`
|
|
102
730
|
- `.cursorrules`
|
|
103
731
|
- `.windsurfrules`
|
|
732
|
+
- `.claude/agents/<name>.md` (the subagents of installed skill groups)
|
|
733
|
+
- `agemon.toml` (written on the first run; rewritten once when a capability is added)
|
|
734
|
+
|
|
735
|
+
It also invokes external installers (`pipx`, `npm -g`, the pinned `skills` CLI) when required.
|
|
736
|
+
Every third-party tool and source is pinned to an exact version or commit
|
|
737
|
+
(`src/plugins/pins.ts`, `assets/tools/package-lock.json`). agnix is installed with
|
|
738
|
+
`npm install --global --ignore-scripts agnix@<pin>`, so its own download script never runs;
|
|
739
|
+
agemon then downloads the binary from the matching GitHub release itself and installs it only
|
|
740
|
+
if the archive matches a sha256 pinned in `src/plugins/pins.ts`.
|
|
741
|
+
|
|
742
|
+
Machine-level caches outside the repo, under `${XDG_STATE_HOME:-~/.local/state}/agemon/`
|
|
743
|
+
(macOS: `~/Library/Application Support/agemon/`), are
|
|
744
|
+
kept by `nuke` because every repo on the machine shares them:
|
|
104
745
|
|
|
105
|
-
|
|
746
|
+
- `tools/<hash>/`: the `skills` CLI, installed from `assets/tools/package-lock.json`
|
|
747
|
+
- `skills-src/<commit>/`: the pinned Essentials checkout that `skills add` installs from
|
|
748
|
+
- `machine.json`: which repositories use code-review-graph, agnix and user linger, and who
|
|
749
|
+
installed or enabled them
|
|
106
750
|
|
|
107
751
|
## Local Development
|
|
108
752
|
|
|
@@ -148,6 +792,7 @@ Useful sandbox flags:
|
|
|
148
792
|
- `--quiet`: suppress captured terminal output.
|
|
149
793
|
- `--skip-daemon`: skip daemon plugin in the run.
|
|
150
794
|
- `--only <plugins>`: run selected plugins only.
|
|
795
|
+
- `--skill-groups <ids>`: pass skill groups through to the install run.
|
|
151
796
|
|
|
152
797
|
## Detailed Docs
|
|
153
798
|
|
|
@@ -156,13 +801,72 @@ Useful sandbox flags:
|
|
|
156
801
|
- Audit and review report: `docs/review-2026-08-13.md`
|
|
157
802
|
- Historical implementation plan: `docs/implementation-plan.md`
|
|
158
803
|
|
|
804
|
+
## Vendored Skills & Attribution
|
|
805
|
+
|
|
806
|
+
The `design`, `security`, `code-quality`, `architecture`, `self-review`, `performance`, `commit`,
|
|
807
|
+
`teamlead` and `geo-seo` skill groups (see [Skill Groups](#skill-groups)) are vendored under
|
|
808
|
+
`assets/skills/<group>/<skill>/`.
|
|
809
|
+
Each vendored skill directory carries a `NOTICE.md` (source repo, exact commit, retrieval date)
|
|
810
|
+
and a copy of its upstream `LICENSE`. Sources, all MIT-licensed:
|
|
811
|
+
|
|
812
|
+
Every skill vendored from a third-party project is renamed to an `agemon-*` identity (frontmatter
|
|
813
|
+
`name` and directory) — it should never be obvious from installing it that the content originated
|
|
814
|
+
elsewhere. Original upstream names are preserved only in each skill's `NOTICE.md`, for attribution.
|
|
815
|
+
The project-authored `team-lead` skills beyond `agemon-plan-rfc` and `prd-generator` have no
|
|
816
|
+
upstream to rename from and keep their original `skill-*` names — see the table below.
|
|
817
|
+
The `geo-seo` group is the one deliberate exception: its skills keep their upstream `geo-*` names
|
|
818
|
+
so `/geo audit` and the other commands match the upstream project's documentation.
|
|
819
|
+
|
|
820
|
+
| Renamed to | Originally | Source |
|
|
821
|
+
|---|---|---|
|
|
822
|
+
| `agemon-design`, `agemon-design-minimal`, `agemon-design-editorial`, `agemon-design-dashboard` | `ui-craft` + 3 recipe variants | [educlopez/ui-craft](https://github.com/educlopez/ui-craft) |
|
|
823
|
+
| `agemon-security` | `security-review` (also avoids colliding with Claude Code's own built-in skill of the same name) | [Dilaz/security-review-skill](https://github.com/Dilaz/security-review-skill) |
|
|
824
|
+
| `agemon-architecture` | `clean-architecture` | [nathankim0/clean-architecture-skills](https://github.com/nathankim0/clean-architecture-skills) |
|
|
825
|
+
| `agemon-verify-before-done`, `agemon-review-intake`, `agemon-review-request`, `agemon-root-cause` | `verification-before-completion`, `receiving-code-review`, `requesting-code-review`, `systematic-debugging` | [obra/superpowers](https://github.com/obra/superpowers) (cherry-picked; not a full vendor of that framework) |
|
|
826
|
+
| `agemon-clean-code` | `karpathy-guidelines` | [swarmclawai/andrej-karpathy-skills](https://github.com/swarmclawai/andrej-karpathy-skills) |
|
|
827
|
+
| `agemon-house-rules`, `agemon-performance`, `agemon-commit`, `agemon-plan-rfc`, `prd-generator`, `skill-headofit-audit`, `skill-incident-rca`, `skill-meeting-lifecycle`, `skill-obsidian-vault-sync`, `skill-prd-decomposer`, `skill-sec-check`, `skill-task-extractor`, `skill-techlead-reviewer`, `skill-tech-spike` | — | Original — authored for this project, `agemon-house-rules` distilled from this repo's own `AGENTS.md`. The `team-lead` skills beyond `agemon-plan-rfc` and `prd-generator` keep their original `skill-*` names rather than the `agemon-*` convention. |
|
|
828
|
+
|
|
829
|
+
`ui-craft`'s own reference files (33 files under `agemon-design/references/`) still mention
|
|
830
|
+
"ui-craft" by name in prose in a few places — they document that project's own separate CLI/MCP
|
|
831
|
+
tooling (`ui-craft-detect`, the `ui-craft` MCP server's `route_task`), which genuinely still goes
|
|
832
|
+
by that name and isn't part of what agemon ships. Rewriting 33 files of someone else's authored
|
|
833
|
+
guidance to scrub every mention was judged higher-risk than leaving a few internal citations
|
|
834
|
+
intact; the skill's own identity (what gets installed, listed, and invoked) is fully renamed.
|
|
835
|
+
|
|
836
|
+
`geo-seo` is vendored from [zubair-trabzada/geo-seo-claude](https://github.com/zubair-trabzada/geo-seo-claude)
|
|
837
|
+
(MIT, commit `989cae0`). It ships 12 of upstream's skills; the self-updater, the Python scripts,
|
|
838
|
+
the CRM/proposal skills and the examples are left out. These skills read untrusted website
|
|
839
|
+
content, so agemon's copy changes them in ways each skill's `NOTICE.md` lists in full:
|
|
840
|
+
|
|
841
|
+
- no skill pre-approves any tool, so every web fetch to a new domain, file write and shell
|
|
842
|
+
command asks for your approval;
|
|
843
|
+
- every skill and subagent brief starts with an untrusted-content rule;
|
|
844
|
+
- the five audit subagents are installed as project agents (`geo-audit-*`, see
|
|
845
|
+
[Subagents](#subagents)) whose system prompt is the brief in `geo-audit/references/`,
|
|
846
|
+
with only the tools they need; without them, `geo-audit` falls back to general-purpose
|
|
847
|
+
subagents given the same briefs;
|
|
848
|
+
- raw HTML and headers come from one fixed, read-only `curl` command that you approve per run;
|
|
849
|
+
- the PDF step builds its cover from checked values in a metadata file, runs pandoc sandboxed
|
|
850
|
+
with raw HTML off, and prints with a sandboxed Chrome under a strict Content-Security-Policy.
|
|
851
|
+
|
|
852
|
+
If you installed upstream geo-seo-claude as personal skills (`~/.claude/skills/geo*`), run its
|
|
853
|
+
`uninstall.sh` first: Claude Code prefers personal skills over project skills of the same name,
|
|
854
|
+
so `/geo` would otherwise run that copy. `geo-report-pdf` needs pandoc 3.0+ and Chrome or
|
|
855
|
+
Chromium.
|
|
856
|
+
|
|
159
857
|
## Roadmap Notes
|
|
160
858
|
|
|
859
|
+
Shipped:
|
|
860
|
+
|
|
861
|
+
- Read-only agent detection (`agemon inspect`'s "Agents" section, `--check-agents-usable`)
|
|
862
|
+
for Claude Code, Gemini CLI, and Copilot. Delegating work to a detected agent is not yet
|
|
863
|
+
built.
|
|
864
|
+
|
|
161
865
|
Planned but not currently implemented:
|
|
162
866
|
|
|
163
|
-
- Dedicated `status` command.
|
|
164
867
|
- Dedicated `doctor` command.
|
|
165
|
-
- Native Windows
|
|
868
|
+
- Native Windows support.
|
|
869
|
+
- Agent delegation (`agemon delegate`/`agemon handoff`).
|
|
166
870
|
|
|
167
871
|
## License
|
|
168
872
|
|