@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
@@ -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,11 @@
1
+ import { EmitContext, EmittedFile } from './shared';
2
+ export declare const CLAUDE_SETTINGS_FILE = ".claude/settings.json";
3
+ /**
4
+ * The hook scripts plus the settings registration. Runs even when the claude target is off so a
5
+ * repo that drops the target also gets its stale registrations removed.
6
+ */
7
+ export declare const emitClaudeHooks: (options: {
8
+ context: EmitContext;
9
+ claudeTarget: boolean;
10
+ existingSettings: string;
11
+ }) => EmittedFile[];
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitClaudeHooks = exports.CLAUDE_SETTINGS_FILE = void 0;
4
+ const hooks_shared_1 = require("./hooks-shared");
5
+ exports.CLAUDE_SETTINGS_FILE = '.claude/settings.json';
6
+ const HOOKS_DIR = '.claude/hooks/ethlete';
7
+ const commandFor = (file) => `python3 "$CLAUDE_PROJECT_DIR/${HOOKS_DIR}/${file}" --agent claude`;
8
+ /**
9
+ * The hook scripts plus the settings registration. Runs even when the claude target is off so a
10
+ * repo that drops the target also gets its stale registrations removed.
11
+ */
12
+ const emitClaudeHooks = (options) => {
13
+ const { context, claudeTarget, existingSettings } = options;
14
+ const hooks = claudeTarget ? context.hooks : [];
15
+ return [
16
+ ...(0, hooks_shared_1.emitHookScripts)({ hooks, hooksDir: HOOKS_DIR }),
17
+ ...(0, hooks_shared_1.emitHookSettings)({
18
+ path: exports.CLAUDE_SETTINGS_FILE,
19
+ existing: existingSettings,
20
+ hooks,
21
+ hooksDir: HOOKS_DIR,
22
+ commandFor,
23
+ createWhenEmpty: true,
24
+ }),
25
+ ];
26
+ };
27
+ exports.emitClaudeHooks = emitClaudeHooks;
28
+ //# 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":";;;AACA,iDAAmE;AAEtD,QAAA,oBAAoB,GAAG,uBAAuB,CAAC;AAE5D,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAE1C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,gCAAgC,SAAS,IAAI,IAAI,kBAAkB,CAAC;AAEzG;;;GAGG;AACI,MAAM,eAAe,GAAG,CAAC,OAI/B,EAAiB,EAAE;IAClB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhD,OAAO;QACL,GAAG,IAAA,8BAAe,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAClD,GAAG,IAAA,+BAAgB,EAAC;YAClB,IAAI,EAAE,4BAAoB;YAC1B,QAAQ,EAAE,gBAAgB;YAC1B,KAAK;YACL,QAAQ,EAAE,SAAS;YACnB,UAAU;YACV,eAAe,EAAE,IAAI;SACtB,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,eAAe,mBAmB1B"}
@@ -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,37 +8,30 @@ 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
- const banner = (0, render_1.buildBanner)(context.version);
16
+ const banner = render_1.BANNER;
15
17
  const links = (0, shared_1.makeLinks)({
16
18
  context,
17
19
  skill: (name) => `the **\`ethlete-${name}\`** skill`,
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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude.ts"],"names":[],"mappings":";;;AAAA,sCAAwC;AACxC,qCAAuH;AAEvH,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,0BAA0B,IAAI,EAAE,CAAC;AAEpE,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3F;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,kBAAS,EAAC;QACtB,OAAO;QACP,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,YAAY;QACpD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,iCAAiC;KAC5E,CAAC,CAAC;IACH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpF,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,yBAAyB,IAAI,KAAK;YACxC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAClC,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,iBAAiB,IAAI,EAAE;YACvB,gBAAgB,IAAA,mBAAU,EAAC,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;YAC5D,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW;YAClC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1E,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,GAAG,IAAA,sBAAa,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1G,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AArCW,QAAA,UAAU,cAqCrB"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/claude.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AACnC,qCAA4F;AAE5F,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,0BAA0B,IAAI,EAAE,CAAC;AAEpE,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3F;;;;;;GAMG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,eAAM,CAAC;IACtB,MAAM,KAAK,GAAG,IAAA,kBAAS,EAAC;QACtB,OAAO;QACP,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,YAAY;QACpD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,iCAAiC;KAC5E,CAAC,CAAC;IACH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAEpF,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,yBAAyB,IAAI,KAAK;gBACxC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;aAC1E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AA1BW,QAAA,UAAU,cA0BrB"}
@@ -0,0 +1,12 @@
1
+ import { EmitContext, EmittedFile } from './shared';
2
+ export declare const CODEX_HOOKS_FILE = ".codex/hooks.json";
3
+ /**
4
+ * The hook scripts plus the `.codex/hooks.json` registration. Runs even when the codex target is
5
+ * off so a repo that drops the target also gets its stale registrations removed — but an absent
6
+ * file stays absent rather than being created empty.
7
+ */
8
+ export declare const emitCodexHooks: (options: {
9
+ context: EmitContext;
10
+ codexTarget: boolean;
11
+ existingHooks: string;
12
+ }) => EmittedFile[];
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitCodexHooks = exports.CODEX_HOOKS_FILE = void 0;
4
+ const hooks_shared_1 = require("./hooks-shared");
5
+ exports.CODEX_HOOKS_FILE = '.codex/hooks.json';
6
+ const HOOKS_DIR = '.codex/hooks/ethlete';
7
+ /**
8
+ * Codex exposes no project-dir variable, so the path is resolved the way Codex's own hook docs
9
+ * resolve it — the command string is evaluated by a shell.
10
+ */
11
+ const commandFor = (file) => `python3 "$(git rev-parse --show-toplevel)/${HOOKS_DIR}/${file}" --agent codex`;
12
+ /**
13
+ * The hook scripts plus the `.codex/hooks.json` registration. Runs even when the codex target is
14
+ * off so a repo that drops the target also gets its stale registrations removed — but an absent
15
+ * file stays absent rather than being created empty.
16
+ */
17
+ const emitCodexHooks = (options) => {
18
+ const { context, codexTarget, existingHooks } = options;
19
+ const hooks = codexTarget ? context.hooks : [];
20
+ return [
21
+ ...(0, hooks_shared_1.emitHookScripts)({ hooks, hooksDir: HOOKS_DIR }),
22
+ ...(0, hooks_shared_1.emitHookSettings)({
23
+ path: exports.CODEX_HOOKS_FILE,
24
+ existing: existingHooks,
25
+ hooks,
26
+ hooksDir: HOOKS_DIR,
27
+ commandFor,
28
+ createWhenEmpty: false,
29
+ }),
30
+ ];
31
+ };
32
+ exports.emitCodexHooks = emitCodexHooks;
33
+ //# sourceMappingURL=codex-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex-hooks.ts"],"names":[],"mappings":";;;AACA,iDAAmE;AAEtD,QAAA,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,SAAS,GAAG,sBAAsB,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,6CAA6C,SAAS,IAAI,IAAI,iBAAiB,CAAC;AAErH;;;;GAIG;AACI,MAAM,cAAc,GAAG,CAAC,OAI9B,EAAiB,EAAE;IAClB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,OAAO;QACL,GAAG,IAAA,8BAAe,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAClD,GAAG,IAAA,+BAAgB,EAAC;YAClB,IAAI,EAAE,wBAAgB;YACtB,QAAQ,EAAE,aAAa;YACvB,KAAK;YACL,QAAQ,EAAE,SAAS;YACnB,UAAU;YACV,eAAe,EAAE,KAAK;SACvB,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,cAAc,kBAmBzB"}
@@ -1,9 +1,11 @@
1
1
  import { EmitContext, EmittedFile } from './shared';
2
2
  export declare const CODEX_FILE = "AGENTS.md";
3
3
  /**
4
- * `AGENTS.md` supports neither frontmatter nor includes, so the always-loaded rules are inlined and
5
- * the on-demand skills become a manifest of paths into `.agents/ethlete/` (emitted separately by the
6
- * neutral target). Everything outside the marker block is left as the repo wrote it.
4
+ * The always-loaded rules are inlined into the `AGENTS.md` marker block — layered `AGENTS.md`
5
+ * files are Codex's rules mechanism. Skills are emitted as real skills under `.agents/skills/`
6
+ * (see `emitAgentsSkills`) and self-describe through their frontmatter, so the block carries only
7
+ * a two-line hint instead of repeating every description into each session's context. Everything
8
+ * outside the marker block is left as the repo wrote it.
7
9
  */
8
10
  export declare const emitCodex: (options: {
9
11
  context: EmitContext;
@@ -5,21 +5,22 @@ const render_1 = require("../render");
5
5
  const shared_1 = require("./shared");
6
6
  exports.CODEX_FILE = 'AGENTS.md';
7
7
  /**
8
- * `AGENTS.md` supports neither frontmatter nor includes, so the always-loaded rules are inlined and
9
- * the on-demand skills become a manifest of paths into `.agents/ethlete/` (emitted separately by the
10
- * neutral target). Everything outside the marker block is left as the repo wrote it.
8
+ * The always-loaded rules are inlined into the `AGENTS.md` marker block — layered `AGENTS.md`
9
+ * files are Codex's rules mechanism. Skills are emitted as real skills under `.agents/skills/`
10
+ * (see `emitAgentsSkills`) and self-describe through their frontmatter, so the block carries only
11
+ * a two-line hint instead of repeating every description into each session's context. Everything
12
+ * outside the marker block is left as the repo wrote it.
11
13
  */
12
14
  const emitCodex = (options) => {
13
15
  const { context, existing } = options;
14
- const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.neutralLinks)(context) }));
16
+ const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)(context) }));
15
17
  if (context.skills.length > 0) {
16
18
  sections.push([
17
- '## Ethlete reference docs',
18
- 'Read the matching file before starting that kind of work — do not work from memory.',
19
- (0, shared_1.pointerTable)({ skills: context.skills, context, pathFor: shared_1.neutralBodyPath }),
19
+ '## Ethlete skills',
20
+ "On-demand guides live in `.agents/skills/ethlete-*/SKILL.md`; each one's frontmatter says when to read it. If your agent does not discover skills on its own, list that directory and read the matching guide before starting that kind of work — do not work from memory.",
20
21
  ].join('\n\n'));
21
22
  }
