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

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 +275 -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 +193 -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
package/src/lib/config.js CHANGED
@@ -1,19 +1,76 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadConfig = exports.detectTargets = exports.readLocalConfig = exports.LOCAL_CONFIG_FILE_NAME = exports.CONFIG_FILE_NAME = exports.AGENT_TARGETS = void 0;
3
+ exports.loadConfig = exports.detectTargets = exports.readLocalConfig = exports.TOPOLOGY_CONFIG_FILE_NAME = exports.MOVED_LOCAL_CONFIG_KEYS = exports.LOCAL_CONFIG_KEYS = exports.resolveRepoRoot = exports.LOCAL_CONFIG_FILE_NAME = exports.CONFIG_FILE_NAME = exports.AGENT_TARGETS = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
+ const commitlint_1 = require("./commitlint");
7
+ const git_flow_1 = require("./git-flow");
6
8
  const load_content_1 = require("./load-content");
9
+ const package_runner_1 = require("./package-runner");
7
10
  exports.AGENT_TARGETS = ['claude', 'codex', 'cursor', 'copilot'];
8
11
  exports.CONFIG_FILE_NAME = 'ethlete-agents.config.json';
9
12
  exports.LOCAL_CONFIG_FILE_NAME = 'ethlete-agents.config.local.json';
13
+ /** The nearest directory at or above `start` holding an `ethlete-agents.config.json`, else `start`. */
14
+ const resolveRepoRoot = (start) => {
15
+ let current = start;
16
+ while (!(0, fs_1.existsSync)((0, path_1.join)(current, exports.CONFIG_FILE_NAME))) {
17
+ const parent = (0, path_1.dirname)(current);
18
+ if (parent === current)
19
+ return start;
20
+ current = parent;
21
+ }
22
+ return current;
23
+ };
24
+ exports.resolveRepoRoot = resolveRepoRoot;
25
+ const RAW_CONFIG_KEYS = [
26
+ 'targets',
27
+ 'profile',
28
+ 'vars',
29
+ 'exclude',
30
+ 'claudeMdImportsAgentsMd',
31
+ 'hooks',
32
+ 'gitHooks',
33
+ 'gitFlow',
34
+ 'jira',
35
+ ];
36
+ const parseJson = (text) => {
37
+ try {
38
+ return { value: JSON.parse(text) };
39
+ }
40
+ catch (error) {
41
+ return { error: error instanceof Error ? error.message : String(error) };
42
+ }
43
+ };
10
44
  const readRawConfig = (root) => {
11
45
  const path = (0, path_1.join)(root, exports.CONFIG_FILE_NAME);
12
46
  if (!(0, fs_1.existsSync)(path))
13
47
  return {};
14
- return JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
48
+ const parsed = parseJson((0, fs_1.readFileSync)(path, 'utf8'));
49
+ if ('error' in parsed)
50
+ throw new Error(`${exports.CONFIG_FILE_NAME}: ${parsed.error}`);
51
+ const { value } = parsed;
52
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
53
+ throw new Error(`${exports.CONFIG_FILE_NAME}: expected a JSON object.`);
54
+ }
55
+ return value;
56
+ };
57
+ const unknownConfigKeyWarnings = (raw) => {
58
+ const unknown = Object.keys(raw).filter((key) => !RAW_CONFIG_KEYS.includes(key));
59
+ return unknown.length
60
+ ? [
61
+ `${exports.CONFIG_FILE_NAME} has unknown key(s): ${unknown.join(', ')} — sync ignores them. Known keys: ${RAW_CONFIG_KEYS.join(', ')}.`,
62
+ ]
63
+ : [];
15
64
  };
