@ethlete/agent-rules 0.1.0-next.2 → 0.1.0-next.20

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 (178) hide show
  1. package/CHANGELOG.md +269 -0
  2. package/README.md +350 -29
  3. package/THIRD-PARTY-LICENSES.md +35 -0
  4. package/content/git-hooks/post-checkout.sh +10 -0
  5. package/content/git-hooks/pre-push.sh +5 -0
  6. package/content/hooks/context-warning.py +766 -108
  7. package/content/hooks/subagent-model-policy.py +187 -0
  8. package/content/output-styles/ste-clarity.md +131 -0
  9. package/content/rules/app-styling.md +59 -0
  10. package/content/rules/comments.md +53 -20
  11. package/content/rules/lint-and-format.md +6 -5
  12. package/content/rules/nx-layout.md +47 -0
  13. package/content/rules/reactive-state.md +1 -1
  14. package/content/rules/styling.md +9 -7
  15. package/content/rules/subagent-models.md +29 -0
  16. package/content/skills/angular-patterns/SKILL.md +30 -7
  17. package/content/skills/api-source/SKILL.md +130 -0
  18. package/content/skills/app-testing/SKILL.md +141 -0
  19. package/content/skills/codex-subagent/SKILL.md +90 -0
  20. package/content/skills/codex-subagent/codex-agent.mjs +229 -0
  21. package/content/skills/design-exploration/SKILL.md +205 -0
  22. package/content/skills/design-exploration/check-story.mjs +139 -0
  23. package/content/skills/design-exploration/shoot-template.mjs +61 -0
  24. package/content/skills/domain-modeling/ADR-FORMAT.md +47 -0
  25. package/content/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  26. package/content/skills/domain-modeling/SKILL.md +80 -0
  27. package/content/skills/figma-export/SKILL.md +191 -0
  28. package/content/skills/figma-export/dump-figma-layers.py +83 -0
  29. package/content/skills/figma-export/dump-figma-svg.py +235 -0
  30. package/content/skills/figma-export/measure-template.mjs +87 -0
  31. package/content/skills/git-commit/SKILL.md +6 -7
  32. package/content/skills/git-flow/SKILL.md +87 -0
  33. package/content/skills/grill-with-docs/SKILL.md +13 -0
  34. package/content/skills/grilling/SKILL.md +34 -0
  35. package/content/skills/handoff/SKILL.md +74 -4
  36. package/content/skills/query/SKILL.md +165 -64
  37. package/content/skills/rxjs-signals/SKILL.md +31 -4
  38. package/content/skills/sdk-docs/SKILL.md +50 -14
  39. package/content/skills/sdk-local-build/SKILL.md +30 -10
  40. package/content/skills/sdk-local-build/sdk-local-baseline.mjs +64 -0
  41. package/content/skills/sdk-source/SKILL.md +49 -21
  42. package/content/skills/sdk-update/SKILL.md +96 -0
  43. package/content/skills/story-styling/SKILL.md +10 -8
  44. package/content/skills/styleguide/SKILL.md +12 -7
  45. package/content/skills/styleguide/assets.md +54 -0
  46. package/content/skills/styleguide/changesets.md +17 -0
  47. package/content/skills/styleguide/file-structure.md +73 -0
  48. package/content/skills/styleguide/lint-rule-lookup.md +51 -0
  49. package/content/skills/styleguide/storybook-structure.md +25 -0
  50. package/content/skills/theming/SKILL.md +41 -28
  51. package/content/skills/timetrack/SKILL.md +397 -0
  52. package/content/skills/verify-in-app/SKILL.md +107 -0
  53. package/migrations/app-styling-utilities.md +63 -0
  54. package/migrations/list-state-query-form.md +20 -0
  55. package/migrations/nx-layout.md +29 -0
  56. package/migrations/sdk-components-over-hand-built-ui.md +27 -0
  57. package/migrations/search-query-field.md +52 -0
  58. package/migrations.json +48 -0
  59. package/package.json +16 -2
  60. package/src/index.js +63 -28
  61. package/src/index.js.map +1 -1
  62. package/src/lib/cli-args.d.ts +9 -0
  63. package/src/lib/cli-args.js +48 -0
  64. package/src/lib/cli-args.js.map +1 -0
  65. package/src/lib/commitlint.d.ts +10 -0
  66. package/src/lib/commitlint.js +51 -0
  67. package/src/lib/commitlint.js.map +1 -0
  68. package/src/lib/config.d.ts +38 -4
  69. package/src/lib/config.js +84 -8
  70. package/src/lib/config.js.map +1 -1
  71. package/src/lib/filter.d.ts +2 -0
  72. package/src/lib/filter.js +4 -4
  73. package/src/lib/filter.js.map +1 -1
  74. package/src/lib/frontmatter.d.ts +2 -0
  75. package/src/lib/frontmatter.js +33 -5
  76. package/src/lib/frontmatter.js.map +1 -1
  77. package/src/lib/git-flow/build.d.ts +35 -0
  78. package/src/lib/git-flow/build.js +24 -0
  79. package/src/lib/git-flow/build.js.map +1 -0
  80. package/src/lib/git-flow/config.d.ts +59 -0
  81. package/src/lib/git-flow/config.js +50 -0
  82. package/src/lib/git-flow/config.js.map +1 -0
  83. package/src/lib/git-flow/index.d.ts +6 -0
  84. package/src/lib/git-flow/index.js +10 -0
  85. package/src/lib/git-flow/index.js.map +1 -0
  86. package/src/lib/git-flow/parse.d.ts +49 -0
  87. package/src/lib/git-flow/parse.js +300 -0
  88. package/src/lib/git-flow/parse.js.map +1 -0
  89. package/src/lib/git-flow/rename.d.ts +24 -0
  90. package/src/lib/git-flow/rename.js +70 -0
  91. package/src/lib/git-flow/rename.js.map +1 -0
  92. package/src/lib/git-flow/start.d.ts +49 -0
  93. package/src/lib/git-flow/start.js +57 -0
  94. package/src/lib/git-flow/start.js.map +1 -0
  95. package/src/lib/git-flow/validate.d.ts +34 -0
  96. package/src/lib/git-flow/validate.js +72 -0
  97. package/src/lib/git-flow/validate.js.map +1 -0
  98. package/src/lib/git-flow-command.d.ts +4 -0
  99. package/src/lib/git-flow-command.js +157 -0
  100. package/src/lib/git-flow-command.js.map +1 -0
  101. package/src/lib/git-flow-repair.d.ts +17 -0
  102. package/src/lib/git-flow-repair.js +157 -0
  103. package/src/lib/git-flow-repair.js.map +1 -0
  104. package/src/lib/git-flow-start.d.ts +20 -0
  105. package/src/lib/git-flow-start.js +132 -0
  106. package/src/lib/git-flow-start.js.map +1 -0
  107. package/src/lib/git.d.ts +64 -0
  108. package/src/lib/git.js +131 -0
  109. package/src/lib/git.js.map +1 -0
  110. package/src/lib/gitlab.d.ts +35 -0
  111. package/src/lib/gitlab.js +108 -0
  112. package/src/lib/gitlab.js.map +1 -0
  113. package/src/lib/index.d.ts +2 -0
  114. package/src/lib/index.js +2 -0
  115. package/src/lib/index.js.map +1 -1
  116. package/src/lib/migrate.js +1 -1
  117. package/src/lib/migrate.js.map +1 -1
  118. package/src/lib/output-style-command.d.ts +3 -0
  119. package/src/lib/output-style-command.js +69 -0
  120. package/src/lib/output-style-command.js.map +1 -0
  121. package/src/lib/output-style.d.ts +38 -0
  122. package/src/lib/output-style.js +134 -0
  123. package/src/lib/output-style.js.map +1 -0
  124. package/src/lib/owned-paths.js +27 -3
  125. package/src/lib/owned-paths.js.map +1 -1
  126. package/src/lib/package-runner.d.ts +3 -0
  127. package/src/lib/package-runner.js +69 -0
  128. package/src/lib/package-runner.js.map +1 -0
  129. package/src/lib/plain-text.d.ts +9 -0
  130. package/src/lib/plain-text.js +22 -0
  131. package/src/lib/plain-text.js.map +1 -0
  132. package/src/lib/plan.d.ts +6 -6
  133. package/src/lib/plan.js +147 -40
  134. package/src/lib/plan.js.map +1 -1
  135. package/src/lib/prompt.d.ts +8 -0
  136. package/src/lib/prompt.js +27 -0
  137. package/src/lib/prompt.js.map +1 -0
  138. package/src/lib/render.d.ts +24 -2
  139. package/src/lib/render.js +39 -10
  140. package/src/lib/render.js.map +1 -1
  141. package/src/lib/sync.d.ts +0 -1
  142. package/src/lib/sync.js +23 -15
  143. package/src/lib/sync.js.map +1 -1
  144. package/src/lib/targets/agents-skills.js +1 -1
  145. package/src/lib/targets/agents-skills.js.map +1 -1
  146. package/src/lib/targets/claude-hooks.d.ts +1 -23
  147. package/src/lib/targets/claude-hooks.js +17 -85
  148. package/src/lib/targets/claude-hooks.js.map +1 -1
  149. package/src/lib/targets/claude.js +1 -2
  150. package/src/lib/targets/claude.js.map +1 -1
  151. package/src/lib/targets/codex-hooks.d.ts +12 -0
  152. package/src/lib/targets/codex-hooks.js +34 -0
  153. package/src/lib/targets/codex-hooks.js.map +1 -0
  154. package/src/lib/targets/codex.js +4 -4
  155. package/src/lib/targets/codex.js.map +1 -1
  156. package/src/lib/targets/copilot.js +3 -3
  157. package/src/lib/targets/copilot.js.map +1 -1
  158. package/src/lib/targets/cursor.js +2 -2
  159. package/src/lib/targets/cursor.js.map +1 -1
  160. package/src/lib/targets/git-hooks.d.ts +24 -0
  161. package/src/lib/targets/git-hooks.js +71 -0
  162. package/src/lib/targets/git-hooks.js.map +1 -0
  163. package/src/lib/targets/hooks-shared.d.ts +58 -0
  164. package/src/lib/targets/hooks-shared.js +128 -0
  165. package/src/lib/targets/hooks-shared.js.map +1 -0
  166. package/src/lib/targets/shared.d.ts +1 -9
  167. package/src/lib/targets/shared.js +4 -8
  168. package/src/lib/targets/shared.js.map +1 -1
  169. package/src/lib/timetrack-command.d.ts +11 -0
  170. package/src/lib/timetrack-command.js +1055 -0
  171. package/src/lib/timetrack-command.js.map +1 -0
  172. package/src/lib/timetrack-snapshot.d.ts +55 -0
  173. package/src/lib/timetrack-snapshot.js +120 -0
  174. package/src/lib/timetrack-snapshot.js.map +1 -0
  175. package/src/lib/timetrack.d.ts +561 -0
  176. package/src/lib/timetrack.js +271 -0
  177. package/src/lib/timetrack.js.map +1 -0
  178. package/content/skills/styleguide/STYLEGUIDE.md +0 -520
