@ethlete/agent-rules 0.1.0-next.0 → 0.1.0-next.1

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 (46) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +87 -15
  3. package/content/hooks/context-warning.py +215 -0
  4. package/package.json +1 -1
  5. package/src/index.js +12 -4
  6. package/src/index.js.map +1 -1
  7. package/src/lib/config.d.ts +35 -2
  8. package/src/lib/config.js +30 -8
  9. package/src/lib/config.js.map +1 -1
  10. package/src/lib/index.d.ts +1 -0
  11. package/src/lib/index.js +1 -0
  12. package/src/lib/index.js.map +1 -1
  13. package/src/lib/migrate.d.ts +6 -0
  14. package/src/lib/migrate.js +155 -0
  15. package/src/lib/migrate.js.map +1 -0
  16. package/src/lib/owned-paths.js +4 -1
  17. package/src/lib/owned-paths.js.map +1 -1
  18. package/src/lib/plan.d.ts +4 -0
  19. package/src/lib/plan.js +65 -6
  20. package/src/lib/plan.js.map +1 -1
  21. package/src/lib/sync.js +8 -2
  22. package/src/lib/sync.js.map +1 -1
  23. package/src/lib/targets/agents-skills.d.ts +8 -0
  24. package/src/lib/targets/agents-skills.js +18 -0
  25. package/src/lib/targets/agents-skills.js.map +1 -0
  26. package/src/lib/targets/claude-hooks.d.ts +33 -0
  27. package/src/lib/targets/claude-hooks.js +97 -0
  28. package/src/lib/targets/claude-hooks.js.map +1 -0
  29. package/src/lib/targets/claude.d.ts +3 -1
  30. package/src/lib/targets/claude.js +13 -20
  31. package/src/lib/targets/claude.js.map +1 -1
  32. package/src/lib/targets/codex.d.ts +5 -3
  33. package/src/lib/targets/codex.js +8 -7
  34. package/src/lib/targets/codex.js.map +1 -1
  35. package/src/lib/targets/copilot.d.ts +3 -3
  36. package/src/lib/targets/copilot.js +5 -28
  37. package/src/lib/targets/copilot.js.map +1 -1
  38. package/src/lib/targets/cursor.d.ts +3 -3
  39. package/src/lib/targets/cursor.js +6 -11
  40. package/src/lib/targets/cursor.js.map +1 -1
  41. package/src/lib/targets/shared.d.ts +22 -12
  42. package/src/lib/targets/shared.js +32 -15
  43. package/src/lib/targets/shared.js.map +1 -1
  44. package/src/lib/targets/neutral.d.ts +0 -8
  45. package/src/lib/targets/neutral.js +0 -29
  46. package/src/lib/targets/neutral.js.map +0 -1
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrate = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const config_1 = require("./config");
7
+ const plan_1 = require("./plan");
8
+ const render_1 = require("./render");
9
+ const sync_1 = require("./sync");
10
+ const CLAUDE_MD = 'CLAUDE.md';
11
+ const AGENTS_MD = 'AGENTS.md';
12
+ const CLAUDE_SKILLS = '.claude/skills';
13
+ const AGENTS_SKILLS = '.agents/skills';
14
+ const log = (message) => console.log(` ${message}`);
15
+ /**
16
+ * `AGENTS.md` becomes the canonical instruction file: whatever `CLAUDE.md` held moves to the top
17
+ * of `AGENTS.md`, and `CLAUDE.md` shrinks to the `@AGENTS.md` import Claude Code documents for
18
+ * exactly this setup.
19
+ */
20
+ const migrateClaudeMd = (options) => {
21
+ const { root, dryRun } = options;
22
+ const claudePath = (0, path_1.join)(root, CLAUDE_MD);
23
+ const agentsPath = (0, path_1.join)(root, AGENTS_MD);
24
+ if ((0, plan_1.claudeMdImportsAgentsMd)(root)) {
25
+ log(`keep ${CLAUDE_MD} — already imports ${AGENTS_MD}`);
26
+ return;
27
+ }
28
+ if (!(0, fs_1.existsSync)(claudePath)) {
29
+ log(`create ${CLAUDE_MD} — "@${AGENTS_MD}" import`);
30
+ if (!dryRun)
31
+ (0, fs_1.writeFileSync)(claudePath, `@${AGENTS_MD}\n`, 'utf8');
32
+ return;
33
+ }
34
+ const claudeContent = (0, fs_1.readFileSync)(claudePath, 'utf8').trim();
35
+ const agentsContent = (0, fs_1.existsSync)(agentsPath) ? (0, fs_1.readFileSync)(agentsPath, 'utf8').trim() : '';
36
+ const merged = [claudeContent, agentsContent].filter((part) => part.length > 0).join('\n\n');
37
+ log(`move ${CLAUDE_MD} content into ${AGENTS_MD}`);
38
+ log(`write ${CLAUDE_MD} — "@${AGENTS_MD}" import`);
39
+ if (dryRun)
40
+ return;
41
+ (0, fs_1.writeFileSync)(agentsPath, `${merged}\n`, 'utf8');
42
+ (0, fs_1.writeFileSync)(claudePath, `@${AGENTS_MD}\n`, 'utf8');
43
+ };
44
+ /**
45
+ * Hand-written skills move to the cross-tool `.agents/skills/` location; a symlink stays behind
46
+ * because Claude Code only scans `.claude/skills/` (and follows symlinks there). Generated
47
+ * `ethlete-` entries are left to `sync`, which owns them.
48
+ */
49
+ const migrateSkills = (options) => {
50
+ const { root, dryRun } = options;
51
+ const claudeSkills = (0, path_1.join)(root, CLAUDE_SKILLS);
52
+ if (!(0, fs_1.existsSync)(claudeSkills))
53
+ return;
54
+ for (const entry of (0, fs_1.readdirSync)(claudeSkills)) {
55
+ const source = (0, path_1.join)(claudeSkills, entry);
56
+ if (entry.startsWith('ethlete-') || (0, fs_1.lstatSync)(source).isSymbolicLink() || !(0, fs_1.lstatSync)(source).isDirectory()) {
57
+ continue;
58
+ }
59
+ const destination = (0, path_1.join)(root, AGENTS_SKILLS, entry);
60
+ if ((0, fs_1.existsSync)(destination)) {
61
+ log(`skip ${CLAUDE_SKILLS}/${entry} — ${AGENTS_SKILLS}/${entry} already exists`);
62
+ continue;
63
+ }
64
+ log(`move ${CLAUDE_SKILLS}/${entry} → ${AGENTS_SKILLS}/${entry} (symlink stays behind)`);
65
+ if (dryRun)
66
+ continue;
67
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(destination), { recursive: true });
68
+ (0, fs_1.renameSync)(source, destination);
69
+ try {
70
+ (0, fs_1.symlinkSync)((0, path_1.relative)((0, path_1.dirname)(source), destination), source, 'dir');
71
+ }
72
+ catch (error) {
73
+ (0, fs_1.renameSync)(destination, source);
74
+ log(`undo ${CLAUDE_SKILLS}/${entry} — creating the symlink failed (${error.message})`);
75
+ }
76
+ }
77
+ };
78
+ const LAYOUT_NOTE = `## Agent file layout
79
+
80
+ \`AGENTS.md\` is canonical; \`CLAUDE.md\` is just an \`@AGENTS.md\` import. Skills live in
81
+ \`.agents/skills/<name>/\`; the entries in \`.claude/skills/\` are symlinks to them (Claude Code
82
+ only scans there) - same file, not a duplicate. Edit and create skills under \`.agents/skills/\`,
83
+ plus a symlink for new ones. \`ethlete-*\` skills and the marker block in this file are generated
84
+ by \`npx ethlete-agents sync\` - never edit them by hand.`;
85
+ const withoutMarkedBlock = (content) => {
86
+ const start = content.indexOf(render_1.START_MARKER);
87
+ const end = content.indexOf(render_1.END_MARKER);
88
+ if (start === -1 || end === -1 || end < start)
89
+ return content;
90
+ return content.slice(0, start) + content.slice(end + render_1.END_MARKER.length);
91
+ };
92
+ /**
93
+ * Without this note an agent that lists both skill directories reads the symlinked entries as
94
+ * duplicated files. Skipped when the repo's own `AGENTS.md` prose already explains the layout.
95
+ */
96
+ const addLayoutNote = (options) => {
97
+ const { root, dryRun } = options;
98
+ const path = (0, path_1.join)(root, AGENTS_MD);
99
+ const existing = (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
100
+ if (withoutMarkedBlock(existing).includes(AGENTS_SKILLS)) {
101
+ log(`keep ${AGENTS_MD} — already documents the ${AGENTS_SKILLS} layout`);
102
+ return;
103
+ }
104
+ log(`write ${AGENTS_MD} — add the agent file layout note`);
105
+ if (dryRun)
106
+ return;
107
+ const start = existing.indexOf(render_1.START_MARKER);
108
+ const contents = start === -1
109
+ ? `${[existing.trimEnd(), LAYOUT_NOTE].filter((part) => part.length > 0).join('\n\n')}\n`
110
+ : `${existing.slice(0, start).trimEnd()}\n\n${LAYOUT_NOTE}\n\n${existing.slice(start)}`;
111
+ (0, fs_1.writeFileSync)(path, contents, 'utf8');
112
+ };
113
+ const migrateConfig = (options) => {
114
+ const { root, dryRun } = options;
115
+ const path = (0, path_1.join)(root, config_1.CONFIG_FILE_NAME);
116
+ const raw = (0, fs_1.existsSync)(path)
117
+ ? JSON.parse((0, fs_1.readFileSync)(path, 'utf8'))
118
+ : { targets: 'auto', vars: {}, exclude: [] };
119
+ const targets = raw['targets'];
120
+ const explicit = Array.isArray(targets) ? targets : undefined;
121
+ const missingCodex = explicit !== undefined && !explicit.includes('codex');
122
+ const missingFlag = raw['claudeMdImportsAgentsMd'] !== true;
123
+ if (!missingCodex && !missingFlag) {
124
+ log(`keep ${config_1.CONFIG_FILE_NAME} — already migrated`);
125
+ return;
126
+ }
127
+ if (missingCodex && explicit)
128
+ raw['targets'] = [...explicit, 'codex'];
129
+ raw['claudeMdImportsAgentsMd'] = true;
130
+ log(`write ${config_1.CONFIG_FILE_NAME} — codex target + claudeMdImportsAgentsMd`);
131
+ if (!dryRun)
132
+ (0, fs_1.writeFileSync)(path, `${JSON.stringify(raw, null, 2)}\n`, 'utf8');
133
+ };
134
+ /**
135
+ * Converts a repo to the `AGENTS.md`-canonical layout and re-syncs. Safe to re-run: every step
136
+ * detects the migrated state and skips itself.
137
+ */
138
+ const migrate = (options) => {
139
+ const { root, dryRun = false } = options;
140
+ console.log(dryRun ? 'Migration plan (dry run):' : 'Migrating to the AGENTS.md + .agents/skills layout:');
141
+ migrateClaudeMd({ root, dryRun });
142
+ migrateSkills({ root, dryRun });
143
+ addLayoutNote({ root, dryRun });
144
+ migrateConfig({ root, dryRun });
145
+ if (dryRun) {
146
+ console.log('\nRe-run without --dry-run to apply, then a sync runs automatically.');
147
+ return 0;
148
+ }
149
+ console.log('\nRunning sync:');
150
+ const result = (0, sync_1.sync)(options);
151
+ console.log('\nDone. Commit the result. Note: the .claude/skills symlinks need symlink support on checkout (Windows: Developer Mode).');
152
+ return result;
153
+ };
154
+ exports.migrate = migrate;
155
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/migrate.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.collectOwnedPaths = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
- const OWNED_DIRECTORIES = ['.agents/ethlete', '.claude/rules/ethlete'];
6
+ // `.agents/ethlete` and `.github/instructions/ethlete-*` are no longer emitted, but stay owned so
7
+ // a sync prunes them from repos generated by older versions.
8
+ const OWNED_DIRECTORIES = ['.agents/ethlete', '.claude/rules/ethlete', '.claude/hooks/ethlete'];
7
9
  const OWNED_PARENTS = [
10
+ { dir: '.agents/skills', match: (entry) => entry.startsWith('ethlete-') },
8
11
  { dir: '.claude/skills', match: (entry) => entry.startsWith('ethlete-') },
9
12
  { dir: '.cursor/rules', match: (entry) => entry.startsWith('ethlete-') && entry.endsWith('.mdc') },
10
13
  {
@@ -1 +1 @@
1
- {"version":3,"file":"owned-paths.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/owned-paths.ts"],"names":[],"mappings":";;;AAAA,2BAAuD;AACvD,+BAA2C;AAE3C,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;AACvE,MAAM,aAAa,GAAG;IACpB,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IACjF,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;IAC1G;QACE,GAAG,EAAE,sBAAsB;QAC3B,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC7F;CACF,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAY,EAAE;IAC3D,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,OAAO,IAAA,gBAAW,EAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAChD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE1C,IAAI,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAElE,OAAO,CAAC,IAAA,eAAQ,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,UAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAA,WAAI,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAE9E,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC;YAAE,SAAS;QAE1C,KAAK,MAAM,KAAK,IAAI,IAAA,gBAAW,EAAC,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YAEnC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAE7C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAlBW,QAAA,iBAAiB,qBAkB5B"}
1
+ {"version":3,"file":"owned-paths.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/owned-paths.ts"],"names":[],"mappings":";;;AAAA,2BAAuD;AACvD,+BAA2C;AAE3C,kGAAkG;AAClG,6DAA6D;AAC7D,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;AAChG,MAAM,aAAa,GAAG;IACpB,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IACjF,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IACjF,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;IAC1G;QACE,GAAG,EAAE,sBAAsB;QAC3B,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC7F;CACF,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAY,EAAE;IAC3D,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,OAAO,IAAA,gBAAW,EAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAChD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE1C,IAAI,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAElE,OAAO,CAAC,IAAA,eAAQ,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,UAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAA,WAAI,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAE9E,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC;YAAE,SAAS;QAE1C,KAAK,MAAM,KAAK,IAAI,IAAA,gBAAW,EAAC,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YAEnC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAE7C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAlBW,QAAA,iBAAiB,qBAkB5B"}
package/src/lib/plan.d.ts CHANGED
@@ -9,7 +9,11 @@ export type SyncPlan = {
9
9
  from: string;
10
10
  to: string;
11
11
  }[];
12
+ /** Config/repo mismatches that won't fail the run but will silently lose content if ignored. */
13
+ warnings: string[];
12
14
  };
