@ethlete/cli 2.1.0-next.8 → 3.0.0-next.16

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 (128) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +22 -7
  3. package/design/define-call.ts +92 -0
  4. package/design/web/env.d.ts +11 -0
  5. package/design/web/frame.html +17 -0
  6. package/design/web/frame.ts +44 -0
  7. package/design/web/host.css +494 -0
  8. package/design/web/host.ts +445 -0
  9. package/design/web/index.html +11 -0
  10. package/package.json +13 -2
  11. package/src/index.d.ts +1 -0
  12. package/src/index.js +32 -4
  13. package/src/index.js.map +1 -1
  14. package/src/lib/api/clear.js +13 -3
  15. package/src/lib/api/clear.js.map +1 -1
  16. package/src/lib/api/compose.js +5 -1
  17. package/src/lib/api/compose.js.map +1 -1
  18. package/src/lib/api/git.d.ts +11 -4
  19. package/src/lib/api/git.js +35 -8
  20. package/src/lib/api/git.js.map +1 -1
  21. package/src/lib/api/load-definitions.js +10 -1
  22. package/src/lib/api/load-definitions.js.map +1 -1
  23. package/src/lib/api/ports.js +12 -3
  24. package/src/lib/api/ports.js.map +1 -1
  25. package/src/lib/api/run.js +8 -3
  26. package/src/lib/api/run.js.map +1 -1
  27. package/src/lib/api/setup.js +1 -1
  28. package/src/lib/api/setup.js.map +1 -1
  29. package/src/lib/api/state.js +7 -5
  30. package/src/lib/api/state.js.map +1 -1
  31. package/src/lib/auth/composer-auth.js +3 -2
  32. package/src/lib/auth/composer-auth.js.map +1 -1
  33. package/src/lib/auth/gitlab-token.js +1 -1
  34. package/src/lib/auth/gitlab-token.js.map +1 -1
  35. package/src/lib/config/diagnose.js +15 -9
  36. package/src/lib/config/diagnose.js.map +1 -1
  37. package/src/lib/config/local-config.d.ts +1 -1
  38. package/src/lib/design/calls-tsconfig.d.ts +6 -0
  39. package/src/lib/design/calls-tsconfig.js +37 -0
  40. package/src/lib/design/calls-tsconfig.js.map +1 -0
  41. package/src/lib/design/check.d.ts +11 -0
  42. package/src/lib/design/check.js +203 -0
  43. package/src/lib/design/check.js.map +1 -0
  44. package/src/lib/design/design-command.d.ts +10 -0
  45. package/src/lib/design/design-command.js +32 -0
  46. package/src/lib/design/design-command.js.map +1 -0
  47. package/src/lib/design/index.d.ts +5 -0
  48. package/src/lib/design/index.js +9 -0
  49. package/src/lib/design/index.js.map +1 -0
  50. package/src/lib/design/paths.d.ts +24 -0
  51. package/src/lib/design/paths.js +31 -0
  52. package/src/lib/design/paths.js.map +1 -0
  53. package/src/lib/design/serve.d.ts +7 -0
  54. package/src/lib/design/serve.js +144 -0
  55. package/src/lib/design/serve.js.map +1 -0
  56. package/src/lib/design/vite-paths.d.ts +7 -0
  57. package/src/lib/design/vite-paths.js +15 -0
  58. package/src/lib/design/vite-paths.js.map +1 -0
  59. package/src/lib/doctor/doctor-command.js +18 -4
  60. package/src/lib/doctor/doctor-command.js.map +1 -1
  61. package/src/lib/index.d.ts +1 -0
  62. package/src/lib/index.js +1 -0
  63. package/src/lib/index.js.map +1 -1
  64. package/src/lib/release.d.ts +38 -1
  65. package/src/lib/release.js +153 -28
  66. package/src/lib/release.js.map +1 -1
  67. package/src/lib/update/agent-rules-sync.d.ts +37 -0
  68. package/src/lib/update/agent-rules-sync.js +40 -0
  69. package/src/lib/update/agent-rules-sync.js.map +1 -0
  70. package/src/lib/update/agent-setup.d.ts +33 -0
  71. package/src/lib/update/agent-setup.js +124 -0
  72. package/src/lib/update/agent-setup.js.map +1 -0
  73. package/src/lib/update/ai.d.ts +37 -8
  74. package/src/lib/update/ai.js +193 -24
  75. package/src/lib/update/ai.js.map +1 -1
  76. package/src/lib/update/args.d.ts +2 -0
  77. package/src/lib/update/args.js +22 -2
  78. package/src/lib/update/args.js.map +1 -1
  79. package/src/lib/update/available-migrations.d.ts +10 -0
  80. package/src/lib/update/available-migrations.js +23 -0
  81. package/src/lib/update/available-migrations.js.map +1 -0
  82. package/src/lib/update/commits.d.ts +63 -0
  83. package/src/lib/update/commits.js +146 -0
  84. package/src/lib/update/commits.js.map +1 -0
  85. package/src/lib/update/gitignore.d.ts +8 -0
  86. package/src/lib/update/gitignore.js +22 -0
  87. package/src/lib/update/gitignore.js.map +1 -0
  88. package/src/lib/update/index.d.ts +6 -0
  89. package/src/lib/update/index.js +6 -0
  90. package/src/lib/update/index.js.map +1 -1
  91. package/src/lib/update/migration-manifest.d.ts +10 -0
  92. package/src/lib/update/migration-manifest.js +15 -3
  93. package/src/lib/update/migration-manifest.js.map +1 -1
  94. package/src/lib/update/migration-record.d.ts +24 -0
  95. package/src/lib/update/migration-record.js +48 -0
  96. package/src/lib/update/migration-record.js.map +1 -0
  97. package/src/lib/update/migrations-command.d.ts +14 -0
  98. package/src/lib/update/migrations-command.js +212 -0
  99. package/src/lib/update/migrations-command.js.map +1 -0
  100. package/src/lib/update/package-manager.d.ts +20 -1
  101. package/src/lib/update/package-manager.js +34 -15
  102. package/src/lib/update/package-manager.js.map +1 -1
  103. package/src/lib/update/packages.d.ts +28 -8
  104. package/src/lib/update/packages.js +117 -36
  105. package/src/lib/update/packages.js.map +1 -1
  106. package/src/lib/update/pending.d.ts +16 -0
  107. package/src/lib/update/pending.js +21 -5
  108. package/src/lib/update/pending.js.map +1 -1
  109. package/src/lib/update/plan.d.ts +33 -8
  110. package/src/lib/update/plan.js +76 -7
  111. package/src/lib/update/plan.js.map +1 -1
  112. package/src/lib/update/registry.d.ts +32 -4
  113. package/src/lib/update/registry.js +145 -8
  114. package/src/lib/update/registry.js.map +1 -1
  115. package/src/lib/update/run-migrations.d.ts +2 -0
  116. package/src/lib/update/run-migrations.js +20 -15
  117. package/src/lib/update/run-migrations.js.map +1 -1
  118. package/src/lib/update/scan.d.ts +14 -0
  119. package/src/lib/update/scan.js +57 -0
  120. package/src/lib/update/scan.js.map +1 -0
  121. package/src/lib/update/semver.js +2 -1
  122. package/src/lib/update/semver.js.map +1 -1
  123. package/src/lib/update/tasks.d.ts +18 -1
  124. package/src/lib/update/tasks.js +114 -43
  125. package/src/lib/update/tasks.js.map +1 -1
  126. package/src/lib/update/update-command.d.ts +7 -0
  127. package/src/lib/update/update-command.js +300 -73
  128. package/src/lib/update/update-command.js.map +1 -1