@@ -5,7 +5,7 @@ const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
6
  // `.agents/ethlete` and `.github/instructions/ethlete-*` are no longer emitted, but stay owned so
7
7
  // a sync prunes them from repos generated by older versions.
8
- const OWNED_DIRECTORIES = ['.agents/ethlete', '.claude/rules/ethlete', '.claude/hooks/ethlete'];
8
+ const OWNED_DIRECTORIES = ['.agents/ethlete', '.claude/rules/ethlete', '.claude/hooks/ethlete', '.codex/hooks/ethlete'];
9
9
  const OWNED_PARENTS = [
10
10
  { dir: '.agents/skills', match: (entry) => entry.startsWith('ethlete-') },
11
11
  { dir: '.claude/skills', match: (entry) => entry.startsWith('ethlete-') },
@@ -15,12 +15,32 @@ const OWNED_PARENTS = [
15
15
  match: (entry) => entry.startsWith('ethlete-') && entry.endsWith('.instructions.md'),
16
16
  },
17
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
+ };
18
35
  const walk = (root, absoluteDir) => {
19
36
  if (!(0, fs_1.existsSync)(absoluteDir))
20
37
  return [];
21
38
  return (0, fs_1.readdirSync)(absoluteDir).flatMap((entry) => {
22
39
  const absolute = (0, path_1.join)(absoluteDir, entry);
23
- if ((0, fs_1.statSync)(absolute).isDirectory())
40
+ const stats = (0, fs_1.lstatSync)(absolute);
41
+ if (stats.isSymbolicLink())
42
+ return [];
43
+ if (stats.isDirectory())
24
44
  return walk(root, absolute);
25
45
  return [(0, path_1.relative)(root, absolute).split(path_1.sep).join('/')];
26
46
  });
@@ -41,9 +61,13 @@ const collectOwnedPaths = (root) => {
41
61
  if (!parent.match(entry))
42
62
  continue;
43
63
  const absolute = (0, path_1.join)(absoluteParent, entry);
44
- owned.push(...((0, fs_1.statSync)(absolute).isDirectory() ? walk(root, absolute) : [`${parent.dir}/${entry}`]));
64
+ const stats = (0, fs_1.lstatSync)(absolute);
65
+ if (stats.isSymbolicLink())
66
+ continue;
67
+ owned.push(...(stats.isDirectory() ? walk(root, absolute) : [`${parent.dir}/${entry}`]));
45
68
  }
46
69
  }