15
+ /** `@AGENTS.md` on its own line (the documented import syntax), or a symlink pointing at it. */
16
+ export declare const claudeMdImportsAgentsMd: (root: string) => boolean;
13
17
  /**
14
18
  * Resolves the full set of files a sync would write, without touching disk — `sync` writes the
15
19
  * result and `check` diffs it.
package/src/lib/plan.js CHANGED
@@ -1,15 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildPlan = void 0;
3
+ exports.buildPlan = exports.claudeMdImportsAgentsMd = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
+ const config_1 = require("./config");
6
7
  const filter_1 = require("./filter");
7
8
  const load_content_1 = require("./load-content");
9
+ const agents_skills_1 = require("./targets/agents-skills");
10
+ const claude_hooks_1 = require("./targets/claude-hooks");
8
11
  const claude_1 = require("./targets/claude");
9
12
  const codex_1 = require("./targets/codex");
10
13
  const copilot_1 = require("./targets/copilot");
11
14
  const cursor_1 = require("./targets/cursor");
12
- const neutral_1 = require("./targets/neutral");
13
15
  const SKILL_LINK_PATTERN = /\{%\s*skill:([a-zA-Z0-9_.-]+)\s*%\}/g;
14
16
  const findDanglingLinks = (items, emittedSkills) => items.flatMap((item) => [...item.body.matchAll(SKILL_LINK_PATTERN)]
15
17
  .map((match) => match[1])
@@ -19,12 +21,63 @@ const readExisting = (root, relativePath) => {
19
21
  const path = (0, path_1.join)(root, relativePath);
20
22
  return (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
21
23
  };
24
+ /** `@AGENTS.md` on its own line (the documented import syntax), or a symlink pointing at it. */
25
+ const claudeMdImportsAgentsMd = (root) => {
26
+ const path = (0, path_1.join)(root, 'CLAUDE.md');
27
+ if (!(0, fs_1.existsSync)(path))
28
+ return false;
29
+ if ((0, fs_1.lstatSync)(path).isSymbolicLink())
30
+ return (0, fs_1.readlinkSync)(path).endsWith('AGENTS.md');
31
+ return /^@AGENTS\.md\s*$/m.test((0, fs_1.readFileSync)(path, 'utf8'));
32
+ };
33
+ exports.claudeMdImportsAgentsMd = claudeMdImportsAgentsMd;
34
+ /**
35
+ * The local file only affects hook runtime, never sync output — so the warnings here are about
36
+ * the mistakes that would otherwise fail silently: a file the hooks can't parse, a key that
37
+ * suggests someone expected sync-time overrides, or a hook name nothing matches.
38
+ */
39
+ const collectLocalConfigWarnings = (root) => {
40
+ const local = (0, config_1.readLocalConfig)(root);
41
+ if (!local.exists)
42
+ return [];
43
+ if (!local.valid) {
44
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} is not a JSON object — hooks ignore it and stay enabled.`];
45
+ }
46
+ const warnings = [];
47
+ if (local.unknownKeys.length > 0) {
48
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file only supports "disableHooks"; it never changes what sync writes.`);
49
+ }
50
+ const disable = local.config.disableHooks;
51
+ if (disable !== undefined && typeof disable !== 'boolean' && !Array.isArray(disable)) {
52
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableHooks" value — use true or an array of hook names; hooks stay enabled.`);
53
+ }
54
+ if (Array.isArray(disable)) {
55
+ const unknown = disable.filter((name) => !(name in claude_hooks_1.CLAUDE_HOOKS));
56
+ if (unknown.length > 0) {
57
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(claude_hooks_1.CLAUDE_HOOKS).join(', ')}.`);
58
+ }
59
+ }
60
+ return warnings;
61
+ };
62
+ const collectWarnings = (config) => {
63
+ const warnings = collectLocalConfigWarnings(config.root);
64
+ if (!config.claudeMdImportsAgentsMd)
65
+ return warnings;
66
+ if (!config.targets.includes('codex')) {
67
+ warnings.push('claudeMdImportsAgentsMd is set but the codex target is off — no AGENTS.md is generated, so Claude gets no rules at all.');
68
+ }
69
+ if (!(0, exports.claudeMdImportsAgentsMd)(config.root)) {
70
+ warnings.push('claudeMdImportsAgentsMd is set but CLAUDE.md does not import AGENTS.md — add a line containing exactly "@AGENTS.md" (or symlink CLAUDE.md to AGENTS.md), or Claude gets no rules at all.');
71
+ }
72
+ return warnings;
73
+ };
22
74
  /**
23
75
  * Resolves the full set of files a sync would write, without touching disk — `sync` writes the
24
76
  * result and `check` diffs it.
25
77
  */
26
78
  const buildPlan = (options) => {
27
79
  const { config, version } = options;
80
+ (0, claude_hooks_1.assertKnownHooks)(config.hooks);
28
81
  const { kept, skipped } = (0, filter_1.filterContent)((0, load_content_1.loadContent)(), config);
29
82
  const skills = kept.filter((item) => item.frontmatter.kind === 'skill');
30
83
  const emittedSkills = new Set(skills.map((item) => item.frontmatter.name));
@@ -34,12 +87,13 @@ const buildPlan = (options) => {
34
87
  emittedSkills,
35
88
  vars: config.vars,
36
89
  version,
90
+ claudeMdImportsAgentsMd: config.claudeMdImportsAgentsMd,
91
+ hooks: config.hooks,
37
92
  };
38
93
  const files = [];
39
- // Codex, Cursor and Copilot all resolve resource files (and, where they have no on-demand
40
- // mechanism, whole skills) out of the neutral tree.
94
+ // Codex, Cursor and Copilot all discover skills from the shared `.agents/skills/` tree.
41
95
  if (config.targets.some((target) => target !== 'claude')) {
42
- files.push(...(0, neutral_1.emitNeutral)(context));
96
+ files.push(...(0, agents_skills_1.emitAgentsSkills)(context));
43
97
  }
44
98
  if (config.targets.includes('claude'))
45
99
  files.push(...(0, claude_1.emitClaude)(context));
@@ -51,7 +105,12 @@ const buildPlan = (options) => {
51
105
  if (config.targets.includes('copilot')) {
52
106
  files.push(...(0, copilot_1.emitCopilot)({ context, existing: readExisting(config.root, copilot_1.COPILOT_FILE) }));
53
107
  }
54
- return { files, skipped, danglingLinks: findDanglingLinks(kept, emittedSkills) };
108
+ files.push(...(0, claude_hooks_1.emitClaudeHooks)({
109
+ context,
110
+ claudeTarget: config.targets.includes('claude'),
111
+ existingSettings: readExisting(config.root, claude_hooks_1.CLAUDE_SETTINGS_FILE),
112
+ }));
113
+ return { files, skipped, danglingLinks: findDanglingLinks(kept, emittedSkills), warnings: collectWarnings(config) };
55
114
  };
56
115
  exports.buildPlan = buildPlan;
57
116
  //# sourceMappingURL=plan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plan.ts"],"names":[],"mappings":"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"}
package/src/lib/sync.js CHANGED
@@ -39,9 +39,12 @@ const describe = (change) => {
39
39
  };
40
40
  const sync = (options) => {
41
41
  const config = (0, config_1.loadConfig)({ root: options.root, targetOverride: options.targets });
42
- const { files, skipped, danglingLinks } = (0, plan_1.buildPlan)({ config, version: options.version });
42
+ const { files, skipped, danglingLinks, warnings } = (0, plan_1.buildPlan)({ config, version: options.version });
43
43
  const changes = diffPlan({ root: options.root, files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
44
44
  console.log(`Targets: ${config.targets.join(', ')}`);
45
+ for (const warning of warnings) {
46
+ console.warn(` warn ${warning}`);
47
+ }
45
48
  for (const entry of skipped) {
46
49
  console.log(` skip ${entry.name} — ${entry.reason}`);
47
50
  }
@@ -75,8 +78,11 @@ const sync = (options) => {
75
78
  exports.sync = sync;
76
79
  const check = (options) => {
77
80
  const config = (0, config_1.loadConfig)({ root: options.root, targetOverride: options.targets });
78
- const { files } = (0, plan_1.buildPlan)({ config, version: options.version });
81
+ const { files, warnings } = (0, plan_1.buildPlan)({ config, version: options.version });
79
82
  const changes = diffPlan({ root: options.root, files, owned: (0, owned_paths_1.collectOwnedPaths)(options.root) });
83
+ for (const warning of warnings) {
84
+ console.warn(` warn ${warning}`);
85
+ }
80
86
  if (changes.length === 0) {
81
87
  console.log('Agent rules are in sync.');
82
88
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { EmitContext, EmittedFile } from './shared';
2
+ /**
3
+ * Skills in the agentskills.io standard layout under `.agents/skills/`, discovered natively by
4
+ * Codex, Cursor, Copilot and VS Code — each tool loads a skill's body on demand from its
5
+ * `description` frontmatter. Claude Code only scans `.claude/skills/`, so the claude target emits
6
+ * its own copies there.
7
+ */
8
+ export declare const emitAgentsSkills: (context: EmitContext) => EmittedFile[];
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitAgentsSkills = void 0;
4
+ const shared_1 = require("./shared");
5
+ /**
6
+ * Skills in the agentskills.io standard layout under `.agents/skills/`, discovered natively by
7
+ * Codex, Cursor, Copilot and VS Code — each tool loads a skill's body on demand from its
8
+ * `description` frontmatter. Claude Code only scans `.claude/skills/`, so the claude target emits
9
+ * its own copies there.
10
+ */
11
+ const emitAgentsSkills = (context) => context.skills.flatMap((item) => (0, shared_1.skillBundle)({
12
+ item,
13
+ context,
14
+ dir: (0, shared_1.agentsSkillDir)(item.frontmatter.name),
15
+ links: (0, shared_1.agentsSkillsLinks)(context),
16
+ }));
17
+ exports.emitAgentsSkills = emitAgentsSkills;
18
+ //# sourceMappingURL=agents-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-skills.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/agents-skills.ts"],"names":[],"mappings":";;;AAAA,qCAAoG;AAEpG;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAAoB,EAAiB,EAAE,CACtE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,IAAA,oBAAW,EAAC;IACV,IAAI;IACJ,OAAO;IACP,GAAG,EAAE,IAAA,uBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC1C,KAAK,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC;CAClC,CAAC,CACH,CAAC;AARS,QAAA,gBAAgB,oBAQzB"}
@@ -0,0 +1,33 @@
1
+ import { EmitContext, EmittedFile } from './shared';
2
+ export declare const CLAUDE_SETTINGS_FILE = ".claude/settings.json";
3
+ type HookDefinition = {
4
+ event: string;
5
+ file: string;
6
+ timeout: number;
7
+ };
8
+ /**
9
+ * Hooks a repo can opt into via the config's `hooks` array. Hooks run arbitrary commands on the
10
+ * developer's machine, so unlike rules and skills they are never emitted by default.
11
+ */
12
+ export declare const CLAUDE_HOOKS: Record<string, HookDefinition>;
13
+ export declare const assertKnownHooks: (hooks: string[]) => void;
14
+ /**
15
+ * Rewrites the generated entries in `.claude/settings.json` declaratively: every entry pointing
16
+ * into `.claude/hooks/ethlete/` is dropped and the currently enabled hooks are re-added, so
17
+ * disabling a hook in the config also unregisters it. Everything else in the file is untouched.
18
+ */
19
+ export declare const mergeClaudeSettings: (options: {
20
+ existing: string;
21
+ hooks: string[];
22
+ }) => string;
23
+ /**
24
+ * The hook scripts plus the settings registration. Runs even when the claude target is off so a
25
+ * repo that drops the target also gets its stale registrations removed — the settings file is
26
+ * only planned when its parsed content actually changes, and an unparseable file is left alone.
27
+ */
28
+ export declare const emitClaudeHooks: (options: {
29
+ context: EmitContext;
30
+ claudeTarget: boolean;
31
+ existingSettings: string;
32
+ }) => EmittedFile[];
33
+ export {};
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitClaudeHooks = exports.mergeClaudeSettings = exports.assertKnownHooks = exports.CLAUDE_HOOKS = exports.CLAUDE_SETTINGS_FILE = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const load_content_1 = require("../load-content");
7
+ exports.CLAUDE_SETTINGS_FILE = '.claude/settings.json';
8
+ const HOOKS_DIR = '.claude/hooks/ethlete';
9
+ /**
10
+ * Hooks a repo can opt into via the config's `hooks` array. Hooks run arbitrary commands on the
11
+ * developer's machine, so unlike rules and skills they are never emitted by default.
12
+ */
13
+ exports.CLAUDE_HOOKS = {
14
+ 'context-warning': { event: 'UserPromptSubmit', file: 'context-warning.py', timeout: 10 },
15
+ };
16
+ const assertKnownHooks = (hooks) => {
17
+ const unknown = hooks.filter((name) => !(name in exports.CLAUDE_HOOKS));
18
+ if (unknown.length > 0) {
19
+ throw new Error(`Unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(exports.CLAUDE_HOOKS).join(', ')}.`);
20
+ }
21
+ };
22
+ exports.assertKnownHooks = assertKnownHooks;
23
+ const commandFor = (file) => `python3 "$CLAUDE_PROJECT_DIR/${HOOKS_DIR}/${file}"`;
24
+ /** `#` comment instead of the HTML banner, placed after the shebang so the file stays runnable. */
25
+ const withBanner = (raw, version) => {
26
+ var _a;
27
+ const banner = `# Generated by @ethlete/agent-rules v${version} — DO NOT EDIT. Run \`npx ethlete-agents sync\`.`;
28
+ const lines = raw.split('\n');
29
+ if ((_a = lines[0]) === null || _a === void 0 ? void 0 : _a.startsWith('#!'))
30
+ return [lines[0], banner, ...lines.slice(1)].join('\n');
31
+ return `${banner}\n${raw}`;
32
+ };
33
+ const isGenerated = (hook) => { var _a; return ((_a = hook.command) !== null && _a !== void 0 ? _a : '').includes(HOOKS_DIR); };
34
+ /**
35
+ * Rewrites the generated entries in `.claude/settings.json` declaratively: every entry pointing
36
+ * into `.claude/hooks/ethlete/` is dropped and the currently enabled hooks are re-added, so
37
+ * disabling a hook in the config also unregisters it. Everything else in the file is untouched.
38
+ */
39
+ const mergeClaudeSettings = (options) => {
40
+ var _a, _b;
41
+ const { existing, hooks } = options;
42
+ const settings = JSON.parse(existing.trim() || '{}');
43
+ const events = Object.assign({}, ((_a = settings.hooks) !== null && _a !== void 0 ? _a : {}));
44
+ for (const [event, groups] of Object.entries(events)) {
45
+ const kept = groups
46
+ .map((group) => { var _a; return (Object.assign(Object.assign({}, group), { hooks: ((_a = group.hooks) !== null && _a !== void 0 ? _a : []).filter((hook) => !isGenerated(hook)) })); })
47
+ .filter((group) => group.hooks.length > 0);
48
+ if (kept.length > 0)
49
+ events[event] = kept;
50
+ else
51
+ delete events[event];
52
+ }
53
+ for (const name of hooks) {
54
+ const definition = exports.CLAUDE_HOOKS[name];
55
+ if (!definition)
56
+ continue;
57
+ events[definition.event] = [
58
+ ...((_b = events[definition.event]) !== null && _b !== void 0 ? _b : []),
59
+ { hooks: [{ type: 'command', command: commandFor(definition.file), timeout: definition.timeout }] },
60
+ ];
61
+ }
62
+ if (Object.keys(events).length > 0)
63
+ settings.hooks = events;
64
+ else
65
+ delete settings.hooks;
66
+ return `${JSON.stringify(settings, null, 2)}\n`;
67
+ };
68
+ exports.mergeClaudeSettings = mergeClaudeSettings;
69
+ /**
70
+ * The hook scripts plus the settings registration. Runs even when the claude target is off so a
71
+ * repo that drops the target also gets its stale registrations removed — the settings file is
72
+ * only planned when its parsed content actually changes, and an unparseable file is left alone.
73
+ */
74
+ const emitClaudeHooks = (options) => {
75
+ const { context, claudeTarget, existingSettings } = options;
76
+ const hooks = claudeTarget ? context.hooks : [];
77
+ const files = [];
78
+ for (const name of hooks) {
79
+ const definition = exports.CLAUDE_HOOKS[name];
80
+ if (!definition)
81
+ continue;
82
+ const raw = (0, fs_1.readFileSync)((0, path_1.join)((0, load_content_1.resolveContentRoot)(), 'hooks', definition.file), 'utf8');
83
+ files.push({ path: `${HOOKS_DIR}/${definition.file}`, contents: withBanner(raw, context.version) });
84
+ }
85
+ try {
86
+ const merged = (0, exports.mergeClaudeSettings)({ existing: existingSettings, hooks });
87
+ if (JSON.stringify(JSON.parse(existingSettings.trim() || '{}')) !== JSON.stringify(JSON.parse(merged))) {
88
+ files.push({ path: exports.CLAUDE_SETTINGS_FILE, contents: merged });
89
+ }
90
+ }
91
+ catch (_a) {
92
+ // Unparseable settings.json — never clobber a file the repo owns.
93
+ }
94
+ return files;
95
+ };
96
+ exports.emitClaudeHooks = emitClaudeHooks;
97
+ //# sourceMappingURL=claude-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude-hooks.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import { EmitContext, EmittedFile } from './shared';
2
2
  /**
3
3
  * Rules land in `.claude/rules/ethlete/` (loaded every session, or only for matching files when
4
4
  * the content declares `paths`); skills land in `.claude/skills/` under an `ethlete-` prefix so a
5
- * generated skill can never collide with one the repo wrote itself.
5
+ * generated skill can never collide with one the repo wrote itself. When the repo's `CLAUDE.md`
6
+ * imports `AGENTS.md`, the rules already reach Claude through the `AGENTS.md` marker block, so the
7
+ * rules directory is skipped entirely rather than loading everything twice.
6
8
  */
