@ethlete/agent-rules 0.1.0-next.1 → 0.1.0-next.11

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 (121) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +296 -21
  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 +284 -69
  6. package/content/output-styles/ste-clarity.md +131 -0
  7. package/content/rules/comments.md +50 -20
  8. package/content/skills/angular-patterns/SKILL.md +1 -1
  9. package/content/skills/api-source/SKILL.md +118 -0
  10. package/content/skills/figma-export/SKILL.md +193 -0
  11. package/content/skills/figma-export/dump-figma-layers.py +83 -0
  12. package/content/skills/figma-export/dump-figma-svg.py +235 -0
  13. package/content/skills/figma-export/measure-template.mjs +87 -0
  14. package/content/skills/git-commit/SKILL.md +6 -7
  15. package/content/skills/git-flow/SKILL.md +87 -0
  16. package/content/skills/handoff/SKILL.md +4 -0
  17. package/content/skills/query/SKILL.md +23 -13
  18. package/content/skills/rxjs-signals/SKILL.md +1 -1
  19. package/content/skills/sdk-docs/SKILL.md +10 -2
  20. package/content/skills/sdk-local-build/SKILL.md +115 -0
  21. package/content/skills/sdk-source/SKILL.md +133 -0
  22. package/content/skills/styleguide/STYLEGUIDE.md +2 -2
  23. package/content/skills/theming/SKILL.md +14 -7
  24. package/content/skills/timetrack/SKILL.md +66 -0
  25. package/package.json +12 -1
  26. package/src/index.js +23 -10
  27. package/src/index.js.map +1 -1
  28. package/src/lib/commitlint.d.ts +10 -0
  29. package/src/lib/commitlint.js +51 -0
  30. package/src/lib/commitlint.js.map +1 -0
  31. package/src/lib/config.d.ts +35 -6
  32. package/src/lib/config.js +26 -3
  33. package/src/lib/config.js.map +1 -1
  34. package/src/lib/git-flow/build.d.ts +35 -0
  35. package/src/lib/git-flow/build.js +24 -0
  36. package/src/lib/git-flow/build.js.map +1 -0
  37. package/src/lib/git-flow/config.d.ts +59 -0
  38. package/src/lib/git-flow/config.js +50 -0
  39. package/src/lib/git-flow/config.js.map +1 -0
  40. package/src/lib/git-flow/index.d.ts +6 -0
  41. package/src/lib/git-flow/index.js +10 -0
  42. package/src/lib/git-flow/index.js.map +1 -0
  43. package/src/lib/git-flow/parse.d.ts +49 -0
  44. package/src/lib/git-flow/parse.js +274 -0
  45. package/src/lib/git-flow/parse.js.map +1 -0
  46. package/src/lib/git-flow/rename.d.ts +24 -0
  47. package/src/lib/git-flow/rename.js +70 -0
  48. package/src/lib/git-flow/rename.js.map +1 -0
  49. package/src/lib/git-flow/start.d.ts +49 -0
  50. package/src/lib/git-flow/start.js +57 -0
  51. package/src/lib/git-flow/start.js.map +1 -0
  52. package/src/lib/git-flow/validate.d.ts +34 -0
  53. package/src/lib/git-flow/validate.js +72 -0
  54. package/src/lib/git-flow/validate.js.map +1 -0
  55. package/src/lib/git-flow-command.d.ts +4 -0
  56. package/src/lib/git-flow-command.js +157 -0
  57. package/src/lib/git-flow-command.js.map +1 -0
  58. package/src/lib/git-flow-repair.d.ts +17 -0
  59. package/src/lib/git-flow-repair.js +146 -0
  60. package/src/lib/git-flow-repair.js.map +1 -0
  61. package/src/lib/git-flow-start.d.ts +20 -0
  62. package/src/lib/git-flow-start.js +132 -0
  63. package/src/lib/git-flow-start.js.map +1 -0
  64. package/src/lib/git.d.ts +27 -0
  65. package/src/lib/git.js +49 -0
  66. package/src/lib/git.js.map +1 -0
  67. package/src/lib/gitlab.d.ts +35 -0
  68. package/src/lib/gitlab.js +98 -0
  69. package/src/lib/gitlab.js.map +1 -0
  70. package/src/lib/index.d.ts +1 -0
  71. package/src/lib/index.js +1 -0
  72. package/src/lib/index.js.map +1 -1
  73. package/src/lib/output-style-command.d.ts +3 -0
  74. package/src/lib/output-style-command.js +69 -0
  75. package/src/lib/output-style-command.js.map +1 -0
  76. package/src/lib/output-style.d.ts +38 -0
  77. package/src/lib/output-style.js +126 -0
  78. package/src/lib/output-style.js.map +1 -0
  79. package/src/lib/owned-paths.js +19 -1
  80. package/src/lib/owned-paths.js.map +1 -1
  81. package/src/lib/plan.d.ts +0 -1
  82. package/src/lib/plan.js +83 -9
  83. package/src/lib/plan.js.map +1 -1
  84. package/src/lib/prompt.d.ts +8 -0
  85. package/src/lib/prompt.js +27 -0
  86. package/src/lib/prompt.js.map +1 -0
  87. package/src/lib/render.d.ts +20 -2
  88. package/src/lib/render.js +31 -8
  89. package/src/lib/render.js.map +1 -1
  90. package/src/lib/sync.d.ts +0 -1
  91. package/src/lib/sync.js +2 -2
  92. package/src/lib/sync.js.map +1 -1
  93. package/src/lib/targets/claude-hooks.d.ts +1 -23
  94. package/src/lib/targets/claude-hooks.js +15 -84
  95. package/src/lib/targets/claude-hooks.js.map +1 -1
  96. package/src/lib/targets/claude.js +1 -1
  97. package/src/lib/targets/claude.js.map +1 -1
  98. package/src/lib/targets/codex-hooks.d.ts +12 -0
  99. package/src/lib/targets/codex-hooks.js +33 -0
  100. package/src/lib/targets/codex-hooks.js.map +1 -0
  101. package/src/lib/targets/codex.js +1 -1
  102. package/src/lib/targets/codex.js.map +1 -1
  103. package/src/lib/targets/copilot.js +1 -1
  104. package/src/lib/targets/copilot.js.map +1 -1
  105. package/src/lib/targets/cursor.js +1 -1
  106. package/src/lib/targets/cursor.js.map +1 -1
  107. package/src/lib/targets/git-hooks.d.ts +24 -0
  108. package/src/lib/targets/git-hooks.js +70 -0
  109. package/src/lib/targets/git-hooks.js.map +1 -0
  110. package/src/lib/targets/hooks-shared.d.ts +37 -0
  111. package/src/lib/targets/hooks-shared.js +95 -0
  112. package/src/lib/targets/hooks-shared.js.map +1 -0
  113. package/src/lib/targets/shared.d.ts +0 -1
  114. package/src/lib/targets/shared.js +1 -1
  115. package/src/lib/targets/shared.js.map +1 -1
  116. package/src/lib/timetrack-command.d.ts +11 -0
  117. package/src/lib/timetrack-command.js +199 -0
  118. package/src/lib/timetrack-command.js.map +1 -0
  119. package/src/lib/timetrack.d.ts +86 -0
  120. package/src/lib/timetrack.js +112 -0
  121. package/src/lib/timetrack.js.map +1 -0