@@ -1,44 +1,213 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runAgentTasks = exports.assistedTasks = exports.agentCommand = exports.PROMPT_PLACEHOLDER = exports.AGENT_COMMAND_KEY = void 0;
3
+ exports.runAgentTasks = exports.assistedTasks = exports.agentEnv = exports.agentCommand = exports.FINISHED_ENV = exports.FILE_ENV = exports.PROMPT_ENV = exports.agentPrompt = exports.finishedPath = exports.FILE_PLACEHOLDER = exports.PROMPT_PLACEHOLDER = exports.AGENT_COMMAND_EXAMPLE = exports.AGENT_COMMAND_KEY = void 0;
4
+ const tslib_1 = require("tslib");
4
5
  const child_process_1 = require("child_process");
6
+ const fs_1 = require("fs");
5
7
  const path_1 = require("path");
8
+ const promises_1 = require("timers/promises");
6
9
  /** Where the agent command sits in `ethlete.config.local.json`. */
7
10
  exports.AGENT_COMMAND_KEY = 'updateAgentCommand';
8
- /** What the command template is asked to hold, so the prompt can go anywhere in it. */
11
+ /** An interactive agent command that can edit files without asking, for the error that names the key. */
12
+ exports.AGENT_COMMAND_EXAMPLE = 'claude --permission-mode auto';
13
+ /** Where the command template takes the whole prompt. */
9
14
  exports.PROMPT_PLACEHOLDER = '<prompt>';
15
+ /** Where the command template takes only the path of the task file. */
16
+ exports.FILE_PLACEHOLDER = '<file>';
17
+ /** The file an agent writes to tell `et update` that it is finished with a task. */
18
+ const finishedPath = (taskPath) => `${taskPath.replace(/\.md$/, '')}.finished`;
19
+ exports.finishedPath = finishedPath;
20
+ /** The prompt one assisted task is handed to an agent with. */
21
+ const agentPrompt = (taskPath) => `Apply the migration task described in ${taskPath} to this repository. ` +
22
+ 'Follow its instructions, then delete that file once the change is complete. ' +
23
+ 'Do not commit: et update commits your change. ' +
24
+ `When you are finished and the user has no more questions for you, create the empty file ${(0, exports.finishedPath)(taskPath)} ` +
25
+ 'as your very last step: et update then ends this session, commits the change and starts the next task.';
26
+ exports.agentPrompt = agentPrompt;
27
+ exports.PROMPT_ENV = 'ETHLETE_UPDATE_PROMPT';
28
+ exports.FILE_ENV = 'ETHLETE_UPDATE_TASK_FILE';
29
+ exports.FINISHED_ENV = 'ETHLETE_UPDATE_FINISHED_FILE';
30
+ const reference = (options) => {
31
+ const { name, platform, insideQuotes } = options;
32
+ const bare = platform === 'win32' ? `%${name}%` : `$${name}`;
33
+ return insideQuotes ? bare : `"${bare}"`;
34
+ };
35
+ const PLACEHOLDERS = [
36
+ { text: exports.PROMPT_PLACEHOLDER, name: exports.PROMPT_ENV },
37
+ { text: exports.FILE_PLACEHOLDER, name: exports.FILE_ENV },
38
+ ];
10
39
  /**
11
- * The command that hands one task to an agent. `<prompt>` becomes the path of the task file; a template
12
- * without it gets the path appended, which is what a plain `claude -p` needs.
40
+ * The command that hands one task to an agent. `<prompt>` becomes the prompt, `<file>` the path of the
41
+ * task file; a template with neither gets the prompt appended, which is what `claude -p` needs. Both
42
+ * values reach the shell as variable references; run it with `agentEnv`.
13
43
  */
14
44
  const agentCommand = (options) => {
15
- const { template, promptPath } = options;
16
- const quoted = /\s/.test(promptPath) ? `"${promptPath}"` : promptPath;
17
- return template.includes(exports.PROMPT_PLACEHOLDER)
18
- ? template.split(exports.PROMPT_PLACEHOLDER).join(quoted)
19
- : `${template} ${quoted}`;
45
+ const { template, platform = process.platform } = options;
46
+ if (!PLACEHOLDERS.some(({ text }) => template.includes(text))) {
47
+ return `${template} ${reference({ name: exports.PROMPT_ENV, platform, insideQuotes: false })}`;
48
+ }
49
+ let command = '';
50
+ let insideQuotes = false;
51
+ for (let index = 0; index < template.length;) {
52
+ const placeholder = PLACEHOLDERS.find(({ text }) => template.startsWith(text, index));
53
+ if (placeholder) {
54
+ command += reference({ name: placeholder.name, platform, insideQuotes });
55
+ index += placeholder.text.length;
56
+ continue;
57
+ }
58
+ const char = template.charAt(index);
59
+ if (char === '"')
60
+ insideQuotes = !insideQuotes;
61
+ command += char;
62
+ index += 1;
63
+ }
64
+ return command;
20
65
  };
