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

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 (134) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/README.md +363 -16
  3. package/content/git-hooks/post-checkout.sh +10 -0
  4. package/content/git-hooks/pre-push.sh +5 -0
  5. package/content/hooks/context-warning.py +430 -0
  6. package/content/output-styles/ste-clarity.md +131 -0
  7. package/content/rules/comments.md +50 -20
  8. package/content/skills/angular-patterns/SKILL.md +1 -1
  9. package/content/skills/api-source/SKILL.md +118 -0
  10. package/content/skills/figma-export/SKILL.md +193 -0
  11. package/content/skills/figma-export/dump-figma-layers.py +83 -0
  12. package/content/skills/figma-export/dump-figma-svg.py +235 -0
  13. package/content/skills/figma-export/measure-template.mjs +87 -0
  14. package/content/skills/git-commit/SKILL.md +6 -7
  15. package/content/skills/git-flow/SKILL.md +87 -0
  16. package/content/skills/handoff/SKILL.md +4 -0
  17. package/content/skills/query/SKILL.md +23 -13
  18. package/content/skills/rxjs-signals/SKILL.md +1 -1
  19. package/content/skills/sdk-docs/SKILL.md +10 -2
  20. package/content/skills/sdk-local-build/SKILL.md +115 -0
  21. package/content/skills/sdk-source/SKILL.md +133 -0
  22. package/content/skills/styleguide/STYLEGUIDE.md +2 -2
  23. package/content/skills/theming/SKILL.md +1 -1
  24. package/content/skills/timetrack/SKILL.md +66 -0
  25. package/package.json +12 -1
  26. package/src/index.js +35 -14
  27. package/src/index.js.map +1 -1
  28. package/src/lib/commitlint.d.ts +10 -0
  29. package/src/lib/commitlint.js +51 -0
  30. package/src/lib/commitlint.js.map +1 -0
  31. package/src/lib/config.d.ts +64 -2
  32. package/src/lib/config.js +54 -9
  33. package/src/lib/config.js.map +1 -1
  34. package/src/lib/git-flow/build.d.ts +35 -0
  35. package/src/lib/git-flow/build.js +24 -0
  36. package/src/lib/git-flow/build.js.map +1 -0
  37. package/src/lib/git-flow/config.d.ts +59 -0
  38. package/src/lib/git-flow/config.js +50 -0
  39. package/src/lib/git-flow/config.js.map +1 -0
  40. package/src/lib/git-flow/index.d.ts +6 -0
  41. package/src/lib/git-flow/index.js +10 -0
  42. package/src/lib/git-flow/index.js.map +1 -0
  43. package/src/lib/git-flow/parse.d.ts +49 -0
  44. package/src/lib/git-flow/parse.js +274 -0
  45. package/src/lib/git-flow/parse.js.map +1 -0
  46. package/src/lib/git-flow/rename.d.ts +24 -0
  47. package/src/lib/git-flow/rename.js +70 -0
  48. package/src/lib/git-flow/rename.js.map +1 -0
  49. package/src/lib/git-flow/start.d.ts +49 -0
  50. package/src/lib/git-flow/start.js +57 -0
  51. package/src/lib/git-flow/start.js.map +1 -0
  52. package/src/lib/git-flow/validate.d.ts +34 -0
  53. package/src/lib/git-flow/validate.js +72 -0
  54. package/src/lib/git-flow/validate.js.map +1 -0
  55. package/src/lib/git-flow-command.d.ts +4 -0
  56. package/src/lib/git-flow-command.js +157 -0
  57. package/src/lib/git-flow-command.js.map +1 -0
  58. package/src/lib/git-flow-repair.d.ts +17 -0
  59. package/src/lib/git-flow-repair.js +146 -0
  60. package/src/lib/git-flow-repair.js.map +1 -0
  61. package/src/lib/git-flow-start.d.ts +20 -0
  62. package/src/lib/git-flow-start.js +132 -0
  63. package/src/lib/git-flow-start.js.map +1 -0
  64. package/src/lib/git.d.ts +27 -0
  65. package/src/lib/git.js +49 -0
  66. package/src/lib/git.js.map +1 -0
  67. package/src/lib/gitlab.d.ts +35 -0
  68. package/src/lib/gitlab.js +98 -0
  69. package/src/lib/gitlab.js.map +1 -0
  70. package/src/lib/index.d.ts +2 -0
  71. package/src/lib/index.js +2 -0
  72. package/src/lib/index.js.map +1 -1
  73. package/src/lib/migrate.d.ts +6 -0
  74. package/src/lib/migrate.js +155 -0
  75. package/src/lib/migrate.js.map +1 -0
  76. package/src/lib/output-style-command.d.ts +3 -0
  77. package/src/lib/output-style-command.js +69 -0
  78. package/src/lib/output-style-command.js.map +1 -0
  79. package/src/lib/output-style.d.ts +38 -0
  80. package/src/lib/output-style.js +126 -0
  81. package/src/lib/output-style.js.map +1 -0
  82. package/src/lib/owned-paths.js +22 -1
  83. package/src/lib/owned-paths.js.map +1 -1
  84. package/src/lib/plan.d.ts +4 -1
  85. package/src/lib/plan.js +141 -8
  86. package/src/lib/plan.js.map +1 -1
  87. package/src/lib/prompt.d.ts +8 -0
  88. package/src/lib/prompt.js +27 -0
  89. package/src/lib/prompt.js.map +1 -0
  90. package/src/lib/render.d.ts +20 -2
  91. package/src/lib/render.js +31 -8
  92. package/src/lib/render.js.map +1 -1
  93. package/src/lib/sync.d.ts +0 -1
  94. package/src/lib/sync.js +8 -2
  95. package/src/lib/sync.js.map +1 -1
  96. package/src/lib/targets/agents-skills.d.ts +8 -0
  97. package/src/lib/targets/agents-skills.js +18 -0
  98. package/src/lib/targets/agents-skills.js.map +1 -0
  99. package/src/lib/targets/claude-hooks.d.ts +11 -0
  100. package/src/lib/targets/claude-hooks.js +28 -0
  101. package/src/lib/targets/claude-hooks.js.map +1 -0
  102. package/src/lib/targets/claude.d.ts +3 -1
  103. package/src/lib/targets/claude.js +14 -21
  104. package/src/lib/targets/claude.js.map +1 -1
  105. package/src/lib/targets/codex-hooks.d.ts +12 -0
  106. package/src/lib/targets/codex-hooks.js +33 -0
  107. package/src/lib/targets/codex-hooks.js.map +1 -0
  108. package/src/lib/targets/codex.d.ts +5 -3
  109. package/src/lib/targets/codex.js +9 -8
  110. package/src/lib/targets/codex.js.map +1 -1
  111. package/src/lib/targets/copilot.d.ts +3 -3
  112. package/src/lib/targets/copilot.js +6 -29
  113. package/src/lib/targets/copilot.js.map +1 -1
  114. package/src/lib/targets/cursor.d.ts +3 -3
  115. package/src/lib/targets/cursor.js +7 -12
  116. package/src/lib/targets/cursor.js.map +1 -1
  117. package/src/lib/targets/git-hooks.d.ts +24 -0
  118. package/src/lib/targets/git-hooks.js +70 -0
  119. package/src/lib/targets/git-hooks.js.map +1 -0
  120. package/src/lib/targets/hooks-shared.d.ts +37 -0
  121. package/src/lib/targets/hooks-shared.js +95 -0
  122. package/src/lib/targets/hooks-shared.js.map +1 -0
  123. package/src/lib/targets/shared.d.ts +22 -13
  124. package/src/lib/targets/shared.js +32 -15
  125. package/src/lib/targets/shared.js.map +1 -1
  126. package/src/lib/timetrack-command.d.ts +11 -0
  127. package/src/lib/timetrack-command.js +199 -0
  128. package/src/lib/timetrack-command.js.map +1 -0
  129. package/src/lib/timetrack.d.ts +86 -0
  130. package/src/lib/timetrack.js +112 -0
  131. package/src/lib/timetrack.js.map +1 -0
  132. package/src/lib/targets/neutral.d.ts +0 -8
  133. package/src/lib/targets/neutral.js +0 -29
  134. package/src/lib/targets/neutral.js.map +0 -1
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyOutputStylePlan = exports.planOutputStyle = exports.availableOutputStyles = exports.resolveClaudeConfigDir = exports.DEFAULT_OUTPUT_STYLE = void 0;
4
+ const fs_1 = require("fs");
5
+ const os_1 = require("os");
6
+ const path_1 = require("path");
7
+ const load_content_1 = require("./load-content");
8
+ exports.DEFAULT_OUTPUT_STYLE = 'ste-clarity';
9
+ const CONTENT_DIR = 'output-styles';
10
+ const MARKER_PREFIX = '<!-- @ethlete/agent-rules output style';
11
+ const marker = (name) => `${MARKER_PREFIX} "${name}" — installed by \`ethlete-agents output-style\`. Re-run it to update; edits here are overwritten. -->`;
12
+ /** Claude Code reads `~/.claude`, or `CLAUDE_CONFIG_DIR` when it is set; an explicit path wins over both. */
13
+ const resolveClaudeConfigDir = (override) => { var _a; return (override === null || override === void 0 ? void 0 : override.trim()) || ((_a = process.env['CLAUDE_CONFIG_DIR']) === null || _a === void 0 ? void 0 : _a.trim()) || (0, path_1.join)((0, os_1.homedir)(), '.claude'); };
14
+ exports.resolveClaudeConfigDir = resolveClaudeConfigDir;
15
+ const availableOutputStyles = (contentRoot = (0, load_content_1.resolveContentRoot)()) => {
16
+ const dir = (0, path_1.join)(contentRoot, CONTENT_DIR);
17
+ if (!(0, fs_1.existsSync)(dir))
18
+ return [];
19
+ return (0, fs_1.readdirSync)(dir)
20
+ .filter((entry) => entry.endsWith('.md'))
21
+ .map((entry) => entry.slice(0, -'.md'.length))
22
+ .sort();
23
+ };
24
+ exports.availableOutputStyles = availableOutputStyles;
25
+ const FRONTMATTER = /^(---\n[\s\S]*?\n---)\n?([\s\S]*)$/;
26
+ /**
27
+ * The marker sits after the frontmatter, never before it: Claude Code only reads a style's `name`
28
+ * and `description` when the file opens with the fence.
29
+ */
30
+ const withMarker = (raw, name) => {
31
+ var _a;
32
+ const source = raw.replace(/\r\n/g, '\n').trim();
33
+ const parts = FRONTMATTER.exec(source);
34
+ if (!parts)
35
+ return `${marker(name)}\n\n${source}\n`;
36
+ return `${parts[1]}\n\n${marker(name)}\n\n${((_a = parts[2]) !== null && _a !== void 0 ? _a : '').trim()}\n`;
37
+ };
38
+ /**
39
+ * Two files count as the same style when they hold the same text in any layout, so a copy that
40
+ * predates the marker is still recognised as this command's own. Whitespace and the width of a
41
+ * table's separator row are both layout: Prettier pads both, and neither changes what Claude reads.
42
+ */
43
+ const normalize = (contents) => contents
44
+ .split('\n')
45
+ .filter((line) => !line.startsWith(MARKER_PREFIX))
46
+ .join(' ')
47
+ .replace(/-{3,}/g, '---')
48
+ .replace(/\s+/g, ' ')
49
+ .trim();
50
+ const readShippedStyle = (name, contentRoot) => {
51
+ const path = (0, path_1.join)(contentRoot, CONTENT_DIR, `${name}.md`);
52
+ if (!(0, fs_1.existsSync)(path)) {
53
+ const known = (0, exports.availableOutputStyles)(contentRoot);
54
+ throw new Error(`Unknown output style "${name}". This package ships: ${known.join(', ') || 'none'}.`);
55
+ }
56
+ return (0, fs_1.readFileSync)(path, 'utf8');
57
+ };
58
+ const readSettings = (path) => {
59
+ const raw = (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
60
+ try {
61
+ return JSON.parse(raw.trim() || '{}');
62
+ }
63
+ catch (_a) {
64
+ throw new Error(`${path} is not valid JSON. Fix the file, then run this again.`);
65
+ }
66
+ };
67
+ const withOutputStyle = (settings, name) => {
68
+ const next = Object.assign({}, settings);
69
+ if (name)
70
+ next.outputStyle = name;
71
+ else
72
+ delete next.outputStyle;
73
+ return `${JSON.stringify(next, null, 2)}\n`;
74
+ };
75
+ /**
76
+ * What an install (or a `remove`) would write into Claude Code's user config, without touching
77
+ * disk. A style file that someone else wrote is reported as a conflict rather than overwritten -
78
+ * the name is a plain file name, so a hand-written style can carry it.
79
+ */
80
+ const planOutputStyle = (options = {}) => {
81
+ var _a, _b;
82
+ const name = ((_a = options.name) === null || _a === void 0 ? void 0 : _a.trim()) || exports.DEFAULT_OUTPUT_STYLE;
83
+ const configDir = (0, exports.resolveClaudeConfigDir)(options.configDir);
84
+ const stylePath = (0, path_1.join)(configDir, CONTENT_DIR, `${name}.md`);
85
+ const settingsPath = (0, path_1.join)(configDir, 'settings.json');
86
+ const settings = readSettings(settingsPath);
87
+ const activeStyle = typeof settings.outputStyle === 'string' ? settings.outputStyle : null;
88
+ const installed = (0, fs_1.existsSync)(stylePath) ? (0, fs_1.readFileSync)(stylePath, 'utf8') : null;
89
+ const shipped = withMarker(readShippedStyle(name, (_b = options.contentRoot) !== null && _b !== void 0 ? _b : (0, load_content_1.resolveContentRoot)()), name);
90
+ const ours = installed === null || installed.includes(MARKER_PREFIX) || normalize(installed) === normalize(shipped);
91
+ const plan = { name, configDir, stylePath, settingsPath, activeStyle };
92
+ if (!ours && !options.force) {
93
+ const verb = options.remove ? 'delete' : 'overwrite';
94
+ return Object.assign(Object.assign({}, plan), { files: [], conflict: `${stylePath} was not written by this command. Pass --force to ${verb} it, or rename your own style.` });
95
+ }
96
+ const files = [];
97
+ const settingsAction = (0, fs_1.existsSync)(settingsPath) ? 'update' : 'create';
98
+ if (options.remove) {
99
+ if (installed !== null)
100
+ files.push({ path: stylePath, action: 'remove', contents: null });
101
+ if (activeStyle === name) {
102
+ files.push({ path: settingsPath, action: settingsAction, contents: withOutputStyle(settings, null) });
103
+ }
104
+ return Object.assign(Object.assign({}, plan), { files, conflict: null });
105
+ }
106
+ if (installed !== shipped) {
107
+ files.push({ path: stylePath, action: installed === null ? 'create' : 'update', contents: shipped });
108
+ }
109
+ if (options.activate !== false && activeStyle !== name) {
110
+ files.push({ path: settingsPath, action: settingsAction, contents: withOutputStyle(settings, name) });
111
+ }
112
+ return Object.assign(Object.assign({}, plan), { files, conflict: null });
113
+ };
114
+ exports.planOutputStyle = planOutputStyle;
115
+ const applyOutputStylePlan = (plan) => {
116
+ for (const file of plan.files) {
117
+ if (file.contents === null) {
118
+ (0, fs_1.rmSync)(file.path, { force: true });
119
+ continue;
120
+ }
121
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(file.path), { recursive: true });
122
+ (0, fs_1.writeFileSync)(file.path, file.contents, 'utf8');
123
+ }
124
+ };
125
+ exports.applyOutputStylePlan = applyOutputStylePlan;
126
+ //# sourceMappingURL=output-style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-style.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/output-style.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', '.codex/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
  {
@@ -12,6 +15,23 @@ const OWNED_PARENTS = [
12
15
  match: (entry) => entry.startsWith('ethlete-') && entry.endsWith('.instructions.md'),
13
16
  },
14
17
  ];