@@ -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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"}
@@ -0,0 +1,17 @@
1
+ import { SyncConfig } from './config';
2
+ export type RepairRequest = {
3
+ root: string;
4
+ config: SyncConfig;
5
+ ref?: string;
6
+ to?: string;
7
+ key?: string;
8
+ skipMrCheck: boolean;
9
+ assumeYes: boolean;
10
+ dryRun: boolean;
11
+ };
12
+ /**
13
+ * Renames a non-conforming branch and moves the merge requests aimed at it. Everything that can be
14
+ * checked is checked before the first mutation, and the order of the mutations is chosen so a
15
+ * failure leaves the old branch and every merge request intact.
16
+ */
17
+ export declare const gitFlowRepair: (request: RepairRequest) => Promise<1 | 0>;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gitFlowRepair = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const git_1 = require("./git");
6
+ const git_flow_1 = require("./git-flow");
7
+ const gitlab_1 = require("./gitlab");
8
+ const prompt_1 = require("./prompt");
9
+ const resolveNewName = (options) => {
10
+ const { branch, to, key, config } = options;
11
+ if (to)
12
+ return to;
13
+ const resolved = (0, git_flow_1.conformingNameFor)({ branch, key, config: config.gitFlow });
14
+ if (resolved.ok)
15
+ return resolved.name;
16
+ if (resolved.reason === 'already-conforms')
17
+ throw new Error(`${branch} already conforms — nothing to repair.`);
18
+ if (resolved.reason === 'needs-key') {
19
+ throw new Error(`${branch} carries no issue key, so the new name needs one: \`git-flow repair ${branch} --key FIP-1234\` (or --to <branch>).`);
20
+ }
21
+ throw new Error(`No conforming name can be derived from ${branch}. Pass --to <branch>.`);
22
+ };
23
+ const readRemoteState = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
24
+ const { root, branch, skipMrCheck } = options;
25
+ const remote = (0, git_1.defaultRemote)(root);
26
+ if (!remote || !(0, git_1.remoteBranchExists)({ root, remote, branch }))
27
+ return { pushed: false };
28
+ if (skipMrCheck)
29
+ return { pushed: true, remote, retarget: [] };
30
+ const project = (0, gitlab_1.parseRemoteUrl)((0, git_1.remoteUrl)({ root, remote }));
31
+ const token = (0, gitlab_1.gitLabToken)();
32
+ if (!project || !token) {
33
+ throw new Error([
34
+ `${branch} is pushed to ${remote}, so open merge requests may point at it and must be retargeted.`,
35
+ project
36
+ ? 'Set GITLAB_TOKEN to a token with the "api" scope, or pass --no-mr-check if you know none do.'
37
+ : `The ${remote} URL is not a recognisable GitLab remote. Pass --no-mr-check if no merge request points at ${branch}.`,
38
+ ].join('\n'));
39
+ }
40
+ const mergeRequests = yield (0, gitlab_1.openMergeRequestsFor)({ project, token, branch });
41
+ const blocking = (0, gitlab_1.blockingMergeRequests)({ mergeRequests, branch });
42
+ if (blocking.length > 0) {
43
+ throw new Error([
44
+ `${branch} is the source branch of ${blocking.length} open merge request(s):`,
45
+ ...blocking.map((mr) => ` !${mr.iid} ${mr.title} ${mr.url}`),
46
+ 'GitLab cannot move a merge request to a different source branch, and closing it would lose its discussion.',
47
+ 'Merge or close it first, then repair the branch.',
48
+ ].join('\n'));
49
+ }
50
+ return {
51
+ pushed: true,
52
+ remote,
53
+ retarget: mergeRequests.filter((mr) => mr.targetBranch === branch),
54
+ api: { project, token },
55
+ };
56
+ });
57
+ const describeSteps = (options) => {
58
+ const { branch, newName, remote } = options;
59
+ const steps = [`git branch -m ${branch} ${newName}`];
60
+ if (remote.pushed) {
61
+ steps.push(`git push -u ${remote.remote} ${newName}`);
62
+ steps.push(...remote.retarget.map((mr) => `retarget !${mr.iid} to ${newName}`));
63
+ steps.push(`git push ${remote.remote} --delete ${branch}`);
64
+ }
65
+ return steps;
66
+ };
67
+ /**
68
+ * Renames a non-conforming branch and moves the merge requests aimed at it. Everything that can be
69
+ * checked is checked before the first mutation, and the order of the mutations is chosen so a
70
+ * failure leaves the old branch and every merge request intact.
71
+ */
72
+ const gitFlowRepair = (request) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
73
+ var _a;
74
+ const { root, config, dryRun } = request;
75
+ const branch = (_a = request.ref) !== null && _a !== void 0 ? _a : (0, git_1.currentBranch)(root);
76
+ const newName = resolveNewName({ branch, to: request.to, key: request.key, config });
77
+ const parsed = (0, git_flow_1.parseBranch)({ branch: newName, config: config.gitFlow });
78
+ if (!parsed.ok) {
79
+ console.error(`${newName} does not conform either:`);
80
+ parsed.findings.forEach((finding) => console.error(` ${finding.rule} ${finding.message}`));
81
+ return 1;
82
+ }
83
+ if (!(0, git_1.localBranchExists)({ root, branch })) {
84
+ console.error(`${branch} does not exist locally — check it out first, then repair it.`);
85
+ return 1;
86
+ }
87
+ if ((0, git_1.localBranchExists)({ root, branch: newName })) {
88
+ console.error(`${newName} already exists locally.`);
89
+ return 1;
90
+ }
91
+ const remote = yield readRemoteState({ root, branch, skipMrCheck: request.skipMrCheck });
92
+ if (remote.pushed && (0, git_1.remoteBranchExists)({ root, remote: remote.remote, branch: newName })) {
93
+ console.error(`${newName} already exists on ${remote.remote}.`);
94
+ return 1;
95
+ }
96
+ const steps = describeSteps({ branch, newName, remote });
97
+ console.log('Repair');
98
+ console.log(` from ${branch}`);
99
+ console.log(` to ${newName}`);
100
+ console.log(` remote ${remote.pushed ? `${remote.remote} (pushed)` : 'not pushed'}`);
101
+ if (remote.pushed && !remote.api)
102
+ console.log(' warn merge requests were not checked (--no-mr-check)');
103
+ if (remote.pushed) {
104
+ remote.retarget.forEach((mr) => console.log(` retarget !${mr.iid} ${mr.title}`));
105
+ }
106
+ console.log('\nSteps');
107
+ steps.forEach((step, index) => console.log(` ${index + 1}. ${step}`));
108
+ if (dryRun) {
109
+ console.log('\nDry run — nothing was changed.');
110
+ return 0;
111
+ }
112
+ if (!(yield (0, prompt_1.confirm)({ question: `\nRename ${branch} to ${newName}?`, assumeYes: request.assumeYes }))) {
113
+ console.log('Nothing was changed.');
114
+ return 1;
115
+ }
116
+ (0, git_1.git)({ root, args: ['branch', '-m', branch, newName] });
117
+ if (!remote.pushed) {
118
+ console.log(`\nRenamed to ${newName}.`);
119
+ return 0;
120
+ }
121
+ (0, git_1.gitLoud)({ root, args: ['push', '-u', remote.remote, newName] });
122
+ const { api } = remote;
123
+ for (const mergeRequest of remote.retarget) {
124
+ if (!api)
125
+ break;
126
+ try {
127
+ yield (0, gitlab_1.retargetMergeRequest)({ project: api.project, token: api.token, iid: mergeRequest.iid, target: newName });
128
+ console.log(`Retargeted !${mergeRequest.iid} to ${newName}.`);
129
+ }
130
+ catch (error) {
131
+ console.error(`\nFailed to retarget !${mergeRequest.iid}: ${error instanceof Error ? error.message : error}`);
132
+ console.error([
133
+ `${branch} still exists on ${remote.remote}, so nothing is broken — but the rename is half done.`,
134
+ `Retarget the remaining merge request(s) to ${newName} by hand, then run:`,
135
+ ` git push ${remote.remote} --delete ${branch}`,
136
+ `Or undo: git branch -m ${newName} ${branch} && git push ${remote.remote} --delete ${newName}`,
137
+ ].join('\n'));
138
+ return 1;
139
+ }
140
+ }
141
+ (0, git_1.gitLoud)({ root, args: ['push', remote.remote, '--delete', branch] });
142
+ console.log(`\nRenamed to ${newName} on ${remote.remote}.`);
143
+ return 0;
144
+ });
145
+ exports.gitFlowRepair = gitFlowRepair;
146
+ //# sourceMappingURL=git-flow-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-flow-repair.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/git-flow-repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { SyncConfig } from './config';
2
+ export type StartRequest = {
3
+ root: string;
4
+ config: SyncConfig;
5
+ key?: string;
6
+ subject?: string;
7
+ type?: string;
8
+ parent?: string;
9
+ hotfix: boolean;
10
+ releaseDate?: string;
11
+ push: boolean;
12
+ assumeYes: boolean;
13
+ dryRun: boolean;
14
+ };
15
+ /**
16
+ * The prospective flow: an issue key in, a correctly named branch off the correct base out. Shares
17
+ * `planStart` with `@ethlete/timetrack`'s ticket → branch flow, so the two cannot name a branch
18
+ * differently.
19
+ */
20
+ export declare const gitFlowStart: (request: StartRequest) => Promise<1 | 0>;
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gitFlowStart = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const git_1 = require("./git");
6
+ const git_flow_1 = require("./git-flow");
7
+ const prompt_1 = require("./prompt");
8
+ const timetrack_1 = require("./timetrack");
9
+ /**
10
+ * A Task's parent Story must already have its feature branch, because that branch is what the
11
+ * sub-feature nests under and is based on. A Story whose branch still uses a deprecated spelling
12
+ * therefore has to be repaired before anything can nest under it — the name is the parent path.
13
+ */
14
+ const findParentBranch = (options) => {
15
+ const { root, storyKey, config } = options;
16
+ const matches = (0, git_flow_1.featureBranchesFor)({ branches: (0, git_1.allBranches)(root), storyKey, config });
17
+ if (matches.length === 0) {
18
+ throw new Error([
19
+ `No feature branch found for the parent story ${storyKey}.`,
20
+ `Create it first with \`ethlete-agents git-flow start ${storyKey}\`, or pass --of <branch>.`,
21
+ "If it exists under a deprecated name, `git-flow repair` it first — a sub-feature nests under its parent's full name.",
22
+ ].join('\n'));
23
+ }
24
+ if (matches.length > 1) {
25
+ throw new Error(`${storyKey} has more than one feature branch: ${matches.join(', ')}. Pass --of <branch>.`);
26
+ }
27
+ return matches[0];
28
+ };
29
+ /**
30
+ * Timetrack resolves the subject field, because the field id is the instance's and lives there. An
31
+ * issue that sets nothing falls back to its summary, which is a paraphrase rather than the agreed
32
+ * subject — so the plan says which of the two it used.
33
+ */
34
+ const resolveSubject = (issue) => issue.subject
35
+ ? { subject: issue.subject, subjectSource: "the issue's subject field" }
36
+ : { subject: issue.summary, subjectSource: `the summary — ${issue.key} sets no subject field` };
37
+ const resolve = (request) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
38
+ var _a;
39
+ const { root, config, subject, type, parent, hotfix, releaseDate } = request;
40
+ if (releaseDate)
41
+ return { spec: { kind: 'release', date: releaseDate }, subjectSource: '—' };
42
+ if (!request.key)
43
+ throw new Error('Pass an issue key, e.g. `git-flow start FIP-2177`.');
44
+ const key = request.key.toUpperCase();
45
+ if (subject) {
46
+ if (hotfix)
47
+ return { spec: { kind: 'hotfix', key, subject }, subjectSource: '--subject' };
48
+ if (parent) {
49
+ return { spec: (0, git_flow_1.nestedSpecFor)({ parent, key, subject, config: config.gitFlow }), subjectSource: '--subject' };
50
+ }
51
+ return { spec: { kind: 'main-feature', type, key, subject }, subjectSource: '--subject' };
52
+ }
53
+ const issue = yield (0, timetrack_1.timetrackIssue)(key);
54
+ const resolvedSubject = resolveSubject(issue);
55
+ const resolvedType = type !== null && type !== void 0 ? type : (_a = config.jira.typeByIssueType) === null || _a === void 0 ? void 0 : _a[issue.issueType];
56
+ const shared = { key, subject: resolvedSubject.subject };
57
+ if (hotfix)
58
+ return { spec: Object.assign({ kind: 'hotfix' }, shared), issue, subjectSource: resolvedSubject.subjectSource };
59
+ const parentBranch = parent !== null && parent !== void 0 ? parent : (issue.parentKey ? findParentBranch({ root, storyKey: issue.parentKey, config: config.gitFlow }) : undefined);
60
+ if (parentBranch) {
61
+ return {
62
+ spec: (0, git_flow_1.nestedSpecFor)(Object.assign(Object.assign({ parent: parentBranch }, shared), { config: config.gitFlow })),
63
+ issue,
64
+ subjectSource: resolvedSubject.subjectSource,
65
+ };
66
+ }
67
+ return {
68
+ spec: Object.assign({ kind: 'main-feature', type: resolvedType }, shared),
69
+ issue,
70
+ subjectSource: resolvedSubject.subjectSource,
71
+ };
72
+ });
73
+ const describePlan = (options) => {
74
+ const { plan, baseRef } = options;
75
+ const { issue, spec, subjectSource } = options.resolved;
76
+ const lines = [` branch ${plan.branch}`, ` from ${baseRef}`, ` merges to ${plan.mrTargets.join(' or ')}`];
77
+ if (issue)
78
+ lines.unshift(` issue ${issue.key} ${issue.issueType}${issue.summary ? ` — ${issue.summary}` : ''}`);
79
+ if (spec.kind !== 'release')
80
+ lines.push(` subject from ${subjectSource}`);
81
+ return lines;
82
+ };
83
+ /**
84
+ * The prospective flow: an issue key in, a correctly named branch off the correct base out. Shares
85
+ * `planStart` with `@ethlete/timetrack`'s ticket → branch flow, so the two cannot name a branch
86
+ * differently.
87
+ */
88
+ const gitFlowStart = (request) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
89
+ const { root, config, push, dryRun } = request;
90
+ const resolved = yield resolve(request);
91
+ const plan = (0, git_flow_1.planStart)({ spec: resolved.spec, config: config.gitFlow });
92
+ if (plan.problems.length > 0) {
93
+ console.error(`Cannot name a conforming branch for this issue:`);
94
+ plan.problems.forEach((problem) => console.error(` ${problem}`));
95
+ return 1;
96
+ }
97
+ const base = plan.base;
98
+ const remote = (0, git_1.defaultRemote)(root);
99
+ const baseOnRemote = remote ? (0, git_1.remoteBranchExists)({ root, remote, branch: base }) : false;
100
+ const baseRef = baseOnRemote ? `${remote}/${base}` : base;
101
+ console.log(`Plan`);
102
+ describePlan({ plan, resolved, baseRef }).forEach((line) => console.log(line));
103
+ if ((0, git_1.localBranchExists)({ root, branch: plan.branch })) {
104
+ console.error(`\n${plan.branch} already exists — \`git switch ${plan.branch}\`.`);
105
+ return 1;
106
+ }
107
+ if (!baseOnRemote && !(0, git_1.localBranchExists)({ root, branch: base })) {
108
+ console.error(`\nThe base branch ${base} exists neither locally nor on ${remote !== null && remote !== void 0 ? remote : 'any remote'}.`);
109
+ return 1;
110
+ }
111
+ if ((0, git_1.isDirty)(root)) {
112
+ console.error('\nThe working tree has uncommitted changes — commit or stash them first.');
113
+ return 1;
114
+ }
115
+ if (dryRun) {
116
+ console.log('\nDry run — nothing was created.');
117
+ return 0;
118
+ }
119
+ if (!(yield (0, prompt_1.confirm)({ question: `\nCreate ${plan.branch} from ${baseRef}?`, assumeYes: request.assumeYes }))) {
120
+ console.log('Nothing was created.');
121
+ return 1;
122
+ }
123
+ if (remote && baseOnRemote)
124
+ (0, git_1.gitLoud)({ root, args: ['fetch', remote, base] });
125
+ (0, git_1.gitLoud)({ root, args: ['switch', '-c', plan.branch, '--no-track', baseRef] });
126
+ if (push && remote)
127
+ (0, git_1.gitLoud)({ root, args: ['push', '-u', remote, plan.branch] });
128
+ console.log(`\nOn ${(0, git_1.currentBranch)(root)}. Open the merge request against ${plan.mrTargets[0]}.`);
129
+ return 0;
130
+ });
131
+ exports.gitFlowStart = gitFlowStart;
132
+ //# sourceMappingURL=git-flow-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-flow-start.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/git-flow-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare const git: (options: {
2
+ root: string;
3
+ args: string[];
4
+ }) => string;
5
+ /** Runs a command whose output belongs on the terminal — a push, a fetch, a branch creation. */
6
+ export declare const gitLoud: (options: {
7
+ root: string;
8
+ args: string[];
9
+ }) => string;
10
+ export declare const currentBranch: (root: string) => string;
11
+ export declare const allBranches: (root: string) => string[];
12
+ export declare const isDirty: (root: string) => boolean;
13
+ export declare const localBranchExists: (options: {
14
+ root: string;
15
+ branch: string;
16
+ }) => boolean;
17
+ export declare const remoteBranchExists: (options: {
18
+ root: string;
19
+ remote: string;
20
+ branch: string;
21
+ }) => boolean;
22
+ /** `origin` when it exists, otherwise the only remote — a repo with several and no `origin` is ambiguous. */
23
+ export declare const defaultRemote: (root: string) => string | undefined;
24
+ export declare const remoteUrl: (options: {
25
+ root: string;
26
+ remote: string;
27
+ }) => string;