@ethlete/agent-rules 0.1.0-next.5 → 0.1.0-next.7

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 (87) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +175 -4
  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 +39 -11
  6. package/content/skills/git-commit/SKILL.md +6 -7
  7. package/content/skills/git-flow/SKILL.md +83 -0
  8. package/content/skills/handoff/SKILL.md +4 -0
  9. package/content/skills/query/SKILL.md +17 -13
  10. package/package.json +12 -1
  11. package/src/index.js +11 -10
  12. package/src/index.js.map +1 -1
  13. package/src/lib/commitlint.d.ts +10 -0
  14. package/src/lib/commitlint.js +51 -0
  15. package/src/lib/commitlint.js.map +1 -0
  16. package/src/lib/config.d.ts +28 -0
  17. package/src/lib/config.js +21 -3
  18. package/src/lib/config.js.map +1 -1
  19. package/src/lib/git-flow/build.d.ts +35 -0
  20. package/src/lib/git-flow/build.js +24 -0
  21. package/src/lib/git-flow/build.js.map +1 -0
  22. package/src/lib/git-flow/config.d.ts +59 -0
  23. package/src/lib/git-flow/config.js +50 -0
  24. package/src/lib/git-flow/config.js.map +1 -0
  25. package/src/lib/git-flow/index.d.ts +5 -0
  26. package/src/lib/git-flow/index.js +9 -0
  27. package/src/lib/git-flow/index.js.map +1 -0
  28. package/src/lib/git-flow/parse.d.ts +49 -0
  29. package/src/lib/git-flow/parse.js +274 -0
  30. package/src/lib/git-flow/parse.js.map +1 -0
  31. package/src/lib/git-flow/start.d.ts +22 -0
  32. package/src/lib/git-flow/start.js +24 -0
  33. package/src/lib/git-flow/start.js.map +1 -0
  34. package/src/lib/git-flow/validate.d.ts +34 -0
  35. package/src/lib/git-flow/validate.js +72 -0
  36. package/src/lib/git-flow/validate.js.map +1 -0
  37. package/src/lib/git-flow-command.d.ts +4 -0
  38. package/src/lib/git-flow-command.js +157 -0
  39. package/src/lib/git-flow-command.js.map +1 -0
  40. package/src/lib/git-flow-repair.d.ts +17 -0
  41. package/src/lib/git-flow-repair.js +150 -0
  42. package/src/lib/git-flow-repair.js.map +1 -0
  43. package/src/lib/git-flow-start.d.ts +20 -0
  44. package/src/lib/git-flow-start.js +147 -0
  45. package/src/lib/git-flow-start.js.map +1 -0
  46. package/src/lib/git.d.ts +27 -0
  47. package/src/lib/git.js +49 -0
  48. package/src/lib/git.js.map +1 -0
  49. package/src/lib/gitlab.d.ts +35 -0
  50. package/src/lib/gitlab.js +98 -0
  51. package/src/lib/gitlab.js.map +1 -0
  52. package/src/lib/jira.d.ts +28 -0
  53. package/src/lib/jira.js +83 -0
  54. package/src/lib/jira.js.map +1 -0
  55. package/src/lib/plan.d.ts +0 -1
  56. package/src/lib/plan.js +20 -4
  57. package/src/lib/plan.js.map +1 -1
  58. package/src/lib/prompt.d.ts +8 -0
  59. package/src/lib/prompt.js +27 -0
  60. package/src/lib/prompt.js.map +1 -0
  61. package/src/lib/render.d.ts +20 -2
  62. package/src/lib/render.js +31 -8
  63. package/src/lib/render.js.map +1 -1
  64. package/src/lib/sync.d.ts +0 -1
  65. package/src/lib/sync.js +2 -2
  66. package/src/lib/sync.js.map +1 -1
  67. package/src/lib/targets/claude-hooks.js +1 -1
  68. package/src/lib/targets/claude-hooks.js.map +1 -1
  69. package/src/lib/targets/claude.js +1 -1
  70. package/src/lib/targets/claude.js.map +1 -1
  71. package/src/lib/targets/codex-hooks.js +1 -1
  72. package/src/lib/targets/codex-hooks.js.map +1 -1
  73. package/src/lib/targets/codex.js +1 -1
  74. package/src/lib/targets/codex.js.map +1 -1
  75. package/src/lib/targets/copilot.js +1 -1
  76. package/src/lib/targets/copilot.js.map +1 -1
  77. package/src/lib/targets/cursor.js +1 -1
  78. package/src/lib/targets/cursor.js.map +1 -1
  79. package/src/lib/targets/git-hooks.d.ts +24 -0
  80. package/src/lib/targets/git-hooks.js +70 -0
  81. package/src/lib/targets/git-hooks.js.map +1 -0
  82. package/src/lib/targets/hooks-shared.d.ts +0 -1
  83. package/src/lib/targets/hooks-shared.js +7 -7
  84. package/src/lib/targets/hooks-shared.js.map +1 -1
  85. package/src/lib/targets/shared.d.ts +0 -1
  86. package/src/lib/targets/shared.js +1 -1
  87. package/src/lib/targets/shared.js.map +1 -1