70
+ owned.push(...OWNED_WHEN_EMPTY.filter((path) => isEmptyObject((0, path_1.join)(root, path))));
47
71
  return owned;
48
72
  };
49
73
  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,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"}
1
+ {"version":3,"file":"owned-paths.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/owned-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const detectPackageRunner: (root: string) => "yarn" | "pnpm exec" | "bunx" | "npx";
2
+ export declare const readScripts: (root: string) => Set<string> | undefined;
3
+ export declare const detectCommandVars: (root: string) => Record<string, string>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectCommandVars = exports.readScripts = exports.detectPackageRunner = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const RUNNERS = { yarn: 'yarn', pnpm: 'pnpm exec', bun: 'bunx', npm: 'npx' };
7
+ const LOCKFILES = [
8
+ ['yarn.lock', 'yarn'],
9
+ ['pnpm-lock.yaml', 'pnpm'],
10
+ ['bun.lock', 'bun'],
11
+ ['bun.lockb', 'bun'],
12
+ ['package-lock.json', 'npm'],
13
+ ];
14
+ const readManifest = (root) => {
15
+ const path = (0, path_1.join)(root, 'package.json');
16
+ if (!(0, fs_1.existsSync)(path))
17
+ return undefined;
18
+ try {
19
+ return JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
20
+ }
21
+ catch (_a) {
22
+ return undefined;
23
+ }
24
+ };
25
+ const declaredManager = (root) => {
26
+ var _a;
27
+ const packageManager = (_a = readManifest(root)) === null || _a === void 0 ? void 0 : _a.packageManager;
28
+ if (typeof packageManager !== 'string')
29
+ return undefined;
30
+ return Object.keys(RUNNERS).find((name) => packageManager.startsWith(`${name}@`));
31
+ };
32
+ const detectPackageManagerName = (root) => { var _a, _b, _c; return (_c = (_a = declaredManager(root)) !== null && _a !== void 0 ? _a : (_b = LOCKFILES.find(([fileName]) => (0, fs_1.existsSync)((0, path_1.join)(root, fileName)))) === null || _b === void 0 ? void 0 : _b[1]) !== null && _c !== void 0 ? _c : 'npm'; };
33
+ const detectPackageRunner = (root) => RUNNERS[detectPackageManagerName(root)];
34
+ exports.detectPackageRunner = detectPackageRunner;
35
+ const readScripts = (root) => {
36
+ const manifest = readManifest(root);
37
+ if (!manifest)
38
+ return undefined;
39
+ return new Set(manifest.scripts && typeof manifest.scripts === 'object' ? Object.keys(manifest.scripts) : []);
40
+ };
41
+ exports.readScripts = readScripts;
42
+ const SCRIPT_RUNNERS = {
43
+ yarn: 'yarn run',
44
+ pnpm: 'pnpm run',
45
+ bun: 'bun run',
46
+ npm: 'npm run',
47
+ };
48
+ const detectCommandVars = (root) => {
49
+ var _a, _b, _c, _d;
50
+ const manager = detectPackageManagerName(root);
51
+ const manifest = readManifest(root);
52
+ const scripts = (_a = (0, exports.readScripts)(root)) !== null && _a !== void 0 ? _a : new Set();
53
+ const script = (name, ...args) => [SCRIPT_RUNNERS[manager], name, ...(args.length && manager === 'npm' ? ['--'] : []), ...args].join(' ');
54
+ const hasNx = Boolean((_c = (_b = manifest === null || manifest === void 0 ? void 0 : manifest.devDependencies) === null || _b === void 0 ? void 0 : _b['nx']) !== null && _c !== void 0 ? _c : (_d = manifest === null || manifest === void 0 ? void 0 : manifest.dependencies) === null || _d === void 0 ? void 0 : _d['nx']) || (0, fs_1.existsSync)((0, path_1.join)(root, 'nx.json'));
55
+ const vars = {};
56
+ if (scripts.has('lint')) {
57
+ vars['lintCommand'] = script('lint');
58
+ vars['lintFixCommand'] = script('lint', '--fix');
59
+ }
60
+ else if (hasNx) {
61
+ vars['lintCommand'] = `${RUNNERS[manager]} nx lint <project>`;
62
+ vars['lintFixCommand'] = `${RUNNERS[manager]} nx lint <project> --fix`;
63
+ }
64
+ if (scripts.has('storybook'))
65
+ vars['storybookStartCommand'] = script('storybook');
66
+ return vars;
67
+ };
68
+ exports.detectCommandVars = detectCommandVars;
69
+ //# sourceMappingURL=package-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-runner.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/package-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * One line as a terminal prints it literally.
3
+ *
4
+ * A Jira summary, a stand-in name and an error message all reach the terminal as somebody typed them.
5
+ * An escape sequence in one of them can clear the screen, move the cursor or redraw a line that has
6
+ * already been printed, so output could be made to say something the app never answered. Every control
7
+ * character apart from tab and newline is printed as its own escaped form instead.
8
+ */
9
+ export declare const plain: (text: string) => string;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.plain = void 0;
4
+ /** Tab and newline are the only control characters a printed line may hold. */
5
+ const isControl = (code) => (code < 0x20 ? code !== 0x09 && code !== 0x0a : code >= 0x7f && code <= 0x9f);
6
+ /**
7
+ * One line as a terminal prints it literally.
8
+ *
9
+ * A Jira summary, a stand-in name and an error message all reach the terminal as somebody typed them.
10
+ * An escape sequence in one of them can clear the screen, move the cursor or redraw a line that has
11
+ * already been printed, so output could be made to say something the app never answered. Every control
12
+ * character apart from tab and newline is printed as its own escaped form instead.
13
+ */
14
+ const plain = (text) => [...text]
15
+ .map((character) => {
16
+ var _a;
17
+ const code = (_a = character.codePointAt(0)) !== null && _a !== void 0 ? _a : 0;
18
+ return isControl(code) ? `\\x${code.toString(16).padStart(2, '0')}` : character;
19
+ })
20
+ .join('');
21
+ exports.plain = plain;
22
+ //# sourceMappingURL=plain-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain-text.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plain-text.ts"],"names":[],"mappings":";;;AAAA,+EAA+E;AAC/E,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;AAElH;;;;;;;GAOG;AACI,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CACpC,CAAC,GAAG,IAAI,CAAC;KACN,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;;IACjB,MAAM,IAAI,GAAG,MAAA,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC;IAE3C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC,CAAC;KACD,IAAI,CAAC,EAAE,CAAC,CAAC;AAPD,QAAA,KAAK,SAOJ"}
package/src/lib/plan.d.ts CHANGED
@@ -1,17 +1,18 @@
1
1
  import { SyncConfig } from './config';
2
2
  import { SkippedItem } from './filter';
3
+ import { ContentItem } from './load-content';
3
4
  import { EmittedFile } from './targets/shared';
4
5
  export type SyncPlan = {
5
6
  files: EmittedFile[];
6
7
  skipped: SkippedItem[];
7
- /** Cross-references whose target was filtered out of this repo; rendered as a bare name. */
8
- danglingLinks: {
9
- from: string;
10
- to: string;
11
- }[];
12
8
  /** Config/repo mismatches that won't fail the run but will silently lose content if ignored. */
13
9
  warnings: string[];
14
10
  };
11
+ export declare const assertResolvedContentReferences: (options: {
12
+ items: ContentItem[];
13
+ kept: ContentItem[];
14
+ skipped: SkippedItem[];
15
+ }) => void;
15
16
  /** `@AGENTS.md` on its own line (the documented import syntax), or a symlink pointing at it. */
16
17
  export declare const claudeMdImportsAgentsMd: (root: string) => boolean;
17
18
  /**
@@ -20,5 +21,4 @@ export declare const claudeMdImportsAgentsMd: (root: string) => boolean;
20
21
  */
21
22
  export declare const buildPlan: (options: {
22
23
  config: SyncConfig;
23
- version: string;
24
24
  }) => SyncPlan;
package/src/lib/plan.js CHANGED
@@ -1,22 +1,59 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildPlan = exports.claudeMdImportsAgentsMd = void 0;
3
+ exports.buildPlan = exports.claudeMdImportsAgentsMd = exports.assertResolvedContentReferences = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
6
  const config_1 = require("./config");
7
7
  const filter_1 = require("./filter");
8
8
  const load_content_1 = require("./load-content");
9
+ const package_runner_1 = require("./package-runner");
9
10
  const agents_skills_1 = require("./targets/agents-skills");
10
11
  const claude_hooks_1 = require("./targets/claude-hooks");
11
12
  const claude_1 = require("./targets/claude");
12
13
  const codex_1 = require("./targets/codex");
14
+ const codex_hooks_1 = require("./targets/codex-hooks");
15
+ const git_hooks_1 = require("./targets/git-hooks");
16
+ const hooks_shared_1 = require("./targets/hooks-shared");
13
17
  const copilot_1 = require("./targets/copilot");
14
18
  const cursor_1 = require("./targets/cursor");
15
19
  const SKILL_LINK_PATTERN = /\{%\s*skill:([a-zA-Z0-9_.-]+)\s*%\}/g;
16
- const findDanglingLinks = (items, emittedSkills) => items.flatMap((item) => [...item.body.matchAll(SKILL_LINK_PATTERN)]
17
- .map((match) => match[1])
18
- .filter((name) => !emittedSkills.has(name))
19
- .map((name) => ({ from: item.frontmatter.name, to: name })));
20
+ const RESOURCE_LINK_PATTERN = /\{%\s*resource:([a-zA-Z0-9_.-]+)\s*%\}/g;
21
+ const assertResolvedContentReferences = (options) => {
22
+ var _a;
23
+ const { items, kept, skipped } = options;
24
+ const knownSkills = new Set(items.filter((item) => item.frontmatter.kind === 'skill').map((item) => item.frontmatter.name));
25
+ const emittedSkills = new Set(kept.filter((item) => item.frontmatter.kind === 'skill').map((item) => item.frontmatter.name));
26
+ const skippedByName = new Map(skipped.map((item) => [item.name, item.reason]));
27
+ for (const item of kept) {
28
+ const origin = item.frontmatter.kind === 'skill' ? `skills/${item.frontmatter.name}/SKILL.md` : item.sourcePath;
29
+ const skillLinks = [...item.body.matchAll(SKILL_LINK_PATTERN)].map((match) => match[1]);
30
+ for (const target of skillLinks) {
31
+ if (!knownSkills.has(target)) {
32
+ throw new Error(`${origin}: references unknown package skill "${target}".`);
33
+ }
34
+ if (!emittedSkills.has(target)) {
35
+ const reason = (_a = skippedByName.get(target)) !== null && _a !== void 0 ? _a : 'it was not selected for emission';
36
+ throw new Error(`${origin}: references package skill "${target}", but it is not emitted because ${reason}.`);
37
+ }
38
+ }
39
+ const resources = new Set(item.resources.map((resource) => resource.fileName));
40
+ for (const target of [...item.body.matchAll(RESOURCE_LINK_PATTERN)].map((match) => match[1])) {
41
+ if (!resources.has(target)) {
42
+ throw new Error(`${origin}: references missing bundled resource "${target}".`);
43
+ }
44
+ }
45
+ const withoutStructuredLinks = item.body.replace(SKILL_LINK_PATTERN, '');
46
+ for (const target of knownSkills) {
47
+ if (target === item.frontmatter.name)
48
+ continue;
49
+ const plainReference = new RegExp('`(?:ethlete-)?' + target.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '` (?:skill|guide)');
50
+ if (plainReference.test(withoutStructuredLinks)) {
51
+ throw new Error(`${origin}: references package skill "${target}" as plain text; use "{% skill:${target} %}" so filtering can validate it.`);
52
+ }
53
+ }
54
+ }
55
+ };
56
+ exports.assertResolvedContentReferences = assertResolvedContentReferences;
20
57
  const readExisting = (root, relativePath) => {
21
58
  const path = (0, path_1.join)(root, relativePath);
22
59
  return (0, fs_1.existsSync)(path) ? (0, fs_1.readFileSync)(path, 'utf8') : '';
@@ -27,33 +64,16 @@ const claudeMdImportsAgentsMd = (root) => {
27
64
  if (!(0, fs_1.existsSync)(path))
28
65
  return false;
29
66
  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'));
67
+ return (0, path_1.resolve)(root, (0, fs_1.readlinkSync)(path)) === (0, path_1.resolve)(root, 'AGENTS.md');
68
+ const outsideFences = (0, fs_1.readFileSync)(path, 'utf8').replace(/^(`{3,}|~{3,})[^\n]*\n[\s\S]*?^\1[^\n]*$/gm, '');
69
+ return /^@AGENTS\.md\s*$/m.test(outsideFences);
32
70
  };
33
71
  exports.claudeMdImportsAgentsMd = claudeMdImportsAgentsMd;
34
- /** Marks a directory as an `ethlete-sdk` checkout rather than some other folder. */
35
- const SDK_CHECKOUT_MARKERS = ['libs/components', 'libs/core', 'libs/agent-rules'];
36
- const describeSdkSourcePath = (options) => {
37
- const { root, value } = options;
38
- if (value === undefined)
39
- return [];
40
- if (typeof value !== 'string' || value.trim().length === 0) {
41
- return [`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "sdkSourcePath" — use a path to an ethlete-sdk checkout.`];
42
- }
43
- const absolute = (0, path_1.resolve)(root, value);
44
- if (!(0, fs_1.existsSync)(absolute)) {
45
- return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "sdkSourcePath" at ${absolute}, which does not exist.`];
46
- }
47
- if (SDK_CHECKOUT_MARKERS.some((marker) => !(0, fs_1.existsSync)((0, path_1.join)(absolute, marker)))) {
48
- return [`${config_1.LOCAL_CONFIG_FILE_NAME} points "sdkSourcePath" at ${absolute}, which is not an ethlete-sdk checkout.`];
49
- }
50
- return [];
51
- };
52
72
  /**
53
73
  * The local file only affects runtime behavior, never sync output — so the warnings here are about
54
74
  * the mistakes that would otherwise fail silently: a file the hooks can't parse, a key that
55
- * suggests someone expected sync-time overrides, a hook name nothing matches, or an SDK path that
56
- * no longer exists (the skills reading it would just report the checkout as missing).
75
+ * suggests someone expected sync-time overrides, a hook name nothing matches, or a checkout path
76
+ * that no longer exists (the skills reading it would just report the checkout as missing).
57
77
  */
58
78
  const collectLocalConfigWarnings = (root) => {
59
79
  const local = (0, config_1.readLocalConfig)(root);
@@ -64,23 +84,98 @@ const collectLocalConfigWarnings = (root) => {
64
84
  }
65
85
  const warnings = [];
66
86
  if (local.unknownKeys.length > 0) {
67
- warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports "disableHooks" and "sdkSourcePath"; it never changes what sync writes.`);
87
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports ${config_1.LOCAL_CONFIG_KEYS.map((key) => `"${key}"`).join(' and ')}; it never changes what sync writes.`);
88
+ }
89
+ if (local.movedKeys.length > 0) {
90
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} still holds ${local.movedKeys.map((key) => `"${key}"`).join(', ')} — move ` +
91
+ `${local.movedKeys.length === 1 ? 'it' : 'them'} to ${config_1.TOPOLOGY_CONFIG_FILE_NAME}, which \`et\` reads too.`);
68
92
  }