21
66
  exports.agentCommand = agentCommand;
67
+ const agentEnv = (taskPath) => ({
68
+ [exports.PROMPT_ENV]: (0, exports.agentPrompt)(taskPath),
69
+ [exports.FILE_ENV]: taskPath,
70
+ [exports.FINISHED_ENV]: (0, exports.finishedPath)(taskPath),
71
+ });
72
+ exports.agentEnv = agentEnv;
22
73
  /** The tasks an agent can work on: the ones whose instructions were written as a prompt. */
23
74
  const assistedTasks = (tasks) => tasks.filter((task) => task.kind === 'assisted' && task.instructionsFile !== undefined);
24
75
  exports.assistedTasks = assistedTasks;
76
+ const DEFAULT_TIMING = { pollMs: 250, settleMs: 2000, killMs: 5000 };
25
77
  /**
26
- * Runs the configured agent once per assisted task, in order, so each run has one change to make. The
27
- * command is a user-written string, so it runs through a shell.
78
+ * The shell and its children: `sh -c` does not always exec the command, so the shell can exit on SIGTERM
79
+ * while the agent under it lives on.
28
80
  */
29
- const runAgentTasks = (options) => {
30
- const { root, template, tasks } = options;
31
- return (0, exports.assistedTasks)(tasks).map((task) => {
32
- var _a;
33
- const command = (0, exports.agentCommand)({ template, promptPath: (0, path_1.join)(root, (_a = task.instructionsFile) !== null && _a !== void 0 ? _a : '') });
34
- console.log(`\n ${command}`);
35
- const result = (0, child_process_1.spawnSync)(command, { cwd: root, stdio: 'inherit', shell: true });
36
- if (result.error)
37
- return { task, command, ok: false, reason: result.error.message };
38
- if (result.status !== 0)
39
- return { task, command, ok: false, reason: `exited with ${result.status}` };
40
- return { task, command, ok: true };
41
- });
81
+ const processTree = (pid) => {
82
+ var _a;
83
+ if (process.platform === 'win32')
84
+ return [pid];
85
+ const children = (_a = (0, child_process_1.spawnSync)('pgrep', ['-P', String(pid)], { encoding: 'utf8' }).stdout) !== null && _a !== void 0 ? _a : '';
86
+ return [pid, ...children.split('\n').filter(Boolean).map(Number)];
87
+ };
88
+ const signal = (pid, name) => {
89
+ if (process.platform === 'win32') {
90
+ (0, child_process_1.spawnSync)('taskkill', ['/pid', String(pid), '/T', ...(name === 'SIGKILL' ? ['/F'] : [])], { stdio: 'ignore' });
91
+ return;
92
+ }
93
+ try {
94
+ process.kill(pid, name);
95
+ }
96
+ catch (_a) {
97
+ return;
98
+ }
99
+ };
100
+ const isAlive = (pid) => {
101
+ try {
102
+ process.kill(pid, 0);
103
+ return true;
104
+ }
105
+ catch (_a) {
106
+ return false;
107
+ }
42
108
  };
109
+ /** Alternate screen, mouse, focus events and bracketed paste off; kitty keyboard modes popped; cursor shown. */
110
+ const TERMINAL_RESET = '\x1b[?1049l\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l\x1b[?1004l\x1b[?2004l\x1b[<10u\x1b[?25h';
111
+ /** An agent ended by a signal can leave the terminal raw with its screen modes on: Codex 0.157 does. */
112
+ const restoreTerminal = () => {
113
+ if (process.stdout.isTTY)
114
+ process.stdout.write(TERMINAL_RESET);
115
+ if (process.platform !== 'win32' && process.stdin.isTTY)
116
+ (0, child_process_1.spawnSync)('stty', ['sane'], { stdio: 'inherit' });
117
+ };
118
+ const ignoreInterrupt = () => undefined;
119
+ const wait = (ms, signal) => (0, promises_1.setTimeout)(ms, undefined, { signal }).catch(() => undefined);
120
+ const watchFor = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
121
+ const { path, pollMs, signal } = options;
122
+ while (!signal.aborted) {
123
+ if ((0, fs_1.existsSync)(path))
124
+ return true;
125
+ yield wait(pollMs, signal);
126
+ }
127
+ return false;
128
+ });
129
+ const endTree = (pid, timing) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
130
+ const targets = processTree(pid);
131
+ const started = Date.now();
132
+ let killed = false;
133
+ targets.forEach((target) => signal(target, 'SIGTERM'));
134
+ while (targets.some(isAlive)) {
135
+ if (!killed && Date.now() - started >= timing.killMs) {
136
+ killed = true;
137
+ targets.filter(isAlive).forEach((target) => signal(target, 'SIGKILL'));
138
+ }
139
+ yield wait(timing.pollMs);
140
+ }
141
+ });
142
+ const runOne = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
143
+ var _a;
144
+ const { root, template, task, timing } = options;
145
+ const taskPath = (0, path_1.join)(root, (_a = task.instructionsFile) !== null && _a !== void 0 ? _a : '');
146
+ const finishedFile = (0, exports.finishedPath)(taskPath);
147
+ const command = (0, exports.agentCommand)({ template });
148
+ console.log(` ${command}\n ${exports.FILE_ENV}=${taskPath}\n`);
149
+ (0, fs_1.rmSync)(finishedFile, { force: true });
150
+ // Ctrl+C belongs to the agent while it runs: an interactive CLI uses it to cancel, not to quit.
151
+ process.on('SIGINT', ignoreInterrupt);
152
+ const child = (0, child_process_1.spawn)(command, {
153
+ cwd: root,
154
+ stdio: 'inherit',
155
+ shell: true,
156
+ env: Object.assign(Object.assign({}, process.env), (0, exports.agentEnv)(taskPath)),
157
+ });
158
+ const exited = new AbortController();
159
+ const exit = new Promise((resolve) => {
160
+ child.on('error', (error) => resolve({ status: null, error }));
161
+ child.on('exit', (status) => resolve({ status }));
162
+ }).finally(() => exited.abort());
163
+ let ended = false;
164
+ if (yield watchFor({ path: finishedFile, pollMs: timing.pollMs, signal: exited.signal })) {
165
+ console.log('\n The agent is finished, so et update ends the session.');
166
+ yield wait(timing.settleMs, exited.signal);
167
+ if (!exited.signal.aborted && child.pid !== undefined) {
168
+ ended = true;
169
+ yield endTree(child.pid, timing);
170
+ }
171
+ }
172
+ const { status, error } = yield exit;
173
+ process.off('SIGINT', ignoreInterrupt);
174
+ if (ended)
175
+ restoreTerminal();
176
+ (0, fs_1.rmSync)(finishedFile, { force: true });
177
+ if (error)
178
+ return { task, command, state: 'failed', reason: error.message };
179
+ if (!ended && status !== 0)
180
+ return { task, command, state: 'failed', reason: `exited with ${status}` };
181
+ if ((0, fs_1.existsSync)(taskPath)) {
182
+ return { task, command, state: 'open', reason: `the agent left ${task.instructionsFile}, so the task stays open` };
183
+ }
184
+ return { task, command, state: 'done' };
185
+ });
186
+ /**
187
+ * Runs the configured agent once per assisted task, in order, so each run has one change to make, and
188
+ * reports each one as it ends. The command is a user-written string, so it runs through a shell.
189
+ * A run ends when the agent exits, or shortly after it writes the finished file the prompt names.
190
+ * `afterRun` runs after each task, before the next one starts; it is how `et update` commits a task that
191
+ * ended done, so the report of any other task says it is not committed.
192
+ */
193
+ const runAgentTasks = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
194
+ const { afterRun } = options;
195
+ const { root, template } = options;
196
+ const timing = Object.assign(Object.assign({}, DEFAULT_TIMING), options.timing);
197
+ const tasks = (0, exports.assistedTasks)(options.tasks);
198
+ const runs = [];
199
+ for (const [index, task] of tasks.entries()) {
200
+ const label = `[${index + 1}/${tasks.length}] ${task.packageName} ${task.name}`;
201
+ console.log(`\n ${label}\n An interactive session ends by itself when the agent is finished. Type /exit to end it sooner.`);
202
+ const run = yield runOne({ root, template, task, timing });
203
+ if (run.state === 'done')
204
+ console.log(`\n ${label}: done`);
205
+ else
206
+ console.error(`\n ${label}: ${run.reason}${afterRun ? ', so it is not committed' : ''}`);
207
+ afterRun === null || afterRun === void 0 ? void 0 : afterRun(run);
208
+ runs.push(run);
209
+ }
210
+ return runs;
211
+ });
43
212
  exports.runAgentTasks = runAgentTasks;
