@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.
- package/CHANGELOG.md +20 -0
- package/README.md +175 -4
- package/content/git-hooks/post-checkout.sh +10 -0
- package/content/git-hooks/pre-push.sh +5 -0
- package/content/hooks/context-warning.py +39 -11
- package/content/skills/git-commit/SKILL.md +6 -7
- package/content/skills/git-flow/SKILL.md +83 -0
- package/content/skills/handoff/SKILL.md +4 -0
- package/content/skills/query/SKILL.md +17 -13
- package/package.json +12 -1
- package/src/index.js +11 -10
- package/src/index.js.map +1 -1
- package/src/lib/commitlint.d.ts +10 -0
- package/src/lib/commitlint.js +51 -0
- package/src/lib/commitlint.js.map +1 -0
- package/src/lib/config.d.ts +28 -0
- package/src/lib/config.js +21 -3
- package/src/lib/config.js.map +1 -1
- package/src/lib/git-flow/build.d.ts +35 -0
- package/src/lib/git-flow/build.js +24 -0
- package/src/lib/git-flow/build.js.map +1 -0
- package/src/lib/git-flow/config.d.ts +59 -0
- package/src/lib/git-flow/config.js +50 -0
- package/src/lib/git-flow/config.js.map +1 -0
- package/src/lib/git-flow/index.d.ts +5 -0
- package/src/lib/git-flow/index.js +9 -0
- package/src/lib/git-flow/index.js.map +1 -0
- package/src/lib/git-flow/parse.d.ts +49 -0
- package/src/lib/git-flow/parse.js +274 -0
- package/src/lib/git-flow/parse.js.map +1 -0
- package/src/lib/git-flow/start.d.ts +22 -0
- package/src/lib/git-flow/start.js +24 -0
- package/src/lib/git-flow/start.js.map +1 -0
- package/src/lib/git-flow/validate.d.ts +34 -0
- package/src/lib/git-flow/validate.js +72 -0
- package/src/lib/git-flow/validate.js.map +1 -0
- package/src/lib/git-flow-command.d.ts +4 -0
- package/src/lib/git-flow-command.js +157 -0
- package/src/lib/git-flow-command.js.map +1 -0
- package/src/lib/git-flow-repair.d.ts +17 -0
- package/src/lib/git-flow-repair.js +150 -0
- package/src/lib/git-flow-repair.js.map +1 -0
- package/src/lib/git-flow-start.d.ts +20 -0
- package/src/lib/git-flow-start.js +147 -0
- package/src/lib/git-flow-start.js.map +1 -0
- package/src/lib/git.d.ts +27 -0
- package/src/lib/git.js +49 -0
- package/src/lib/git.js.map +1 -0
- package/src/lib/gitlab.d.ts +35 -0
- package/src/lib/gitlab.js +98 -0
- package/src/lib/gitlab.js.map +1 -0
- package/src/lib/jira.d.ts +28 -0
- package/src/lib/jira.js +83 -0
- package/src/lib/jira.js.map +1 -0
- package/src/lib/plan.d.ts +0 -1
- package/src/lib/plan.js +20 -4
- package/src/lib/plan.js.map +1 -1
- package/src/lib/prompt.d.ts +8 -0
- package/src/lib/prompt.js +27 -0
- package/src/lib/prompt.js.map +1 -0
- package/src/lib/render.d.ts +20 -2
- package/src/lib/render.js +31 -8
- package/src/lib/render.js.map +1 -1
- package/src/lib/sync.d.ts +0 -1
- package/src/lib/sync.js +2 -2
- package/src/lib/sync.js.map +1 -1
- package/src/lib/targets/claude-hooks.js +1 -1
- package/src/lib/targets/claude-hooks.js.map +1 -1
- package/src/lib/targets/claude.js +1 -1
- package/src/lib/targets/claude.js.map +1 -1
- package/src/lib/targets/codex-hooks.js +1 -1
- package/src/lib/targets/codex-hooks.js.map +1 -1
- package/src/lib/targets/codex.js +1 -1
- package/src/lib/targets/codex.js.map +1 -1
- package/src/lib/targets/copilot.js +1 -1
- package/src/lib/targets/copilot.js.map +1 -1
- package/src/lib/targets/cursor.js +1 -1
- package/src/lib/targets/cursor.js.map +1 -1
- package/src/lib/targets/git-hooks.d.ts +24 -0
- package/src/lib/targets/git-hooks.js +70 -0
- package/src/lib/targets/git-hooks.js.map +1 -0
- package/src/lib/targets/hooks-shared.d.ts +0 -1
- package/src/lib/targets/hooks-shared.js +7 -7
- package/src/lib/targets/hooks-shared.js.map +1 -1
- package/src/lib/targets/shared.d.ts +0 -1
- package/src/lib/targets/shared.js +1 -1
- 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,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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"}
|