18
+ /**
19
+ * Files that exist only to register hooks: once the last generated entry is removed the merge
20
+ * leaves `{}` behind, which is ours to clean up. Any hand-written entry keeps the file non-empty
21
+ * and therefore unowned.
22
+ */
23
+ const OWNED_WHEN_EMPTY = ['.codex/hooks.json'];
24
+ const isEmptyObject = (absolute) => {
25
+ if (!(0, fs_1.existsSync)(absolute))
26
+ return false;
27
+ try {
28
+ const parsed = JSON.parse((0, fs_1.readFileSync)(absolute, 'utf8'));
29
+ return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) && Object.keys(parsed).length === 0;
30
+ }
31
+ catch (_a) {
32
+ return false;
33
+ }
34
+ };
15
35
  const walk = (root, absoluteDir) => {
16
36
  if (!(0, fs_1.existsSync)(absoluteDir))
17
37
  return [];
@@ -41,6 +61,7 @@ const collectOwnedPaths = (root) => {
41
61
  owned.push(...((0, fs_1.statSync)(absolute).isDirectory() ? walk(root, absolute) : [`${parent.dir}/${entry}`]));
42
62
  }
43
63
  }
64
+ owned.push(...OWNED_WHEN_EMPTY.filter((path) => isEmptyObject((0, path_1.join)(root, path))));
44
65
  return owned;