22
- const block = (0, shared_1.document)([(0, render_1.buildBanner)(context.version), ...sections]).trimEnd();
23
+ const block = (0, shared_1.document)([render_1.BANNER, ...sections]).trimEnd();
23
24
  return [{ path: exports.CODEX_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) }];
24
25
  };
25
26
  exports.emitCodex = emitCodex;
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex.ts"],"names":[],"mappings":";;;AAAA,sCAA4D;AAC5D,qCAAiH;AAEpG,QAAA,UAAU,GAAG,WAAW,CAAC;AAEtC;;;;GAIG;AACI,MAAM,SAAS,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAC9F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,qBAAY,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX;YACE,2BAA2B;YAC3B,qFAAqF;YACrF,IAAA,qBAAY,EAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAe,EAAE,CAAC;SAC5E,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAE9E,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAU,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC,CAAC;AAjBW,QAAA,SAAS,aAiBpB"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/codex.ts"],"names":[],"mappings":";;;AAAA,sCAAuD;AACvD,qCAAuF;AAE1E,QAAA,UAAU,GAAG,WAAW,CAAC;AAEtC;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAC9F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX;YACE,mBAAmB;YACnB,4QAA4Q;SAC7Q,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,eAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAExD,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAU,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC,CAAC;AAhBW,QAAA,SAAS,aAgBpB"}
@@ -1,9 +1,9 @@
1
1
  import { EmitContext, EmittedFile } from './shared';