@@ -0,0 +1,274 @@
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
+ /**
11
+ * The key is only recognised anchored at the start of a segment. A trailing number is therefore
12
+ * never mistaken for one — `ratings-reveal-secondary-page-27` yields no key rather than a wrong
13
+ * one, and a confidently wrong attribution is worse than none.
14
+ */
15
+ const parseSegment = (options) => {
16
+ const { segment, config, role } = options;
17
+ const match = new RegExp(`^(${config.keyPattern})(?:-(.*))?$`, 'i').exec(segment);
18
+ const rawKey = match === null || match === void 0 ? void 0 : match[1];
19
+ const known = config.keyPrefixes.length === 0 ||
20
+ config.keyPrefixes.some((prefix) => rawKey === null || rawKey === void 0 ? void 0 : rawKey.toUpperCase().startsWith(prefix.toUpperCase()));
21
+ if (!rawKey || !known) {
22
+ return {
23
+ subject: segment || undefined,
24
+ findings: [{ rule: 'missing-key', message: `"${segment}" carries no ${role} issue key.` }],
25
+ };
26
+ }
27
+ const key = rawKey.toUpperCase();
28
+ const subject = (match === null || match === void 0 ? void 0 : match[2]) || undefined;
29
+ const findings = [];
30
+ if (rawKey !== key) {
31
+ findings.push({ rule: 'key-case', message: `Issue key "${rawKey}" should be uppercase "${key}".` });
32
+ }
33
+ if (!subject) {
34
+ findings.push({ rule: 'missing-subject', message: `"${segment}" names ${key} but has no subject.` });
35
+ }
36
+ return { key, subject, findings };
37
+ };
38
+ const matchDeprecatedShape = (options) => {
39
+ var _a;
40
+ const { branch, config } = options;
41
+ for (const shape of config.deprecatedShapes) {
42
+ const match = new RegExp(shape.match).exec(branch);
43
+ if (match)
44
+ return { shape, groups: (_a = match.groups) !== null && _a !== void 0 ? _a : {} };
45
+ }
46
+ return undefined;
47
+ };
48
+ const renameSuggestion = (options) => {
49
+ var _a;
50
+ const { shape, groups } = options;
51
+ const key = groups['key'];
52
+ return shape.renameTo
53
+ .replace(/<subject>/g, (_a = groups['subject']) !== null && _a !== void 0 ? _a : '')
54
+ .replace(/<KEY>/g, key ? key.toUpperCase() : '<KEY>');
55
+ };
56
+ const targetsForKind = (options) => {
57
+ const { kind, config, parent, branch } = options;
58
+ const { development, production } = config.baseBranches;
59
+ switch (kind) {
60
+ case 'main-feature':
61
+ return { expectedBase: development, expectedMrTargets: [development] };
62
+ case 'sub-feature':
63
+ case 'release-fix':
64
+ return { expectedBase: parent, expectedMrTargets: parent ? [parent] : [] };
65
+ case 'release':
66
+ return { expectedBase: development, expectedMrTargets: [development, production] };
67
+ case 'hotfix':
68
+ return { expectedBase: production, expectedMrTargets: [production] };
69
+ case 'protected':
70
+ return { expectedMrTargets: branch === development ? [production] : [development] };
71
+ default:
72
+ return { expectedMrTargets: [] };
73
+ }
74
+ };
75
+ /**
76
+ * Classifies a branch name against the grammar. Never throws: an unrecognised name comes back as
77
+ * `kind: 'unknown'` with findings, so the validator and timetrack's correlation engine can read
78
+ * the same result for different purposes.
79
+ */
80
+ const parseBranch = (options) => {
81
+ const { config } = options;
82
+ const branch = (0, exports.stripRefPrefix)(options.branch);
83
+ const segments = branch.split('/');
84
+ const unknown = (message) => ({
85
+ branch,
86
+ ok: false,
87
+ kind: 'unknown',
88
+ deprecated: false,
89
+ expectedMrTargets: [],
90
+ findings: [{ rule: 'unknown-type', message }],
91
+ });
92
+ if (!branch || segments.some((segment) => !segment))
93
+ return unknown(`"${options.branch}" is not a branch name.`);
94
+ if (branch === config.baseBranches.development || branch === config.baseBranches.production) {
95
+ return Object.assign({ branch, ok: true, kind: 'protected', deprecated: false, findings: [] }, targetsForKind({ kind: 'protected', config, branch }));
96
+ }
97
+ const deprecated = matchDeprecatedShape({ branch, config });
98
+ if (deprecated) {
99
+ const suggestion = renameSuggestion(deprecated);
100
+ return Object.assign({ branch, ok: false, kind: deprecated.shape.kind, subject: deprecated.groups['subject'], deprecated: true, suggestedName: suggestion, findings: [
101
+ {
102
+ rule: 'deprecated-prefix',
103
+ message: `"${branch}" uses a deprecated spelling; rename it to ${suggestion}.`,
104
+ suggestion,
105
+ },
106
+ ] }, targetsForKind({ kind: deprecated.shape.kind, config }));
107
+ }
108
+ const [prefix, ...rest] = segments;
109
+ if (prefix === config.subPrefix)
110
+ return dropRedundantSuggestion(parseNested({ branch, segments: rest, config }));
111
+ if (prefix === config.releasePrefix)
112
+ return dropRedundantSuggestion(parseRelease({ branch, segments: rest, config }));
113
+ if (prefix === config.hotfixPrefix)
114
+ return dropRedundantSuggestion(parseHotfix({ branch, segments: rest, config }));
115
+ return dropRedundantSuggestion(parseFeature({ branch, prefix: prefix !== null && prefix !== void 0 ? prefix : '', segments: rest, config }));
116
+ };
117
+ exports.parseBranch = parseBranch;
118
+ const unrecognised = (options) => ({
119
+ branch: options.branch,
120
+ ok: false,
121
+ kind: 'unknown',
122
+ deprecated: false,
123
+ expectedMrTargets: [],
124
+ findings: [{ rule: 'unknown-type', message: options.message }],
125
+ });
126
+ /**
127
+ * `sub/<parent path>/<KEY>-<subject>` — the nested shape. The parent's full name is inside the
128
+ * child's, so the merge request target needs no lookup; only two levels are allowed, so a parent
129
+ * that is itself nested is not a shape.
130
+ */
131
+ const parseNested = (options) => {
132
+ var _a, _b, _c;
133
+ const { branch, segments, config } = options;
134
+ const leaf = segments[segments.length - 1];
135
+ const parent = segments.slice(0, -1).join('/');
136
+ if (!leaf || !parent) {
137
+ return unrecognised({ branch, message: `"${branch}" names no parent branch to nest under.` });
138
+ }
139
+ const parentParse = (0, exports.parseBranch)({ branch: parent, config });
140
+ const kind = nestedKindFor(parentParse);
141
+ if (!kind) {
142
+ return unrecognised({
143
+ branch,
144
+ message: `"${parent}" is not a branch anything can nest under — only a main feature or a release branch is.`,
145
+ });
146
+ }
147
+ const parts = parseSegment({ segment: leaf, config, role: kind === 'release-fix' ? 'bug' : 'task' });
148
+ const findings = [...parentParse.findings, ...parts.findings];
149
+ 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
150
+ ? (0, build_1.buildBranchName)({
151
+ spec: { kind, parent: (_b = parentParse.suggestedName) !== null && _b !== void 0 ? _b : parent, key: parts.key, subject: (_c = parts.subject) !== null && _c !== void 0 ? _c : '' },
152
+ config,
153
+ })
154
+ : undefined }, targetsForKind({ kind, config, parent }));
155
+ };
156
+ const nestedKindFor = (parent) => {
157
+ if (parent.kind === 'release')
158
+ return 'release-fix';
159
+ return parent.kind === 'main-feature' && !parent.deprecated ? 'sub-feature' : undefined;
160
+ };
161
+ /**
162
+ * The spelling the convention was originally written with, `<parent>/<KEY>-<subject>`. It parses so
163
+ * that `explain` and `repair` can say something useful about it, but it can never exist next to the
164
+ * parent it names — see `subPrefix`.
165
+ */
166
+ const nestedTooDeep = (options) => {
167
+ var _a, _b;
168
+ const { branch, kind, parent, leaf, config, storyKey, type } = options;
169
+ const suggestion = leaf.key
170
+ ? (0, build_1.buildBranchName)({ spec: { kind, parent, key: leaf.key, subject: (_a = leaf.subject) !== null && _a !== void 0 ? _a : '' }, config })
171
+ : `${config.subPrefix}/${branch}`;
172
+ return Object.assign({ branch, ok: false, kind,
173
+ type,
174
+ storyKey, taskKey: leaf.key, issueKey: (_b = leaf.key) !== null && _b !== void 0 ? _b : storyKey, subject: leaf.subject, parent, deprecated: true, suggestedName: suggestion, findings: [
175
+ {
176
+ rule: 'deprecated-prefix',
177
+ message: `"${branch}" cannot exist while ${parent} does — git rejects a ref that is both a branch and a directory of branches. Use ${suggestion}.`,
178
+ suggestion,
179
+ },
180
+ ] }, targetsForKind({ kind, config, parent }));
181
+ };
182
+ const dropRedundantSuggestion = (result) => result.suggestedName === result.branch ? Object.assign(Object.assign({}, result), { suggestedName: undefined }) : result;
183
+ const parseRelease = (options) => {
184
+ const { branch, segments, config } = options;
185
+ const [date, leaf, ...extra] = segments;
186
+ if (!date || extra.length > 0) {
187
+ return unrecognised({ branch, message: `"${branch}" is not a release or release-fix branch.` });
188
+ }
189
+ const findings = [];
190
+ if (!new RegExp(`^${config.releasePattern}$`).test(date)) {
191
+ findings.push({ rule: 'release-date', message: `"${date}" is not a release date (expected YYYY.MM.DD).` });
192
+ }
193
+ const parent = `${config.releasePrefix}/${date}`;
194
+ if (leaf === undefined) {
195
+ return Object.assign({ branch, ok: findings.length === 0, kind: 'release', deprecated: false, findings }, targetsForKind({ kind: 'release', config }));
196
+ }
197
+ return nestedTooDeep({
198
+ branch,
199
+ kind: 'release-fix',
200
+ parent,
201
+ leaf: parseSegment({ segment: leaf, config, role: 'bug' }),
202
+ config,
203
+ });
204
+ };
205
+ const parseHotfix = (options) => {
206
+ var _a;
207
+ const { branch, segments, config } = options;
208
+ const [leaf, ...extra] = segments;
209
+ if (!leaf || extra.length > 0) {
210
+ return {
211
+ branch,
212
+ ok: false,
213
+ kind: 'unknown',
214
+ deprecated: false,
215
+ expectedMrTargets: [],
216
+ findings: [{ rule: 'unknown-type', message: `"${branch}" is not a hotfix branch.` }],
217
+ };
218
+ }
219
+ const parts = parseSegment({ segment: leaf, config, role: 'bug' });
220
+ 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
221
+ ? (0, build_1.buildBranchName)({ spec: { kind: 'hotfix', key: parts.key, subject: (_a = parts.subject) !== null && _a !== void 0 ? _a : '' }, config })
222
+ : undefined }, targetsForKind({ kind: 'hotfix', config }));
223
+ };
224
+ const parseFeature = (options) => {
225
+ var _a;
226
+ const { branch, prefix, segments, config } = options;
227
+ const alias = config.typeAliases[prefix];
228
+ const type = config.types.includes(prefix) ? prefix : alias;
229
+ const [story, task, ...extra] = segments;
230
+ if (!type || !story || extra.length > 0) {
231
+ return unrecognised({
232
+ branch,
233
+ message: `"${branch}" matches no branch shape; expected <type>/<KEY>-<subject> with type one of ${config.types.join(', ')}.`,
234
+ });
235
+ }
236
+ const findings = [];
237
+ if (alias && prefix !== type) {
238
+ findings.push({ rule: 'type-alias', message: `"${prefix}/" is an alias; use "${type}/".` });
239
+ }
240
+ const storyParts = parseSegment({ segment: story, config, role: 'story' });
241
+ if (task === undefined) {
242
+ findings.push(...storyParts.findings);
243
+ 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
244
+ ? (0, build_1.buildBranchName)({
245
+ spec: { kind: 'main-feature', type, key: storyParts.key, subject: (_a = storyParts.subject) !== null && _a !== void 0 ? _a : '' },
246
+ config,
247
+ })
248
+ : undefined }, targetsForKind({ kind: 'main-feature', config }));
249
+ }
250
+ return nestedTooDeep({
251
+ branch,
252
+ kind: 'sub-feature',
253
+ parent: `${prefix}/${story}`,
254
+ leaf: parseSegment({ segment: task, config, role: 'task' }),
255
+ config,
256
+ storyKey: storyParts.key,
257
+ type,
258
+ });
259
+ };
260
+ /**
261
+ * Attributes a keyless branch through the branch it is based on. Reviewed branches land in an
262
+ * integration branch, so a flat name like `feat/logout-confirmation` usually has a parent that
263
+ * does carry the story key. Deterministic — no model involved.
264
+ */
265
+ const resolveThroughBase = (options) => {
266
+ var _a, _b;
267
+ const { branch, base } = options;
268
+ const inherited = (_a = base.storyKey) !== null && _a !== void 0 ? _a : base.taskKey;
269
+ if (branch.storyKey || !inherited)
270
+ return branch;
271
+ return Object.assign(Object.assign({}, branch), { storyKey: inherited, issueKey: (_b = branch.taskKey) !== null && _b !== void 0 ? _b : inherited, inheritedFrom: base.branch });
272
+ };
273
+ exports.resolveThroughBase = resolveThroughBase;
274
+ //# 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,22 @@
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;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ 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
+ //# 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,mCAAyD;AAYzD;;;;;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"}
@@ -0,0 +1,34 @@
1
+ import { GitFlowConfig, GitFlowRule, GitFlowSeverity } from './config';
2
+ import { BranchParseResult, GitFlowFinding } from './parse';
3
+ export type GitFlowResolvedFinding = GitFlowFinding & {
4
+ severity: Exclude<GitFlowSeverity, 'off'>;
5
+ };
6
+ export type GitFlowReport = {
7
+ branch: string;
8
+ target?: string;
9
+ parse: BranchParseResult;
10
+ findings: GitFlowResolvedFinding[];
11
+ ok: boolean;
12
+ /** At least one finding resolved to `error`, so the hook or the CI job should exit non-zero. */
13
+ blocked: boolean;
14
+ };
15
+ /**
16
+ * `advisory` caps the *naming* rules at `warn`, because the whole naming zoo is deliberately
17
+ * accepted during the grace period. `protected-push` and `wrong-mr-target` are not naming rules
18
+ * and keep their configured severity in both modes — that is what lets `wrong-mr-target` be
19
+ * promoted to `error` before the naming grace period ends.
20
+ */
21
+ export declare const resolveSeverity: (options: {
22
+ rule: GitFlowRule;
23
+ config: GitFlowConfig;
24
+ }) => GitFlowSeverity;
25
+ /**
26
+ * The single place a verdict is computed — the CLI, the git hook, the CI job and timetrack all
27
+ * call this rather than re-deriving the rules.
28
+ */
29
+ export declare const validateBranch: (options: {
30
+ branch: string;
31
+ config: GitFlowConfig;
32
+ target?: string;
33
+ push?: boolean;
34
+ }) => GitFlowReport;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateBranch = exports.resolveSeverity = void 0;
4
+ const parse_1 = require("./parse");
5
+ /**
6
+ * `advisory` caps the *naming* rules at `warn`, because the whole naming zoo is deliberately
7
+ * accepted during the grace period. `protected-push` and `wrong-mr-target` are not naming rules
8
+ * and keep their configured severity in both modes — that is what lets `wrong-mr-target` be
9
+ * promoted to `error` before the naming grace period ends.
10
+ */
11
+ const resolveSeverity = (options) => {
12
+ const { rule, config } = options;
13
+ const configured = config.severity[rule];
14
+ if (configured === 'off')
15
+ return 'off';
16
+ if (rule === 'protected-push' || rule === 'wrong-mr-target')
17
+ return configured;
18
+ return config.enforcement === 'gated' ? configured : 'warn';
19
+ };
20
+ exports.resolveSeverity = resolveSeverity;
21
+ const mrTargetFindings = (options) => {
22
+ const { parse, target, config } = options;
23
+ if (parse.kind === 'unknown' || parse.expectedMrTargets.includes(target))
24
+ return [];
25
+ // A flat feature branch is how the zoo spells a sub-branch of an integration branch, and `dev-*`
26
+ // is an integration branch under its old name — so any main feature may target any other. Tighten
27
+ // this and the rule fires on the team's entire real workflow.
28
+ if (parse.kind === 'main-feature' && (0, parse_1.parseBranch)({ branch: target, config }).kind === 'main-feature')
29
+ return [];
30
+ const expected = parse.expectedMrTargets;
31
+ return [
32
+ {
33
+ rule: 'wrong-mr-target',
34
+ message: expected.length
35
+ ? `A ${parse.kind} branch must merge into ${expected.join(' or ')}, not ${target}.`
36
+ : `A ${parse.kind} branch has no merge request target.`,
37
+ suggestion: expected[0],
38
+ },
39
+ ];
40
+ };
41
+ /**
42
+ * The single place a verdict is computed — the CLI, the git hook, the CI job and timetrack all
43
+ * call this rather than re-deriving the rules.
44
+ */
45
+ const validateBranch = (options) => {
46
+ const { config, push } = options;
47
+ const branch = (0, parse_1.stripRefPrefix)(options.branch);
48
+ const target = options.target ? (0, parse_1.stripRefPrefix)(options.target) : undefined;
49
+ const parse = (0, parse_1.parseBranch)({ branch, config });
50
+ const findings = [...parse.findings];
51
+ if (target)
52
+ findings.push(...mrTargetFindings({ parse, target, config }));
53
+ if (push && parse.kind === 'protected') {
54
+ findings.push({
55
+ rule: 'protected-push',
56
+ message: `${branch} is protected — push a branch and open a merge request.`,
57
+ });
58
+ }
59
+ const resolved = findings
60
+ .map((finding) => (Object.assign(Object.assign({}, finding), { severity: (0, exports.resolveSeverity)({ rule: finding.rule, config }) })))
61
+ .filter((finding) => finding.severity !== 'off');
62
+ return {
63
+ branch,
64
+ target,
65
+ parse,
66
+ findings: resolved,
67
+ ok: resolved.length === 0,
68
+ blocked: resolved.some((finding) => finding.severity === 'error'),
69
+ };
70
+ };
71
+ exports.validateBranch = validateBranch;
72
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../../../libs/agent-rules/src/lib/git-flow/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const gitFlowCommand: (options: {
2
+ root: string;
3
+ argv: string[];
4
+ }) => Promise<number>;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gitFlowCommand = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const config_1 = require("./config");
6
+ const git_1 = require("./git");
7
+ const git_flow_1 = require("./git-flow");
8
+ const git_flow_repair_1 = require("./git-flow-repair");
9
+ const git_flow_start_1 = require("./git-flow-start");
10
+ const describeParse = (parse) => {
11
+ const lines = [` kind ${parse.kind}${parse.deprecated ? ' (deprecated spelling)' : ''}`];
12
+ if (parse.type)
13
+ lines.push(` type ${parse.type}`);
14
+ if (parse.storyKey)
15
+ lines.push(` story ${parse.storyKey}${parse.inheritedFrom ? ` (from ${parse.inheritedFrom})` : ''}`);
16
+ if (parse.taskKey)
17
+ lines.push(` task ${parse.taskKey}`);
18
+ if (parse.subject)
19
+ lines.push(` subject ${parse.subject}`);
20
+ if (parse.parent)
21
+ lines.push(` parent ${parse.parent}`);
22
+ if (parse.expectedBase)
23
+ lines.push(` base ${parse.expectedBase}`);
24
+ lines.push(` merges to ${parse.expectedMrTargets.join(' or ') || '—'}`);
25
+ if (parse.suggestedName)
26
+ lines.push(` rename to ${parse.suggestedName}`);
27
+ return lines;
28
+ };
29
+ const checkOne = (options) => {
30
+ const { config, branch, target, push } = options;
31
+ const report = (0, git_flow_1.validateBranch)({ branch, target, push, config });
32
+ console.log(`Branch: ${report.branch}${report.target ? ` → ${report.target}` : ''}`);
33
+ if (report.ok) {
34
+ console.log(` ok ${report.parse.kind}`);
35
+ return 0;
36
+ }
37
+ for (const finding of report.findings) {
38
+ console.log(` ${finding.severity === 'error' ? 'error ' : 'warn '} ${finding.rule} ${finding.message}`);
39
+ }
40
+ if (report.blocked) {
41
+ console.error('\nBlocked by the finding(s) above.');
42
+ return 1;
43
+ }
44
+ console.log(`\nAdvisory only — nothing is blocked. Run \`ethlete-agents git-flow explain ${report.branch}\` for the full parse.`);
45
+ return 0;
46
+ };
47
+ const checkAll = (options) => {
48
+ var _a;
49
+ const { root, config } = options;
50
+ const branches = (0, git_1.allBranches)(root);
51
+ const counts = new Map();
52
+ const offenders = [];
53
+ let conforming = 0;
54
+ let counted = 0;
55
+ let deprecated = 0;
56
+ for (const branch of branches) {
57
+ const parse = (0, git_flow_1.parseBranch)({ branch, config });
58
+ for (const finding of parse.findings)
59
+ counts.set(finding.rule, ((_a = counts.get(finding.rule)) !== null && _a !== void 0 ? _a : 0) + 1);
60
+ if (parse.kind === 'protected')
61
+ continue;
62
+ if (parse.deprecated) {
63
+ deprecated++;
64
+ continue;
65
+ }
66
+ counted++;
67
+ if (parse.ok)
68
+ conforming++;
69
+ else
70
+ offenders.push(` ${branch}${parse.suggestedName ? ` → ${parse.suggestedName}` : ''}`);
71
+ }
72
+ const ratio = counted === 0 ? 100 : Math.round((conforming / counted) * 100);
73
+ console.log(`${conforming}/${counted} branches conform (${ratio}%), ${deprecated} deprecated, ${branches.length} scanned.`);
74
+ if (counts.size > 0) {
75
+ console.log('\nFindings');
76
+ [...counts.entries()]
77
+ .sort((a, b) => b[1] - a[1])
78
+ .forEach(([rule, count]) => console.log(` ${String(count).padStart(4)} ${rule}`));
79
+ }
80
+ if (offenders.length > 0) {
81
+ console.log('\nNon-conforming');
82
+ offenders.forEach((line) => console.log(line));
83
+ }
84
+ return 0;
85
+ };
86
+ const FLAGS_WITH_VALUE = ['--target', '--root', '--to', '--key', '--of', '--subject', '--type', '--release'];
87
+ const positionalArgs = (args) => args.filter((entry, index) => { var _a; return !entry.startsWith('--') && !FLAGS_WITH_VALUE.includes((_a = args[index - 1]) !== null && _a !== void 0 ? _a : ''); });
88
+ const flagValue = (args, flag) => {
89
+ const index = args.indexOf(flag);
90
+ return index === -1 ? undefined : args[index + 1];
91
+ };
92
+ const USAGE = `ethlete-agents git-flow — name, check and repair branches against the repo's git flow
93
+
94
+ git-flow start <KEY> Create the correctly named branch off the correct base
95
+ git-flow check [ref] Validate a branch name (default: the current branch)
96
+ git-flow check --all Adoption report over every local and remote branch
97
+ git-flow repair [ref] Rename a non-conforming branch and retarget its merge requests
98
+ git-flow explain [ref] Print what the parser saw
99
+
100
+ Options for check
101
+ --target <branch> Also validate the merge request target
102
+ --push Also report a direct push to a protected branch
103
+
104
+ Options for start
105
+ --subject <text> Use this subject instead of reading the issue from Jira
106
+ --of <branch> Nest under this branch instead of the parent story's own branch
107
+ --type <type> Branch type for a main feature (default: feat)
108
+ --hotfix Branch off production as a hotfix
109
+ --release <date> Create a release branch instead of a feature branch
110
+ --push Push the new branch and set its upstream
111
+
112
+ Options for repair
113
+ --key <KEY> The issue key to put into the new name
114
+ --to <branch> Use this name instead of the derived one
115
+ --no-mr-check Skip the GitLab merge request lookup (only when you know none point at it)
116
+
117
+ Options for start and repair
118
+ --yes Do not ask for confirmation
119
+ --dry-run Print the plan and stop
120
+ `;
121
+ const gitFlowCommand = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
122
+ const { root, argv } = options;
123
+ // The subcommand is the first positional, not `argv[0]` — a global flag like `--root` may precede it.
124
+ const [subcommand, ref] = positionalArgs(argv);
125
+ const rest = argv;
126
+ const loaded = (0, config_1.loadConfig)({ root });
127
+ const config = loaded.gitFlow;
128
+ const target = flagValue(rest, '--target');
129
+ const shared = { root, assumeYes: rest.includes('--yes'), dryRun: rest.includes('--dry-run') };
130
+ if (subcommand === 'check') {
131
+ if (rest.includes('--all'))
132
+ return checkAll({ root, config });
133
+ return checkOne({ root, config, branch: ref !== null && ref !== void 0 ? ref : (0, git_1.currentBranch)(root), target, push: rest.includes('--push') });
134
+ }
135
+ if (subcommand === 'start') {
136
+ return (0, git_flow_start_1.gitFlowStart)(Object.assign(Object.assign({}, shared), { config: loaded, key: ref, subject: flagValue(rest, '--subject'), type: flagValue(rest, '--type'), parent: flagValue(rest, '--of'), hotfix: rest.includes('--hotfix'), releaseDate: flagValue(rest, '--release'), push: rest.includes('--push') }));
137
+ }
138
+ if (subcommand === 'repair') {
139
+ return (0, git_flow_repair_1.gitFlowRepair)(Object.assign(Object.assign({}, shared), { config: loaded, ref, to: flagValue(rest, '--to'), key: flagValue(rest, '--key'), skipMrCheck: rest.includes('--no-mr-check') }));
140
+ }
141
+ if (subcommand === 'explain') {
142
+ const branch = ref !== null && ref !== void 0 ? ref : (0, git_1.currentBranch)(root);
143
+ const parse = (0, git_flow_1.parseBranch)({ branch, config });
144
+ console.log(`Branch: ${parse.branch}`);
145
+ describeParse(parse).forEach((line) => console.log(line));
146
+ if (parse.findings.length > 0) {
147
+ console.log('\nFindings');
148
+ parse.findings.forEach((finding) => console.log(` ${finding.rule} ${finding.message}`));
149
+ }
150
+ console.log(`\nEnforcement: ${config.enforcement}`);
151
+ return 0;
152
+ }
153
+ console.log(USAGE);
154
+ return subcommand === undefined || subcommand === '--help' || subcommand === '-h' ? 0 : 1;
155
+ });
156
+ exports.gitFlowCommand = gitFlowCommand;
157
+ //# sourceMappingURL=git-flow-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-flow-command.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/git-flow-command.ts"],"names":[],"mappings":"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"}