45
66
  };
46
67
  exports.collectOwnedPaths = collectOwnedPaths;
@@ -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":"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"}
package/src/lib/plan.d.ts CHANGED
@@ -9,12 +9,15 @@ 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.
16
20
  */
17
21
  export declare const buildPlan: (options: {
18
22
  config: SyncConfig;
19
- version: string;
20
23
  }) => SyncPlan;
package/src/lib/plan.js CHANGED
@@ -1,15 +1,20 @@
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");
13
+ const codex_hooks_1 = require("./targets/codex-hooks");
14
+ const git_hooks_1 = require("./targets/git-hooks");
15
+ const hooks_shared_1 = require("./targets/hooks-shared");
10
16
  const copilot_1 = require("./targets/copilot");
11
17
  const cursor_1 = require("./targets/cursor");
12
- const neutral_1 = require("./targets/neutral");
13
18
  const SKILL_LINK_PATTERN = /\{%\s*skill:([a-zA-Z0-9_.-]+)\s*%\}/g;
14
19
  const findDanglingLinks = (items, emittedSkills) => items.flatMap((item) => [...item.body.matchAll(SKILL_LINK_PATTERN)]
15
20
  .map((match) => match[1])
@@ -19,12 +24,127 @@ const readExisting = (root, relativePath) => {
19
24
  const path = (0, path_1.join)(root, relativePath);
20
25
  return (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
21
26
  };
27
+ /** `@AGENTS.md` on its own line (the documented import syntax), or a symlink pointing at it. */
28
+ const claudeMdImportsAgentsMd = (root) => {
29
+ const path = (0, path_1.join)(root, 'CLAUDE.md');
30
+ if (!(0, fs_1.existsSync)(path))
31
+ return false;
32
+ if ((0, fs_1.lstatSync)(path).isSymbolicLink())
33
+ return (0, fs_1.readlinkSync)(path).endsWith('AGENTS.md');
34
+ return /^@AGENTS\.md\s*$/m.test((0, fs_1.readFileSync)(path, 'utf8'));
35
+ };
36
+ exports.claudeMdImportsAgentsMd = claudeMdImportsAgentsMd;
37
+ /** Marks a directory as an `ethlete-sdk` checkout rather than some other folder. */
38
+ const SDK_CHECKOUT_MARKERS = ['libs/components', 'libs/core', 'libs/agent-rules'];
39
+ const describeSdkSourcePath = (options) => {
40
+ const { root, value } = options;
41
+ if (value === undefined)
42
+ return [];
43
+ if (typeof value !== 'string' || value.trim().length === 0) {
44
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "sdkSourcePath" — use a path to an ethlete-sdk checkout.`];
45
+ }
46
+ const absolute = (0, path_1.resolve)(root, value);
47
+ if (!(0, fs_1.existsSync)(absolute)) {
48
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "sdkSourcePath" at ${absolute}, which does not exist.`];
49
+ }
50
+ if (SDK_CHECKOUT_MARKERS.some((marker) => !(0, fs_1.existsSync)((0, path_1.join)(absolute, marker)))) {
51
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "sdkSourcePath" at ${absolute}, which is not an ethlete-sdk checkout.`];
52
+ }
53
+ return [];
54
+ };
55
+ /**
56
+ * An API repo can be any stack, so there is no marker to check the way an SDK checkout has one —
57
+ * only that every entry names an app and points at a directory that is there.
58
+ */
59
+ const describeApiRepoPaths = (options) => {
60
+ const { root, value } = options;
61
+ if (value === undefined)
62
+ return [];
63
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
64
+ return [
65
+ `${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "apiRepoPaths" value — use an object mapping an app name to its API repo path.`,
66
+ ];
67
+ }
68
+ return Object.entries(value).flatMap(([app, path]) => {
69
+ if (typeof path !== 'string' || path.trim().length === 0) {
70
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "apiRepoPaths.${app}" value — use a path to the API repo.`];
71
+ }
72
+ const absolute = (0, path_1.resolve)(root, path);
73
+ if (!(0, fs_1.existsSync)(absolute)) {
74
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "apiRepoPaths.${app}" at ${absolute}, which does not exist.`];
75
+ }
76
+ if (!(0, fs_1.statSync)(absolute).isDirectory()) {
77
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "apiRepoPaths.${app}" at ${absolute}, which is not a directory.`];
78
+ }
79
+ return [];
80
+ });
81
+ };
82
+ /**
83
+ * The local file only affects runtime behavior, never sync output — so the warnings here are about
84
+ * the mistakes that would otherwise fail silently: a file the hooks can't parse, a key that
85
+ * suggests someone expected sync-time overrides, a hook name nothing matches, or a checkout path
86
+ * that no longer exists (the skills reading it would just report the checkout as missing).
87
+ */
88
+ const collectLocalConfigWarnings = (root) => {
89
+ const local = (0, config_1.readLocalConfig)(root);
90
+ if (!local.exists)
91
+ return [];
92
+ if (!local.valid) {
93
+ return [`${config_1.LOCAL_CONFIG_FILE_NAME} is not a JSON object — hooks ignore it and stay enabled.`];
94
+ }
95
+ const warnings = [];
96
+ if (local.unknownKeys.length > 0) {
97
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports "disableHooks", "disableAutoHandoffSave", "sdkSourcePath", "apiRepoPaths" and "jira"; it never changes what sync writes.`);
98
+ }
99
+ warnings.push(...describeSdkSourcePath({ root, value: local.config.sdkSourcePath }));
100
+ warnings.push(...describeApiRepoPaths({ root, value: local.config.apiRepoPaths }));
101
+ const disable = local.config.disableHooks;
102
+ if (disable !== undefined && typeof disable !== 'boolean' && !Array.isArray(disable)) {
103
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableHooks" value — use true or an array of hook names; hooks stay enabled.`);
104
+ }
105
+ if (Array.isArray(disable)) {
106
+ const unknown = disable.filter((name) => !(name in hooks_shared_1.KNOWN_HOOKS));
107
+ if (unknown.length > 0) {
108
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(hooks_shared_1.KNOWN_HOOKS).join(', ')}.`);
109
+ }
110
+ }
111
+ const disableAutoHandoffSave = local.config.disableAutoHandoffSave;
112
+ if (disableAutoHandoffSave !== undefined && typeof disableAutoHandoffSave !== 'boolean') {
113
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableAutoHandoffSave" value — use true or false.`);
114
+ }
115
+ return warnings;
116
+ };
117
+ /**
118
+ * Only `.husky/` is written into, never `.git/hooks/`: the generated files are committed and CI's
119
+ * `check` diffs them, so a hook that lives outside the working tree could never be in sync.
120
+ */
121
+ const collectGitHookWarnings = (config) => {
122
+ if (config.gitHooks.length === 0 || (0, fs_1.existsSync)((0, path_1.join)(config.root, git_hooks_1.HUSKY_DIR)))
123
+ return [];
124
+ return [
125
+ `gitHooks is set to ${config.gitHooks.join(', ')} but there is no ${git_hooks_1.HUSKY_DIR}/ directory — nothing was written. Install husky, or run \`npx ethlete-agents git-flow check\` from your own hooks.`,
126
+ ];
127
+ };
128
+ const collectWarnings = (config) => {
129
+ const warnings = [...collectLocalConfigWarnings(config.root), ...collectGitHookWarnings(config)];
130
+ if (!config.claudeMdImportsAgentsMd)
131
+ return warnings;
132
+ if (!config.targets.includes('codex')) {
133
+ warnings.push('claudeMdImportsAgentsMd is set but the codex target is off — no AGENTS.md is generated, so Claude gets no rules at all.');
134
+ }
135
+ if (!(0, exports.claudeMdImportsAgentsMd)(config.root)) {
136
+ 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.');
137
+ }
138
+ return warnings;
139
+ };
22
140
  /**
23
141
  * Resolves the full set of files a sync would write, without touching disk — `sync` writes the
24
142
  * result and `check` diffs it.
25
143
  */