2
2
  export declare const COPILOT_FILE = ".github/copilot-instructions.md";
3
3
  /**
4
- * Copilot can scope an instruction file to a glob but has no way to load one on description alone,
5
- * so a skill with `paths` becomes a real `.instructions.md` and everything else falls back to a
6
- * manifest pointer in the always-loaded file.
4
+ * Always-loaded rules go into the `copilot-instructions.md` marker block. Skills are not mirrored
5
+ * here — Copilot discovers `.agents/skills/` natively, so the old pointer table and the
6
+ * `applyTo`-scoped `.instructions.md` fallback are gone.
7
7
  */
8
8
  export declare const emitCopilot: (options: {
9
9
  context: EmitContext;
@@ -5,39 +5,16 @@ const render_1 = require("../render");
5
5
  const shared_1 = require("./shared");
6
6
  exports.COPILOT_FILE = '.github/copilot-instructions.md';
7
7
  /**
8
- * Copilot can scope an instruction file to a glob but has no way to load one on description alone,
9
- * so a skill with `paths` becomes a real `.instructions.md` and everything else falls back to a
10
- * manifest pointer in the always-loaded file.
8
+ * Always-loaded rules go into the `copilot-instructions.md` marker block. Skills are not mirrored
9
+ * here — Copilot discovers `.agents/skills/` natively, so the old pointer table and the
10
+ * `applyTo`-scoped `.instructions.md` fallback are gone.
11
11
  */
12
12
  const emitCopilot = (options) => {
13
13
  const { context, existing } = options;
14
- const banner = (0, render_1.buildBanner)(context.version);
15
- const links = (0, shared_1.makeLinks)({
16
- context,
17
- skill: (name) => `\`${(0, shared_1.neutralBodyPath)(name)}\``,
18
- resource: (target) => `\`${(0, shared_1.neutralResourcePath)(target)}\``,
19
- });
20
- const files = [];
21
- const scoped = context.skills.filter((item) => item.frontmatter.paths.length > 0);
22
- const unscoped = context.skills.filter((item) => item.frontmatter.paths.length === 0);
23
- for (const item of scoped) {
24
- const frontmatter = ['---', `applyTo: ${(0, shared_1.yamlString)(item.frontmatter.paths.join(','))}`, '---'].join('\n');
25
- files.push({
26
- path: `.github/instructions/ethlete-${item.frontmatter.name}.instructions.md`,
27
- contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
28
- });
29
- }
30
- const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links }));
31
- if (unscoped.length > 0) {
32
- sections.push([
33
- '## Ethlete reference docs',
34
- 'Read the matching file before starting that kind of work — do not work from memory.',
35
- (0, shared_1.pointerTable)({ skills: unscoped, context, pathFor: shared_1.neutralBodyPath }),
36
- ].join('\n\n'));
37
- }
14
+ const banner = render_1.BANNER;
15
+ const sections = context.rules.map((item) => (0, shared_1.body)({ item, context, links: (0, shared_1.agentsSkillsLinks)(context) }));
38
16
  const block = (0, shared_1.document)([banner, ...sections]).trimEnd();