16
- const LOCAL_CONFIG_KEYS = ['disableHooks', 'sdkSourcePath'];
65
+ exports.LOCAL_CONFIG_KEYS = ['disableHooks', 'disableAutoHandoffSave'];
66
+ /**
67
+ * Repo topology moved to `@ethlete/cli`'s `ethlete.config.local.json`, because `et` needs it too.
68
+ * Still recognised here so a checkout that has not moved them yet gets told where they went
69
+ * instead of an "unsupported key" warning.
70
+ */
71
+ exports.MOVED_LOCAL_CONFIG_KEYS = ['sdkSourcePath', 'apiRepoPaths', 'apiRepoBranches'];
72
+ /** Named only to point a migration at it. `@ethlete/cli` owns the file and validates its values. */
73
+ exports.TOPOLOGY_CONFIG_FILE_NAME = 'ethlete.config.local.json';
17
74
  const readLocalConfig = (root) => {
18
75
  const path = (0, path_1.join)(root, exports.LOCAL_CONFIG_FILE_NAME);
19
76
  if (!(0, fs_1.existsSync)(path))
@@ -28,8 +85,10 @@ const readLocalConfig = (root) => {
28
85
  if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
29
86
  return { exists: true, valid: false };
30
87
  const config = parsed;
31
- const unknownKeys = Object.keys(config).filter((key) => !LOCAL_CONFIG_KEYS.includes(key));
32
- return { exists: true, valid: true, config, unknownKeys };
88
+ const keys = Object.keys(config);
89
+ const movedKeys = keys.filter((key) => exports.MOVED_LOCAL_CONFIG_KEYS.includes(key));
90
+ const unknownKeys = keys.filter((key) => !exports.LOCAL_CONFIG_KEYS.includes(key) && !movedKeys.includes(key));
91
+ return { exists: true, valid: true, config, unknownKeys, movedKeys };
33
92
  };
34
93
  exports.readLocalConfig = readLocalConfig;
35
94
  /**
@@ -55,21 +114,38 @@ const assertKnownTargets = (targets) => {
55
114
  throw new Error(`Unknown target(s): ${unknown.join(', ')}. Known targets: ${exports.AGENT_TARGETS.join(', ')}.`);
56
115
  }
57
116
  };
117
+ /**
118
+ * The git-flow skill interpolates the grammar it teaches from the same `gitFlow` block the
119
+ * validator reads, so the documented convention cannot drift from the enforced one. A repo can
120
+ * still override any of these through `vars`.
121
+ */
122
+ const gitFlowVars = (gitFlow) => ({
123
+ gitFlowDevelopmentBranch: gitFlow.baseBranches.development,
124
+ gitFlowProductionBranch: gitFlow.baseBranches.production,
125
+ gitFlowTypes: gitFlow.types,
126
+ gitFlowEnforcement: gitFlow.enforcement,
127
+ gitFlowSubPrefix: gitFlow.subPrefix,
128
+ });
58
129
  const loadConfig = (options) => {
59
- var _a, _b, _c, _d, _e;
130
+ var _a, _b, _c, _d, _e, _f, _g;
60
131
  const { root, targetOverride } = options;
61
132
  const raw = readRawConfig(root);
62
133
  const configured = raw.targets && raw.targets !== 'auto' ? raw.targets : undefined;
63
134
  const targets = (_a = targetOverride !== null && targetOverride !== void 0 ? targetOverride : configured) !== null && _a !== void 0 ? _a : (0, exports.detectTargets)(root);
135
+ const gitFlow = (0, git_flow_1.resolveGitFlowConfig)(raw.gitFlow);
64
136
  assertKnownTargets(targets);
65
137
  return {
66
138
  root,
67
139
  targets,
68
- scopes: raw.profile === 'sdk' ? ['both'] : ['consumer', 'both'],
69
- vars: Object.assign(Object.assign({}, (0, load_content_1.loadDefaultVars)()), ((_b = raw.vars) !== null && _b !== void 0 ? _b : {})),
140
+ scopes: raw.profile === 'sdk' ? ['sdk', 'both'] : ['consumer', 'both'],
141
+ vars: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (0, load_content_1.loadDefaultVars)()), (0, package_runner_1.detectCommandVars)(root)), { packageRunner: (0, package_runner_1.detectPackageRunner)(root) }), gitFlowVars(gitFlow)), (0, commitlint_1.commitMessageVars)((0, commitlint_1.findCommitlintConfig)(root))), ((_b = raw.vars) !== null && _b !== void 0 ? _b : {})),
70
142
  exclude: (_c = raw.exclude) !== null && _c !== void 0 ? _c : [],
71
143
  claudeMdImportsAgentsMd: (_d = raw.claudeMdImportsAgentsMd) !== null && _d !== void 0 ? _d : false,
