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.
Files changed (144) hide show
  1. package/README.md +732 -28
  2. package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
  3. package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
  4. package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
  5. package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
  6. package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
  7. package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
  8. package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
  9. package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
  10. package/assets/skills/design/agemon-design/LICENSE +21 -0
  11. package/assets/skills/design/agemon-design/NOTICE.md +9 -0
  12. package/assets/skills/design/agemon-design/SKILL.md +391 -0
  13. package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
  14. package/assets/skills/design/agemon-design/references/agents.md +63 -0
  15. package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
  16. package/assets/skills/design/agemon-design/references/brief.md +186 -0
  17. package/assets/skills/design/agemon-design/references/color.md +216 -0
  18. package/assets/skills/design/agemon-design/references/components.md +91 -0
  19. package/assets/skills/design/agemon-design/references/copy.md +300 -0
  20. package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
  21. package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
  22. package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
  23. package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
  24. package/assets/skills/design/agemon-design/references/forms.md +192 -0
  25. package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
  26. package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
  27. package/assets/skills/design/agemon-design/references/layout.md +236 -0
  28. package/assets/skills/design/agemon-design/references/loops.md +155 -0
  29. package/assets/skills/design/agemon-design/references/metadata.md +98 -0
  30. package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
  31. package/assets/skills/design/agemon-design/references/motion.md +434 -0
  32. package/assets/skills/design/agemon-design/references/personas.md +206 -0
  33. package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
  34. package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
  35. package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
  36. package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
  37. package/assets/skills/design/agemon-design/references/responsive.md +168 -0
  38. package/assets/skills/design/agemon-design/references/review.md +340 -0
  39. package/assets/skills/design/agemon-design/references/sound.md +150 -0
  40. package/assets/skills/design/agemon-design/references/spec.md +123 -0
  41. package/assets/skills/design/agemon-design/references/stack.md +522 -0
  42. package/assets/skills/design/agemon-design/references/state-design.md +188 -0
  43. package/assets/skills/design/agemon-design/references/themes.md +229 -0
  44. package/assets/skills/design/agemon-design/references/tokens.md +350 -0
  45. package/assets/skills/design/agemon-design/references/typography.md +246 -0
  46. package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
  47. package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
  48. package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
  49. package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
  50. package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
  51. package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
  52. package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
  53. package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
  54. package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
  55. package/assets/skills/geo-seo/geo/LICENSE +21 -0
  56. package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
  57. package/assets/skills/geo-seo/geo/SKILL.md +145 -0
  58. package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
  59. package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
  60. package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
  61. package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
  62. package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
  63. package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
  64. package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
  65. package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
  66. package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
  67. package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
  68. package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
  69. package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
  70. package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
  71. package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
  72. package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
  73. package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
  74. package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
  75. package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
  76. package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
  77. package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
  78. package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
  79. package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
  80. package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
  81. package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
  82. package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
  83. package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
  84. package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
  85. package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
  86. package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
  87. package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
  88. package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
  89. package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
  90. package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
  91. package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
  92. package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
  93. package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
  94. package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
  95. package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
  96. package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
  97. package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
  98. package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
  99. package/assets/skills/security/agemon-security/LICENSE +21 -0
  100. package/assets/skills/security/agemon-security/NOTICE.md +8 -0
  101. package/assets/skills/security/agemon-security/SKILL.md +356 -0
  102. package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
  103. package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
  104. package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
  105. package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
  106. package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
  107. package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
  108. package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
  109. package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
  110. package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
  111. package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
  112. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
  113. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
  114. package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
  115. package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
  116. package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
  117. package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
  118. package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
  119. package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
  120. package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
  121. package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
  122. package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
  123. package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
  124. package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
  125. package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
  126. package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
  127. package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
  128. package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
  129. package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
  130. package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
  131. package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
  132. package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
  133. package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
  134. package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
  135. package/assets/tools/code-review-graph-constraints.txt +1418 -0
  136. package/assets/tools/package-lock.json +111 -0
  137. package/assets/tools/package.json +6 -0
  138. package/dist/chunk-5LATHJYU.js +4026 -0
  139. package/dist/chunk-5LATHJYU.js.map +1 -0
  140. package/dist/fake-subprocess-2BETWZVZ.js +666 -0
  141. package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
  142. package/dist/index.js +21101 -1956
  143. package/dist/index.js.map +1 -1
  144. package/package.json +30 -17
package/README.md CHANGED
@@ -1,30 +1,263 @@
1
1
  # agemon
2
2
 
3
+ [![CI](https://github.com/Korak-997/agemon/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/Korak-997/agemon/actions/workflows/ci.yml)
4
+ [![Release](https://img.shields.io/github/v/release/Korak-997/agemon)](https://github.com/Korak-997/agemon/releases/latest)
5
+ [![npm](https://img.shields.io/npm/v/agemon)](https://www.npmjs.com/package/agemon)
6
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Korak-997/agemon/badge)](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
+ ![agemon installs the essentials bundle with --yes, agemon nuke removes everything it added, and git status --ignored shows the repository exactly as it was](docs/demo/agemon.gif)
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
- Current v0.1 behavior is plugin-driven and runs in this order:
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 `crg-daemon` autostart via `systemd --user`.
14
- 3. `skills`: installs bundled skills via `npx skills`.
15
- 4. `workflow-scaffolder`: writes bundled GitHub workflow files.
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
- - Linux with Ubuntu (`/etc/os-release` must report `ID=ubuntu`).
25
- - Node.js `>=24`.
26
- - `npx`.
27
- - Binaries checked at runtime: `python3`, `pip`, `pipx`, `uv`, `crg`.
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
- Install in the current repository:
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
- npx agemon@latest install
282
+ curl --proto '=https' --tlsv1.2 -fsSL https://github.com/Korak-997/agemon/releases/latest/download/install.sh | sh
39
283
  ```
40
284
 
41
- Or use the local preflight script:
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 [options]
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`: show raw subprocess output beneath each step.
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
- npx agemon@latest install --dry-run
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
- # Install only skills and workflows
78
- npx agemon@latest install --only skills,workflow-scaffolder
539
+ ### `agemon.toml`
79
540
 
80
- # Reverse only specific plugins
81
- npx agemon@latest nuke --only skills,workflow-scaffolder
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
- - Master-prompt file edits are backed up in `.agemon/backups/master-prompt/` and restored
89
- on uninstall.
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/master-prompt/*.bak`
97
- - `.github/workflows/claude-code-security-review.yml`
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
- It also invokes external installers (`pipx`, `npm -g`, `npx skills`) when required.
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/macOS platform support.
868
+ - Native Windows support.
869
+ - Agent delegation (`agemon delegate`/`agemon handoff`).
166
870
 
167
871
  ## License
168
872