26
144
  const buildPlan = (options) => {
27
- const { config, version } = options;
145
+ const { config } = options;
146
+ (0, hooks_shared_1.assertKnownHooks)(config.hooks);
147
+ (0, git_hooks_1.assertKnownGitHooks)(config.gitHooks);
28
148
  const { kept, skipped } = (0, filter_1.filterContent)((0, load_content_1.loadContent)(), config);
29
149
  const skills = kept.filter((item) => item.frontmatter.kind === 'skill');
30
150
  const emittedSkills = new Set(skills.map((item) => item.frontmatter.name));
@@ -33,13 +153,13 @@ const buildPlan = (options) => {
33
153
  skills,
34
154
  emittedSkills,
35
155
  vars: config.vars,
36
- version,
156
+ claudeMdImportsAgentsMd: config.claudeMdImportsAgentsMd,
157
+ hooks: config.hooks,
37
158
  };
38
159
  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.
160
+ // Codex, Cursor and Copilot all discover skills from the shared `.agents/skills/` tree.
41
161
  if (config.targets.some((target) => target !== 'claude')) {
42
- files.push(...(0, neutral_1.emitNeutral)(context));
162
+ files.push(...(0, agents_skills_1.emitAgentsSkills)(context));
43
163
  }
44
164
  if (config.targets.includes('claude'))
45
165
  files.push(...(0, claude_1.emitClaude)(context));
@@ -51,7 +171,20 @@ const buildPlan = (options) => {
51
171
  if (config.targets.includes('copilot')) {
52
172
  files.push(...(0, copilot_1.emitCopilot)({ context, existing: readExisting(config.root, copilot_1.COPILOT_FILE) }));
53
173
  }
54
- return { files, skipped, danglingLinks: findDanglingLinks(kept, emittedSkills) };
174
+ files.push(...(0, claude_hooks_1.emitClaudeHooks)({
175
+ context,
176
+ claudeTarget: config.targets.includes('claude'),
177
+ existingSettings: readExisting(config.root, claude_hooks_1.CLAUDE_SETTINGS_FILE),
178
+ }), ...(0, codex_hooks_1.emitCodexHooks)({
179
+ context,
180
+ codexTarget: config.targets.includes('codex'),
181
+ existingHooks: readExisting(config.root, codex_hooks_1.CODEX_HOOKS_FILE),
182
+ }), ...(0, git_hooks_1.emitGitHooks)({
183
+ gitHooks: config.gitHooks,
184
+ huskyExists: (0, fs_1.existsSync)((0, path_1.join)(config.root, git_hooks_1.HUSKY_DIR)),
185
+ existing: Object.fromEntries(Object.keys(git_hooks_1.KNOWN_GIT_HOOKS).map((name) => [name, readExisting(config.root, (0, git_hooks_1.huskyHookPath)(name))])),
186
+ }));
187
+ return { files, skipped, danglingLinks: findDanglingLinks(kept, emittedSkills), warnings: collectWarnings(config) };
55
188
  };
56
189
  exports.buildPlan = buildPlan;
57
190
  //# 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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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Without a TTY there is nobody to ask, so an unattended run must pass `--yes` explicitly rather
3
+ * than have silence read as consent.
4
+ */
5
+ export declare const confirm: (options: {
6
+ question: string;
7
+ assumeYes: boolean;
8
+ }) => Promise<boolean>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.confirm = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const promises_1 = require("readline/promises");
6
+ /**
7
+ * Without a TTY there is nobody to ask, so an unattended run must pass `--yes` explicitly rather
8
+ * than have silence read as consent.
9
+ */
10
+ const confirm = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
11
+ if (options.assumeYes)
12
+ return true;
13
+ if (!process.stdin.isTTY) {
14
+ console.error('Nothing to prompt on (no TTY). Re-run with --yes to proceed unattended.');
15
+ return false;
16
+ }
17
+ const readline = (0, promises_1.createInterface)({ input: process.stdin, output: process.stdout });
18
+ try {
19
+ const answer = yield readline.question(`${options.question} [y/N] `);
20
+ return /^y(es)?$/i.test(answer.trim());
21
+ }
22
+ finally {
23
+ readline.close();
24
+ }
25
+ });
26
+ exports.confirm = confirm;
27
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/prompt.ts"],"names":[],"mappings":";;;;AAAA,gDAAoD;AAEpD;;;GAGG;AACI,MAAM,OAAO,GAAG,CAAO,OAAiD,EAAE,EAAE;IACjF,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAEzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,SAAS,CAAC,CAAC;QAErE,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC,CAAA,CAAC;AAlBW,QAAA,OAAO,WAkBlB"}
@@ -13,7 +13,14 @@ export type LinkResolver = {
13
13
  };