44
213
  //# sourceMappingURL=ai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/ai.ts"],"names":[],"mappings":";;;AAAA,iDAA0C;AAC1C,+BAA4B;AAG5B,mEAAmE;AACtD,QAAA,iBAAiB,GAAG,oBAAoB,CAAC;AAEtD,uFAAuF;AAC1E,QAAA,kBAAkB,GAAG,UAAU,CAAC;AAE7C;;;GAGG;AACI,MAAM,YAAY,GAAG,CAAC,OAAiD,EAAE,EAAE;IAChF,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;IAEtE,OAAO,QAAQ,CAAC,QAAQ,CAAC,0BAAkB,CAAC;QAC1C,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,0BAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACjD,CAAC,CAAC,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;AAC9B,CAAC,CAAC;AAPW,QAAA,YAAY,gBAOvB;AASF,4FAA4F;AACrF,MAAM,aAAa,GAAG,CAAC,KAA4B,EAAE,EAAE,CAC5D,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC;AAD7E,QAAA,aAAa,iBACgE;AAE1F;;;GAGG;AACI,MAAM,aAAa,GAAG,CAAC,OAI7B,EAAc,EAAE;IACf,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1C,OAAO,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;;QACvC,MAAM,OAAO,GAAG,IAAA,oBAAY,EAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAA,WAAI,EAAC,IAAI,EAAE,MAAA,IAAI,CAAC,gBAAgB,mCAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhG,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhF,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAEpF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAErG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AApBW,QAAA,aAAa,iBAoBxB"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/ai.ts"],"names":[],"mappings":";;;;AAAA,iDAAiD;AACjD,2BAAwC;AACxC,+BAA4B;AAC5B,8CAAsD;AAGtD,mEAAmE;AACtD,QAAA,iBAAiB,GAAG,oBAAoB,CAAC;AAEtD,yGAAyG;AAC5F,QAAA,qBAAqB,GAAG,+BAA+B,CAAC;AAErE,yDAAyD;AAC5C,QAAA,kBAAkB,GAAG,UAAU,CAAC;AAE7C,uEAAuE;AAC1D,QAAA,gBAAgB,GAAG,QAAQ,CAAC;AAEzC,oFAAoF;AAC7E,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;AAAjF,QAAA,YAAY,gBAAqE;AAE9F,+DAA+D;AACxD,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,EAAE,CAC9C,yCAAyC,QAAQ,uBAAuB;IACxE,8EAA8E;IAC9E,gDAAgD;IAChD,2FAA2F,IAAA,oBAAY,EAAC,QAAQ,CAAC,GAAG;IACpH,wGAAwG,CAAC;AAL9F,QAAA,WAAW,eAKmF;AAE9F,QAAA,UAAU,GAAG,uBAAuB,CAAC;AACrC,QAAA,QAAQ,GAAG,0BAA0B,CAAC;AACtC,QAAA,YAAY,GAAG,8BAA8B,CAAC;AAE3D,MAAM,SAAS,GAAG,CAAC,OAA2E,EAAE,EAAE;IAChG,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE7D,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,EAAE,IAAI,EAAE,0BAAkB,EAAE,IAAI,EAAE,kBAAU,EAAE;IAC9C,EAAE,IAAI,EAAE,wBAAgB,EAAE,IAAI,EAAE,gBAAQ,EAAE;CAC3C,CAAC;AAEF;;;;GAIG;AACI,MAAM,YAAY,GAAG,CAAC,OAAyD,EAAE,EAAE;IACxF,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,QAAQ,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAEtF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACzE,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,IAAI,KAAK,GAAG;YAAE,YAAY,GAAG,CAAC,YAAY,CAAC;QAE/C,OAAO,IAAI,IAAI,CAAC;QAChB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AA5BW,QAAA,YAAY,gBA4BvB;AAEK,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC,kBAAU,CAAC,EAAE,IAAA,mBAAW,EAAC,QAAQ,CAAC;IACnC,CAAC,gBAAQ,CAAC,EAAE,QAAQ;IACpB,CAAC,oBAAY,CAAC,EAAE,IAAA,oBAAY,EAAC,QAAQ,CAAC;CACvC,CAAC,CAAC;AAJU,QAAA,QAAQ,YAIlB;AAWH,4FAA4F;AACrF,MAAM,aAAa,GAAG,CAAC,KAA4B,EAAE,EAAE,CAC5D,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC;AAD7E,QAAA,aAAa,iBACgE;AAK1F,MAAM,cAAc,GAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAElF;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE;;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,MAAA,IAAA,yBAAS,EAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,mCAAI,EAAE,CAAC;IAE5F,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,IAA2B,EAAE,EAAE;IAC1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAA,yBAAS,EAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/G,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,WAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,gHAAgH;AAChH,MAAM,cAAc,GAClB,iGAAiG,CAAC;AAEpG,wGAAwG;AACxG,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,IAAA,yBAAS,EAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7G,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;AAExC,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,MAAoB,EAAE,EAAE,CAAC,IAAA,qBAAK,EAAC,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAE3G,MAAM,QAAQ,GAAG,CAAO,OAA8D,EAAE,EAAE;IACxF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEzC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAA,CAAC;AAEF,MAAM,OAAO,GAAG,CAAO,GAAW,EAAE,MAAmB,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAEvD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,MAAM,GAAG,CAAO,OAKrB,EAAqB,EAAE;;IACtB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,MAAA,IAAI,CAAC,gBAAgB,mCAAI,EAAE,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAA,oBAAY,EAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAA,oBAAY,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,OAAO,gBAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC;IAEzD,IAAA,WAAM,EAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,gGAAgG;IAChG,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE;QAC3B,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;QACX,GAAG,kCAAO,OAAO,CAAC,GAAG,GAAK,IAAA,gBAAQ,EAAC,QAAQ,CAAC,CAAE;KAC/C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,OAAO,CAA2C,CAAC,OAAO,EAAE,EAAE;QAC7E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,IAAI,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAEzE,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACtD,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEvC,IAAI,KAAK;QAAE,eAAe,EAAE,CAAC;IAE7B,IAAA,WAAM,EAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAE5E,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,MAAM,EAAE,EAAE,CAAC;IAEvG,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,IAAI,CAAC,gBAAgB,0BAA0B,EAAE,CAAC;IACrH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC,CAAA,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,aAAa,GAAG,CAAO,OAMnC,EAAuB,EAAE;IACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,MAAM,mCAAQ,cAAc,GAAK,OAAO,CAAC,MAAM,CAAE,CAAC;IACxD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAEhF,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,oGAAoG,CACjH,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;;YACvD,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/F,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AA9BW,QAAA,aAAa,iBA8BxB"}
