@ethlete/agent-rules 0.1.0-next.3 → 0.1.0-next.31

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 (200) hide show
  1. package/AGENTS.md +28 -0
  2. package/CHANGELOG.md +480 -0
  3. package/CLAUDE.md +1 -0
  4. package/README.md +362 -29
  5. package/THIRD-PARTY-LICENSES.md +35 -0
  6. package/content/defaults.json +1 -1
  7. package/content/git-hooks/post-checkout.sh +10 -0
  8. package/content/git-hooks/pre-push.sh +5 -0
  9. package/content/hooks/context-warning.py +872 -110
  10. package/content/hooks/subagent-model-policy.py +194 -0
  11. package/content/mods/.claude-plugin/marketplace.json +11 -0
  12. package/content/mods/plugins/e2e-progress/.claude-plugin/plugin.json +6 -0
  13. package/content/mods/plugins/e2e-progress/hooks/hooks.json +1 -0
  14. package/content/mods/plugins/e2e-progress/hooks/register.tsx +442 -0
  15. package/content/mods/plugins/e2e-progress/tsconfig.json +3 -0
  16. package/content/mods/plugins/e2e-progress/types/index.d.ts +23 -0
  17. package/content/output-styles/ste-clarity.md +131 -0
  18. package/content/rules/agent-sessions-wake-up.md +11 -0
  19. package/content/rules/app-styling.md +66 -0
  20. package/content/rules/comments.md +4 -1
  21. package/content/rules/lint-and-format.md +7 -5
  22. package/content/rules/nx-layout.md +50 -0
  23. package/content/rules/reactive-state.md +1 -1
  24. package/content/rules/styling.md +9 -7
  25. package/content/rules/subagent-models.md +39 -0
  26. package/content/skills/agent-sessions/SKILL.md +81 -0
  27. package/content/skills/agent-sessions/agent-sessions.mjs +498 -0
  28. package/content/skills/angular-patterns/SKILL.md +30 -7
  29. package/content/skills/api-source/SKILL.md +156 -0
  30. package/content/skills/app-testing/SKILL.md +141 -0
  31. package/content/skills/codex-subagent/SKILL.md +90 -0
  32. package/content/skills/codex-subagent/codex-agent.mjs +229 -0
  33. package/content/skills/design-exploration/SKILL.md +687 -0
  34. package/content/skills/design-exploration/check-story.mjs +139 -0
  35. package/content/skills/design-exploration/shoot-template.mjs +61 -0
  36. package/content/skills/domain-modeling/ADR-FORMAT.md +47 -0
  37. package/content/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  38. package/content/skills/domain-modeling/SKILL.md +80 -0
  39. package/content/skills/e2e-triage/SKILL.md +80 -0
  40. package/content/skills/figma-export/SKILL.md +191 -0
  41. package/content/skills/figma-export/dump-figma-layers.py +83 -0
  42. package/content/skills/figma-export/dump-figma-svg.py +235 -0
  43. package/content/skills/figma-export/measure-template.mjs +87 -0
  44. package/content/skills/git-commit/SKILL.md +11 -7
  45. package/content/skills/git-flow/SKILL.md +87 -0
  46. package/content/skills/grill-with-docs/SKILL.md +13 -0
  47. package/content/skills/grilling/SKILL.md +51 -0
  48. package/content/skills/handoff/SKILL.md +125 -5
  49. package/content/skills/query/SKILL.md +165 -64
  50. package/content/skills/rxjs-signals/SKILL.md +33 -4
  51. package/content/skills/sdk-docs/SKILL.md +50 -14
  52. package/content/skills/sdk-local-build/SKILL.md +26 -8
  53. package/content/skills/sdk-local-build/sdk-local-baseline.mjs +64 -0
  54. package/content/skills/sdk-source/SKILL.md +37 -34
  55. package/content/skills/sdk-update/SKILL.md +103 -0
  56. package/content/skills/story-styling/SKILL.md +10 -8
  57. package/content/skills/styleguide/SKILL.md +12 -7
  58. package/content/skills/styleguide/assets.md +54 -0
  59. package/content/skills/styleguide/changesets.md +17 -0
  60. package/content/skills/styleguide/file-structure.md +73 -0
  61. package/content/skills/styleguide/lint-rule-lookup.md +51 -0
  62. package/content/skills/styleguide/storybook-structure.md +25 -0
  63. package/content/skills/theming/SKILL.md +50 -28
  64. package/content/skills/timetrack/SKILL.md +397 -0
  65. package/content/skills/verify-in-app/SKILL.md +107 -0
  66. package/migrations/app-styling-utilities.md +63 -0
  67. package/migrations/list-state-query-form.md +20 -0
  68. package/migrations/nx-layout.md +29 -0
  69. package/migrations/sdk-components-over-hand-built-ui.md +27 -0
  70. package/migrations/search-query-field.md +52 -0
  71. package/migrations.json +48 -0
  72. package/package.json +19 -3
  73. package/src/index.js +85 -30
  74. package/src/index.js.map +1 -1
  75. package/src/lib/cli-args.d.ts +9 -0
  76. package/src/lib/cli-args.js +48 -0
  77. package/src/lib/cli-args.js.map +1 -0
  78. package/src/lib/commitlint.d.ts +10 -0
  79. package/src/lib/commitlint.js +51 -0
  80. package/src/lib/commitlint.js.map +1 -0
  81. package/src/lib/config.d.ts +41 -5
  82. package/src/lib/config.js +117 -10
  83. package/src/lib/config.js.map +1 -1
  84. package/src/lib/filter.d.ts +2 -0
  85. package/src/lib/filter.js +4 -4
  86. package/src/lib/filter.js.map +1 -1
  87. package/src/lib/frontmatter.d.ts +2 -0
  88. package/src/lib/frontmatter.js +33 -5
  89. package/src/lib/frontmatter.js.map +1 -1
  90. package/src/lib/git-flow/build.d.ts +35 -0
  91. package/src/lib/git-flow/build.js +24 -0
  92. package/src/lib/git-flow/build.js.map +1 -0
  93. package/src/lib/git-flow/config.d.ts +59 -0
  94. package/src/lib/git-flow/config.js +50 -0
  95. package/src/lib/git-flow/config.js.map +1 -0
  96. package/src/lib/git-flow/index.d.ts +6 -0
  97. package/src/lib/git-flow/index.js +23 -0
  98. package/src/lib/git-flow/index.js.map +1 -0
  99. package/src/lib/git-flow/parse.d.ts +49 -0
  100. package/src/lib/git-flow/parse.js +300 -0
  101. package/src/lib/git-flow/parse.js.map +1 -0
  102. package/src/lib/git-flow/rename.d.ts +24 -0
  103. package/src/lib/git-flow/rename.js +70 -0
  104. package/src/lib/git-flow/rename.js.map +1 -0
  105. package/src/lib/git-flow/start.d.ts +49 -0
  106. package/src/lib/git-flow/start.js +57 -0
  107. package/src/lib/git-flow/start.js.map +1 -0
  108. package/src/lib/git-flow/validate.d.ts +34 -0
  109. package/src/lib/git-flow/validate.js +72 -0
  110. package/src/lib/git-flow/validate.js.map +1 -0
  111. package/src/lib/git-flow-command.d.ts +4 -0
  112. package/src/lib/git-flow-command.js +165 -0
  113. package/src/lib/git-flow-command.js.map +1 -0
  114. package/src/lib/git-flow-repair.d.ts +17 -0
  115. package/src/lib/git-flow-repair.js +165 -0
  116. package/src/lib/git-flow-repair.js.map +1 -0
  117. package/src/lib/git-flow-start.d.ts +20 -0
  118. package/src/lib/git-flow-start.js +140 -0
  119. package/src/lib/git-flow-start.js.map +1 -0
  120. package/src/lib/git.d.ts +64 -0
  121. package/src/lib/git.js +131 -0
  122. package/src/lib/git.js.map +1 -0
  123. package/src/lib/gitlab.d.ts +35 -0
  124. package/src/lib/gitlab.js +116 -0
  125. package/src/lib/gitlab.js.map +1 -0
  126. package/src/lib/index.d.ts +2 -0
  127. package/src/lib/index.js +26 -11
  128. package/src/lib/index.js.map +1 -1
  129. package/src/lib/migrate.js +6 -1
  130. package/src/lib/migrate.js.map +1 -1
  131. package/src/lib/output-style-command.d.ts +3 -0
  132. package/src/lib/output-style-command.js +69 -0
  133. package/src/lib/output-style-command.js.map +1 -0
  134. package/src/lib/output-style.d.ts +38 -0
  135. package/src/lib/output-style.js +134 -0
  136. package/src/lib/output-style.js.map +1 -0
  137. package/src/lib/owned-paths.js +27 -3
  138. package/src/lib/owned-paths.js.map +1 -1
  139. package/src/lib/package-runner.d.ts +4 -0
  140. package/src/lib/package-runner.js +86 -0
  141. package/src/lib/package-runner.js.map +1 -0
  142. package/src/lib/plain-text.d.ts +9 -0
  143. package/src/lib/plain-text.js +22 -0
  144. package/src/lib/plain-text.js.map +1 -0
  145. package/src/lib/plan.d.ts +6 -6
  146. package/src/lib/plan.js +164 -40
  147. package/src/lib/plan.js.map +1 -1
  148. package/src/lib/prompt.d.ts +8 -0
  149. package/src/lib/prompt.js +35 -0
  150. package/src/lib/prompt.js.map +1 -0
  151. package/src/lib/render.d.ts +25 -2
  152. package/src/lib/render.js +43 -10
  153. package/src/lib/render.js.map +1 -1
  154. package/src/lib/sessions-command.d.ts +4 -0
  155. package/src/lib/sessions-command.js +16 -0
  156. package/src/lib/sessions-command.js.map +1 -0
  157. package/src/lib/sync.d.ts +0 -1
  158. package/src/lib/sync.js +30 -17
  159. package/src/lib/sync.js.map +1 -1
  160. package/src/lib/targets/agents-skills.js +1 -1
  161. package/src/lib/targets/agents-skills.js.map +1 -1
  162. package/src/lib/targets/claude-hooks.d.ts +3 -23
  163. package/src/lib/targets/claude-hooks.js +22 -86
  164. package/src/lib/targets/claude-hooks.js.map +1 -1
  165. package/src/lib/targets/claude-mods.d.ts +20 -0
  166. package/src/lib/targets/claude-mods.js +47 -0
  167. package/src/lib/targets/claude-mods.js.map +1 -0
  168. package/src/lib/targets/claude.js +2 -3
  169. package/src/lib/targets/claude.js.map +1 -1
  170. package/src/lib/targets/codex-hooks.d.ts +12 -0
  171. package/src/lib/targets/codex-hooks.js +35 -0
  172. package/src/lib/targets/codex-hooks.js.map +1 -0
  173. package/src/lib/targets/codex.js +4 -4
  174. package/src/lib/targets/codex.js.map +1 -1
  175. package/src/lib/targets/copilot.js +4 -4
  176. package/src/lib/targets/copilot.js.map +1 -1
  177. package/src/lib/targets/cursor.js +3 -3
  178. package/src/lib/targets/cursor.js.map +1 -1
  179. package/src/lib/targets/git-hooks.d.ts +25 -0
  180. package/src/lib/targets/git-hooks.js +71 -0
  181. package/src/lib/targets/git-hooks.js.map +1 -0
  182. package/src/lib/targets/hooks-shared.d.ts +60 -0
  183. package/src/lib/targets/hooks-shared.js +130 -0
  184. package/src/lib/targets/hooks-shared.js.map +1 -0
  185. package/src/lib/targets/mcp.d.ts +16 -0
  186. package/src/lib/targets/mcp.js +68 -0
  187. package/src/lib/targets/mcp.js.map +1 -0
  188. package/src/lib/targets/shared.d.ts +1 -9
  189. package/src/lib/targets/shared.js +4 -8
  190. package/src/lib/targets/shared.js.map +1 -1
  191. package/src/lib/timetrack-command.d.ts +11 -0
  192. package/src/lib/timetrack-command.js +1063 -0
  193. package/src/lib/timetrack-command.js.map +1 -0
  194. package/src/lib/timetrack-snapshot.d.ts +55 -0
  195. package/src/lib/timetrack-snapshot.js +120 -0
  196. package/src/lib/timetrack-snapshot.js.map +1 -0
  197. package/src/lib/timetrack.d.ts +561 -0
  198. package/src/lib/timetrack.js +279 -0
  199. package/src/lib/timetrack.js.map +1 -0
  200. package/content/skills/styleguide/STYLEGUIDE.md +0 -520
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./build"), exports);
18
+ __exportStar(require("./config"), exports);
19
+ __exportStar(require("./parse"), exports);
20
+ __exportStar(require("./rename"), exports);
21
+ __exportStar(require("./start"), exports);
22
+ __exportStar(require("./validate"), exports);
23
+ //# 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,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,6CAA2B"}
@@ -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;
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveThroughBase = exports.parseBranch = exports.stripRefPrefix = void 0;
4
+ const build_1 = require("./build");
5
+ const stripRefPrefix = (ref) => ref
6
+ .trim()
7
+ .replace(/^refs\/heads\//, '')
8
+ .replace(/^refs\/remotes\/[^/]+\//, '');
9
+ exports.stripRefPrefix = stripRefPrefix;
10
+ const hasKeyPrefix = (options) => {
11
+ var _a;
12
+ const key = (_a = options.key) === null || _a === void 0 ? void 0 : _a.toUpperCase();
13
+ const prefix = options.prefix.toUpperCase();
14
+ return !!(key === null || key === void 0 ? void 0 : key.startsWith(prefix)) && !/[A-Z0-9]/.test(key.charAt(prefix.length));
15
+ };
16
+ /**
17
+ * The key is only recognised anchored at the start of a segment. A trailing number is therefore
18
+ * never mistaken for one — `ratings-reveal-secondary-page-27` yields no key rather than a wrong
19
+ * one, and a confidently wrong attribution is worse than none.
20
+ */
21
+ const parseSegment = (options) => {
22
+ var _a, _b;
23
+ const { segment, config, role } = options;
24
+ const match = new RegExp(`^(?<etKey>${config.keyPattern})(?:-(?<etSubject>.*))?$`, 'i').exec(segment);
25
+ const rawKey = (_a = match === null || match === void 0 ? void 0 : match.groups) === null || _a === void 0 ? void 0 : _a['etKey'];
26
+ const known = config.keyPrefixes.length === 0
27
+ ? !!rawKey && rawKey === rawKey.toUpperCase()
28
+ : config.keyPrefixes.some((prefix) => hasKeyPrefix({ key: rawKey, prefix }));
29
+ if (!rawKey || !known) {
30
+ return {
31
+ subject: segment || undefined,
32
+ findings: [{ rule: 'missing-key', message: `"${segment}" carries no ${role} issue key.` }],
33
+ };
34
+ }
35
+ const key = rawKey.toUpperCase();
36
+ const subject = ((_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b['etSubject']) || undefined;
37
+ const findings = [];
38
+ if (rawKey !== key) {
39
+ findings.push({ rule: 'key-case', message: `Issue key "${rawKey}" should be uppercase "${key}".` });
40
+ }
41
+ if (!subject) {
42
+ findings.push({ rule: 'missing-subject', message: `"${segment}" names ${key} but has no subject.` });
43
+ }
44
+ return { key, subject, findings };
45
+ };
46
+ const matchDeprecatedShape = (options) => {
47
+ var _a;
48
+ const { branch, config } = options;
49
+ for (const shape of config.deprecatedShapes) {
50
+ const match = new RegExp(shape.match).exec(branch);
51
+ if (match)
52
+ return { shape, groups: (_a = match.groups) !== null && _a !== void 0 ? _a : {} };
53
+ }
54
+ return undefined;
55
+ };
56
+ const deprecatedKey = (options) => {
57
+ const { groups, config } = options;
58
+ const subject = groups['subject'];
59
+ if (groups['key'])
60
+ return { key: groups['key'].toUpperCase(), subject };
61
+ if (!subject)
62
+ return { subject };
63
+ const parts = parseSegment({ segment: subject, config, role: 'story' });
64
+ return parts.key ? { key: parts.key, subject: parts.subject } : { subject };
65
+ };
66
+ const renameSuggestion = (options) => {
67
+ const { shape, groups } = options;
68
+ const key = groups['key'];
69
+ return shape.renameTo
70
+ .replace(/<subject>/g, () => { var _a; return (_a = groups['subject']) !== null && _a !== void 0 ? _a : ''; })
71
+ .replace(/<KEY>/g, () => (key ? key.toUpperCase() : '<KEY>'));
72
+ };
73
+ const targetsForKind = (options) => {
74
+ const { kind, config, parent, branch } = options;
75
+ const { development, production } = config.baseBranches;
76
+ switch (kind) {
77
+ case 'main-feature':
78
+ return { expectedBase: development, expectedMrTargets: [development] };
79
+ case 'sub-feature':
80
+ case 'release-fix':
81
+ return { expectedBase: parent, expectedMrTargets: parent ? [parent] : [] };
82
+ case 'release':
83
+ return { expectedBase: development, expectedMrTargets: [development, production] };
84
+ case 'hotfix':
85
+ return { expectedBase: production, expectedMrTargets: [production] };
86
+ case 'protected':
87
+ return { expectedMrTargets: branch === development ? [production] : [development] };
88
+ default:
89
+ return { expectedMrTargets: [] };
90
+ }
91
+ };
92
+ /**
93
+ * Classifies a branch name against the grammar. Never throws: an unrecognised name comes back as
94
+ * `kind: 'unknown'` with findings, so the validator and timetrack's correlation engine can read
95
+ * the same result for different purposes.
96
+ */
97
+ const parseBranch = (options) => {
98
+ const { config } = options;
99
+ const branch = (0, exports.stripRefPrefix)(options.branch);
100
+ const segments = branch.split('/');
101
+ const unknown = (message) => ({
102
+ branch,
103
+ ok: false,
104
+ kind: 'unknown',
105
+ deprecated: false,
106
+ expectedMrTargets: [],
107
+ findings: [{ rule: 'unknown-type', message }],
108
+ });
109
+ if (!branch || segments.some((segment) => !segment))
110
+ return unknown(`"${options.branch}" is not a branch name.`);
111
+ if (branch === config.baseBranches.development || branch === config.baseBranches.production) {
112
+ return Object.assign({ branch, ok: true, kind: 'protected', deprecated: false, findings: [] }, targetsForKind({ kind: 'protected', config, branch }));
113
+ }
114
+ const deprecated = matchDeprecatedShape({ branch, config });
115
+ if (deprecated) {
116
+ const keyed = deprecatedKey({ groups: deprecated.groups, config });
117
+ const suggestion = renameSuggestion({
118
+ shape: deprecated.shape,
119
+ groups: Object.assign(Object.assign({}, deprecated.groups), { key: keyed.key, subject: keyed.subject }),
120
+ });
121
+ const keys = deprecated.shape.kind === 'main-feature'
122
+ ? { storyKey: keyed.key, issueKey: keyed.key }
123
+ : { taskKey: keyed.key, issueKey: keyed.key };
124
+ return Object.assign(Object.assign(Object.assign({ branch, ok: false, kind: deprecated.shape.kind }, keys), { subject: keyed.subject, deprecated: true, suggestedName: suggestion, findings: [
125
+ {
126
+ rule: 'deprecated-prefix',
127
+ message: `"${branch}" uses a deprecated spelling; rename it to ${suggestion}.`,
128
+ suggestion,
129
+ },
130
+ ] }), targetsForKind({ kind: deprecated.shape.kind, config }));
131
+ }
132
+ const [prefix, ...rest] = segments;
133
+ if (prefix === config.subPrefix)
134
+ return dropRedundantSuggestion(parseNested({ branch, segments: rest, config }));
135
+ if (prefix === config.releasePrefix)
136
+ return dropRedundantSuggestion(parseRelease({ branch, segments: rest, config }));
137
+ if (prefix === config.hotfixPrefix)
138
+ return dropRedundantSuggestion(parseHotfix({ branch, segments: rest, config }));
139
+ return dropRedundantSuggestion(parseFeature({ branch, prefix: prefix !== null && prefix !== void 0 ? prefix : '', segments: rest, config }));
140
+ };
141
+ exports.parseBranch = parseBranch;
142
+ const unrecognised = (options) => ({
143
+ branch: options.branch,
144
+ ok: false,
145
+ kind: 'unknown',
146
+ deprecated: false,
147
+ expectedMrTargets: [],
148
+ findings: [{ rule: 'unknown-type', message: options.message }],
149
+ });
150
+ /**
151
+ * `sub/<parent path>/<KEY>-<subject>` — the nested shape. The parent's full name is inside the
152
+ * child's, so the merge request target needs no lookup; only two levels are allowed, so a parent
153
+ * that is itself nested is not a shape.
154
+ */
155
+ const parseNested = (options) => {
156
+ var _a, _b, _c;
157
+ const { branch, segments, config } = options;
158
+ const leaf = segments[segments.length - 1];
159
+ const parent = segments.slice(0, -1).join('/');
160
+ if (!leaf || !parent) {
161
+ return unrecognised({ branch, message: `"${branch}" names no parent branch to nest under.` });
162
+ }
163
+ const parentParse = (0, exports.parseBranch)({ branch: parent, config });
164
+ const kind = nestedKindFor(parentParse);
165
+ if (!kind) {
166
+ return unrecognised({
167
+ branch,
168
+ message: `"${parent}" is not a branch anything can nest under — only a main feature or a release branch is.`,
169
+ });
170
+ }
171
+ const parts = parseSegment({ segment: leaf, config, role: kind === 'release-fix' ? 'bug' : 'task' });
172
+ const findings = [...parentParse.findings, ...parts.findings];
173
+ return Object.assign({ branch, ok: findings.length === 0, type: parentParse.type, kind, storyKey: parentParse.storyKey, taskKey: parts.key, issueKey: (_a = parts.key) !== null && _a !== void 0 ? _a : parentParse.storyKey, subject: parts.subject, parent, deprecated: false, findings, suggestedName: parts.key
174
+ ? (0, build_1.buildBranchName)({
175
+ spec: { kind, parent: (_b = parentParse.suggestedName) !== null && _b !== void 0 ? _b : parent, key: parts.key, subject: (_c = parts.subject) !== null && _c !== void 0 ? _c : '' },
176
+ config,
177
+ })
178
+ : undefined }, targetsForKind({ kind, config, parent }));
179
+ };
180
+ const nestedKindFor = (parent) => {
181
+ if (parent.kind === 'release')
182
+ return 'release-fix';
183
+ return parent.kind === 'main-feature' && !parent.deprecated ? 'sub-feature' : undefined;
184
+ };
185
+ /**
186
+ * The spelling the convention was originally written with, `<parent>/<KEY>-<subject>`. It parses so
187
+ * that `explain` and `repair` can say something useful about it, but it can never exist next to the
188
+ * parent it names — see `subPrefix`.
189
+ */
190
+ const nestedTooDeep = (options) => {
191
+ var _a, _b;
192
+ const { branch, kind, parent, leaf, config, storyKey, type } = options;
193
+ const suggestion = leaf.key
194
+ ? (0, build_1.buildBranchName)({ spec: { kind, parent, key: leaf.key, subject: (_a = leaf.subject) !== null && _a !== void 0 ? _a : '' }, config })
195
+ : `${config.subPrefix}/${branch}`;
196
+ return Object.assign({ branch, ok: false, kind,
197
+ type,
198
+ storyKey, taskKey: leaf.key, issueKey: (_b = leaf.key) !== null && _b !== void 0 ? _b : storyKey, subject: leaf.subject, parent, deprecated: true, suggestedName: suggestion, findings: [
199
+ {
200
+ rule: 'deprecated-prefix',
201
+ message: `"${branch}" cannot exist while ${parent} does — git rejects a ref that is both a branch and a directory of branches. Use ${suggestion}.`,
202
+ suggestion,
203
+ },
204
+ ] }, targetsForKind({ kind, config, parent }));
205
+ };
206
+ const dropRedundantSuggestion = (result) => result.suggestedName === result.branch ? Object.assign(Object.assign({}, result), { suggestedName: undefined }) : result;
207
+ const parseRelease = (options) => {
208
+ const { branch, segments, config } = options;
209
+ const [date, leaf, ...extra] = segments;
210
+ if (!date || extra.length > 0) {
211
+ return unrecognised({ branch, message: `"${branch}" is not a release or release-fix branch.` });
212
+ }
213
+ const findings = [];
214
+ if (!new RegExp(`^${config.releasePattern}$`).test(date)) {
215
+ findings.push({ rule: 'release-date', message: `"${date}" is not a release date (expected YYYY.MM.DD).` });
216
+ }
217
+ const parent = `${config.releasePrefix}/${date}`;
218
+ if (leaf === undefined) {
219
+ return Object.assign({ branch, ok: findings.length === 0, kind: 'release', deprecated: false, findings }, targetsForKind({ kind: 'release', config }));
220
+ }
221
+ return nestedTooDeep({
222
+ branch,
223
+ kind: 'release-fix',
224
+ parent,
225
+ leaf: parseSegment({ segment: leaf, config, role: 'bug' }),
226
+ config,
227
+ });
228
+ };
229
+ const parseHotfix = (options) => {
230
+ var _a;
231
+ const { branch, segments, config } = options;
232
+ const [leaf, ...extra] = segments;
233
+ if (!leaf || extra.length > 0) {
234
+ return {
235
+ branch,
236
+ ok: false,
237
+ kind: 'unknown',
238
+ deprecated: false,
239
+ expectedMrTargets: [],
240
+ findings: [{ rule: 'unknown-type', message: `"${branch}" is not a hotfix branch.` }],
241
+ };
242
+ }
243
+ const parts = parseSegment({ segment: leaf, config, role: 'bug' });
244
+ return Object.assign({ branch, ok: parts.findings.length === 0, kind: 'hotfix', taskKey: parts.key, issueKey: parts.key, subject: parts.subject, deprecated: false, findings: parts.findings, suggestedName: parts.key
245
+ ? (0, build_1.buildBranchName)({ spec: { kind: 'hotfix', key: parts.key, subject: (_a = parts.subject) !== null && _a !== void 0 ? _a : '' }, config })
246
+ : undefined }, targetsForKind({ kind: 'hotfix', config }));
247
+ };
248
+ const parseFeature = (options) => {
249
+ var _a;
250
+ const { branch, prefix, segments, config } = options;
251
+ const alias = Object.prototype.hasOwnProperty.call(config.typeAliases, prefix)
252
+ ? config.typeAliases[prefix]
253
+ : undefined;
254
+ const type = config.types.includes(prefix) ? prefix : alias;
255
+ const [story, task, ...extra] = segments;
256
+ if (!type || !story || extra.length > 0) {
257
+ return unrecognised({
258
+ branch,
259
+ message: `"${branch}" matches no branch shape; expected <type>/<KEY>-<subject> with type one of ${config.types.join(', ')}.`,
260
+ });
261
+ }
262
+ const findings = [];
263
+ if (alias && prefix !== type) {
264
+ findings.push({ rule: 'type-alias', message: `"${prefix}/" is an alias; use "${type}/".` });
265
+ }
266
+ const storyParts = parseSegment({ segment: story, config, role: 'story' });
267
+ if (task === undefined) {
268
+ findings.push(...storyParts.findings);
269
+ return Object.assign({ branch, ok: findings.length === 0, kind: 'main-feature', type, storyKey: storyParts.key, issueKey: storyParts.key, subject: storyParts.subject, deprecated: false, findings, suggestedName: storyParts.key
270
+ ? (0, build_1.buildBranchName)({
271
+ spec: { kind: 'main-feature', type, key: storyParts.key, subject: (_a = storyParts.subject) !== null && _a !== void 0 ? _a : '' },
272
+ config,
273
+ })
274
+ : undefined }, targetsForKind({ kind: 'main-feature', config }));
275
+ }
276
+ return nestedTooDeep({
277
+ branch,
278
+ kind: 'sub-feature',
279
+ parent: `${prefix}/${story}`,
280
+ leaf: parseSegment({ segment: task, config, role: 'task' }),
281
+ config,
282
+ storyKey: storyParts.key,
283
+ type,
284
+ });
285
+ };
286
+ /**
287
+ * Attributes a keyless branch through the branch it is based on. Reviewed branches land in an
288
+ * integration branch, so a flat name like `feat/logout-confirmation` usually has a parent that
289
+ * does carry the story key. Deterministic — no model involved.
290
+ */
291
+ const resolveThroughBase = (options) => {
292
+ var _a, _b;
293
+ const { branch, base } = options;
294
+ const inherited = (_a = base.storyKey) !== null && _a !== void 0 ? _a : base.taskKey;
295
+ if (branch.storyKey || !inherited)
296
+ return branch;
297
+ return Object.assign(Object.assign({}, branch), { storyKey: inherited, issueKey: (_b = branch.taskKey) !== null && _b !== void 0 ? _b : inherited, inheritedFrom: base.branch });
298
+ };
299
+ exports.resolveThroughBase = resolveThroughBase;
300
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { GitFlowConfig } from './config';
2
+ export type ConformingName = {
3
+ ok: true;
4
+ name: string;
5
+ } | {
6
+ ok: false;
7
+ /**
8
+ * `needs-key` is the only reason a caller can act on: file the issue, then ask again with the
9
+ * key it returned.
10
+ */
11
+ reason: 'already-conforms' | 'needs-key' | 'no-shape';
12
+ };
13
+ /**
14
+ * The conforming name a non-conforming branch should take, once an issue key exists for it.
15
+ *
16
+ * A candidate is returned only after it parses as fully conforming, so a rename always lands on a
17
+ * name the grammar accepts — `parseBranch`'s own `suggestedName` does not guarantee that for a
18
+ * nested branch whose leaf names no issue, and half a rename is worse than none.
19
+ */
20
+ export declare const conformingNameFor: (options: {
21
+ branch: string;
22
+ key?: string;
23
+ config: GitFlowConfig;
24
+ }) => ConformingName;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.conformingNameFor = void 0;
4
+ const build_1 = require("./build");
5
+ const parse_1 = require("./parse");
6
+ const KEY_PLACEHOLDER = '<KEY>';
7
+ /**
8
+ * The spec that rebuilds a branch whose leaf carries no key at all, which is why `parseBranch` left
9
+ * `suggestedName` unset. Only the kinds the grammar can spell are here — an unrecognised name names
10
+ * no kind, and inventing one would rename the branch to something the user never chose.
11
+ */
12
+ const specFor = (options) => {
13
+ var _a;
14
+ const { parse, key } = options;
15
+ const subject = (_a = parse.subject) !== null && _a !== void 0 ? _a : '';
16
+ switch (parse.kind) {
17
+ case 'main-feature':
18
+ return { kind: 'main-feature', type: parse.type, key, subject };
19
+ case 'hotfix':
20
+ return { kind: 'hotfix', key, subject };
21
+ case 'sub-feature':
22
+ return parse.parent ? { kind: 'sub-feature', parent: parse.parent, key, subject } : undefined;
23
+ case 'release-fix':
24
+ return parse.parent ? { kind: 'release-fix', parent: parse.parent, key, subject } : undefined;
25
+ default:
26
+ return undefined;
27
+ }
28
+ };
29
+ const candidatesFor = (options) => {
30
+ const { parse, key, config } = options;
31
+ const suggested = parse.suggestedName;
32
+ const candidates = [];
33
+ if (suggested && !suggested.includes(KEY_PLACEHOLDER))
34
+ candidates.push(suggested);
35
+ if (key) {
36
+ if (suggested === null || suggested === void 0 ? void 0 : suggested.includes(KEY_PLACEHOLDER))
37
+ candidates.push(suggested.replace(/<KEY>/g, key.toUpperCase()));
38
+ const spec = specFor({ parse, key: key.toUpperCase() });
39
+ if (spec)
40
+ candidates.push((0, build_1.buildBranchName)({ spec, config }));
41
+ }
42
+ return candidates;
43
+ };
44
+ /**
45
+ * The conforming name a non-conforming branch should take, once an issue key exists for it.
46
+ *
47
+ * A candidate is returned only after it parses as fully conforming, so a rename always lands on a
48
+ * name the grammar accepts — `parseBranch`'s own `suggestedName` does not guarantee that for a
49
+ * nested branch whose leaf names no issue, and half a rename is worse than none.
50
+ */
51
+ const conformingNameFor = (options) => {
52
+ var _a;
53
+ const { key, config } = options;
54
+ const parse = (0, parse_1.parseBranch)({ branch: options.branch, config });
55
+ if (parse.ok)
56
+ return { ok: false, reason: 'already-conforms' };
57
+ for (const name of candidatesFor({ parse, key, config })) {
58
+ if (name !== parse.branch && (0, parse_1.parseBranch)({ branch: name, config }).ok)
59
+ return { ok: true, name };
60
+ }
61
+ if (key)
62
+ return { ok: false, reason: 'no-shape' };
63
+ // Whether a key would help is answered by trying one, using a prefix this repo accepts so the
64
+ // probe is not rejected by `keyPrefixes` for a reason the real key would not hit.
65
+ const probe = candidatesFor({ parse, key: `${(_a = config.keyPrefixes[0]) !== null && _a !== void 0 ? _a : 'KEY'}-1`, config });
66
+ const rebuildable = probe.some((name) => (0, parse_1.parseBranch)({ branch: name, config }).ok);
67
+ return { ok: false, reason: rebuildable ? 'needs-key' : 'no-shape' };
68
+ };
69
+ exports.conformingNameFor = conformingNameFor;
70
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/rename.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { BranchNameSpec } from './build';
2
+ import { GitFlowConfig } from './config';
3
+ import { BranchParseResult } from './parse';
4
+ export type StartPlan = {
5
+ branch: string;
6
+ /** The branch to create the new one from. Absent only when `problems` says why. */
7
+ base?: string;
8
+ mrTargets: string[];
9
+ parse: BranchParseResult;
10
+ /** Empty when the plan is safe to execute; every entry is a reason to refuse. */
11
+ problems: string[];
12
+ };
13
+ /**
14
+ * The plan a caller must show before it writes anything: the branch name, the base to branch from
15
+ * and the merge request target. Built through `buildBranchName` and then re-parsed, so a spec the
16
+ * grammar cannot express — a key the project's prefixes reject, a parent that is itself
17
+ * non-conforming — comes back as a problem instead of as a branch somebody has to delete again.
18
+ */
19
+ export declare const planStart: (options: {
20
+ spec: BranchNameSpec;
21
+ config: GitFlowConfig;
22
+ }) => StartPlan;
23
+ /**
24
+ * The spec for a branch nesting under `parent`. Which of the two nested kinds it is follows from the
25
+ * parent alone, so no caller has to decide it: a release branch takes fixes, anything else takes
26
+ * sub-features.
27
+ */
28
+ export declare const nestedSpecFor: (options: {
29
+ parent: string;
30
+ key: string;
31
+ subject: string;
32
+ config: GitFlowConfig;
33
+ }) => BranchNameSpec;
34
+ /**
35
+ * The branches a story's sub-features may nest under, out of a list of names.
36
+ *
37
+ * A sub-feature's parent is a branch name and not an issue, because the nested spelling keeps the
38
+ * parent's full path inside the child's — so this, and not a Jira lookup, is what says whether a
39
+ * Task can be started at all. A deprecated spelling is never a candidate: a child nested under a
40
+ * name that is about to be repaired would have to be renamed with it.
41
+ *
42
+ * More than one match is returned rather than resolved. Which of two feature branches a story means
43
+ * is not something a grammar can answer, and picking one would put the work on the wrong branch.
44
+ */
45
+ export declare const featureBranchesFor: (options: {
46
+ branches: readonly string[];
47
+ storyKey: string;
48
+ config: GitFlowConfig;
49
+ }) => string[];
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.featureBranchesFor = exports.nestedSpecFor = exports.planStart = void 0;
4
+ const build_1 = require("./build");
5
+ const parse_1 = require("./parse");
6
+ /**
7
+ * The plan a caller must show before it writes anything: the branch name, the base to branch from
8
+ * and the merge request target. Built through `buildBranchName` and then re-parsed, so a spec the
9
+ * grammar cannot express — a key the project's prefixes reject, a parent that is itself
10
+ * non-conforming — comes back as a problem instead of as a branch somebody has to delete again.
11
+ */
12
+ const planStart = (options) => {
13
+ const { spec, config } = options;
14
+ const branch = (0, build_1.buildBranchName)({ spec, config });
15
+ const parse = (0, parse_1.parseBranch)({ branch, config });
16
+ const problems = [
17
+ ...(parse.kind === spec.kind ? [] : [`"${branch}" parses as ${parse.kind}, not ${spec.kind}.`]),
18
+ ...parse.findings.map((finding) => finding.message),
19
+ ...(parse.expectedBase ? [] : [`"${branch}" has no base branch to branch from.`]),
20
+ ];
21
+ return { branch, base: parse.expectedBase, mrTargets: parse.expectedMrTargets, parse, problems };
22
+ };
23
+ exports.planStart = planStart;
24
+ /**
25
+ * The spec for a branch nesting under `parent`. Which of the two nested kinds it is follows from the
26
+ * parent alone, so no caller has to decide it: a release branch takes fixes, anything else takes
27
+ * sub-features.
28
+ */
29
+ const nestedSpecFor = (options) => {
30
+ const { parent, key, subject, config } = options;
31
+ const kind = (0, parse_1.parseBranch)({ branch: parent, config }).kind === 'release' ? 'release-fix' : 'sub-feature';
32
+ return { kind, parent, key, subject };
33
+ };
34
+ exports.nestedSpecFor = nestedSpecFor;
35
+ /**
36
+ * The branches a story's sub-features may nest under, out of a list of names.
37
+ *
38
+ * A sub-feature's parent is a branch name and not an issue, because the nested spelling keeps the
39
+ * parent's full path inside the child's — so this, and not a Jira lookup, is what says whether a
40
+ * Task can be started at all. A deprecated spelling is never a candidate: a child nested under a
41
+ * name that is about to be repaired would have to be renamed with it.
42
+ *
43
+ * More than one match is returned rather than resolved. Which of two feature branches a story means
44
+ * is not something a grammar can answer, and picking one would put the work on the wrong branch.
45
+ */
46
+ const featureBranchesFor = (options) => {
47
+ const { branches, config } = options;
48
+ const storyKey = options.storyKey.toUpperCase();
49
+ return [...new Set(branches.map(parse_1.stripRefPrefix))]
50
+ .filter((branch) => {
51
+ const parse = (0, parse_1.parseBranch)({ branch, config });
52
+ return parse.kind === 'main-feature' && !parse.deprecated && parse.storyKey === storyKey;
53
+ })
54
+ .sort();
55
+ };
56
+ exports.featureBranchesFor = featureBranchesFor;
57
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/start.ts"],"names":[],"mappings":";;;AAAA,mCAA0D;AAE1D,mCAAyE;AAYzE;;;;;GAKG;AACI,MAAM,SAAS,GAAG,CAAC,OAAwD,EAAa,EAAE;IAC/F,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,MAAM,GAAG,IAAA,uBAAe,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,eAAe,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/F,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACnD,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,sCAAsC,CAAC,CAAC;KAClF,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACnG,CAAC,CAAC;AAZW,QAAA,SAAS,aAYpB;AAEF;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAAC,OAK7B,EAAkB,EAAE;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,IAAI,GAAG,IAAA,mBAAW,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;IAExG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAEF;;;;;;;;;;GAUG;AACI,MAAM,kBAAkB,GAAG,CAAC,OAIlC,EAAE,EAAE;IACH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEhD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,sBAAc,CAAC,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3F,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;AACZ,CAAC,CAAC;AAfW,QAAA,kBAAkB,sBAe7B"}