72
144
  hooks: (_e = raw.hooks) !== null && _e !== void 0 ? _e : [],
145
+ gitHooks: (_f = raw.gitHooks) !== null && _f !== void 0 ? _f : [],
146
+ gitFlow,
147
+ jira: (_g = raw.jira) !== null && _g !== void 0 ? _g : {},
148
+ configWarnings: unknownConfigKeyWarnings(raw),
73
149
  };
74
150
  };
75
151
  exports.loadConfig = loadConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { SyncConfig } from './config';
2
2
  import { ContentItem } from './load-content';
3
+ export type SkipCause = 'excluded' | 'scope' | 'requires' | 'vars';
3
4
  export type SkippedItem = {
4
5
  name: string;
6
+ cause: SkipCause;
5
7
  reason: string;
6
8
  };
7
9
  export type FilterResult = {
package/src/lib/filter.js CHANGED
@@ -24,21 +24,21 @@ const filterContent = (items, config) => {
24
24
  for (const item of items) {
25
25
  const { name, scope, requires, vars } = item.frontmatter;
26
26
  if (config.exclude.includes(name)) {
27
- skipped.push({ name, reason: 'excluded by config' });
27
+ skipped.push({ name, cause: 'excluded', reason: 'excluded by config' });
28
28
  continue;
29
29
  }
30
30
  if (!config.scopes.includes(scope)) {
31
- skipped.push({ name, reason: `scope "${scope}" is not emitted for this profile` });
31
+ skipped.push({ name, cause: 'scope', reason: `scope "${scope}" is not emitted for this profile` });
32
32
  continue;
33
33
  }
34
34
  const missingPackage = requires.find((packageName) => !(0, exports.isPackageInstalled)(config.root, packageName));
35
35
  if (missingPackage) {
36
- skipped.push({ name, reason: `requires ${missingPackage}, which is not installed` });
36
+ skipped.push({ name, cause: 'requires', reason: `requires ${missingPackage}, which is not installed` });
37
37
  continue;
38
38
  }
39
39
  const missingVar = vars.find((varName) => config.vars[varName] === undefined);
40
40
  if (missingVar) {
41
- skipped.push({ name, reason: `needs the "${missingVar}" variable — set it in vars` });
41
+ skipped.push({ name, cause: 'vars', reason: `needs the "${missingVar}" variable — set it in vars` });
42
42
  continue;
43
43
  }
44
44
  kept.push(item);
@@ -1 +1 @@
1
- {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/filter.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA4B;AAoB5B;;;GAGG;AACI,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAE,EAAE;IACtE,IAAI,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,IAAI,EAAE,cAAc,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnF,MAAM,YAAY,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEhD,IAAI,CAAC,IAAA,eAAU,EAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,YAAY,EAAE,MAAM,CAAC,CAAoB,CAAC;IACnF,MAAM,QAAQ,iDACT,QAAQ,CAAC,YAAY,GACrB,QAAQ,CAAC,eAAe,GACxB,QAAQ,CAAC,gBAAgB,CAC7B,CAAC;IAEF,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACrE,CAAC,CAAC;AAfW,QAAA,kBAAkB,sBAe7B;AAEK,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,MAAkB,EAAgB,EAAE;IACtF,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAEzD,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,KAAK,mCAAmC,EAAE,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAA,0BAAkB,EAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QAErG,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,cAAc,0BAA0B,EAAE,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;QAE9E,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,UAAU,6BAA6B,EAAE,CAAC,CAAC;YACtF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC;AAnCW,QAAA,aAAa,iBAmCxB"}
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/filter.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA4B;AAuB5B;;;GAGG;AACI,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAE,EAAE;IACtE,IAAI,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,IAAI,EAAE,cAAc,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnF,MAAM,YAAY,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEhD,IAAI,CAAC,IAAA,eAAU,EAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,YAAY,EAAE,MAAM,CAAC,CAAoB,CAAC;IACnF,MAAM,QAAQ,iDACT,QAAQ,CAAC,YAAY,GACrB,QAAQ,CAAC,eAAe,GACxB,QAAQ,CAAC,gBAAgB,CAC7B,CAAC;IAEF,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACrE,CAAC,CAAC;AAfW,QAAA,kBAAkB,sBAe7B;AAEK,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,MAAkB,EAAgB,EAAE;IACtF,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAEzD,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,KAAK,mCAAmC,EAAE,CAAC,CAAC;YACnG,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAA,0BAAkB,EAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QAErG,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,cAAc,0BAA0B,EAAE,CAAC,CAAC;YACxG,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;QAE9E,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAAU,6BAA6B,EAAE,CAAC,CAAC;YACrG,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC;AAnCW,QAAA,aAAa,iBAmCxB"}
@@ -10,6 +10,8 @@ export type Frontmatter = {
10
10
  requires: string[];
11
11
  paths: string[];
12
12
  vars: string[];
13
+ /** `false` keeps an agent from invoking the skill on its own, so only the user can start it. */
14
+ modelInvocation: boolean;
13
15
  };
14
16
  export type ParsedDocument = {
15
17
  frontmatter: Frontmatter;
@@ -4,7 +4,7 @@ exports.parseFrontmatter = exports.CONTENT_SCOPES = exports.CONTENT_KINDS = void
4
4
  exports.CONTENT_KINDS = ['rule', 'skill'];
5
5
  exports.CONTENT_SCOPES = ['consumer', 'sdk', 'both'];
6
6
  const FENCE = '---';
7
- const KNOWN_KEYS = ['name', 'description', 'kind', 'scope', 'requires', 'paths', 'vars'];
7
+ const KNOWN_KEYS = ['name', 'description', 'kind', 'scope', 'requires', 'paths', 'vars', 'modelInvocation'];
8
8
  const LIST_KEYS = ['requires', 'paths', 'vars'];
9
9
  const unquote = (value) => {
10
10
  const trimmed = value.trim();
@@ -16,10 +16,34 @@ const parseInlineList = (value) => {
16
16
  const inner = value.trim().slice(1, -1).trim();
17
17
  if (!inner)
18
18
  return [];
19
- return inner
20
- .split(',')
21
- .map(unquote)
22
- .filter((entry) => entry.length > 0);
19
+ const entries = [];
20
+ let quote = null;
21
+ let current = '';
22
+ for (const char of inner) {
23
+ if (quote) {
24
+ if (char === quote)
25
+ quote = null;
26
+ }
27
+ else if (char === "'" || char === '"') {
28
+ quote = char;
29
+ }
30
+ else if (char === ',') {
31
+ entries.push(current);
32
+ current = '';
33
+ continue;
34
+ }
35
+ current += char;
36
+ }
37
+ entries.push(current);
38
+ return entries.map(unquote).filter((entry) => entry.length > 0);
39
+ };
40
+ const parseBoolean = (options) => {
41
+ const { value, key, origin } = options;
42
+ if (value === undefined || value === 'true')
43
+ return true;
44
+ if (value === 'false')
45
+ return false;
46
+ throw new Error(`${origin}: "${key}" must be true or false, got "${value}".`);
23
47
  };
24
48
  const splitBlock = (source, origin) => {
25
49
  const normalized = source.replace(/\r\n/g, '\n');
@@ -66,6 +90,9 @@ const parseFrontmatter = (source, origin) => {
66
90
  if (!KNOWN_KEYS.includes(key)) {
67
91
  throw new Error(`${origin}: unknown frontmatter key "${key}". Known keys: ${KNOWN_KEYS.join(', ')}.`);
68
92
  }
93
+ if (Object.prototype.hasOwnProperty.call(raw, key)) {
94
+ throw new Error(`${origin}: frontmatter key "${key}" appears more than once.`);
95
+ }
69
96
  if (LIST_KEYS.includes(key) && !value) {
70
97
  raw[key] = [];
71
98
  listKey = key;
@@ -109,6 +136,7 @@ const parseFrontmatter = (source, origin) => {
109
136
  requires: readList('requires'),
110
137
  paths: readList('paths'),
111
138
  vars: readList('vars'),
139
+ modelInvocation: parseBoolean({ value: readText('modelInvocation'), key: 'modelInvocation', origin }),
112
140
  },
113
141
  body: body.trimEnd(),
114
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/frontmatter.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,CAAU,CAAC;AAC3C,QAAA,cAAc,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAoBnE,MAAM,KAAK,GAAG,KAAK,CAAC;AACpB,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACzF,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,IAAI,CAAC;QACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE7G,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,EAAE;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,OAAO,CAAC;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,MAAc,EAAE,EAAE;IACpD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC;IAE1E,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,gDAAgD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEzD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qDAAqD,CAAC,CAAC;IAClF,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,MAAc,EAAkB,EAAE;;IACjF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,GAAG,GAAsC,EAAE,CAAC;IAElD,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE1D,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAG,CAAC,CAAC,MAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,gBAAgB,IAAI,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;YACrF,CAAC;YAEA,GAAG,CAAC,OAAO,CAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,oCAAoC,IAAI,IAAI,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,8BAA8B,GAAG,kBAAkB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,GAAG,GAAG,CAAC;YACd,SAAS;QACX,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvB,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAEnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAA,QAAQ,CAAC,OAAO,CAAC,mCAAI,UAAU,CAAC;IAE9C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAC;IACxE,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yCAAyC,CAAC,CAAC;IACtF,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAC;IAExE,IAAI,CAAC,qBAAa,CAAC,QAAQ,CAAC,IAAmB,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,WAAW,IAAI,oBAAoB,qBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,sBAAc,CAAC,QAAQ,CAAC,KAAqB,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,YAAY,KAAK,oBAAoB,sBAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO;QACL,WAAW,EAAE;YACX,IAAI;YACJ,WAAW;YACX,IAAI,EAAE,IAAmB;YACzB,KAAK,EAAE,KAAqB;YAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC;YAC9B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;SACvB;QACD,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;KACrB,CAAC;AACJ,CAAC,CAAC;AAtFW,QAAA,gBAAgB,oBAsF3B"}
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { GitFlowConfig } from './config';
2
+ export declare const slugifySubject: (subject: string) => string;
3
+ /**
4
+ * `parent` is the full branch name the new branch nests under — `feat/FIP-2177-user-management`
5
+ * for a sub-feature, `release/2026.04.28` for a release fix. The nested name keeps that whole path
6
+ * under the config's `subPrefix`, so the parent stays derivable from the child.
7
+ */
8
+ export type BranchNameSpec = {
9
+ kind: 'main-feature';
10
+ type?: string;
11
+ key: string;
12
+ subject: string;
13
+ } | {
14
+ kind: 'sub-feature';
15
+ parent: string;
16
+ key: string;
17
+ subject: string;
18
+ } | {
19
+ kind: 'release';
20
+ date: string;
21
+ } | {
22
+ kind: 'release-fix';
23
+ parent: string;
24
+ key: string;
25
+ subject: string;
26
+ } | {
27
+ kind: 'hotfix';
28
+ key: string;
29
+ subject: string;
30
+ };
31
+ /** Builds a conforming branch name from the grammar. The single naming implementation. */
32
+ export declare const buildBranchName: (options: {
33
+ spec: BranchNameSpec;
34
+ config: GitFlowConfig;
35
+ }) => string;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildBranchName = exports.slugifySubject = void 0;
4
+ const slugifySubject = (subject) => subject
5
+ .trim()
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9]+/g, '-')
8
+ .replace(/^-+|-+$/g, '');
9
+ exports.slugifySubject = slugifySubject;
10
+ /** Builds a conforming branch name from the grammar. The single naming implementation. */
11
+ const buildBranchName = (options) => {
12
+ var _a;
13
+ const { spec, config } = options;
14
+ if (spec.kind === 'release')
15
+ return `${config.releasePrefix}/${spec.date}`;
16
+ const leaf = [spec.key.toUpperCase(), (0, exports.slugifySubject)(spec.subject)].filter(Boolean).join('-');
17
+ if (spec.kind === 'main-feature')
18
+ return `${(_a = spec.type) !== null && _a !== void 0 ? _a : 'feat'}/${leaf}`;
19
+ if (spec.kind === 'hotfix')
20
+ return `${config.hotfixPrefix}/${leaf}`;
21
+ return `${config.subPrefix}/${spec.parent}/${leaf}`;
22
+ };
23
+ exports.buildBranchName = buildBranchName;
24
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/build.ts"],"names":[],"mappings":";;;AAEO,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAChD,OAAO;KACJ,IAAI,EAAE;KACN,WAAW,EAAE;KACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;KAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AALhB,QAAA,cAAc,kBAKE;AAc7B,0FAA0F;AACnF,MAAM,eAAe,GAAG,CAAC,OAAwD,EAAE,EAAE;;IAC1F,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEjC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAE3E,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAA,sBAAc,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9F,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,GAAG,MAAA,IAAI,CAAC,IAAI,mCAAI,MAAM,IAAI,IAAI,EAAE,CAAC;IAC1E,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;IAEpE,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AACtD,CAAC,CAAC;AAXW,QAAA,eAAe,mBAW1B"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The branch grammar as data: one config drives the parser, the validators, the CLI, the generated
3
+ * skill and `@ethlete/timetrack`'s correlation engine.
4
+ *
5
+ * Nothing in this folder may import `fs`, `path` or `process`, or take a dependency — it is
6
+ * reachable as `@ethlete/agent-rules/git-flow` and gets bundled into a browser webview.
7
+ */
8
+ export declare const GIT_FLOW_RULES: readonly ["unknown-type", "missing-key", "key-case", "missing-subject", "type-alias", "deprecated-prefix", "release-date", "wrong-mr-target", "protected-push"];
9
+ export type GitFlowRule = (typeof GIT_FLOW_RULES)[number];
10
+ export type GitFlowSeverity = 'off' | 'warn' | 'error';
11
+ export type GitFlowEnforcement = 'advisory' | 'gated';
12
+ export type GitFlowBranchKind = 'main-feature' | 'sub-feature' | 'release' | 'release-fix' | 'hotfix' | 'protected' | 'unknown';
13
+ /**
14
+ * A legacy spelling that means one of the known kinds. `match` is a regular expression whose
15
+ * `subject` and `key` named groups feed `renameTo`, in which `<subject>` and `<KEY>` are the
16
+ * placeholders — an unresolved `<KEY>` is left in place, because only Jira can supply it.
17
+ */
18
+ export type GitFlowDeprecatedShape = {
19
+ match: string;
20
+ kind: GitFlowBranchKind;
21
+ renameTo: string;
22
+ };
23
+ export type GitFlowConfig = {
24
+ enforcement: GitFlowEnforcement;
25
+ /**
26
+ * The segment a nested branch is prefixed with. Git refuses a ref that is both a branch and a
27
+ * directory of branches, so a sub-feature cannot be spelled `<parent>/<KEY>-<subject>` while its
28
+ * parent exists — the push is rejected with "refname conflict". The prefix moves the whole nested
29
+ * tree out of the way while keeping the parent's full path inside the child's name.
30
+ */
31
+ subPrefix: string;
32
+ keyPattern: string;
33
+ /**
34
+ * Project prefixes a key may use, e.g. `["FIP"]`. Empty accepts anything `keyPattern` matches,
35
+ * which also accepts `chore/angular-22` as issue ANGULAR-22 — set this in any repo whose
36
+ * branch subjects can start with a word followed by a number.
37
+ */
38
+ keyPrefixes: string[];
39
+ baseBranches: {
40
+ development: string;
41
+ production: string;
42
+ };
43
+ types: string[];
44
+ typeAliases: Record<string, string>;
45
+ releasePrefix: string;
46
+ releasePattern: string;
47
+ hotfixPrefix: string;
48
+ subjectCase: 'kebab';
49
+ deprecatedShapes: GitFlowDeprecatedShape[];
50
+ severity: Record<GitFlowRule, GitFlowSeverity>;
51
+ };
52
+ export declare const DEFAULT_GIT_FLOW_CONFIG: GitFlowConfig;
53
+ export type RawGitFlowConfig = Partial<Omit<GitFlowConfig, 'baseBranches' | 'typeAliases' | 'severity'>> & {
54
+ baseBranches?: Partial<GitFlowConfig['baseBranches']>;
55
+ typeAliases?: Record<string, string>;
56
+ severity?: Partial<Record<GitFlowRule, GitFlowSeverity>>;
57
+ };
58
+ /** Fills a repo's `gitFlow` config block out to a complete grammar. */
59
+ export declare const resolveGitFlowConfig: (raw?: RawGitFlowConfig) => GitFlowConfig;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * The branch grammar as data: one config drives the parser, the validators, the CLI, the generated
4
+ * skill and `@ethlete/timetrack`'s correlation engine.
5
+ *
6
+ * Nothing in this folder may import `fs`, `path` or `process`, or take a dependency — it is
7
+ * reachable as `@ethlete/agent-rules/git-flow` and gets bundled into a browser webview.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.resolveGitFlowConfig = exports.DEFAULT_GIT_FLOW_CONFIG = exports.GIT_FLOW_RULES = void 0;
11
+ exports.GIT_FLOW_RULES = [
12
+ 'unknown-type',
13
+ 'missing-key',
14
+ 'key-case',
15
+ 'missing-subject',
16
+ 'type-alias',
17
+ 'deprecated-prefix',
18
+ 'release-date',
19
+ 'wrong-mr-target',
20
+ 'protected-push',
21
+ ];
22
+ exports.DEFAULT_GIT_FLOW_CONFIG = {
23
+ enforcement: 'advisory',
24
+ subPrefix: 'sub',
25
+ keyPattern: '[A-Z]{2,10}-\\d+',
26
+ keyPrefixes: [],
27
+ baseBranches: { development: 'next', production: 'main' },
28
+ types: ['feat', 'fix', 'refactor', 'chore', 'docs', 'spec', 'perf', 'test', 'style', 'build', 'ci'],
29
+ typeAliases: { feature: 'feat', bugfix: 'fix' },
30
+ releasePrefix: 'release',
31
+ releasePattern: '\\d{4}\\.\\d{2}\\.\\d{2}',
32
+ hotfixPrefix: 'hotfix',
33
+ subjectCase: 'kebab',
34
+ deprecatedShapes: [{ match: '^dev-(?<subject>.+)$', kind: 'main-feature', renameTo: 'feat/<KEY>-<subject>' }],
35
+ severity: {
36
+ 'unknown-type': 'warn',
37
+ 'missing-key': 'warn',
38
+ 'key-case': 'warn',
39
+ 'missing-subject': 'warn',
40
+ 'type-alias': 'warn',
41
+ 'deprecated-prefix': 'warn',
42
+ 'release-date': 'warn',
43
+ 'wrong-mr-target': 'warn',
44
+ 'protected-push': 'error',
45
+ },
46
+ };
47
+ /** Fills a repo's `gitFlow` config block out to a complete grammar. */
48
+ const resolveGitFlowConfig = (raw) => (Object.assign(Object.assign(Object.assign({}, exports.DEFAULT_GIT_FLOW_CONFIG), raw), { baseBranches: Object.assign(Object.assign({}, exports.DEFAULT_GIT_FLOW_CONFIG.baseBranches), raw === null || raw === void 0 ? void 0 : raw.baseBranches), typeAliases: Object.assign(Object.assign({}, exports.DEFAULT_GIT_FLOW_CONFIG.typeAliases), raw === null || raw === void 0 ? void 0 : raw.typeAliases), severity: Object.assign(Object.assign({}, exports.DEFAULT_GIT_FLOW_CONFIG.severity), raw === null || raw === void 0 ? void 0 : raw.severity) }));
49
+ exports.resolveGitFlowConfig = resolveGitFlowConfig;
50
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/config.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEU,QAAA,cAAc,GAAG;IAC5B,cAAc;IACd,aAAa;IACb,UAAU;IACV,iBAAiB;IACjB,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,iBAAiB;IACjB,gBAAgB;CACR,CAAC;AAiDE,QAAA,uBAAuB,GAAkB;IACpD,WAAW,EAAE,UAAU;IACvB,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,kBAAkB;IAC9B,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;IACzD,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;IACnG,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;IAC/C,aAAa,EAAE,SAAS;IACxB,cAAc,EAAE,0BAA0B;IAC1C,YAAY,EAAE,QAAQ;IACtB,WAAW,EAAE,OAAO;IACpB,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IAC7G,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM;QACtB,aAAa,EAAE,MAAM;QACrB,UAAU,EAAE,MAAM;QAClB,iBAAiB,EAAE,MAAM;QACzB,YAAY,EAAE,MAAM;QACpB,mBAAmB,EAAE,MAAM;QAC3B,cAAc,EAAE,MAAM;QACtB,iBAAiB,EAAE,MAAM;QACzB,gBAAgB,EAAE,OAAO;KAC1B;CACF,CAAC;AAQF,uEAAuE;AAChE,MAAM,oBAAoB,GAAG,CAAC,GAAsB,EAAiB,EAAE,CAAC,+CAC1E,+BAAuB,GACvB,GAAG,KACN,YAAY,kCAAO,+BAAuB,CAAC,YAAY,GAAK,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,YAAY,GAC7E,WAAW,kCAAO,+BAAuB,CAAC,WAAW,GAAK,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,GAC1E,QAAQ,kCAAO,+BAAuB,CAAC,QAAQ,GAAK,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,KACjE,CAAC;AANU,QAAA,oBAAoB,wBAM9B"}
@@ -0,0 +1,6 @@
1
+ export * from './build';
2
+ export * from './config';
3
+ export * from './parse';
4
+ export * from './rename';
5
+ export * from './start';
6
+ export * from './validate';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./build"), exports);
5
+ tslib_1.__exportStar(require("./config"), exports);
6
+ tslib_1.__exportStar(require("./parse"), exports);
7
+ tslib_1.__exportStar(require("./rename"), exports);
8
+ tslib_1.__exportStar(require("./start"), exports);
9
+ tslib_1.__exportStar(require("./validate"), exports);
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/index.ts"],"names":[],"mappings":";;;AAAA,kDAAwB;AACxB,mDAAyB;AACzB,kDAAwB;AACxB,mDAAyB;AACzB,kDAAwB;AACxB,qDAA2B"}
@@ -0,0 +1,49 @@
1
+ import { GitFlowBranchKind, GitFlowConfig, GitFlowRule } from './config';
2
+ export type GitFlowFinding = {
3
+ rule: GitFlowRule;
4
+ message: string;
5
+ /** The conforming spelling, when it can be derived without asking Jira for an issue key. */
6
+ suggestion?: string;
7
+ };
8
+ export type BranchParseResult = {
9
+ branch: string;
10
+ /** True only for a fully conforming name — an alias or a lowercase key still parses, but is not `ok`. */
11
+ ok: boolean;
12
+ kind: GitFlowBranchKind;
13
+ /** The normalized type segment (`feature/` resolves to `feat`). */
14
+ type?: string;
15
+ storyKey?: string;
16
+ taskKey?: string;
17
+ /** The most specific issue the branch names — what time should be logged against. */
18
+ issueKey?: string;
19
+ subject?: string;
20
+ /** The branch this one nests under, for a sub-feature or a release fix. */
21
+ parent?: string;
22
+ /** The branch matched a `deprecatedShapes` entry, so it should be excluded from adoption reports. */
23
+ deprecated: boolean;
24
+ expectedBase?: string;
25
+ expectedMrTargets: string[];
26
+ /** Set by `resolveThroughBase` when the story key came from the base branch rather than this name. */
27
+ inheritedFrom?: string;
28
+ suggestedName?: string;
29
+ findings: GitFlowFinding[];
30
+ };
31
+ export declare const stripRefPrefix: (ref: string) => string;
32
+ /**
33
+ * Classifies a branch name against the grammar. Never throws: an unrecognised name comes back as
34
+ * `kind: 'unknown'` with findings, so the validator and timetrack's correlation engine can read
35
+ * the same result for different purposes.
36
+ */
37
+ export declare const parseBranch: (options: {
38
+ branch: string;
39
+ config: GitFlowConfig;
40
+ }) => BranchParseResult;
41
+ /**
42
+ * Attributes a keyless branch through the branch it is based on. Reviewed branches land in an
43
+ * integration branch, so a flat name like `feat/logout-confirmation` usually has a parent that
44
+ * does carry the story key. Deterministic — no model involved.
45
+ */
46
+ export declare const resolveThroughBase: (options: {
47
+ branch: BranchParseResult;
48
+ base: BranchParseResult;
49
+ }) => BranchParseResult;