14
14
  export declare const START_MARKER = "<!-- ethlete:agent-rules:start -->";
15
15
  export declare const END_MARKER = "<!-- ethlete:agent-rules:end -->";
16
- export declare const buildBanner: (version: string) => string;
16
+ /**
17
+ * Never interpolate the package version here. `check` diffs whole file contents, so a version in
18
+ * the banner puts every generated file out of sync on a release bump that changed no content —
19
+ * turning each release into a repo-wide re-sync commit and a red CI in the meantime.
20
+ */
21
+ export declare const BANNER = "<!-- Generated by @ethlete/agent-rules \u2014 DO NOT EDIT. Run `npx ethlete-agents sync`. -->";
22
+ /** `#` comment form for generated scripts, which must stay runnable. See {@link BANNER}. */
23
+ export declare const SHELL_BANNER = "# Generated by @ethlete/agent-rules \u2014 DO NOT EDIT. Run `npx ethlete-agents sync`.";
17
24
  export declare const renderBody: (options: {
18
25
  item: ContentItem;
19
26
  vars: Record<string, string | string[]>;
@@ -31,9 +38,20 @@ export declare const renderDescription: (options: {
31
38
  }) => string;
32
39
  /**
33
40
  * Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
34
- * A file without markers gets the block appended.
41
+ * A file without markers gets the block appended. Shell files pass their own `#` markers.
35
42
  */
36
43
  export declare const replaceMarkedBlock: (options: {
37
44
  existing: string;
38
45
  block: string;
46
+ startMarker?: string;
47
+ endMarker?: string;
48
+ }) => string;
49
+ /**
50
+ * Takes the block back out, so switching a generated block off in the config removes it instead of
51
+ * leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
52
+ */
53
+ export declare const removeMarkedBlock: (options: {
54
+ existing: string;
55
+ startMarker: string;
56
+ endMarker: string;
39
57
  }) => string;
package/src/lib/render.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars = exports.renderBody = exports.buildBanner = exports.END_MARKER = exports.START_MARKER = void 0;
3
+ exports.removeMarkedBlock = exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars = exports.renderBody = exports.SHELL_BANNER = exports.BANNER = exports.END_MARKER = exports.START_MARKER = void 0;
4
4
  /**
5
5
  * `{% … %}`, not `{{ … }}`: content bodies routinely quote Angular templates, and an example
6
6
  * containing `{{ count() }}` must not be mistaken for a template token.
@@ -8,8 +8,14 @@ exports.replaceMarkedBlock = exports.renderDescription = exports.substituteVars
8
8
  const TOKEN_PATTERN = /\{%\s*([a-zA-Z0-9_:.-]+)\s*%\}/g;
9
9
  exports.START_MARKER = '<!-- ethlete:agent-rules:start -->';
10
10
  exports.END_MARKER = '<!-- ethlete:agent-rules:end -->';
11
- const buildBanner = (version) => `<!-- Generated by @ethlete/agent-rules v${version} — DO NOT EDIT. Run \`npx ethlete-agents sync\`. -->`;
12
- exports.buildBanner = buildBanner;
11
+ /**
12
+ * Never interpolate the package version here. `check` diffs whole file contents, so a version in
13
+ * the banner puts every generated file out of sync on a release bump that changed no content —
14
+ * turning each release into a repo-wide re-sync commit and a red CI in the meantime.
15
+ */
16
+ exports.BANNER = '<!-- Generated by @ethlete/agent-rules — DO NOT EDIT. Run `npx ethlete-agents sync`. -->';
17
+ /** `#` comment form for generated scripts, which must stay runnable. See {@link BANNER}. */
18
+ exports.SHELL_BANNER = '# Generated by @ethlete/agent-rules — DO NOT EDIT. Run `npx ethlete-agents sync`.';
13
19
  const renderValue = (value) => Array.isArray(value) ? value.map((entry) => `\`${entry}\``).join(', ') : value;
14
20
  const renderBody = (options) => {
15
21
  const { item, vars, links } = options;
@@ -56,18 +62,35 @@ const renderDescription = (options) => (0, exports.substituteVars)({
56
62
  exports.renderDescription = renderDescription;
57
63
  /**
58
64
  * Rewrites the block between the markers, leaving everything a repo wrote around it untouched.
59
- * A file without markers gets the block appended.
65
+ * A file without markers gets the block appended. Shell files pass their own `#` markers.
60
66
  */
61
67
  const replaceMarkedBlock = (options) => {
68
+ var _a, _b;
62
69
  const { existing, block } = options;
63
- const wrapped = `${exports.START_MARKER}\n${block}\n${exports.END_MARKER}`;
64
- const start = existing.indexOf(exports.START_MARKER);
65
- const end = existing.indexOf(exports.END_MARKER);
70
+ const startMarker = (_a = options.startMarker) !== null && _a !== void 0 ? _a : exports.START_MARKER;
71
+ const endMarker = (_b = options.endMarker) !== null && _b !== void 0 ? _b : exports.END_MARKER;
72
+ const wrapped = `${startMarker}\n${block}\n${endMarker}`;
73
+ const start = existing.indexOf(startMarker);
74
+ const end = existing.indexOf(endMarker);
66
75
  if (start === -1 || end === -1 || end < start) {
67
76
  const separator = existing.trim().length > 0 ? `${existing.trimEnd()}\n\n` : '';
68
77
  return `${separator}${wrapped}\n`;
69
78
  }
70
- return `${existing.slice(0, start)}${wrapped}${existing.slice(end + exports.END_MARKER.length)}`;
79
+ return `${existing.slice(0, start)}${wrapped}${existing.slice(end + endMarker.length)}`;
71
80
  };
72
81
  exports.replaceMarkedBlock = replaceMarkedBlock;
82
+ /**
83
+ * Takes the block back out, so switching a generated block off in the config removes it instead of
84
+ * leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
85
+ */
86
+ const removeMarkedBlock = (options) => {
87
+ const { existing, startMarker, endMarker } = options;
88
+ const start = existing.indexOf(startMarker);
89
+ const end = existing.indexOf(endMarker);
90
+ if (start === -1 || end === -1 || end < start)
91
+ return existing;
92
+ const kept = `${existing.slice(0, start).trimEnd()}\n${existing.slice(end + endMarker.length).trimStart()}`;
93
+ return kept.trim().length > 0 ? kept : '';
94
+ };
95
+ exports.removeMarkedBlock = removeMarkedBlock;
73
96
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/render.ts"],"names":[],"mappings":"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"}
package/src/lib/sync.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { AgentTarget } from './config';
2
2
  export type RunOptions = {
3
3
  root: string;
4
- version: string;
5
4
  targets?: AgentTarget[];
6
5
  dryRun?: boolean;
7
6
  };
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 });
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 });
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;