@ethlete/cli 2.0.1-next.2 → 2.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.
- package/CHANGELOG.md +109 -0
- package/README.md +178 -6
- 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 +38 -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 +12 -1
- package/src/index.d.ts +2 -1
- package/src/index.js +97 -10
- package/src/index.js.map +1 -1
- package/src/lib/api/api-command.d.ts +5 -0
- package/src/lib/api/api-command.js +27 -0
- package/src/lib/api/api-command.js.map +1 -0
- package/src/lib/api/auth-hint.d.ts +16 -0
- package/src/lib/api/auth-hint.js +59 -0
- package/src/lib/api/auth-hint.js.map +1 -0
- package/src/lib/api/clear.d.ts +36 -0
- package/src/lib/api/clear.js +121 -0
- package/src/lib/api/clear.js.map +1 -0
- package/src/lib/api/clone.d.ts +12 -0
- package/src/lib/api/clone.js +24 -0
- package/src/lib/api/clone.js.map +1 -0
- package/src/lib/api/compose.d.ts +46 -0
- package/src/lib/api/compose.js +101 -0
- package/src/lib/api/compose.js.map +1 -0
- package/src/lib/api/definition.d.ts +37 -0
- package/src/lib/api/definition.js +33 -0
- package/src/lib/api/definition.js.map +1 -0
- package/src/lib/api/git.d.ts +27 -0
- package/src/lib/api/git.js +79 -0
- package/src/lib/api/git.js.map +1 -0
- package/src/lib/api/help.d.ts +11 -0
- package/src/lib/api/help.js +72 -0
- package/src/lib/api/help.js.map +1 -0
- package/src/lib/api/index.d.ts +15 -0
- package/src/lib/api/index.js +19 -0
- package/src/lib/api/index.js.map +1 -0
- package/src/lib/api/load-definitions.d.ts +16 -0
- package/src/lib/api/load-definitions.js +22 -0
- package/src/lib/api/load-definitions.js.map +1 -0
- package/src/lib/api/ports.d.ts +13 -0
- package/src/lib/api/ports.js +98 -0
- package/src/lib/api/ports.js.map +1 -0
- package/src/lib/api/resolve-checkout.d.ts +45 -0
- package/src/lib/api/resolve-checkout.js +91 -0
- package/src/lib/api/resolve-checkout.js.map +1 -0
- package/src/lib/api/run.d.ts +10 -0
- package/src/lib/api/run.js +332 -0
- package/src/lib/api/run.js.map +1 -0
- package/src/lib/api/setup.d.ts +15 -0
- package/src/lib/api/setup.js +41 -0
- package/src/lib/api/setup.js.map +1 -0
- package/src/lib/api/state.d.ts +20 -0
- package/src/lib/api/state.js +33 -0
- package/src/lib/api/state.js.map +1 -0
- package/src/lib/api/suggest.d.ts +7 -0
- package/src/lib/api/suggest.js +35 -0
- package/src/lib/api/suggest.js.map +1 -0
- package/src/lib/auth/auth-command.d.ts +11 -0
- package/src/lib/auth/auth-command.js +165 -0
- package/src/lib/auth/auth-command.js.map +1 -0
- package/src/lib/auth/composer-auth.d.ts +30 -0
- package/src/lib/auth/composer-auth.js +70 -0
- package/src/lib/auth/composer-auth.js.map +1 -0
- package/src/lib/auth/composer-repositories.d.ts +5 -0
- package/src/lib/auth/composer-repositories.js +33 -0
- package/src/lib/auth/composer-repositories.js.map +1 -0
- package/src/lib/auth/gitlab-token.d.ts +43 -0
- package/src/lib/auth/gitlab-token.js +72 -0
- package/src/lib/auth/gitlab-token.js.map +1 -0
- package/src/lib/auth/index.d.ts +4 -0
- package/src/lib/auth/index.js +8 -0
- package/src/lib/auth/index.js.map +1 -0
- package/src/lib/config/diagnose.d.ts +7 -0
- package/src/lib/config/diagnose.js +112 -0
- package/src/lib/config/diagnose.js.map +1 -0
- package/src/lib/config/index.d.ts +2 -0
- package/src/lib/config/index.js +6 -0
- package/src/lib/config/index.js.map +1 -0
- package/src/lib/config/local-config.d.ts +46 -0
- package/src/lib/config/local-config.js +57 -0
- package/src/lib/config/local-config.js.map +1 -0
- 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 +192 -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/doctor/doctor-command.d.ts +7 -0
- package/src/lib/doctor/doctor-command.js +62 -0
- package/src/lib/doctor/doctor-command.js.map +1 -0
- package/src/lib/doctor/index.d.ts +1 -0
- package/src/lib/doctor/index.js +5 -0
- package/src/lib/doctor/index.js.map +1 -0
- package/src/lib/index.d.ts +7 -0
- package/src/lib/index.js +7 -0
- package/src/lib/index.js.map +1 -1
- package/src/lib/invocation.d.ts +9 -0
- package/src/lib/invocation.js +47 -0
- package/src/lib/invocation.js.map +1 -0
- package/src/lib/release.js +21 -3
- 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/ai.d.ts +37 -0
- package/src/lib/update/ai.js +71 -0
- package/src/lib/update/ai.js.map +1 -0
- package/src/lib/update/args.d.ts +21 -0
- package/src/lib/update/args.js +89 -0
- package/src/lib/update/args.js.map +1 -0
- package/src/lib/update/gitignore.d.ts +2 -0
- package/src/lib/update/gitignore.js +18 -0
- package/src/lib/update/gitignore.js.map +1 -0
- package/src/lib/update/index.d.ts +13 -0
- package/src/lib/update/index.js +17 -0
- package/src/lib/update/index.js.map +1 -0
- package/src/lib/update/migration-manifest.d.ts +40 -0
- package/src/lib/update/migration-manifest.js +137 -0
- package/src/lib/update/migration-manifest.js.map +1 -0
- package/src/lib/update/package-manager.d.ts +30 -0
- package/src/lib/update/package-manager.js +60 -0
- package/src/lib/update/package-manager.js.map +1 -0
- package/src/lib/update/packages.d.ts +65 -0
- package/src/lib/update/packages.js +147 -0
- package/src/lib/update/packages.js.map +1 -0
- package/src/lib/update/pending.d.ts +34 -0
- package/src/lib/update/pending.js +46 -0
- package/src/lib/update/pending.js.map +1 -0
- package/src/lib/update/plan.d.ts +51 -0
- package/src/lib/update/plan.js +101 -0
- package/src/lib/update/plan.js.map +1 -0
- package/src/lib/update/registry.d.ts +40 -0
- package/src/lib/update/registry.js +140 -0
- package/src/lib/update/registry.js.map +1 -0
- package/src/lib/update/run-migrations.d.ts +45 -0
- package/src/lib/update/run-migrations.js +73 -0
- package/src/lib/update/run-migrations.js.map +1 -0
- package/src/lib/update/semver.d.ts +19 -0
- package/src/lib/update/semver.js +79 -0
- package/src/lib/update/semver.js.map +1 -0
- package/src/lib/update/tasks.d.ts +75 -0
- package/src/lib/update/tasks.js +241 -0
- package/src/lib/update/tasks.js.map +1 -0
- package/src/lib/update/update-command.d.ts +12 -0
- package/src/lib/update/update-command.js +411 -0
- package/src/lib/update/update-command.js.map +1 -0
- package/src/lib/utils.d.ts +14 -0
- package/src/lib/utils.js +14 -1
- package/src/lib/utils.js.map +1 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serveDesign = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const calls_tsconfig_1 = require("./calls-tsconfig");
|
|
8
|
+
const paths_1 = require("./paths");
|
|
9
|
+
const VIRTUAL = 'virtual:design-explore';
|
|
10
|
+
/** What a slug says about which project drew it: its first segment. */
|
|
11
|
+
const projectOf = (slug) => { var _a; return (_a = slug.split('/')[0]) !== null && _a !== void 0 ? _a : ''; };
|
|
12
|
+
const fsUrl = (target, path) => `/@fs/${(0, path_1.resolve)(target, path).replace(/^\//, '')}`;
|
|
13
|
+
const registry = (target, config) => {
|
|
14
|
+
var _a;
|
|
15
|
+
const root = (0, paths_1.callsRootOf)(target);
|
|
16
|
+
const entries = (0, fs_1.globSync)('**/call.ts', { cwd: root })
|
|
17
|
+
.sort()
|
|
18
|
+
.map((file) => [(0, path_1.dirname)(file), fsUrl(target, (0, path_1.resolve)(root, file))]);
|
|
19
|
+
return `export const calls = {\n${entries
|
|
20
|
+
.map(([slug, url]) => ` ${JSON.stringify(slug)}: () => import(${JSON.stringify(url)}),`)
|
|
21
|
+
.join('\n')}\n};\nexport const defaultCall = ${JSON.stringify((_a = config.defaultCall) !== null && _a !== void 0 ? _a : null)};\n`;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Vite's own tsconfigPaths resolves against the tsconfig nearest the importing file, which is not
|
|
25
|
+
* the one that carries the workspace paths. The aliases are read from the base config instead.
|
|
26
|
+
*/
|
|
27
|
+
const workspaceAliases = (target) => {
|
|
28
|
+
var _a, _b;
|
|
29
|
+
const basePath = (0, path_1.resolve)(target, 'tsconfig.base.json');
|
|
30
|
+
if (!(0, fs_1.existsSync)(basePath))
|
|
31
|
+
return [];
|
|
32
|
+
const base = JSON.parse((0, fs_1.readFileSync)(basePath, 'utf8'));
|
|
33
|
+
const paths = (_b = (_a = base.compilerOptions) === null || _a === void 0 ? void 0 : _a.paths) !== null && _b !== void 0 ? _b : {};
|
|
34
|
+
return Object.entries(paths).flatMap(([key, [mapped]]) => {
|
|
35
|
+
if (!mapped)
|
|
36
|
+
return [];
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
find: key.endsWith('/*') ? new RegExp(`^${key.slice(0, -2)}/`) : new RegExp(`^${key}$`),
|
|
40
|
+
replacement: key.endsWith('/*') ? `${(0, path_1.resolve)(target, mapped.slice(0, -2))}/` : (0, path_1.resolve)(target, mapped),
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* The stylesheet of every project, each behind its own loader. A frame loads the one its call
|
|
47
|
+
* belongs to: two projects define the same theme variables, so a frame that loaded both would
|
|
48
|
+
* draw under whichever stylesheet came last.
|
|
49
|
+
*/
|
|
50
|
+
const env = (target, config) => {
|
|
51
|
+
var _a;
|
|
52
|
+
const loaders = Object.entries((_a = config.projects) !== null && _a !== void 0 ? _a : {}).map(([name, project]) => {
|
|
53
|
+
var _a;
|
|
54
|
+
return ` ${JSON.stringify(name)}: () => Promise.all([${((_a = project.styles) !== null && _a !== void 0 ? _a : [])
|
|
55
|
+
.map((style) => `import(${JSON.stringify(fsUrl(target, style))})`)
|
|
56
|
+
.join(', ')}]),`;
|
|
57
|
+
});
|
|
58
|
+
return (`const envs = {\n${loaders.join('\n')}\n};\n` +
|
|
59
|
+
`export const loadEnv = (project) => (envs[project] ?? (() => Promise.resolve()))();\n`);
|
|
60
|
+
};
|
|
61
|
+
/** Serves the call registry and each project's global stylesheet to the web pages. */
|
|
62
|
+
const designExplore = (target, config) => ({
|
|
63
|
+
name: 'design-explore',
|
|
64
|
+
resolveId: (id) => (id === VIRTUAL || id === `${VIRTUAL}/env` ? `\0${id}` : null),
|
|
65
|
+
load: (id) => {
|
|
66
|
+
if (id === `\0${VIRTUAL}`)
|
|
67
|
+
return registry(target, config);
|
|
68
|
+
if (id === `\0${VIRTUAL}/env`)
|
|
69
|
+
return env(target, config);
|
|
70
|
+
return null;
|
|
71
|
+
},
|
|
72
|
+
transformIndexHtml: {
|
|
73
|
+
order: 'pre',
|
|
74
|
+
handler: (html, ctx) => {
|
|
75
|
+
var _a, _b, _c, _d;
|
|
76
|
+
if (!ctx.path.includes('frame'))
|
|
77
|
+
return html;
|
|
78
|
+
const asked = new URL((_a = ctx.originalUrl) !== null && _a !== void 0 ? _a : ctx.path, 'http://localhost');
|
|
79
|
+
const head = (_d = (_b = config.projects) === null || _b === void 0 ? void 0 : _b[projectOf((_c = asked.searchParams.get('call')) !== null && _c !== void 0 ? _c : '')]) === null || _d === void 0 ? void 0 : _d.head;
|
|
80
|
+
if (!head)
|
|
81
|
+
return html;
|
|
82
|
+
return html.replace('<!--head-->', (0, fs_1.readFileSync)((0, path_1.resolve)(target, head), 'utf8'));
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
/** The registry is built once per load, so a new call folder is invisible until it is invalidated. */
|
|
86
|
+
configureServer: (vite) => {
|
|
87
|
+
const callsRoot = (0, paths_1.callsRootOf)(target);
|
|
88
|
+
const refresh = (file) => {
|
|
89
|
+
if (!file.startsWith(callsRoot) || !file.endsWith('/call.ts'))
|
|
90
|
+
return;
|
|
91
|
+
const module = vite.moduleGraph.getModuleById(`\0${VIRTUAL}`);
|
|
92
|
+
if (module)
|
|
93
|
+
vite.moduleGraph.invalidateModule(module);
|
|
94
|
+
vite.ws.send({ type: 'full-reload' });
|
|
95
|
+
};
|
|
96
|
+
vite.watcher.add(callsRoot);
|
|
97
|
+
vite.watcher.on('add', refresh);
|
|
98
|
+
vite.watcher.on('unlink', refresh);
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
/**
|
|
102
|
+
* Starts the design page for a checkout and keeps it running. The returned exit code is the
|
|
103
|
+
* command's, not the server's: a listening server holds the process open on its own.
|
|
104
|
+
*/
|
|
105
|
+
const serveDesign = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
106
|
+
const { target } = options;
|
|
107
|
+
const config = (0, paths_1.readConfig)(target);
|
|
108
|
+
if (!config) {
|
|
109
|
+
console.error(`design-explore: no config at ${(0, paths_1.configPathOf)(target)}`);
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
(0, calls_tsconfig_1.writeCallsTsconfig)(target);
|
|
113
|
+
// Vite reads a tsconfig out of the working directory to transpile a call, and the calls sit
|
|
114
|
+
// outside its root. From a directory that holds none, every call compiles to an empty module.
|
|
115
|
+
process.chdir(target);
|
|
116
|
+
const { createServer } = yield import('vite');
|
|
117
|
+
const { default: tailwind } = yield import('@tailwindcss/postcss');
|
|
118
|
+
const here = (0, paths_1.assetRoot)();
|
|
119
|
+
const server = yield createServer({
|
|
120
|
+
configFile: false,
|
|
121
|
+
root: (0, path_1.resolve)(here, 'web'),
|
|
122
|
+
// Every drawing is ruled under Tailwind 4, whatever the checkout installs. The tool brings its
|
|
123
|
+
// own pipeline so no checkout's postcss config reaches a drawing.
|
|
124
|
+
css: { postcss: { plugins: [tailwind()] } },
|
|
125
|
+
cacheDir: (0, path_1.resolve)((0, paths_1.workRootOf)(target), 'vite'),
|
|
126
|
+
resolve: {
|
|
127
|
+
alias: [{ find: /^@design-explore$/, replacement: (0, path_1.resolve)(here, 'define-call.ts') }, ...workspaceAliases(target)],
|
|
128
|
+
},
|
|
129
|
+
plugins: [designExplore(target, config)],
|
|
130
|
+
server: {
|
|
131
|
+
port: (0, paths_1.portOf)(config),
|
|
132
|
+
strictPort: true,
|
|
133
|
+
// The web pages live inside this package, which is outside the checkout it draws. Vite
|
|
134
|
+
// serves neither root unless both are allowed.
|
|
135
|
+
fs: { allow: [target, here] },
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
yield server.listen();
|
|
139
|
+
console.log(`design-explore: drawing ${target}`);
|
|
140
|
+
server.printUrls();
|
|
141
|
+
return 0;
|
|
142
|
+
});
|
|
143
|
+
exports.serveDesign = serveDesign;
|
|
144
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/design/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ComposeTool } from '../api/compose';
|
|
2
|
+
/** Reports every problem with this machine's setup, so `et api` does not have to find them one at a time. */
|
|
3
|
+
export declare const doctorCommand: ({ root, apiInvocation, composeTools, }: {
|
|
4
|
+
root: string;
|
|
5
|
+
apiInvocation?: string;
|
|
6
|
+
composeTools?: ComposeTool[];
|
|
7
|
+
}) => 0 | 1;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.doctorCommand = void 0;
|
|
4
|
+
const compose_1 = require("../api/compose");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const load_definitions_1 = require("../api/load-definitions");
|
|
7
|
+
const resolve_checkout_1 = require("../api/resolve-checkout");
|
|
8
|
+
const diagnose_1 = require("../config/diagnose");
|
|
9
|
+
const local_config_1 = require("../config/local-config");
|
|
10
|
+
const indent = (text) => text.replace(/\n/g, '\n ');
|
|
11
|
+
const describeComposeTool = (composeTools) => {
|
|
12
|
+
const tool = (0, compose_1.resolveComposeTool)(composeTools);
|
|
13
|
+
return tool
|
|
14
|
+
? { line: `container engine: ${(0, compose_1.composeBinary)(tool.compose).join(' ')}`, problems: [] }
|
|
15
|
+
: { line: undefined, problems: [`No compose tool found. Tried: ${(0, compose_1.composeToolNames)(composeTools).join(', ')}.`] };
|
|
16
|
+
};
|
|
17
|
+
const describeApis = (root, apiInvocation) => {
|
|
18
|
+
const { found, apis, fileName } = (0, load_definitions_1.loadApiDefinitions)(root);
|
|
19
|
+
if (!found)
|
|
20
|
+
return { lines: [], problems: [] };
|
|
21
|
+
const lines = [];
|
|
22
|
+
const problems = [];
|
|
23
|
+
for (const [name, api] of Object.entries(apis)) {
|
|
24
|
+
const checkout = (0, resolve_checkout_1.resolveApiCheckout)({ root, name, api });
|
|
25
|
+
if (checkout.ok) {
|
|
26
|
+
lines.push(`${fileName}: ${name} → ${checkout.checkout.composePath}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
problems.push((0, resolve_checkout_1.checkoutProblem)({ failure: checkout, name, invocation: apiInvocation }));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { lines, problems };
|
|
33
|
+
};
|
|
34
|
+
/** Reports every problem with this machine's setup, so `et api` does not have to find them one at a time. */
|
|
35
|
+
const doctorCommand = ({ root, apiInvocation = 'et api', composeTools, }) => {
|
|
36
|
+
// A file that exists but cannot be parsed still has to be reported, so this asks whether the file
|
|
37
|
+
// is there rather than whether it could be read.
|
|
38
|
+
const hasConfig = [local_config_1.LOCAL_CONFIG_FILE_NAME, local_config_1.LEGACY_LOCAL_CONFIG_FILE_NAME].some((fileName) => (0, local_config_1.readLocalConfigFile)((0, path_1.join)(root, fileName)).status !== 'absent');
|
|
39
|
+
const hasApis = (0, load_definitions_1.loadApiDefinitions)(root).found;
|
|
40
|
+
if (!hasConfig && !hasApis) {
|
|
41
|
+
console.log(`Nothing to check: ${root} has no ${local_config_1.LOCAL_CONFIG_FILE_NAME} and no ${load_definitions_1.API_DEFINITIONS_FILE_NAMES[0]}.`);
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
const configProblems = (0, diagnose_1.diagnoseLocalConfig)({ root });
|
|
45
|
+
const compose = describeComposeTool(composeTools);
|
|
46
|
+
const apis = describeApis(root, apiInvocation);
|
|
47
|
+
const problems = [...configProblems, ...compose.problems, ...apis.problems];
|
|
48
|
+
for (const line of [compose.line, ...apis.lines].filter(Boolean)) {
|
|
49
|
+
console.log(` ${line}`);
|
|
50
|
+
}
|
|
51
|
+
if (problems.length === 0) {
|
|
52
|
+
console.log('\nNo problems found.');
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
console.error(`\n${problems.length} problem(s):\n`);
|
|
56
|
+
for (const problem of problems) {
|
|
57
|
+
console.error(` - ${indent(problem)}`);
|
|
58
|
+
}
|
|
59
|
+
return 1;
|
|
60
|
+
};
|
|
61
|
+
exports.doctorCommand = doctorCommand;
|
|
62
|
+
//# sourceMappingURL=doctor-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/doctor/doctor-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './doctor-command';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/doctor/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC"}
|
package/src/lib/index.d.ts
CHANGED
package/src/lib/index.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./api"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./auth"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./config"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./design"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./doctor"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./invocation"), exports);
|
|
4
10
|
tslib_1.__exportStar(require("./release"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./update"), exports);
|
|
5
12
|
//# sourceMappingURL=index.js.map
|
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,oDAA0B"}
|
|
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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the reader of a message can type to reach `et <subcommand>` in this repo, because `et` itself
|
|
3
|
+
* is rarely on the PATH: the package script that wraps it, or the package manager's own way to run
|
|
4
|
+
* the binary, for example `npx et api`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const repoInvocation: (options: {
|
|
7
|
+
root: string;
|
|
8
|
+
subcommand: string;
|
|
9
|
+
}) => string;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.repoInvocation = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
/**
|
|
7
|
+
* How each package manager runs a script, and how it runs a binary from `node_modules` when no
|
|
8
|
+
* script wraps it.
|
|
9
|
+
*/
|
|
10
|
+
const RUNNERS = [
|
|
11
|
+
{ name: 'yarn', script: 'yarn', binary: 'yarn et' },
|
|
12
|
+
{ name: 'pnpm', script: 'pnpm', binary: 'pnpm exec et' },
|
|
13
|
+
{ name: 'bun', script: 'bun run', binary: 'bunx et' },
|
|
14
|
+
{ name: 'npm', script: 'npm run', binary: 'npx et' },
|
|
15
|
+
];
|
|
16
|
+
const readManifest = (root) => {
|
|
17
|
+
let parsed;
|
|
18
|
+
try {
|
|
19
|
+
parsed = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(root, 'package.json'), 'utf8'));
|
|
20
|
+
}
|
|
21
|
+
catch (_a) {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) ? parsed : {};
|
|
25
|
+
};
|
|
26
|
+
const runnerFor = (manifest) => {
|
|
27
|
+
var _a;
|
|
28
|
+
const declared = (_a = manifest.packageManager) !== null && _a !== void 0 ? _a : process.env['npm_config_user_agent'];
|
|
29
|
+
return declared ? RUNNERS.find((runner) => declared.startsWith(runner.name)) : undefined;
|
|
30
|
+
};
|
|
31
|
+
const scriptFor = (manifest, command) => { var _a, _b; return (_b = Object.entries((_a = manifest.scripts) !== null && _a !== void 0 ? _a : {}).find(([, value]) => value.trim() === command)) === null || _b === void 0 ? void 0 : _b[0]; };
|
|
32
|
+
/**
|
|
33
|
+
* What the reader of a message can type to reach `et <subcommand>` in this repo, because `et` itself
|
|
34
|
+
* is rarely on the PATH: the package script that wraps it, or the package manager's own way to run
|
|
35
|
+
* the binary, for example `npx et api`.
|
|
36
|
+
*/
|
|
37
|
+
const repoInvocation = (options) => {
|
|
38
|
+
const { root, subcommand } = options;
|
|
39
|
+
const manifest = readManifest(root);
|
|
40
|
+
const runner = runnerFor(manifest);
|
|
41
|
+
if (!runner)
|
|
42
|
+
return `et ${subcommand}`;
|
|
43
|
+
const script = scriptFor(manifest, `et ${subcommand}`);
|
|
44
|
+
return script ? `${runner.script} ${script}` : `${runner.binary} ${subcommand}`;
|
|
45
|
+
};
|
|
46
|
+
exports.repoInvocation = repoInvocation;
|
|
47
|
+
//# sourceMappingURL=invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../../../../libs/cli/src/lib/invocation.ts"],"names":[],"mappings":";;;AAAA,2BAAkC;AAClC,+BAA4B;AAI5B;;;GAGG;AACH,MAAM,OAAO,GAAG;IACd,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;IACnD,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE;IACxD,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IACrD,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;CACrD,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAY,EAAE;IAC9C,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7G,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAE,EAAE;;IACvC,MAAM,QAAQ,GAAG,MAAA,QAAQ,CAAC,cAAc,mCAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAEjF,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAE,OAAe,EAAE,EAAE,eACxD,OAAA,MAAA,MAAM,CAAC,OAAO,CAAC,MAAA,QAAQ,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,0CAAG,CAAC,CAAC,CAAA,EAAA,CAAC;AAE5F;;;;GAIG;AACI,MAAM,cAAc,GAAG,CAAC,OAA6C,EAAE,EAAE;IAC9E,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,UAAU,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,UAAU,EAAE,CAAC,CAAC;IAEvD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;AAClF,CAAC,CAAC;AAVW,QAAA,cAAc,kBAUzB"}
|
package/src/lib/release.js
CHANGED
|
@@ -4,6 +4,25 @@ exports.release = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const child_process_1 = require("child_process");
|
|
6
6
|
const utils_1 = require("./utils");
|
|
7
|
+
const NO_CHANGESETS_MESSAGE = 'No unreleased changesets found';
|
|
8
|
+
const changesetMajorVersion = () => {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const version = (0, child_process_1.execSync)('yarn changeset --version').toString();
|
|
11
|
+
return Number((_b = (_a = /(\d+)\.\d+\.\d+/.exec(version)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : 0);
|
|
12
|
+
};
|
|
13
|
+
const runChangesetVersion = () => {
|
|
14
|
+
try {
|
|
15
|
+
return (0, child_process_1.execSync)('yarn changeset version', { stdio: 'pipe' }).toString();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
const { stdout, stderr } = error;
|
|
19
|
+
const output = `${stdout !== null && stdout !== void 0 ? stdout : ''}${stderr !== null && stderr !== void 0 ? stderr : ''}`;
|
|
20
|
+
if (!output.includes(NO_CHANGESETS_MESSAGE))
|
|
21
|
+
throw error;
|
|
22
|
+
console.error(`${NO_CHANGESETS_MESSAGE}, aborting...\n`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
7
26
|
const release = (args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
8
27
|
const shouldForce = args.findIndex((arg) => arg.includes('--force') || arg.includes('-f')) !== -1;
|
|
9
28
|
const skipPush = args.findIndex((arg) => arg.includes('--skip-push') || arg.includes('-sp')) !== -1;
|
|
@@ -22,9 +41,8 @@ const release = (args) => tslib_1.__awaiter(void 0, void 0, void 0, function* ()
|
|
|
22
41
|
console.error('Aborting...');
|
|
23
42
|
process.exit(1);
|
|
24
43
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const changesetTag = (0, child_process_1.execSync)('yarn changeset tag').toString();
|
|
44
|
+
console.log(runChangesetVersion());
|
|
45
|
+
const changesetTag = (0, child_process_1.execSync)(`yarn changeset ${changesetMajorVersion() >= 3 ? 'git-tag' : 'tag'}`).toString();
|
|
28
46
|
console.log(changesetTag);
|
|
29
47
|
(0, child_process_1.execSync)('git add .');
|
|
30
48
|
console.log('Committing release... 🚀 \n(This may take a while depending on your pre-commit hooks) \n');
|
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,iDAAyC;AACzC,mCAAsC;AAE/B,MAAM,OAAO,GAAG,CAAO,IAAc,EAAE,EAAE;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpG,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,wBAAwB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE7D,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAW,EAC9B,2KAA2K,CAC5K,CAAC;IAEF,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,
|
|
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 child_process_1 = require("child_process");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
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, child_process_1.spawnSync)(binary, args, { 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,iDAA0C;AAC1C,2BAAgC;AAChC,+BAA4B;AAIf,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,yBAAS,EAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAExE,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,37 @@
|
|
|
1
|
+
import { UpdateTask } from './tasks';
|
|
2
|
+
/** Where the agent command sits in `ethlete.config.local.json`. */
|
|
3
|
+
export declare const AGENT_COMMAND_KEY = "updateAgentCommand";
|
|
4
|
+
/** An agent command that can edit files without asking, for the docs and the error that names the key. */
|
|
5
|
+
export declare const AGENT_COMMAND_EXAMPLE = "claude --permission-mode acceptEdits -p";
|
|
6
|
+
/** Where the command template takes the whole prompt. */
|
|
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 prompt one assisted task is handed to an agent with. */
|
|
11
|
+
export declare const agentPrompt: (taskPath: string) => string;
|
|
12
|
+
/**
|
|
13
|
+
* The command that hands one task to an agent. `<prompt>` becomes the prompt, `<file>` the path of the
|
|
14
|
+
* task file; a template with neither gets the prompt appended, which is what `claude -p` needs.
|
|
15
|
+
*/
|
|
16
|
+
export declare const agentCommand: (options: {
|
|
17
|
+
template: string;
|
|
18
|
+
taskPath: string;
|
|
19
|
+
}) => string;
|
|
20
|
+
export type AgentRunState = 'done' | 'open' | 'failed';
|
|
21
|
+
export type AgentRun = {
|
|
22
|
+
task: UpdateTask;
|
|
23
|
+
command: string;
|
|
24
|
+
state: AgentRunState;
|
|
25
|
+
reason?: string;
|
|
26
|
+
};
|
|
27
|
+
/** The tasks an agent can work on: the ones whose instructions were written as a prompt. */
|
|
28
|
+
export declare const assistedTasks: (tasks: readonly UpdateTask[]) => UpdateTask[];
|
|
29
|
+
/**
|
|
30
|
+
* Runs the configured agent once per assisted task, in order, so each run has one change to make, and
|
|
31
|
+
* reports each one as it ends. The command is a user-written string, so it runs through a shell.
|
|
32
|
+
*/
|
|
33
|
+
export declare const runAgentTasks: (options: {
|
|
34
|
+
root: string;
|
|
35
|
+
template: string;
|
|
36
|
+
tasks: readonly UpdateTask[];
|
|
37
|
+
}) => AgentRun[];
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runAgentTasks = exports.assistedTasks = exports.agentCommand = exports.agentPrompt = exports.FILE_PLACEHOLDER = exports.PROMPT_PLACEHOLDER = exports.AGENT_COMMAND_EXAMPLE = exports.AGENT_COMMAND_KEY = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
/** Where the agent command sits in `ethlete.config.local.json`. */
|
|
8
|
+
exports.AGENT_COMMAND_KEY = 'updateAgentCommand';
|
|
9
|
+
/** An agent command that can edit files without asking, for the docs and the error that names the key. */
|
|
10
|
+
exports.AGENT_COMMAND_EXAMPLE = 'claude --permission-mode acceptEdits -p';
|
|
11
|
+
/** Where the command template takes the whole prompt. */
|
|
12
|
+
exports.PROMPT_PLACEHOLDER = '<prompt>';
|
|
13
|
+
/** Where the command template takes only the path of the task file. */
|
|
14
|
+
exports.FILE_PLACEHOLDER = '<file>';
|
|
15
|
+
/** The prompt one assisted task is handed to an agent with. */
|
|
16
|
+
const agentPrompt = (taskPath) => `Apply the migration task described in ${taskPath} to this repository. ` +
|
|
17
|
+
'Follow its instructions, then delete that file once the change is complete.';
|
|
18
|
+
exports.agentPrompt = agentPrompt;
|
|
19
|
+
const quoted = (value) => (/\s/.test(value) ? `"${value}"` : value);
|
|
20
|
+
/**
|
|
21
|
+
* The command that hands one task to an agent. `<prompt>` becomes the prompt, `<file>` the path of the
|
|
22
|
+
* task file; a template with neither gets the prompt appended, which is what `claude -p` needs.
|
|
23
|
+
*/
|
|
24
|
+
const agentCommand = (options) => {
|
|
25
|
+
const { template, taskPath } = options;
|
|
26
|
+
const prompt = quoted((0, exports.agentPrompt)(taskPath));
|
|
27
|
+
if (template.includes(exports.PROMPT_PLACEHOLDER) || template.includes(exports.FILE_PLACEHOLDER)) {
|
|
28
|
+
return template.split(exports.PROMPT_PLACEHOLDER).join(prompt).split(exports.FILE_PLACEHOLDER).join(quoted(taskPath));
|
|
29
|
+
}
|
|
30
|
+
return `${template} ${prompt}`;
|
|
31
|
+
};
|
|
32
|
+
exports.agentCommand = agentCommand;
|
|
33
|
+
/** The tasks an agent can work on: the ones whose instructions were written as a prompt. */
|
|
34
|
+
const assistedTasks = (tasks) => tasks.filter((task) => task.kind === 'assisted' && task.instructionsFile !== undefined);
|
|
35
|
+
exports.assistedTasks = assistedTasks;
|
|
36
|
+
const runOne = (options) => {
|
|
37
|
+
var _a;
|
|
38
|
+
const { root, template, task } = options;
|
|
39
|
+
const taskPath = (0, path_1.join)(root, (_a = task.instructionsFile) !== null && _a !== void 0 ? _a : '');
|
|
40
|
+
const command = (0, exports.agentCommand)({ template, taskPath });
|
|
41
|
+
console.log(` ${command}\n`);
|
|
42
|
+
const result = (0, child_process_1.spawnSync)(command, { cwd: root, stdio: 'inherit', shell: true });
|
|
43
|
+
if (result.error)
|
|
44
|
+
return { task, command, state: 'failed', reason: result.error.message };
|
|
45
|
+
if (result.status !== 0)
|
|
46
|
+
return { task, command, state: 'failed', reason: `exited with ${result.status}` };
|
|
47
|
+
if ((0, fs_1.existsSync)(taskPath)) {
|
|
48
|
+
return { task, command, state: 'open', reason: `the agent left ${task.instructionsFile}, so the task stays open` };
|
|
49
|
+
}
|
|
50
|
+
return { task, command, state: 'done' };
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Runs the configured agent once per assisted task, in order, so each run has one change to make, and
|
|
54
|
+
* reports each one as it ends. The command is a user-written string, so it runs through a shell.
|
|
55
|
+
*/
|
|
56
|
+
const runAgentTasks = (options) => {
|
|
57
|
+
const { root, template } = options;
|
|
58
|
+
const tasks = (0, exports.assistedTasks)(options.tasks);
|
|
59
|
+
return tasks.map((task, index) => {
|
|
60
|
+
const label = `[${index + 1}/${tasks.length}] ${task.packageName} ${task.name}`;
|
|
61
|
+
console.log(`\n ${label}`);
|
|
62
|
+
const run = runOne({ root, template, task });
|
|
63
|
+
if (run.state === 'done')
|
|
64
|
+
console.log(`\n ${label}: done`);
|
|
65
|
+
else
|
|
66
|
+
console.error(`\n ${label}: ${run.reason}`);
|
|
67
|
+
return run;
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
exports.runAgentTasks = runAgentTasks;
|
|
71
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/update/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type UpdateArgs = {
|
|
2
|
+
/** Full package names the run is limited to. Empty means every `@ethlete/*` the manifest declares. */
|
|
3
|
+
packages: string[];
|
|
4
|
+
tag?: string;
|
|
5
|
+
/** A single version named with `--to`. */
|
|
6
|
+
version?: string;
|
|
7
|
+
/** The version the migrations of a package run from, keyed by full package name. */
|
|
8
|
+
from: Record<string, string>;
|
|
9
|
+
check: boolean;
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
install: boolean;
|
|
12
|
+
resume: boolean;
|
|
13
|
+
ai: boolean;
|
|
14
|
+
force: boolean;
|
|
15
|
+
help: boolean;
|
|
16
|
+
problems: string[];
|
|
17
|
+
};
|
|
18
|
+
/** `core` and `@ethlete/core` both name the same package on the command line. */
|
|
19
|
+
export declare const fullPackageName: (name: string) => string;
|
|
20
|
+
/** Reads the flags of `et update`, collecting every problem so one run reports them all. */
|
|
21
|
+
export declare const parseUpdateArgs: (argv: readonly string[]) => UpdateArgs;
|