39
- files.push({ path: exports.COPILOT_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) });
40
- return files;
17
+ return [{ path: exports.COPILOT_FILE, contents: (0, render_1.replaceMarkedBlock)({ existing, block }) }];
41
18
  };
42
19
  exports.emitCopilot = emitCopilot;
43
20
  //# sourceMappingURL=copilot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/copilot.ts"],"names":[],"mappings":";;;AAAA,sCAA4D;AAC5D,qCAUkB;AAEL,QAAA,YAAY,GAAG,iCAAiC,CAAC;AAE9D;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAChG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,kBAAS,EAAC;QACtB,OAAO;QACP,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAA,wBAAe,EAAC,IAAI,CAAC,IAAI;QAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,IAAA,4BAAmB,EAAC,MAAM,CAAC,IAAI;KAC3D,CAAC,CAAC;IACH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAEtF,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,YAAY,IAAA,mBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1G,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,gCAAgC,IAAI,CAAC,WAAW,CAAC,IAAI,kBAAkB;YAC7E,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CACX;YACE,2BAA2B;YAC3B,qFAAqF;YACrF,IAAA,qBAAY,EAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAe,EAAE,CAAC;SACtE,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAExD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAY,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAEtF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAvCW,QAAA,WAAW,eAuCtB"}
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/copilot.ts"],"names":[],"mappings":";;;AAAA,sCAAuD;AACvD,qCAAuF;AAE1E,QAAA,YAAY,GAAG,iCAAiC,CAAC;AAE9D;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,OAAmD,EAAiB,EAAE;IAChG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,MAAM,GAAG,eAAM,CAAC;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAExD,OAAO,CAAC,EAAE,IAAI,EAAE,oBAAY,EAAE,QAAQ,EAAE,IAAA,2BAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB"}
@@ -1,7 +1,7 @@
1
1
  import { EmitContext, EmittedFile } from './shared';