7
9
  export declare const emitClaude: (context: EmitContext) => EmittedFile[];
@@ -8,7 +8,9 @@ const quoteList = (values) => values.map((value) => ` - '${value}'`).join('\n')
8
8
  /**
9
9
  * Rules land in `.claude/rules/ethlete/` (loaded every session, or only for matching files when
10
10
  * the content declares `paths`); skills land in `.claude/skills/` under an `ethlete-` prefix so a
11
- * generated skill can never collide with one the repo wrote itself.
11
+ * generated skill can never collide with one the repo wrote itself. When the repo's `CLAUDE.md`
12
+ * imports `AGENTS.md`, the rules already reach Claude through the `AGENTS.md` marker block, so the
13
+ * rules directory is skipped entirely rather than loading everything twice.
12
14
  */
13
15
  const emitClaude = (context) => {
14
16
  const banner = (0, render_1.buildBanner)(context.version);
@@ -18,27 +20,18 @@ const emitClaude = (context) => {
18
20
  resource: (target) => `\`${target.fileName}\` (bundled next to this skill)`,
19
21
  });
20
22
  const files = [];
21
- for (const item of context.rules) {
22
- const { name, paths } = item.frontmatter;
23
- const frontmatter = paths.length > 0 ? `---\npaths:\n${quoteList(paths)}\n---` : '';
24
- files.push({
25
- path: `.claude/rules/ethlete/${name}.md`,
26
- contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
27
- });
23
+ if (!context.claudeMdImportsAgentsMd) {
24
+ for (const item of context.rules) {
25
+ const { name, paths } = item.frontmatter;
26
+ const frontmatter = paths.length > 0 ? `---\npaths:\n${quoteList(paths)}\n---` : '';
27
+ files.push({
28
+ path: `.claude/rules/ethlete/${name}.md`,
29
+ contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
30
+ });
31
+ }
28
32
  }
29
33
  for (const item of context.skills) {
30
- const { name } = item.frontmatter;
31
- const frontmatter = [
32
- '---',
33
- `name: ethlete-${name}`,
34
- `description: ${(0, shared_1.yamlString)((0, shared_1.description)({ item, context }))}`,
35
- '---',
36
- ].join('\n');
37
- files.push({
38
- path: `${skillDir(name)}/SKILL.md`,
39
- contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
40
- });
41
- files.push(...(0, shared_1.resourceFiles)({ item, context, pathFor: (fileName) => `${skillDir(name)}/${fileName}` }));
34
+ files.push(...(0, shared_1.skillBundle)({ item, context, dir: skillDir(item.frontmatter.name), links }));
42
35
  }
43
36
  return files;
44
37
  };