@@ -9,6 +9,8 @@ export type UpdateArgs = {
9
9
  check: boolean;
10
10
  dryRun: boolean;
11
11
  install: boolean;
12
+ /** Whether each step of the run is committed by itself. */
13
+ commit: boolean;
12
14
  resume: boolean;
13
15
  ai: boolean;
14
16
  force: boolean;
@@ -2,8 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseUpdateArgs = exports.fullPackageName = void 0;
4
4
  const packages_1 = require("./packages");
5
+ const semver_1 = require("./semver");
5
6
  const VALUE_FLAGS = ['--tag', '--to', '--from'];
6
- const BOOLEAN_FLAGS = ['--check', '--dry-run', '--no-install', '--continue', '--ai', '--force', '--help', '-h'];
7
+ const BOOLEAN_FLAGS = [
8
+ '--check',
9
+ '--dry-run',
10
+ '--no-install',
11
+ '--no-commit',
12
+ '--continue',
13
+ '--ai',
14
+ '--force',
15
+ '--help',
16
+ '-h',
17
+ ];
7
18
  /** `core` and `@ethlete/core` both name the same package on the command line. */
8
19
  const fullPackageName = (name) => (name.includes('/') ? name : `${packages_1.ETHLETE_SCOPE}${name}`);
9
20
  exports.fullPackageName = fullPackageName;
@@ -22,6 +33,7 @@ const parseUpdateArgs = (argv) => {
22
33
  check: false,
23
34
  dryRun: false,
24
35
  install: true,
36
+ commit: true,
25
37
  resume: false,
26
38
  ai: false,
27
39
  force: false,
@@ -39,7 +51,7 @@ const parseUpdateArgs = (argv) => {
39
51
  const value = inline !== null && inline !== void 0 ? inline : argv[index + 1];
40
52
  if (inline === undefined)
41
53
  index += 1;
42
- if (value === undefined || value.startsWith('-')) {
54
+ if (!value || value.startsWith('-')) {
43
55
  args.problems.push(`${flag} needs a value.`);
44
56
  continue;
45
57
  }
@@ -53,6 +65,8 @@ const parseUpdateArgs = (argv) => {
53
65
  const version = separator > 0 ? value.slice(separator + 1) : undefined;
54
66
  if (!name || !version)
55
67
  args.problems.push(`--from needs <package>@<version>, not "${value}".`);
68
+ else if (!(0, semver_1.isValidVersion)(version))
69
+ args.problems.push(`--from ${value}: "${version}" is not a version.`);
56
70
  else
57
71
  args.from[(0, exports.fullPackageName)(name)] = version;
58
72
  }
@@ -62,12 +76,18 @@ const parseUpdateArgs = (argv) => {
62
76
  args.problems.push(`Unknown flag "${flag}".`);
63
77
  continue;
64
78
  }
79
+ if (inline !== undefined) {
80
+ args.problems.push(`${flag} takes no value.`);
81
+ continue;
82
+ }
65
83
  if (flag === '--check')
66
84
  args.check = true;
67
85
  if (flag === '--dry-run')
68
86
  args.dryRun = true;
69
87
  if (flag === '--no-install')
70
88
  args.install = false;
89
+ if (flag === '--no-commit')
90
+ args.commit = false;
71
91
  if (flag === '--continue')
72
92
  args.resume = true;
73
93
  if (flag === '--ai')
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/args.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { PendingMigration } from './plan';
2
+ export type AvailableMigration = PendingMigration & {
3
+ /** The installed version of the package. */
4
+ installed: string;
5
+ };
6
+ /** The recommended and optional migrations of every installed `@ethlete/*` package that have not run yet. */
7
+ export declare const collectAvailableMigrations: (root: string) => {
8
+ available: AvailableMigration[];
9
+ problems: string[];
10
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectAvailableMigrations = void 0;
4
+ const migration_manifest_1 = require("./migration-manifest");
5
+ const migration_record_1 = require("./migration-record");
6
+ const packages_1 = require("./packages");
7
+ const plan_1 = require("./plan");
8
+ /** The recommended and optional migrations of every installed `@ethlete/*` package that have not run yet. */
9
+ const collectAvailableMigrations = (root) => {
10
+ const { record, problems } = (0, migration_record_1.readMigrationRecord)(root);
11
+ const available = [];
12
+ for (const declared of (0, packages_1.declaredEthletePackages)({ root })) {
13
+ const installed = declared.installedVersion;
14
+ if (installed === undefined)
15
+ continue;
16
+ const packageMigrations = (0, migration_manifest_1.readPackageMigrations)({ root, packageName: declared.name });
17
+ problems.push(...packageMigrations.problems);
18
+ available.push(...(0, plan_1.availableMigrations)({ packageMigrations, installed, record }).map((entry) => (Object.assign(Object.assign({}, entry), { installed }))));
19
+ }
20
+ return { available: (0, plan_1.orderAvailableMigrations)(available), problems };
21
+ };
22
+ exports.collectAvailableMigrations = collectAvailableMigrations;
23
+ //# sourceMappingURL=available-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"available-migrations.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/available-migrations.ts"],"names":[],"mappings":";;;AAAA,6DAA6D;AAC7D,yDAAyD;AACzD,yCAAqD;AACrD,iCAAyF;AAOzF,6GAA6G;AACtG,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAE,EAAE;IACzD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,sCAAmB,EAAC,IAAI,CAAC,CAAC;IACvD,MAAM,SAAS,GAAyB,EAAE,CAAC;IAE3C,KAAK,MAAM,QAAQ,IAAI,IAAA,kCAAuB,EAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAE5C,IAAI,SAAS,KAAK,SAAS;YAAE,SAAS;QAEtC,MAAM,iBAAiB,GAAG,IAAA,0CAAqB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtF,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC7C,SAAS,CAAC,IAAI,CACZ,GAAG,IAAA,0BAAmB,EAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iCAAM,KAAK,KAAE,SAAS,IAAG,CAAC,CAC3G,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAA,+BAAwB,EAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;AACtE,CAAC,CAAC;AAlBW,QAAA,0BAA0B,8BAkBrC"}
@@ -0,0 +1,63 @@
1
+ /** Repo-relative paths git reports as changed or untracked, each with a hash of its content. */
2
+ export type DirtySnapshot = Record<string, string>;
3
+ /** What the commits of one update compare against. It lives in the pending update, so a `--continue` keeps it. */
4
+ export type CommitState = {
5
+ /** The paths that were dirty before the update wrote anything: the user's own work, never committed. */
6
+ baseline: DirtySnapshot;
7
+ /** The dirty paths after the last step, so the next step commits only what it changed. */
8
+ snapshot: DirtySnapshot;
9
+ bumped: boolean;
10
+ };
11
+ export type StepCommit = {
12
+ state: 'unchanged';
13
+ } | {
14
+ state: 'committed';
15
+ hash: string;
16
+ paths: string[];
17
+ } | {
18
+ state: 'blocked';
19
+ paths: string[];
20
+ } | {
21
+ state: 'failed';
22
+ reason: string;
23
+ paths: string[];
24
+ };
25
+ /** The paths of `git status --porcelain -z`, a rename's source included. */
26
+ export declare const parsePorcelain: (output: string) => string[];
27
+ /** The dirty paths of the checkout `root` sits in, or `undefined` outside a git checkout. */
28
+ export declare const dirtySnapshot: (root: string) => DirtySnapshot | undefined;
29
+ /** The commit state of an update that starts now, or `undefined` outside a git checkout. */
30
+ export declare const startCommits: (root: string) => CommitState | undefined;
31
+ /**
32
+ * Commits what one step changed since the last one, and nothing else. A step that touched a path the user
33
+ * had changed before the update is not committed at all, so their work never lands in an update commit.
34
+ */
35
+ export declare const commitStep: (options: {
36
+ root: string;
37
+ state: CommitState;
38
+ message: string;
39
+ body?: string;
40
+ }) => {
41
+ state: CommitState;
42
+ commit: StepCommit;
43
+ };
44
+ /** Moves the snapshot past a step that is not committed, so the next step does not pick up what it left. */
45
+ export declare const skipStep: (options: {
46
+ root: string;
47
+ state: CommitState;
48
+ }) => CommitState;
49
+ export type StepCommitter = {
50
+ readonly state: CommitState;
51
+ commit: (step: {
52
+ message: string;
53
+ body?: string;
54
+ }) => StepCommit;
55
+ skip: () => void;
56
+ markBumped: () => void;
57
+ };
58
+ /** Commits the steps of one update in order, and hands every new state to `save`. */
59
+ export declare const createStepCommitter: (options: {
60
+ root: string;
61
+ state: CommitState;
62
+ save: (state: CommitState) => void;
63
+ }) => StepCommitter;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStepCommitter = exports.skipStep = exports.commitStep = exports.startCommits = exports.dirtySnapshot = exports.parsePorcelain = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const crypto_1 = require("crypto");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const tasks_1 = require("./tasks");
9
+ const git = (cwd, args) => {
10
+ var _a, _b, _c, _d, _e;
11
+ const result = (0, child_process_1.spawnSync)('git', args, { cwd, encoding: 'utf8' });
12
+ return {
13
+ status: result.error ? 1 : ((_a = result.status) !== null && _a !== void 0 ? _a : 1),
14
+ stdout: (_b = result.stdout) !== null && _b !== void 0 ? _b : '',
15
+ stderr: ((_c = result.stderr) !== null && _c !== void 0 ? _c : '').trim() || ((_e = (_d = result.error) === null || _d === void 0 ? void 0 : _d.message) !== null && _e !== void 0 ? _e : ''),
16
+ };
17
+ };
18
+ const contentHash = (path) => {
19
+ try {
20
+ return (0, crypto_1.createHash)('sha1').update((0, fs_1.readFileSync)(path)).digest('hex');
21
+ }
22
+ catch (_a) {
23
+ return 'missing';
24
+ }
25
+ };
26
+ const topLevel = (root) => {
27
+ const result = git(root, ['rev-parse', '--show-toplevel']);
28
+ const top = result.stdout.trim();
29
+ return result.status === 0 && top.length > 0 ? top : undefined;
30
+ };
31
+ /** The paths of `git status --porcelain -z`, a rename's source included. */
32
+ const parsePorcelain = (output) => {
33
+ var _a;
34
+ const entries = output.split('\0').filter((entry) => entry.length > 0);
35
+ const paths = [];
36
+ for (let index = 0; index < entries.length; index += 1) {
37
+ const entry = (_a = entries[index]) !== null && _a !== void 0 ? _a : '';
38
+ const status = entry.slice(0, 2);
39
+ paths.push(entry.slice(3));
40
+ if (status.includes('R') || status.includes('C')) {
41
+ const source = entries[index + 1];
42
+ if (source !== undefined)
43
+ paths.push(source);
44
+ index += 1;
45
+ }
46
+ }
47
+ return paths;
48
+ };
49
+ exports.parsePorcelain = parsePorcelain;
50
+ const updateDirPrefix = (options) => {
51
+ const fromTop = (0, path_1.relative)(options.top, (0, fs_1.realpathSync)(options.root)).split(path_1.sep).join('/');
52
+ return fromTop.length === 0 ? `${tasks_1.UPDATE_DIR}/` : `${fromTop}/${tasks_1.UPDATE_DIR}/`;
53
+ };
54
+ /** The dirty paths of the checkout `root` sits in, or `undefined` outside a git checkout. */
55
+ const dirtySnapshot = (root) => {
56
+ const top = topLevel(root);
57
+ if (top === undefined)
58
+ return undefined;
59
+ const status = git(top, ['status', '--porcelain', '-z', '--untracked-files=all']);
60
+ if (status.status !== 0)
61
+ return undefined;
62
+ const ignored = updateDirPrefix({ root, top });
63
+ return Object.fromEntries((0, exports.parsePorcelain)(status.stdout)
64
+ .filter((path) => !path.startsWith(ignored))
65
+ .map((path) => [path, contentHash((0, path_1.join)(top, path))]));
66
+ };
67
+ exports.dirtySnapshot = dirtySnapshot;
68
+ /** The commit state of an update that starts now, or `undefined` outside a git checkout. */
69
+ const startCommits = (root) => {
70
+ const snapshot = (0, exports.dirtySnapshot)(root);
71
+ return snapshot === undefined ? undefined : { baseline: snapshot, snapshot, bumped: false };
72
+ };
73
+ exports.startCommits = startCommits;
74
+ const changedSince = (options) => Object.keys(options.now).filter((path) => options.before[path] !== options.now[path]);
75
+ /**
76
+ * Commits what one step changed since the last one, and nothing else. A step that touched a path the user
77
+ * had changed before the update is not committed at all, so their work never lands in an update commit.
78
+ */
79
+ const commitStep = (options) => {
80
+ const { root, state, message, body } = options;
81
+ const now = (0, exports.dirtySnapshot)(root);
82
+ const top = topLevel(root);
83
+ if (now === undefined || top === undefined) {
84
+ return { state, commit: { state: 'failed', reason: 'git status failed', paths: [] } };
85
+ }
86
+ const paths = changedSince({ before: state.snapshot, now });
87
+ const settle = (commit) => { var _a; return ({ state: Object.assign(Object.assign({}, state), { snapshot: (_a = (0, exports.dirtySnapshot)(root)) !== null && _a !== void 0 ? _a : now }), commit }); };
88
+ if (paths.length === 0)
89
+ return settle({ state: 'unchanged' });
90
+ const blocked = paths.filter((path) => path in state.baseline);
91
+ if (blocked.length > 0)
92
+ return settle({ state: 'blocked', paths: blocked });
93
+ const added = git(top, ['add', '--', ...paths]);
94
+ if (added.status !== 0)
95
+ return settle({ state: 'failed', reason: added.stderr, paths });
96
+ const committed = git(top, ['commit', '-m', message, ...(body === undefined ? [] : ['-m', body]), '--', ...paths]);
97
+ if (committed.status !== 0) {
98
+ const reason = committed.stderr || committed.stdout.trim() || `git commit exited with ${committed.status}`;
99
+ git(top, ['reset', '--quiet', '--', ...paths]);
100
+ return settle({ state: 'failed', reason, paths });
101
+ }
102
+ return settle({ state: 'committed', hash: git(top, ['rev-parse', '--short', 'HEAD']).stdout.trim(), paths });
103
+ };
104
+ exports.commitStep = commitStep;
105
+ /** Moves the snapshot past a step that is not committed, so the next step does not pick up what it left. */
106
+ const skipStep = (options) => {
107
+ var _a;
108
+ return (Object.assign(Object.assign({}, options.state), { snapshot: (_a = (0, exports.dirtySnapshot)(options.root)) !== null && _a !== void 0 ? _a : options.state.snapshot }));
109
+ };
110
+ exports.skipStep = skipStep;
111
+ const printCommit = (options) => {
112
+ const { message, commit } = options;
113
+ if (commit.state === 'committed')
114
+ console.log(`\n Committed ${commit.hash}: ${message}`);
115
+ if (commit.state === 'blocked') {
116
+ console.error(`\n Not committed: ${commit.paths.join(', ')} had uncommitted changes before the update. ` +
117
+ `Commit "${message}" yourself.`);
118
+ }
119
+ if (commit.state === 'failed') {
120
+ console.error(`\n The commit "${message}" failed, so its changes stay in the working tree:\n${commit.reason}`);
121
+ }
122
+ };
123
+ /** Commits the steps of one update in order, and hands every new state to `save`. */
124
+ const createStepCommitter = (options) => {
125
+ const { root, save } = options;
126
+ let state = options.state;
127
+ const update = (next) => {
128
+ state = next;
129
+ save(state);
130
+ };
131
+ return {
132
+ get state() {
133
+ return state;
134
+ },
135
+ commit: (step) => {
136
+ const result = (0, exports.commitStep)(Object.assign({ root, state }, step));
137
+ update(result.state);
138
+ printCommit({ message: step.message, commit: result.commit });
139
+ return result.commit;
140
+ },
141
+ skip: () => update((0, exports.skipStep)({ root, state })),
142
+ markBumped: () => update(Object.assign(Object.assign({}, state), { bumped: true })),
143
+ };
144
+ };
145
+ exports.createStepCommitter = createStepCommitter;
146
+ //# sourceMappingURL=commits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commits.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/commits.ts"],"names":[],"mappings":";;;AAAA,iDAA0C;AAC1C,mCAAoC;AACpC,2BAAgD;AAChD,+BAA2C;AAC3C,mCAAqC;AAoBrC,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE;;IAC1C,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjE,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC;QAC/C,MAAM,EAAE,MAAA,MAAM,CAAC,MAAM,mCAAI,EAAE;QAC3B,MAAM,EAAE,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,MAAA,MAAA,MAAM,CAAC,KAAK,0CAAE,OAAO,mCAAI,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;IACnC,IAAI,CAAC;QACH,OAAO,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAA,iBAAY,EAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IAChC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE3D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEjC,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC,CAAC;AAEF,4EAA4E;AACrE,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE;;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAA,OAAO,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAElC,IAAI,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE7C,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AApBW,QAAA,cAAc,kBAoBzB;AAEF,MAAM,eAAe,GAAG,CAAC,OAAsC,EAAE,EAAE;IACjE,MAAM,OAAO,GAAG,IAAA,eAAQ,EAAC,OAAO,CAAC,GAAG,EAAE,IAAA,iBAAY,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvF,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAU,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,kBAAU,GAAG,CAAC;AAC/E,CAAC,CAAC;AAEF,6FAA6F;AACtF,MAAM,aAAa,GAAG,CAAC,IAAY,EAA6B,EAAE;IACvE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAElF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAE/C,OAAO,MAAM,CAAC,WAAW,CACvB,IAAA,sBAAc,EAAC,MAAM,CAAC,MAAM,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,IAAA,WAAI,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,aAAa,iBAgBxB;AAEF,4FAA4F;AACrF,MAAM,YAAY,GAAG,CAAC,IAAY,EAA2B,EAAE;IACpE,MAAM,QAAQ,GAAG,IAAA,qBAAa,EAAC,IAAI,CAAC,CAAC;IAErC,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC9F,CAAC,CAAC;AAJW,QAAA,YAAY,gBAIvB;AAEF,MAAM,YAAY,GAAG,CAAC,OAAsD,EAAE,EAAE,CAC9E,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAExF;;;GAGG;AACI,MAAM,UAAU,GAAG,CAAC,OAK1B,EAA8C,EAAE;IAC/C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAA,qBAAa,EAAC,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,CAAC,MAAkB,EAAE,EAAE,WAAC,OAAA,CAAC,EAAE,KAAK,kCAAO,KAAK,KAAE,QAAQ,EAAE,MAAA,IAAA,qBAAa,EAAC,IAAI,CAAC,mCAAI,GAAG,GAAE,EAAE,MAAM,EAAE,CAAC,CAAA,EAAA,CAAC;IAE/G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IAEhD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAExF,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IAEnH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,0BAA0B,SAAS,CAAC,MAAM,EAAE,CAAC;QAE3G,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;QAE/C,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/G,CAAC,CAAC;AAtCW,QAAA,UAAU,cAsCrB;AAEF,4GAA4G;AACrG,MAAM,QAAQ,GAAG,CAAC,OAA6C,EAAe,EAAE;;IAAC,OAAA,iCACnF,OAAO,CAAC,KAAK,KAChB,QAAQ,EAAE,MAAA,IAAA,qBAAa,EAAC,OAAO,CAAC,IAAI,CAAC,mCAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,IAC/D,CAAA;CAAA,CAAC;AAHU,QAAA,QAAQ,YAGlB;AAEH,MAAM,WAAW,GAAG,CAAC,OAAgD,EAAE,EAAE;IACvE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpC,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IAE1F,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CACX,sBAAsB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C;YACzF,WAAW,OAAO,aAAa,CAClC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,uDAAuD,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClH,CAAC;AACH,CAAC,CAAC;AASF,qFAAqF;AAC9E,MAAM,mBAAmB,GAAG,CAAC,OAInC,EAAiB,EAAE;IAClB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC/B,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE1B,MAAM,MAAM,GAAG,CAAC,IAAiB,EAAE,EAAE;QACnC,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,KAAK;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,IAAA,kBAAU,kBAAG,IAAI,EAAE,KAAK,IAAK,IAAI,EAAG,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAE9D,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAA,gBAAQ,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,iCAAM,KAAK,KAAE,MAAM,EAAE,IAAI,IAAG;KACrD,CAAC;AACJ,CAAC,CAAC;AA5BW,QAAA,mBAAmB,uBA4B9B"}
@@ -0,0 +1,8 @@
1
+ export declare const UPDATE_IGNORE_ENTRY = ".ethlete/update/";
2
+ /** Appends `entry` to `.gitignore` unless git ignores `probe` already. True when it wrote the line. */
3
+ export declare const ignoreEntry: (options: {
4
+ root: string;
5
+ entry: string;
6
+ probe?: string;
7
+ }) => boolean;
8
+ export declare const ignoreUpdateDir: (root: string) => boolean;