2
2
  /**
3
- * Cursor has no bundle concept, so a skill's resource files stay in the neutral `.agents/ethlete/`
4
- * tree and the rule points at them. Rules apply always; skills are "agent requested" — Cursor picks
5
- * them from the description, or attaches them automatically when `globs` match the open file.
3
+ * Always-loaded rules become `alwaysApply` `.mdc` files (path-scoped ones via `globs`). Skills are
4
+ * not mirrored here — Cursor discovers them from `.agents/skills/` like every other
5
+ * agentskills.io-aware tool.
6
6
  */
7
7
  export declare const emitCursor: (context: EmitContext) => EmittedFile[];
@@ -4,24 +4,20 @@ exports.emitCursor = void 0;
4
4
  const render_1 = require("../render");
5
5
  const shared_1 = require("./shared");
6
6
  /**
7
- * Cursor has no bundle concept, so a skill's resource files stay in the neutral `.agents/ethlete/`
8
- * tree and the rule points at them. Rules apply always; skills are "agent requested" — Cursor picks
9
- * them from the description, or attaches them automatically when `globs` match the open file.
7
+ * Always-loaded rules become `alwaysApply` `.mdc` files (path-scoped ones via `globs`). Skills are
8
+ * not mirrored here — Cursor discovers them from `.agents/skills/` like every other
9
+ * agentskills.io-aware tool.
10
10
  */