69
- warnings.push(...describeSdkSourcePath({ root, value: local.config.sdkSourcePath }));
70
93
  const disable = local.config.disableHooks;
71
94
  if (disable !== undefined && typeof disable !== 'boolean' && !Array.isArray(disable)) {
72
95
  warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableHooks" value — use true or an array of hook names; hooks stay enabled.`);
73
96
  }
74
97
  if (Array.isArray(disable)) {
75
- const unknown = disable.filter((name) => !(name in claude_hooks_1.CLAUDE_HOOKS));
98
+ const unknown = disable.filter((name) => !Object.prototype.hasOwnProperty.call(hooks_shared_1.KNOWN_HOOKS, name));
76
99
  if (unknown.length > 0) {
77
- warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(claude_hooks_1.CLAUDE_HOOKS).join(', ')}.`);
100
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(hooks_shared_1.KNOWN_HOOKS).join(', ')}.`);
78
101
  }
79
102
  }
103
+ const disableAutoHandoffSave = local.config.disableAutoHandoffSave;
104
+ if (disableAutoHandoffSave !== undefined && typeof disableAutoHandoffSave !== 'boolean') {
105
+ warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableAutoHandoffSave" value — use true or false.`);
106
+ }
80
107
  return warnings;
81
108
  };
82
- const collectWarnings = (config) => {
83
- const warnings = collectLocalConfigWarnings(config.root);
109
+ /**
110
+ * Only `.husky/` is written into, never `.git/hooks/`: the generated files are committed and CI's
111
+ * `check` diffs them, so a hook that lives outside the working tree could never be in sync.
112
+ */
113
+ const collectGitHookWarnings = (config) => {
114
+ if (config.gitHooks.length === 0 || (0, fs_1.existsSync)((0, path_1.join)(config.root, git_hooks_1.HUSKY_DIR)))
115
+ return [];
116
+ return [
117
+ `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.`,
118
+ ];
119
+ };
120
+ const collectExcludeWarnings = (items, exclude) => {
121
+ const knownNames = new Set(items.map((item) => item.frontmatter.name));
122
+ const unknownNames = exclude.filter((name) => !knownNames.has(name));
123
+ if (unknownNames.length === 0)
124
+ return [];
125
+ return [
126
+ `${config_1.CONFIG_FILE_NAME} excludes unknown content name(s): ${unknownNames.join(', ')} — check their spelling or remove them.`,
127
+ ];
128
+ };
129
+ const PATH_VARS = ['themeStylesheet'];
130
+ const collectPathVarWarnings = (config) => PATH_VARS.flatMap((name) => {
131
+ const value = config.vars[name];
132
+ if (typeof value !== 'string' || (0, fs_1.existsSync)((0, path_1.resolve)(config.root, value)))
133
+ return [];
134
+ return [
135
+ `vars.${name} points at ${value}, which does not exist — the guides that read it will send agents to a missing file.`,
136
+ ];
137
+ });
138
+ const isUnparseableJson = (contents) => {
139
+ if (!contents.trim())
140
+ return false;
141
+ try {
142
+ JSON.parse(contents);
143
+ return false;
144
+ }
145
+ catch (_a) {
146
+ return true;
147
+ }
148
+ };
149
+ const collectHookSettingsWarnings = (root) => [claude_hooks_1.CLAUDE_SETTINGS_FILE, codex_hooks_1.CODEX_HOOKS_FILE]
150
+ .filter((path) => isUnparseableJson(readExisting(root, path)))
151
+ .map((path) => `${path} is not valid JSON — sync leaves it alone, so no hook is registered or removed there.`);
152
+ const SCRIPT_COMMAND_VARS = ['lintCommand', 'lintFixCommand'];
153
+ const collectMissingScriptWarnings = (config) => {
154
+ const scripts = (0, package_runner_1.readScripts)(config.root);
155
+ if (!scripts)
156
+ return [];
157
+ return SCRIPT_COMMAND_VARS.flatMap((name) => {
158
+ var _a;
159
+ const value = config.vars[name];
160
+ const script = typeof value === 'string' ? (_a = /^(?:npm|yarn|pnpm|bun) run (\S+)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1] : undefined;
161
+ if (script === undefined || scripts.has(script))
162
+ return [];
163
+ return [
164
+ `vars.${name} is \`${value}\`, but package.json has no "${script}" script — set vars.${name} in ${config_1.CONFIG_FILE_NAME} to the command this repo uses.`,
165
+ ];
166
+ });
167
+ };
168
+ const collectWarnings = (config, items) => {
169
+ var _a;
170
+ const warnings = [
171
+ ...((_a = config.configWarnings) !== null && _a !== void 0 ? _a : []),
172
+ ...collectMissingScriptWarnings(config),
173
+ ...collectLocalConfigWarnings(config.root),
174
+ ...collectHookSettingsWarnings(config.root),
175
+ ...collectPathVarWarnings(config),
176
+ ...collectGitHookWarnings(config),
177
+ ...collectExcludeWarnings(items, config.exclude),
178
+ ];
84
179
  if (!config.claudeMdImportsAgentsMd)
85
180
  return warnings;
86
181
  if (!config.targets.includes('codex')) {
@@ -96,17 +191,17 @@ const collectWarnings = (config) => {
96
191
  * result and `check` diffs it.
97
192
  */
98
193
  const buildPlan = (options) => {
99
- const { config, version } = options;
100
- (0, claude_hooks_1.assertKnownHooks)(config.hooks);
101
- const { kept, skipped } = (0, filter_1.filterContent)((0, load_content_1.loadContent)(), config);
194
+ const { config } = options;
195
+ (0, hooks_shared_1.assertKnownHooks)(config.hooks);
196
+ (0, git_hooks_1.assertKnownGitHooks)(config.gitHooks);
197
+ const items = (0, load_content_1.loadContent)();
198
+ const { kept, skipped } = (0, filter_1.filterContent)(items, config);
199
+ (0, exports.assertResolvedContentReferences)({ items, kept, skipped });
102
200
  const skills = kept.filter((item) => item.frontmatter.kind === 'skill');
103
- const emittedSkills = new Set(skills.map((item) => item.frontmatter.name));
104
201
  const context = {
105
202
  rules: kept.filter((item) => item.frontmatter.kind === 'rule'),
106
203
  skills,
107
- emittedSkills,
108
204
  vars: config.vars,
109
- version,
110
205
  claudeMdImportsAgentsMd: config.claudeMdImportsAgentsMd,
111
206
  hooks: config.hooks,
112
207
  };
@@ -129,8 +224,20 @@ const buildPlan = (options) => {
129
224
  context,
130
225
  claudeTarget: config.targets.includes('claude'),
131
226
  existingSettings: readExisting(config.root, claude_hooks_1.CLAUDE_SETTINGS_FILE),
227
+ }), ...(0, codex_hooks_1.emitCodexHooks)({
228
+ context,
229
+ codexTarget: config.targets.includes('codex'),
230
+ existingHooks: readExisting(config.root, codex_hooks_1.CODEX_HOOKS_FILE),
231
+ }), ...(0, git_hooks_1.emitGitHooks)({
232
+ gitHooks: config.gitHooks,
233
+ huskyExists: (0, fs_1.existsSync)((0, path_1.join)(config.root, git_hooks_1.HUSKY_DIR)),
234
+ existing: Object.fromEntries(Object.keys(git_hooks_1.KNOWN_GIT_HOOKS).map((name) => [name, readExisting(config.root, (0, git_hooks_1.huskyHookPath)(name))])),
132
235
  }));
133
- return { files, skipped, danglingLinks: findDanglingLinks(kept, emittedSkills), warnings: collectWarnings(config) };
236
+ return {
237
+ files,
238
+ skipped,
239
+ warnings: collectWarnings(config, items),
240
+ };
134
241
  };
135
242
  exports.buildPlan = buildPlan;
136
243
  //# 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,24 @@ 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.
42
+ * Throws when only one marker is there, or the end marker comes first, rather than guess where the
43
+ * block ends and delete what the repo wrote.
35
44
  */
36
45
  export declare const replaceMarkedBlock: (options: {
37
46
  existing: string;
38
47
  block: string;
48
+ /** Named in the error for unbalanced markers. */
49
+ file?: string;
50
+ startMarker?: string;
51
+ endMarker?: string;
52
+ }) => string;
53
+ /**
54
+ * Takes the block back out, so switching a generated block off in the config removes it instead of
55
+ * leaving it behind — `sync`'s file-level pruning cannot reach inside a file the repo also owns.
56
+ */
57
+ export declare const removeMarkedBlock: (options: {
58
+ existing: string;
59
+ startMarker: string;
60
+ endMarker: string;
39
61
  }) => string;