@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.
- package/CHANGELOG.md +93 -0
- package/README.md +22 -7
- package/design/define-call.ts +92 -0
- package/design/web/env.d.ts +11 -0
- package/design/web/frame.html +17 -0
- package/design/web/frame.ts +44 -0
- package/design/web/host.css +494 -0
- package/design/web/host.ts +445 -0
- package/design/web/index.html +11 -0
- package/package.json +13 -2
- package/src/index.d.ts +1 -0
- package/src/index.js +32 -4
- package/src/index.js.map +1 -1
- package/src/lib/api/clear.js +13 -3
- package/src/lib/api/clear.js.map +1 -1
- package/src/lib/api/compose.js +5 -1
- package/src/lib/api/compose.js.map +1 -1
- package/src/lib/api/git.d.ts +11 -4
- package/src/lib/api/git.js +35 -8
- package/src/lib/api/git.js.map +1 -1
- package/src/lib/api/load-definitions.js +10 -1
- package/src/lib/api/load-definitions.js.map +1 -1
- package/src/lib/api/ports.js +12 -3
- package/src/lib/api/ports.js.map +1 -1
- package/src/lib/api/run.js +8 -3
- package/src/lib/api/run.js.map +1 -1
- package/src/lib/api/setup.js +1 -1
- package/src/lib/api/setup.js.map +1 -1
- package/src/lib/api/state.js +7 -5
- package/src/lib/api/state.js.map +1 -1
- package/src/lib/auth/composer-auth.js +3 -2
- package/src/lib/auth/composer-auth.js.map +1 -1
- package/src/lib/auth/gitlab-token.js +1 -1
- package/src/lib/auth/gitlab-token.js.map +1 -1
- package/src/lib/config/diagnose.js +15 -9
- package/src/lib/config/diagnose.js.map +1 -1
- package/src/lib/config/local-config.d.ts +1 -1
- package/src/lib/design/calls-tsconfig.d.ts +6 -0
- package/src/lib/design/calls-tsconfig.js +37 -0
- package/src/lib/design/calls-tsconfig.js.map +1 -0
- package/src/lib/design/check.d.ts +11 -0
- package/src/lib/design/check.js +203 -0
- package/src/lib/design/check.js.map +1 -0
- package/src/lib/design/design-command.d.ts +10 -0
- package/src/lib/design/design-command.js +32 -0
- package/src/lib/design/design-command.js.map +1 -0
- package/src/lib/design/index.d.ts +5 -0
- package/src/lib/design/index.js +9 -0
- package/src/lib/design/index.js.map +1 -0
- package/src/lib/design/paths.d.ts +24 -0
- package/src/lib/design/paths.js +31 -0
- package/src/lib/design/paths.js.map +1 -0
- package/src/lib/design/serve.d.ts +7 -0
- package/src/lib/design/serve.js +144 -0
- package/src/lib/design/serve.js.map +1 -0
- package/src/lib/design/vite-paths.d.ts +7 -0
- package/src/lib/design/vite-paths.js +15 -0
- package/src/lib/design/vite-paths.js.map +1 -0
- package/src/lib/doctor/doctor-command.js +18 -4
- package/src/lib/doctor/doctor-command.js.map +1 -1
- package/src/lib/index.d.ts +1 -0
- package/src/lib/index.js +1 -0
- package/src/lib/index.js.map +1 -1
- package/src/lib/release.d.ts +38 -1
- package/src/lib/release.js +153 -28
- package/src/lib/release.js.map +1 -1
- package/src/lib/update/agent-rules-sync.d.ts +37 -0
- package/src/lib/update/agent-rules-sync.js +40 -0
- package/src/lib/update/agent-rules-sync.js.map +1 -0
- package/src/lib/update/agent-setup.d.ts +33 -0
- package/src/lib/update/agent-setup.js +124 -0
- package/src/lib/update/agent-setup.js.map +1 -0
- package/src/lib/update/ai.d.ts +37 -8
- package/src/lib/update/ai.js +193 -24
- package/src/lib/update/ai.js.map +1 -1
- package/src/lib/update/args.d.ts +2 -0
- package/src/lib/update/args.js +22 -2
- package/src/lib/update/args.js.map +1 -1
- package/src/lib/update/available-migrations.d.ts +10 -0
- package/src/lib/update/available-migrations.js +23 -0
- package/src/lib/update/available-migrations.js.map +1 -0
- package/src/lib/update/commits.d.ts +63 -0
- package/src/lib/update/commits.js +146 -0
- package/src/lib/update/commits.js.map +1 -0
- package/src/lib/update/gitignore.d.ts +8 -0
- package/src/lib/update/gitignore.js +22 -0
- package/src/lib/update/gitignore.js.map +1 -0
- package/src/lib/update/index.d.ts +6 -0
- package/src/lib/update/index.js +6 -0
- package/src/lib/update/index.js.map +1 -1
- package/src/lib/update/migration-manifest.d.ts +10 -0
- package/src/lib/update/migration-manifest.js +15 -3
- package/src/lib/update/migration-manifest.js.map +1 -1
- package/src/lib/update/migration-record.d.ts +24 -0
- package/src/lib/update/migration-record.js +48 -0
- package/src/lib/update/migration-record.js.map +1 -0
- package/src/lib/update/migrations-command.d.ts +14 -0
- package/src/lib/update/migrations-command.js +212 -0
- package/src/lib/update/migrations-command.js.map +1 -0
- package/src/lib/update/package-manager.d.ts +20 -1
- package/src/lib/update/package-manager.js +34 -15
- package/src/lib/update/package-manager.js.map +1 -1
- package/src/lib/update/packages.d.ts +28 -8
- package/src/lib/update/packages.js +117 -36
- package/src/lib/update/packages.js.map +1 -1
- package/src/lib/update/pending.d.ts +16 -0
- package/src/lib/update/pending.js +21 -5
- package/src/lib/update/pending.js.map +1 -1
- package/src/lib/update/plan.d.ts +33 -8
- package/src/lib/update/plan.js +76 -7
- package/src/lib/update/plan.js.map +1 -1
- package/src/lib/update/registry.d.ts +32 -4
- package/src/lib/update/registry.js +145 -8
- package/src/lib/update/registry.js.map +1 -1
- package/src/lib/update/run-migrations.d.ts +2 -0
- package/src/lib/update/run-migrations.js +20 -15
- package/src/lib/update/run-migrations.js.map +1 -1
- package/src/lib/update/scan.d.ts +14 -0
- package/src/lib/update/scan.js +57 -0
- package/src/lib/update/scan.js.map +1 -0
- package/src/lib/update/semver.js +2 -1
- package/src/lib/update/semver.js.map +1 -1
- package/src/lib/update/tasks.d.ts +18 -1
- package/src/lib/update/tasks.js +114 -43
- package/src/lib/update/tasks.js.map +1 -1
- package/src/lib/update/update-command.d.ts +7 -0
- package/src/lib/update/update-command.js +300 -73
- package/src/lib/update/update-command.js.map +1 -1
package/src/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/cli/src/lib/index.ts"],"names":[],"mappings":";;;AAAA,gDAAsB;AACtB,iDAAuB;AACvB,mDAAyB;AACzB,mDAAyB;AACzB,uDAA6B;AAC7B,oDAA0B;AAC1B,mDAAyB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/cli/src/lib/index.ts"],"names":[],"mappings":";;;AAAA,gDAAsB;AACtB,iDAAuB;AACvB,mDAAyB;AACzB,mDAAyB;AACzB,mDAAyB;AACzB,uDAA6B;AAC7B,oDAA0B;AAC1B,mDAAyB"}
|
package/src/lib/release.d.ts
CHANGED
|
@@ -1 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
import { PackageManager } from './update/package-manager';
|
|
2
|
+
export declare const releaseUsage: (invocation: string) => string;
|
|
3
|
+
export type ReleaseFlags = {
|
|
4
|
+
shouldForce: boolean;
|
|
5
|
+
skipPush: boolean;
|
|
6
|
+
message: string;
|
|
7
|
+
help: boolean;
|
|
8
|
+
problems: string[];
|
|
9
|
+
};
|
|
10
|
+
/** Reads the flags of `et release`, collecting every problem so one run reports them all. */
|
|
11
|
+
export declare const releaseFlags: (args: readonly string[]) => ReleaseFlags;
|
|
12
|
+
export type WorkingTreeSnapshot = Map<string, string>;
|
|
13
|
+
export declare const pathsChangedBetween: (before: WorkingTreeSnapshot, after: WorkingTreeSnapshot) => string[];
|
|
14
|
+
export type CommandResult = {
|
|
15
|
+
status: number | null;
|
|
16
|
+
output: string;
|
|
17
|
+
};
|
|
18
|
+
export type ReleaseIo = {
|
|
19
|
+
/** Runs a command. `inherit` streams its output to the terminal instead of capturing it. */
|
|
20
|
+
run: (command: readonly string[], options?: {
|
|
21
|
+
inherit?: boolean;
|
|
22
|
+
}) => CommandResult;
|
|
23
|
+
snapshot: () => WorkingTreeSnapshot;
|
|
24
|
+
ask: (question: string) => Promise<string>;
|
|
25
|
+
log: (message: string) => void;
|
|
26
|
+
error: (message: string) => void;
|
|
27
|
+
};
|
|
28
|
+
export type ReleaseOptions = {
|
|
29
|
+
args: readonly string[];
|
|
30
|
+
root?: string;
|
|
31
|
+
invocation?: string;
|
|
32
|
+
manager?: PackageManager;
|
|
33
|
+
/** Whether the repo declares `@changesets/cli`. Read from the root `package.json` when left out. */
|
|
34
|
+
hasChangesets?: boolean;
|
|
35
|
+
io?: Partial<ReleaseIo>;
|
|
36
|
+
};
|
|
37
|
+
/** Runs `et release`: version, commit, tag, push. Resolves to the exit code. */
|
|
38
|
+
export declare const release: (options: ReleaseOptions) => Promise<number>;
|
package/src/lib/release.js
CHANGED
|
@@ -1,41 +1,166 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.release = void 0;
|
|
3
|
+
exports.release = exports.pathsChangedBetween = exports.releaseFlags = exports.releaseUsage = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const child_process_1 = require("child_process");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const package_manager_1 = require("./update/package-manager");
|
|
8
|
+
const packages_1 = require("./update/packages");
|
|
6
9
|
const utils_1 = require("./utils");
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const NO_CHANGESETS_MESSAGE = 'No unreleased changesets found';
|
|
11
|
+
const DEFAULT_COMMIT_MESSAGE = 'Release versions';
|
|
12
|
+
const releaseUsage = (invocation) => [
|
|
13
|
+
`Usage: ${invocation} [flags]`,
|
|
14
|
+
'',
|
|
15
|
+
'Turns pending changesets into a release commit, tags it and pushes both.',
|
|
16
|
+
'',
|
|
17
|
+
' --force, -f Release although the working tree has uncommitted changes',
|
|
18
|
+
' --skip-push, -sp Commit and tag, but do not push',
|
|
19
|
+
` --message, -m <text> The release commit message (default "${DEFAULT_COMMIT_MESSAGE}")`,
|
|
20
|
+
' --help, -h Print this help',
|
|
21
|
+
'',
|
|
22
|
+
].join('\n');
|
|
23
|
+
exports.releaseUsage = releaseUsage;
|
|
24
|
+
/** Reads the flags of `et release`, collecting every problem so one run reports them all. */
|
|
25
|
+
const releaseFlags = (args) => {
|
|
26
|
+
var _a;
|
|
27
|
+
const flags = {
|
|
28
|
+
shouldForce: false,
|
|
29
|
+
skipPush: false,
|
|
30
|
+
message: DEFAULT_COMMIT_MESSAGE,
|
|
31
|
+
help: false,
|
|
32
|
+
problems: [],
|
|
33
|
+
};
|
|
34
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
35
|
+
const argument = (_a = args[index]) !== null && _a !== void 0 ? _a : '';
|
|
36
|
+
const separator = argument.indexOf('=');
|
|
37
|
+
const flag = separator === -1 ? argument : argument.slice(0, separator);
|
|
38
|
+
if (flag === '--message' || flag === '-m') {
|
|
39
|
+
const value = separator === -1 ? args[++index] : argument.slice(separator + 1);
|
|
40
|
+
if (!value || value.startsWith('-'))
|
|
41
|
+
flags.problems.push(`${flag} needs a value.`);
|
|
42
|
+
else
|
|
43
|
+
flags.message = value;
|
|
14
44
|
}
|
|
15
|
-
else
|
|
16
|
-
|
|
17
|
-
|
|
45
|
+
else if (separator !== -1)
|
|
46
|
+
flags.problems.push(`${flag} takes no value.`);
|
|
47
|
+
else if (flag === '--force' || flag === '-f')
|
|
48
|
+
flags.shouldForce = true;
|
|
49
|
+
else if (flag === '--skip-push' || flag === '-sp')
|
|
50
|
+
flags.skipPush = true;
|
|
51
|
+
else if (flag === '--help' || flag === '-h')
|
|
52
|
+
flags.help = true;
|
|
53
|
+
else
|
|
54
|
+
flags.problems.push(`Unknown flag "${argument}".`);
|
|
55
|
+
}
|
|
56
|
+
return flags;
|
|
57
|
+
};
|
|
58
|
+
exports.releaseFlags = releaseFlags;
|
|
59
|
+
const pathsChangedBetween = (before, after) => {
|
|
60
|
+
const paths = new Set([...before.keys(), ...after.keys()]);
|
|
61
|
+
return [...paths].filter((path) => before.get(path) !== after.get(path));
|
|
62
|
+
};
|
|
63
|
+
exports.pathsChangedBetween = pathsChangedBetween;
|
|
64
|
+
const defaultRun = ([binary = '', ...args], options = {}) => {
|
|
65
|
+
var _a, _b;
|
|
66
|
+
const result = binary === 'git'
|
|
67
|
+
? (0, child_process_1.spawnSync)(binary, args, { stdio: options.inherit ? 'inherit' : 'pipe' })
|
|
68
|
+
: (0, package_manager_1.spawnPackageManager)({ binary, args, spawn: { stdio: options.inherit ? 'inherit' : 'pipe' } });
|
|
69
|
+
return { status: result.status, output: `${(_a = result.stdout) !== null && _a !== void 0 ? _a : ''}${(_b = result.stderr) !== null && _b !== void 0 ? _b : ''}` };
|
|
70
|
+
};
|
|
71
|
+
const snapshotWorkingTree = () => {
|
|
72
|
+
const entries = (0, child_process_1.execFileSync)('git', ['status', '--porcelain', '-z', '-uall']).toString().split('\0').filter(Boolean);
|
|
73
|
+
return new Map(entries.map((entry) => {
|
|
74
|
+
const path = entry.slice(3);
|
|
75
|
+
return [path, (0, fs_1.existsSync)(path) ? (0, child_process_1.execFileSync)('git', ['hash-object', '--', path]).toString().trim() : 'deleted'];
|
|
76
|
+
}));
|
|
77
|
+
};
|
|
78
|
+
const defaultIo = {
|
|
79
|
+
run: defaultRun,
|
|
80
|
+
snapshot: snapshotWorkingTree,
|
|
81
|
+
ask: utils_1.askQuestion,
|
|
82
|
+
log: (message) => console.log(message),
|
|
83
|
+
error: (message) => console.error(message),
|
|
84
|
+
};
|
|
85
|
+
const tagSubcommand = (io, changeset) => {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
const version = io.run(changeset('--version')).output;
|
|
88
|
+
return Number((_b = (_a = /(\d+)\.\d+\.\d+/.exec(version)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : 0) >= 3 ? 'git-tag' : 'tag';
|
|
89
|
+
};
|
|
90
|
+
const CHANGESETS_CLI = '@changesets/cli';
|
|
91
|
+
/** Runs `et release`: version, commit, tag, push. Resolves to the exit code. */
|
|
92
|
+
const release = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
93
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
94
|
+
const root = (_a = options.root) !== null && _a !== void 0 ? _a : process.cwd();
|
|
95
|
+
const invocation = (_b = options.invocation) !== null && _b !== void 0 ? _b : 'et release';
|
|
96
|
+
const io = Object.assign(Object.assign({}, defaultIo), options.io);
|
|
97
|
+
const flags = (0, exports.releaseFlags)(options.args);
|
|
98
|
+
if (flags.problems.length) {
|
|
99
|
+
io.error(`${flags.problems.join('\n')}\n\n${(0, exports.releaseUsage)(invocation)}`);
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
if (flags.help) {
|
|
103
|
+
io.log((0, exports.releaseUsage)(invocation));
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
const manifest = (0, packages_1.readManifest)(root);
|
|
107
|
+
const manager = (_c = options.manager) !== null && _c !== void 0 ? _c : (0, package_manager_1.detectPackageManager)({ root, manifest });
|
|
108
|
+
const hasChangesets = (_d = options.hasChangesets) !== null && _d !== void 0 ? _d : Boolean((_f = (_e = manifest === null || manifest === void 0 ? void 0 : manifest.devDependencies) === null || _e === void 0 ? void 0 : _e[CHANGESETS_CLI]) !== null && _f !== void 0 ? _f : (_g = manifest === null || manifest === void 0 ? void 0 : manifest.dependencies) === null || _g === void 0 ? void 0 : _g[CHANGESETS_CLI]);
|
|
109
|
+
const changeset = (...args) => [...manager.run, 'changeset', ...args];
|
|
110
|
+
if (!hasChangesets) {
|
|
111
|
+
io.error(`${CHANGESETS_CLI} is not in the root package.json, so there is nothing to release with. Add it as a dev dependency and run \`${changeset('init').join(' ')}\`.\n`);
|
|
112
|
+
return 1;
|
|
113
|
+
}
|
|
114
|
+
if (io.run(['git', 'status', '--porcelain']).output.trim()) {
|
|
115
|
+
if (!flags.shouldForce) {
|
|
116
|
+
io.error('There are uncommitted changes, aborting...\n');
|
|
117
|
+
return 1;
|
|
18
118
|
}
|
|
119
|
+
io.log('🚨 Proceed with caution 🚨 \n\nForcing release with uncommitted changes...\n');
|
|
19
120
|
}
|
|
20
|
-
const answer = yield
|
|
121
|
+
const answer = yield io.ask('You are about to release a new version. Make sure you are not releasing a version that has already been released on a different branch. \n\n Press enter to continue...\n');
|
|
21
122
|
if (answer !== '') {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
123
|
+
io.error('Aborting...');
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
const before = io.snapshot();
|
|
127
|
+
const version = io.run(changeset('version'));
|
|
128
|
+
if (version.status !== 0) {
|
|
129
|
+
io.error(version.output.includes(NO_CHANGESETS_MESSAGE)
|
|
130
|
+
? `${NO_CHANGESETS_MESSAGE}, aborting...\n`
|
|
131
|
+
: `\`${changeset('version').join(' ')}\` failed:\n${version.output}`);
|
|
132
|
+
return 1;
|
|
133
|
+
}
|
|
134
|
+
io.log(version.output);
|
|
135
|
+
const changedPaths = (0, exports.pathsChangedBetween)(before, io.snapshot());
|
|
136
|
+
if (changedPaths.length)
|
|
137
|
+
io.run(['git', 'add', '--', ...changedPaths]);
|
|
138
|
+
io.log('Committing release... 🚀 \n(This may take a while depending on your pre-commit hooks) \n');
|
|
139
|
+
if (io.run(['git', 'commit', '-m', flags.message], { inherit: true }).status !== 0) {
|
|
140
|
+
io.error([
|
|
141
|
+
'git commit failed, so no tag was written. The version bump is staged.',
|
|
142
|
+
`Fix what the hook reported (a commit-msg hook may need \`--message "<text>"\`), commit the staged files,`,
|
|
143
|
+
`then run \`${changeset(tagSubcommand(io, changeset)).join(' ')}\` and \`git push --follow-tags\`.`,
|
|
144
|
+
'',
|
|
145
|
+
].join('\n'));
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
const tag = io.run(changeset(tagSubcommand(io, changeset)));
|
|
149
|
+
if (tag.status !== 0) {
|
|
150
|
+
io.error(`The release commit exists, but tagging it failed:\n${tag.output}`);
|
|
151
|
+
return 1;
|
|
152
|
+
}
|
|
153
|
+
io.log(tag.output);
|
|
154
|
+
if (flags.skipPush) {
|
|
155
|
+
io.log('🚀 Release complete without pushing the commit 🚀 Have a great day ❤️ ');
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
if (io.run(['git', 'push', '--follow-tags'], { inherit: true }).status !== 0) {
|
|
159
|
+
io.error('The release commit and its tags exist locally, but `git push --follow-tags` failed.');
|
|
160
|
+
return 1;
|
|
38
161
|
}
|
|
162
|
+
io.log('🚀 Release complete 🚀 Have a great day ❤️');
|
|
163
|
+
return 0;
|
|
39
164
|
});
|
|
40
165
|
exports.release = release;
|
|
41
166
|
//# sourceMappingURL=release.js.map
|
package/src/lib/release.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../../../libs/cli/src/lib/release.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../../../libs/cli/src/lib/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { PackageManager } from './package-manager';
|
|
2
|
+
import { UpdatedPackage } from './plan';
|
|
3
|
+
export declare const AGENT_RULES_PACKAGE = "@ethlete/agent-rules";
|
|
4
|
+
export declare const AGENT_RULES_CONFIG_FILE = "ethlete-agents.config.json";
|
|
5
|
+
export type AgentRulesSyncPlan = {
|
|
6
|
+
state: 'not-updated';
|
|
7
|
+
} | {
|
|
8
|
+
state: 'no-config';
|
|
9
|
+
command: string[];
|
|
10
|
+
} | {
|
|
11
|
+
state: 'sync';
|
|
12
|
+
command: string[];
|
|
13
|
+
};
|
|
14
|
+
export type AgentRulesSyncOutcome = {
|
|
15
|
+
state: 'not-updated';
|
|
16
|
+
} | {
|
|
17
|
+
state: 'no-config';
|
|
18
|
+
command: string[];
|
|
19
|
+
} | {
|
|
20
|
+
state: 'synced';
|
|
21
|
+
command: string[];
|
|
22
|
+
} | {
|
|
23
|
+
state: 'failed';
|
|
24
|
+
command: string[];
|
|
25
|
+
reason: string;
|
|
26
|
+
};
|
|
27
|
+
export declare const agentRulesSyncCommand: (manager: PackageManager) => string[];
|
|
28
|
+
/**
|
|
29
|
+
* Whether an update has to regenerate the repo's agent rules and skills: only when it moved
|
|
30
|
+
* `@ethlete/agent-rules`, and only in a repo that configured them.
|
|
31
|
+
*/
|
|
32
|
+
export declare const planAgentRulesSync: (options: {
|
|
33
|
+
root: string;
|
|
34
|
+
manager: PackageManager;
|
|
35
|
+
updates: readonly UpdatedPackage[];
|
|
36
|
+
}) => AgentRulesSyncPlan;
|
|
37
|
+
export declare const runAgentRulesSync: (plan: AgentRulesSyncPlan, root: string) => AgentRulesSyncOutcome;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runAgentRulesSync = exports.planAgentRulesSync = exports.agentRulesSyncCommand = exports.AGENT_RULES_CONFIG_FILE = exports.AGENT_RULES_PACKAGE = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const package_manager_1 = require("./package-manager");
|
|
7
|
+
exports.AGENT_RULES_PACKAGE = '@ethlete/agent-rules';
|
|
8
|
+
exports.AGENT_RULES_CONFIG_FILE = 'ethlete-agents.config.json';
|
|
9
|
+
const agentRulesSyncCommand = (manager) => [...manager.run, 'ethlete-agents', 'sync'];
|
|
10
|
+
exports.agentRulesSyncCommand = agentRulesSyncCommand;
|
|
11
|
+
/**
|
|
12
|
+
* Whether an update has to regenerate the repo's agent rules and skills: only when it moved
|
|
13
|
+
* `@ethlete/agent-rules`, and only in a repo that configured them.
|
|
14
|
+
*/
|
|
15
|
+
const planAgentRulesSync = (options) => {
|
|
16
|
+
const { root, manager, updates } = options;
|
|
17
|
+
if (!updates.some((update) => update.name === exports.AGENT_RULES_PACKAGE))
|
|
18
|
+
return { state: 'not-updated' };
|
|
19
|
+
const command = (0, exports.agentRulesSyncCommand)(manager);
|
|
20
|
+
if (!(0, fs_1.existsSync)((0, path_1.join)(root, exports.AGENT_RULES_CONFIG_FILE)))
|
|
21
|
+
return { state: 'no-config', command };
|
|
22
|
+
return { state: 'sync', command };
|
|
23
|
+
};
|
|
24
|
+
exports.planAgentRulesSync = planAgentRulesSync;
|
|
25
|
+
const runAgentRulesSync = (plan, root) => {
|
|
26
|
+
if (plan.state !== 'sync')
|
|
27
|
+
return plan;
|
|
28
|
+
const [binary, ...args] = plan.command;
|
|
29
|
+
if (binary === undefined)
|
|
30
|
+
return { state: 'failed', command: plan.command, reason: 'no command to run sync with' };
|
|
31
|
+
const result = (0, package_manager_1.spawnPackageManager)({ binary, args, spawn: { cwd: root, stdio: 'inherit' } });
|
|
32
|
+
if (result.error)
|
|
33
|
+
return { state: 'failed', command: plan.command, reason: result.error.message };
|
|
34
|
+
if (result.status !== 0) {
|
|
35
|
+
return { state: 'failed', command: plan.command, reason: `${binary} exited with ${result.status}` };
|
|
36
|
+
}
|
|
37
|
+
return { state: 'synced', command: plan.command };
|
|
38
|
+
};
|
|
39
|
+
exports.runAgentRulesSync = runAgentRulesSync;
|
|
40
|
+
//# sourceMappingURL=agent-rules-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-rules-sync.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/agent-rules-sync.ts"],"names":[],"mappings":";;;AAAA,2BAAgC;AAChC,+BAA4B;AAC5B,uDAAwE;AAG3D,QAAA,mBAAmB,GAAG,sBAAsB,CAAC;AAC7C,QAAA,uBAAuB,GAAG,4BAA4B,CAAC;AAW7D,MAAM,qBAAqB,GAAG,CAAC,OAAuB,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;AAAhG,QAAA,qBAAqB,yBAA2E;AAE7G;;;GAGG;AACI,MAAM,kBAAkB,GAAG,CAAC,OAIlC,EAAsB,EAAE;IACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,2BAAmB,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAEpG,MAAM,OAAO,GAAG,IAAA,6BAAqB,EAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,CAAC,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,IAAI,EAAE,+BAAuB,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAE7F,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B;AAEK,MAAM,iBAAiB,GAAG,CAAC,IAAwB,EAAE,IAAY,EAAyB,EAAE;IACjG,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IAEvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IAEnH,MAAM,MAAM,GAAG,IAAA,qCAAmB,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAE7F,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAElG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;IACtG,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACpD,CAAC,CAAC;AAhBW,QAAA,iBAAiB,qBAgB5B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type AgentCli = {
|
|
2
|
+
binary: string;
|
|
3
|
+
label: string;
|
|
4
|
+
/** Opens a session the developer can answer questions in, and exits when they close it. */
|
|
5
|
+
interactive: string;
|
|
6
|
+
/** Runs to the end without a question, so a task that needs a decision stays open. */
|
|
7
|
+
headless: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const AGENT_CLIS: readonly AgentCli[];
|
|
10
|
+
export type AgentChoice = {
|
|
11
|
+
label: string;
|
|
12
|
+
command: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const onPath: (options: {
|
|
15
|
+
binary: string;
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
platform?: NodeJS.Platform;
|
|
18
|
+
}) => boolean;
|
|
19
|
+
/** The commands of every installed agent CLI, the interactive one of each first. */
|
|
20
|
+
export declare const agentChoices: (options?: {
|
|
21
|
+
env?: NodeJS.ProcessEnv;
|
|
22
|
+
platform?: NodeJS.Platform;
|
|
23
|
+
}) => AgentChoice[];
|
|
24
|
+
/**
|
|
25
|
+
* Asks which agent command `--ai` uses and saves the answer in the local config. Without a terminal it
|
|
26
|
+
* names the key and the installed CLIs instead. Returns `undefined` when there is no command to use.
|
|
27
|
+
*/
|
|
28
|
+
export declare const setUpAgentCommand: (options: {
|
|
29
|
+
root: string;
|
|
30
|
+
env?: NodeJS.ProcessEnv;
|
|
31
|
+
platform?: NodeJS.Platform;
|
|
32
|
+
isTTY?: boolean;
|
|
33
|
+
}) => Promise<string | undefined>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setUpAgentCommand = exports.agentChoices = exports.onPath = exports.AGENT_CLIS = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const local_config_1 = require("../config/local-config");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const ai_1 = require("./ai");
|
|
10
|
+
const gitignore_1 = require("./gitignore");
|
|
11
|
+
exports.AGENT_CLIS = [
|
|
12
|
+
{
|
|
13
|
+
binary: 'claude',
|
|
14
|
+
label: 'Claude Code',
|
|
15
|
+
interactive: 'claude --permission-mode auto',
|
|
16
|
+
headless: 'claude --permission-mode auto -p',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
binary: 'codex',
|
|
20
|
+
label: 'Codex',
|
|
21
|
+
interactive: 'codex --sandbox workspace-write',
|
|
22
|
+
headless: 'codex exec --sandbox workspace-write',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
binary: 'gemini',
|
|
26
|
+
label: 'Gemini CLI',
|
|
27
|
+
interactive: 'gemini --approval-mode auto_edit -i',
|
|
28
|
+
headless: 'gemini --approval-mode auto_edit -p',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
binary: 'copilot',
|
|
32
|
+
label: 'GitHub Copilot CLI',
|
|
33
|
+
interactive: 'copilot --allow-all-tools -i',
|
|
34
|
+
headless: 'copilot --allow-all-tools -p',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
binary: 'cursor-agent',
|
|
38
|
+
label: 'Cursor Agent',
|
|
39
|
+
interactive: 'cursor-agent --force',
|
|
40
|
+
headless: 'cursor-agent --force -p',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
const isExecutable = (path, platform) => {
|
|
44
|
+
try {
|
|
45
|
+
(0, fs_1.accessSync)(path, platform === 'win32' ? fs_1.constants.F_OK : fs_1.constants.X_OK);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch (_a) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const onPath = (options) => {
|
|
53
|
+
var _a, _b, _c;
|
|
54
|
+
const { binary, env = process.env, platform = process.platform } = options;
|
|
55
|
+
const dirs = ((_b = (_a = env['PATH']) !== null && _a !== void 0 ? _a : env['Path']) !== null && _b !== void 0 ? _b : '').split(path_1.delimiter).filter(Boolean);
|
|
56
|
+
const extensions = platform === 'win32' ? ['', ...((_c = env['PATHEXT']) !== null && _c !== void 0 ? _c : '.EXE;.CMD;.BAT').split(';')] : [''];
|
|
57
|
+
return dirs.some((dir) => extensions.some((extension) => isExecutable((0, path_1.join)(dir, binary + extension), platform)));
|
|
58
|
+
};
|
|
59
|
+
exports.onPath = onPath;
|
|
60
|
+
/** The commands of every installed agent CLI, the interactive one of each first. */
|
|
61
|
+
const agentChoices = (options = {}) => exports.AGENT_CLIS.filter(({ binary }) => (0, exports.onPath)(Object.assign({ binary }, options))).flatMap((cli) => [
|
|
62
|
+
{ label: `${cli.label}, interactive: you can answer its questions`, command: cli.interactive },
|
|
63
|
+
{ label: `${cli.label}, headless: a task that needs a decision stays open`, command: cli.headless },
|
|
64
|
+
]);
|
|
65
|
+
exports.agentChoices = agentChoices;
|
|
66
|
+
const missingKeyMessage = `--ai needs "${ai_1.AGENT_COMMAND_KEY}" in ${local_config_1.LOCAL_CONFIG_FILE_NAME}, for example "${ai_1.AGENT_COMMAND_EXAMPLE}".`;
|
|
67
|
+
const pick = (choices) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
68
|
+
var _a, _b;
|
|
69
|
+
const list = choices.map((choice, index) => ` ${index + 1}. ${choice.label}\n ${choice.command}`).join('\n');
|
|
70
|
+
const question = choices.length > 0
|
|
71
|
+
? `${list}\n\nPick a number, or type a command of your own. Press Enter for 1, or Ctrl+C to stop: `
|
|
72
|
+
: 'No agent CLI was found on PATH. Type the command to hand a task to, or press Enter to stop: ';
|
|
73
|
+
const answer = (yield (0, utils_1.askQuestion)(`\n${missingKeyMessage}\n\n${question}`)).trim();
|
|
74
|
+
if (answer === '')
|
|
75
|
+
return (_a = choices[0]) === null || _a === void 0 ? void 0 : _a.command;
|
|
76
|
+
const index = /^\d+$/.test(answer) ? Number(answer) - 1 : -1;
|
|
77
|
+
if (index >= 0)
|
|
78
|
+
return (_b = choices[index]) === null || _b === void 0 ? void 0 : _b.command;
|
|
79
|
+
return answer;
|
|
80
|
+
});
|
|
81
|
+
/** The file the key goes in: the one that holds the local config now, or a new `ethlete.config.local.json`. */
|
|
82
|
+
const targetFile = (root) => {
|
|
83
|
+
const primary = (0, local_config_1.readLocalConfigFile)((0, path_1.join)(root, local_config_1.LOCAL_CONFIG_FILE_NAME));
|
|
84
|
+
if (primary.status === 'ok')
|
|
85
|
+
return { fileName: local_config_1.LOCAL_CONFIG_FILE_NAME, config: primary.config };
|
|
86
|
+
if (primary.status !== 'absent')
|
|
87
|
+
return undefined;
|
|
88
|
+
const legacy = (0, local_config_1.readLocalConfigFile)((0, path_1.join)(root, local_config_1.LEGACY_LOCAL_CONFIG_FILE_NAME));
|
|
89
|
+
if (legacy.status === 'ok')
|
|
90
|
+
return { fileName: local_config_1.LEGACY_LOCAL_CONFIG_FILE_NAME, config: legacy.config };
|
|
91
|
+
return { fileName: local_config_1.LOCAL_CONFIG_FILE_NAME, config: {} };
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Asks which agent command `--ai` uses and saves the answer in the local config. Without a terminal it
|
|
95
|
+
* names the key and the installed CLIs instead. Returns `undefined` when there is no command to use.
|
|
96
|
+
*/
|
|
97
|
+
const setUpAgentCommand = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
98
|
+
const { root, isTTY = process.stdin.isTTY === true } = options;
|
|
99
|
+
const choices = (0, exports.agentChoices)(options);
|
|
100
|
+
if (!isTTY) {
|
|
101
|
+
const found = choices.map(({ command }) => ` ${command}`).join('\n');
|
|
102
|
+
console.error(`${missingKeyMessage}\n` +
|
|
103
|
+
(found ? `Commands for the agent CLIs on PATH:\n${found}\n` : '') +
|
|
104
|
+
'Nothing was changed.');
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
const target = targetFile(root);
|
|
108
|
+
if (!target) {
|
|
109
|
+
console.error(`${missingKeyMessage}\n${local_config_1.LOCAL_CONFIG_FILE_NAME} cannot be read, so it stays as it is. Nothing was changed.`);
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const command = yield pick(choices);
|
|
113
|
+
if (!command) {
|
|
114
|
+
console.error('No agent command was picked. Nothing was changed.');
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(root, target.fileName), `${JSON.stringify(Object.assign(Object.assign({}, target.config), { [ai_1.AGENT_COMMAND_KEY]: command }), null, 2)}\n`, 'utf8');
|
|
118
|
+
console.log(`\n Saved "${ai_1.AGENT_COMMAND_KEY}": "${command}" in ${target.fileName}.`);
|
|
119
|
+
if ((0, gitignore_1.ignoreEntry)({ root, entry: target.fileName }))
|
|
120
|
+
console.log(` Added ${target.fileName} to .gitignore.`);
|
|
121
|
+
return command;
|
|
122
|
+
});
|
|
123
|
+
exports.setUpAgentCommand = setUpAgentCommand;
|
|
124
|
+
//# sourceMappingURL=agent-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-setup.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/agent-setup.ts"],"names":[],"mappings":"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"}
|
package/src/lib/update/ai.d.ts
CHANGED
|
@@ -1,30 +1,59 @@
|
|
|
1
1
|
import { UpdateTask } from './tasks';
|
|
2
2
|
/** Where the agent command sits in `ethlete.config.local.json`. */
|
|
3
3
|
export declare const AGENT_COMMAND_KEY = "updateAgentCommand";
|
|
4
|
-
/**
|
|
4
|
+
/** An interactive agent command that can edit files without asking, for the error that names the key. */
|
|
5
|
+
export declare const AGENT_COMMAND_EXAMPLE = "claude --permission-mode auto";
|
|
6
|
+
/** Where the command template takes the whole prompt. */
|
|
5
7
|
export declare const PROMPT_PLACEHOLDER = "<prompt>";
|
|
8
|
+
/** Where the command template takes only the path of the task file. */
|
|
9
|
+
export declare const FILE_PLACEHOLDER = "<file>";
|
|
10
|
+
/** The file an agent writes to tell `et update` that it is finished with a task. */
|
|
11
|
+
export declare const finishedPath: (taskPath: string) => string;
|
|
12
|
+
/** The prompt one assisted task is handed to an agent with. */
|
|
13
|
+
export declare const agentPrompt: (taskPath: string) => string;
|
|
14
|
+
export declare const PROMPT_ENV = "ETHLETE_UPDATE_PROMPT";
|
|
15
|
+
export declare const FILE_ENV = "ETHLETE_UPDATE_TASK_FILE";
|
|
16
|
+
export declare const FINISHED_ENV = "ETHLETE_UPDATE_FINISHED_FILE";
|
|
6
17
|
/**
|
|
7
|
-
* The command that hands one task to an agent. `<prompt>` becomes the
|
|
8
|
-
*
|
|
18
|
+
* The command that hands one task to an agent. `<prompt>` becomes the prompt, `<file>` the path of the
|
|
19
|
+
* task file; a template with neither gets the prompt appended, which is what `claude -p` needs. Both
|
|
20
|
+
* values reach the shell as variable references; run it with `agentEnv`.
|
|
9
21
|
*/
|
|
10
22
|
export declare const agentCommand: (options: {
|
|
11
23
|
template: string;
|
|
12
|
-
|
|
24
|
+
platform?: NodeJS.Platform;
|
|
13
25
|
}) => string;
|
|
26
|
+
export declare const agentEnv: (taskPath: string) => {
|
|
27
|
+
ETHLETE_UPDATE_PROMPT: string;
|
|
28
|
+
ETHLETE_UPDATE_TASK_FILE: string;
|
|
29
|
+
ETHLETE_UPDATE_FINISHED_FILE: string;
|
|
30
|
+
};
|
|
31
|
+
export type AgentRunState = 'done' | 'open' | 'failed';
|
|
14
32
|
export type AgentRun = {
|
|
15
33
|
task: UpdateTask;
|
|
16
34
|
command: string;
|
|
17
|
-
|
|
35
|
+
state: AgentRunState;
|
|
18
36
|
reason?: string;
|
|
19
37
|
};
|
|
20
38
|
/** The tasks an agent can work on: the ones whose instructions were written as a prompt. */
|
|
21
39
|
export declare const assistedTasks: (tasks: readonly UpdateTask[]) => UpdateTask[];
|
|
40
|
+
/** `settleMs` lets the agent print its last message after it writes the finished file; `killMs` is the SIGTERM grace. */
|
|
41
|
+
export type AgentTiming = {
|
|
42
|
+
pollMs: number;
|
|
43
|
+
settleMs: number;
|
|
44
|
+
killMs: number;
|
|
45
|
+
};
|
|
22
46
|
/**
|
|
23
|
-
* Runs the configured agent once per assisted task, in order, so each run has one change to make
|
|
24
|
-
* command is a user-written string, so it runs through a shell.
|
|
47
|
+
* Runs the configured agent once per assisted task, in order, so each run has one change to make, and
|
|
48
|
+
* reports each one as it ends. The command is a user-written string, so it runs through a shell.
|
|
49
|
+
* A run ends when the agent exits, or shortly after it writes the finished file the prompt names.
|
|
50
|
+
* `afterRun` runs after each task, before the next one starts; it is how `et update` commits a task that
|
|
51
|
+
* ended done, so the report of any other task says it is not committed.
|
|
25
52
|
*/
|
|
26
53
|
export declare const runAgentTasks: (options: {
|
|
27
54
|
root: string;
|
|
28
55
|
template: string;
|
|
29
56
|
tasks: readonly UpdateTask[];
|
|
30
|
-
|
|
57
|
+
afterRun?: (run: AgentRun) => void;
|
|
58
|
+
timing?: Partial<AgentTiming>;
|
|
59
|
+
}) => Promise<AgentRun[]>;
|