11
11
  const emitCursor = (context) => {
12
- const banner = (0, render_1.buildBanner)(context.version);
13
- const links = (0, shared_1.makeLinks)({
14
- context,
15
- skill: (name) => `the **\`ethlete-${name}\`** rule`,
16
- resource: (target) => `\`${(0, shared_1.neutralResourcePath)(target)}\``,
17
- });
18
- const emit = (options) => options.items.map((item) => {
12
+ const banner = render_1.BANNER;
13
+ const links = (0, shared_1.agentsSkillsLinks)(context);
14
+ return context.rules.map((item) => {
19
15
  const { name, paths } = item.frontmatter;
20
16
  const frontmatter = [
21
17
  '---',
22
18
  `description: ${(0, shared_1.yamlString)((0, shared_1.description)({ item, context }))}`,
23
19
  paths.length > 0 ? `globs: ${paths.join(',')}` : 'globs:',
24
- `alwaysApply: ${options.alwaysApply}`,
20
+ 'alwaysApply: true',
25
21
  '---',
26
22
  ].join('\n');
27
23
  return {
@@ -29,7 +25,6 @@ const emitCursor = (context) => {
29
25
  contents: (0, shared_1.document)([frontmatter, banner, (0, shared_1.body)({ item, context, links })]),
30
26
  };
31
27
  });
32
- return [...emit({ items: context.rules, alwaysApply: true }), ...emit({ items: context.skills, alwaysApply: false })];
33
28
  };
34
29
  exports.emitCursor = emitCursor;
35
30
  //# sourceMappingURL=cursor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/cursor.ts"],"names":[],"mappings":";;;AAAA,sCAAwC;AACxC,qCASkB;AAElB;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,kBAAS,EAAC;QACtB,OAAO;QACP,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,WAAW;QACnD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,IAAA,4BAAmB,EAAC,MAAM,CAAC,IAAI;KAC3D,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,OAA8D,EAAE,EAAE,CAC9E,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,gBAAgB,IAAA,mBAAU,EAAC,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;YAC5D,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YACzD,gBAAgB,OAAO,CAAC,WAAW,EAAE;YACrC,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,IAAI,EAAE,yBAAyB,IAAI,MAAM;YACzC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACxH,CAAC,CAAC;AA1BW,QAAA,UAAU,cA0BrB"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/cursor.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AACnC,qCAAgH;AAEhH;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAiB,EAAE;IAChE,MAAM,MAAM,GAAG,eAAM,CAAC;IACtB,MAAM,KAAK,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,gBAAgB,IAAA,mBAAU,EAAC,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;YAC5D,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YACzD,mBAAmB;YACnB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,IAAI,EAAE,yBAAyB,IAAI,MAAM;YACzC,QAAQ,EAAE,IAAA,iBAAQ,EAAC,CAAC,WAAW,EAAE,MAAM,EAAE,IAAA,aAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAnBW,QAAA,UAAU,cAmBrB"}
@@ -0,0 +1,24 @@
1
+ import { EmittedFile } from './shared';
2
+ export declare const HUSKY_DIR = ".husky";
3
+ export declare const START_MARKER = "# ethlete:git-flow:start";
4
+ export declare const END_MARKER = "# ethlete:git-flow:end";
5
+ /**
6
+ * Git hooks a repo can opt into via the config's `gitHooks` array. Like the agent hooks these never
7
+ * default: a generated block that can reject a developer's push is a higher-stakes artifact than a
8
+ * markdown one, so a repo asks for it.
9
+ */
10
+ export declare const KNOWN_GIT_HOOKS: Record<string, {
11
+ file: string;
12
+ }>;
13
+ export declare const assertKnownGitHooks: (hooks: string[]) => void;
14
+ export declare const huskyHookPath: (name: string) => string;
15
+ /**
16
+ * Appends the check to whatever the repo already has in `.husky/<name>`, between markers — those
17
+ * files routinely hold a git-lfs hook that must keep running and must keep reading stdin first,
18
+ * which is why the appended block never consumes it.
19
+ */
20
+ export declare const emitGitHooks: (options: {
21
+ gitHooks: string[];
22
+ huskyExists: boolean;
23
+ existing: Record<string, string>;
24
+ }) => EmittedFile[];
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emitGitHooks = exports.huskyHookPath = exports.assertKnownGitHooks = exports.KNOWN_GIT_HOOKS = exports.END_MARKER = exports.START_MARKER = exports.HUSKY_DIR = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const load_content_1 = require("../load-content");
7
+ const render_1 = require("../render");
8
+ exports.HUSKY_DIR = '.husky';
9
+ exports.START_MARKER = '# ethlete:git-flow:start';
10
+ exports.END_MARKER = '# ethlete:git-flow:end';
11
+ /**
12
+ * Git hooks a repo can opt into via the config's `gitHooks` array. Like the agent hooks these never
13
+ * default: a generated block that can reject a developer's push is a higher-stakes artifact than a
14
+ * markdown one, so a repo asks for it.
15
+ */
16
+ exports.KNOWN_GIT_HOOKS = {
17
+ 'pre-push': { file: 'pre-push.sh' },
18
+ 'post-checkout': { file: 'post-checkout.sh' },
19
+ };
20
+ const assertKnownGitHooks = (hooks) => {
21
+ const unknown = hooks.filter((name) => !(name in exports.KNOWN_GIT_HOOKS));
22
+ if (unknown.length > 0) {
23
+ throw new Error(`Unknown git hook(s): ${unknown.join(', ')}. Known git hooks: ${Object.keys(exports.KNOWN_GIT_HOOKS).join(', ')}.`);
24
+ }
25
+ };
26
+ exports.assertKnownGitHooks = assertKnownGitHooks;
27
+ const huskyHookPath = (name) => `${exports.HUSKY_DIR}/${name}`;
28
+ exports.huskyHookPath = huskyHookPath;
29
+ const SHEBANG = '#!/bin/sh\n';
30
+ const block = (options) => {
31
+ const { file } = options;
32
+ const body = (0, fs_1.readFileSync)((0, path_1.join)((0, load_content_1.resolveContentRoot)(), 'git-hooks', file), 'utf8');
33
+ return [
34
+ '# Generated by @ethlete/agent-rules — DO NOT EDIT between the markers. Run `npx ethlete-agents sync`.',
35
+ '# Set ETHLETE_GIT_FLOW_SKIP=1 to silence it on this machine.',
36
+ body.trimEnd(),
37
+ ].join('\n');
38
+ };
39
+ /**
40
+ * Appends the check to whatever the repo already has in `.husky/<name>`, between markers — those
41
+ * files routinely hold a git-lfs hook that must keep running and must keep reading stdin first,
42
+ * which is why the appended block never consumes it.
43
+ */
44
+ const emitGitHooks = (options) => {
45
+ const { gitHooks, huskyExists, existing } = options;
46
+ if (!huskyExists)
47
+ return [];
48
+ return Object.entries(exports.KNOWN_GIT_HOOKS).flatMap(([name, definition]) => {
49
+ var _a;
50
+ const path = (0, exports.huskyHookPath)(name);
51
+ const current = (_a = existing[name]) !== null && _a !== void 0 ? _a : '';
52
+ if (!gitHooks.includes(name)) {
53
+ const stripped = (0, render_1.removeMarkedBlock)({ existing: current, startMarker: exports.START_MARKER, endMarker: exports.END_MARKER });
54
+ return stripped === current ? [] : [{ path, contents: stripped.trim().length > 0 ? stripped : SHEBANG }];
55
+ }
56
+ return [
57
+ {
58
+ path,
59
+ contents: (0, render_1.replaceMarkedBlock)({
60
+ existing: current.trim().length > 0 ? current : SHEBANG,
61
+ block: block({ file: definition.file }),
62
+ startMarker: exports.START_MARKER,
63
+ endMarker: exports.END_MARKER,
64
+ }),
65
+ },
66
+ ];
67
+ });
68
+ };
69
+ exports.emitGitHooks = emitGitHooks;
70
+ //# sourceMappingURL=git-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hooks.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/targets/git-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { EmittedFile } from './shared';
2
+ type HookDefinition = {
3
+ event: string;
4
+ file: string;
5
+ timeout: number;
6
+ };
7
+ /**
8
+ * Hooks a repo can opt into via the config's `hooks` array. Hooks run arbitrary commands on the
9
+ * developer's machine, so unlike rules and skills they are never emitted by default.
10
+ */
11
+ export declare const KNOWN_HOOKS: Record<string, HookDefinition>;
12
+ export declare const assertKnownHooks: (hooks: string[]) => void;
13
+ /**
14
+ * Rewrites the generated entries declaratively: every entry whose command points into the
15
+ * agent's `hooks/ethlete/` directory is dropped and the currently enabled hooks are re-added, so
16
+ * disabling a hook in the config also unregisters it. Everything else in the file is untouched.
17
+ */
18
+ export declare const mergeHookSettings: (options: {
19
+ existing: string;
20
+ hooks: string[];
21
+ hooksDir: string;
22
+ commandFor: (file: string) => string;
23
+ }) => string;
24
+ export declare const emitHookScripts: (options: {
25
+ hooks: string[];
26
+ hooksDir: string;
27
+ }) => EmittedFile[];
28
+ /** Only planned when the parsed content actually changes; an unparseable file is left alone. */
29
+ export declare const emitHookSettings: (options: {
30
+ path: string;
31
+ existing: string;
32
+ hooks: string[];
33
+ hooksDir: string;
34
+ commandFor: (file: string) => string;
35
+ createWhenEmpty: boolean;
36
+ }) => EmittedFile[];
37
+ export {};