@zaowu-labs/cli 1.0.1
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/README.md +16 -0
- package/dist/args.d.ts +11 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +65 -0
- package/dist/args.js.map +1 -0
- package/dist/command-contracts.d.ts +11 -0
- package/dist/command-contracts.d.ts.map +1 -0
- package/dist/command-contracts.js +74 -0
- package/dist/command-contracts.js.map +1 -0
- package/dist/domain-handlers.d.ts +4 -0
- package/dist/domain-handlers.d.ts.map +1 -0
- package/dist/domain-handlers.js +65 -0
- package/dist/domain-handlers.js.map +1 -0
- package/dist/domains.d.ts +4 -0
- package/dist/domains.d.ts.map +1 -0
- package/dist/domains.js +22 -0
- package/dist/domains.js.map +1 -0
- package/dist/handler-utils.d.ts +59 -0
- package/dist/handler-utils.d.ts.map +1 -0
- package/dist/handler-utils.js +113 -0
- package/dist/handler-utils.js.map +1 -0
- package/dist/handlers/ai-handlers.d.ts +4 -0
- package/dist/handlers/ai-handlers.d.ts.map +1 -0
- package/dist/handlers/ai-handlers.js +159 -0
- package/dist/handlers/ai-handlers.js.map +1 -0
- package/dist/handlers/auto-handlers.d.ts +5 -0
- package/dist/handlers/auto-handlers.d.ts.map +1 -0
- package/dist/handlers/auto-handlers.js +132 -0
- package/dist/handlers/auto-handlers.js.map +1 -0
- package/dist/handlers/config-handlers.d.ts +8 -0
- package/dist/handlers/config-handlers.d.ts.map +1 -0
- package/dist/handlers/config-handlers.js +140 -0
- package/dist/handlers/config-handlers.js.map +1 -0
- package/dist/handlers/data-handlers.d.ts +8 -0
- package/dist/handlers/data-handlers.d.ts.map +1 -0
- package/dist/handlers/data-handlers.js +135 -0
- package/dist/handlers/data-handlers.js.map +1 -0
- package/dist/handlers/dev-handlers.d.ts +6 -0
- package/dist/handlers/dev-handlers.d.ts.map +1 -0
- package/dist/handlers/dev-handlers.js +322 -0
- package/dist/handlers/dev-handlers.js.map +1 -0
- package/dist/handlers/doc-handlers.d.ts +7 -0
- package/dist/handlers/doc-handlers.d.ts.map +1 -0
- package/dist/handlers/doc-handlers.js +133 -0
- package/dist/handlers/doc-handlers.js.map +1 -0
- package/dist/handlers/plugin-handlers.d.ts +6 -0
- package/dist/handlers/plugin-handlers.d.ts.map +1 -0
- package/dist/handlers/plugin-handlers.js +149 -0
- package/dist/handlers/plugin-handlers.js.map +1 -0
- package/dist/handlers/teach-handlers.d.ts +4 -0
- package/dist/handlers/teach-handlers.d.ts.map +1 -0
- package/dist/handlers/teach-handlers.js +30 -0
- package/dist/handlers/teach-handlers.js.map +1 -0
- package/dist/handlers/web-handlers.d.ts +4 -0
- package/dist/handlers/web-handlers.d.ts.map +1 -0
- package/dist/handlers/web-handlers.js +90 -0
- package/dist/handlers/web-handlers.js.map +1 -0
- package/dist/help-text.d.ts +2 -0
- package/dist/help-text.d.ts.map +1 -0
- package/dist/help-text.js +439 -0
- package/dist/help-text.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/option-validation.d.ts +5 -0
- package/dist/option-validation.d.ts.map +1 -0
- package/dist/option-validation.js +111 -0
- package/dist/option-validation.js.map +1 -0
- package/dist/output.d.ts +5 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +11 -0
- package/dist/output.js.map +1 -0
- package/dist/root-doctor.d.ts +22 -0
- package/dist/root-doctor.d.ts.map +1 -0
- package/dist/root-doctor.js +231 -0
- package/dist/root-doctor.js.map +1 -0
- package/dist/root-help.d.ts +8 -0
- package/dist/root-help.d.ts.map +1 -0
- package/dist/root-help.js +130 -0
- package/dist/root-help.js.map +1 -0
- package/dist/root-init.d.ts +4 -0
- package/dist/root-init.d.ts.map +1 -0
- package/dist/root-init.js +87 -0
- package/dist/root-init.js.map +1 -0
- package/dist/run.d.ts +8 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +152 -0
- package/dist/run.js.map +1 -0
- package/dist/system-command.d.ts +3 -0
- package/dist/system-command.d.ts.map +1 -0
- package/dist/system-command.js +27 -0
- package/dist/system-command.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +14 -0
- package/dist/version.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { validateAIProviderConfig } from '@zaowu-labs/ai';
|
|
3
|
+
import { findConfigFile, loadResolvedConfig } from '@zaowu-labs/config';
|
|
4
|
+
import { createOperationPlan, isZaoWuError } from '@zaowu-labs/core';
|
|
5
|
+
import { COMMAND_CONTRACTS } from './command-contracts.js';
|
|
6
|
+
import { runSystemCommand } from './system-command.js';
|
|
7
|
+
const MINIMUM_NODE_VERSION = '20.19.0';
|
|
8
|
+
const MINIMUM_PNPM_VERSION = '10.34.1';
|
|
9
|
+
const MAXIMUM_PNPM_MAJOR = 11;
|
|
10
|
+
const ADDITIONAL_ROOT_SURFACES_IN_CAPABILITY_MATRIX = 3;
|
|
11
|
+
const PNPM_MISSING_FIX = 'Run `corepack enable` or install pnpm.';
|
|
12
|
+
const PNPM_VERSION_FIX = `Use pnpm ${MINIMUM_PNPM_VERSION} through Corepack: ` +
|
|
13
|
+
`corepack prepare pnpm@${MINIMUM_PNPM_VERSION} --activate.`;
|
|
14
|
+
const satisfiesMinimumVersion = (version, minimum) => {
|
|
15
|
+
const parse = (value) => value
|
|
16
|
+
.replace(/^v/, '')
|
|
17
|
+
.split('.')
|
|
18
|
+
.map((part) => Number.parseInt(part, 10) || 0);
|
|
19
|
+
const actual = parse(version);
|
|
20
|
+
const required = parse(minimum);
|
|
21
|
+
const length = Math.max(actual.length, required.length);
|
|
22
|
+
for (let index = 0; index < length; index += 1) {
|
|
23
|
+
const actualPart = actual[index] ?? 0;
|
|
24
|
+
const requiredPart = required[index] ?? 0;
|
|
25
|
+
if (actualPart > requiredPart) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if (actualPart < requiredPart) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
};
|
|
34
|
+
const extractVersion = (output) => {
|
|
35
|
+
const match = output.match(/v?\d+(?:\.\d+)+(?:[-.\w]*)?/);
|
|
36
|
+
return match?.[0];
|
|
37
|
+
};
|
|
38
|
+
const getMajorVersion = (version) => Number.parseInt(version.replace(/^v/, '').split('.')[0] ?? '', 10) || 0;
|
|
39
|
+
const satisfiesPnpmVersion = (version) => Boolean(version &&
|
|
40
|
+
satisfiesMinimumVersion(version, MINIMUM_PNPM_VERSION) &&
|
|
41
|
+
getMajorVersion(version) < MAXIMUM_PNPM_MAJOR);
|
|
42
|
+
const checkCommand = (name, command, args, fix, commandRunner, details) => {
|
|
43
|
+
try {
|
|
44
|
+
const output = commandRunner(command, args);
|
|
45
|
+
return {
|
|
46
|
+
name,
|
|
47
|
+
status: 'ok',
|
|
48
|
+
version: extractVersion(output),
|
|
49
|
+
details,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {
|
|
54
|
+
name,
|
|
55
|
+
status: 'missing',
|
|
56
|
+
fix,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const checkPnpmCommand = (command, args, commandRunner, details) => {
|
|
61
|
+
try {
|
|
62
|
+
const output = commandRunner(command, args);
|
|
63
|
+
const version = extractVersion(output);
|
|
64
|
+
const isSupported = satisfiesPnpmVersion(version);
|
|
65
|
+
return {
|
|
66
|
+
name: 'pnpm',
|
|
67
|
+
status: isSupported ? 'ok' : 'warning',
|
|
68
|
+
version,
|
|
69
|
+
details,
|
|
70
|
+
fix: isSupported ? undefined : PNPM_VERSION_FIX,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return {
|
|
75
|
+
name: 'pnpm',
|
|
76
|
+
status: 'missing',
|
|
77
|
+
fix: PNPM_MISSING_FIX,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const checkPnpm = (commandRunner) => {
|
|
82
|
+
const pnpmCheck = checkPnpmCommand('pnpm', ['--version'], commandRunner);
|
|
83
|
+
if (pnpmCheck.status === 'ok') {
|
|
84
|
+
return pnpmCheck;
|
|
85
|
+
}
|
|
86
|
+
const corepackPnpmCheck = checkPnpmCommand('corepack', ['pnpm', '--version'], commandRunner, 'via corepack');
|
|
87
|
+
if (corepackPnpmCheck.status === 'ok') {
|
|
88
|
+
return corepackPnpmCheck;
|
|
89
|
+
}
|
|
90
|
+
if (pnpmCheck.status !== 'missing') {
|
|
91
|
+
return pnpmCheck;
|
|
92
|
+
}
|
|
93
|
+
return corepackPnpmCheck.status !== 'missing' ? corepackPnpmCheck : pnpmCheck;
|
|
94
|
+
};
|
|
95
|
+
const getConfigCheck = async (cwd) => {
|
|
96
|
+
const configFile = await findConfigFile({ cwd });
|
|
97
|
+
if (!configFile) {
|
|
98
|
+
return {
|
|
99
|
+
check: {
|
|
100
|
+
name: 'Config',
|
|
101
|
+
status: 'missing',
|
|
102
|
+
fix: 'Run `zw init` to preview config creation, then `zw init --yes` to create it.',
|
|
103
|
+
},
|
|
104
|
+
checkedInvalidConfig: false,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const resolvedConfig = await loadResolvedConfig(cwd);
|
|
109
|
+
return {
|
|
110
|
+
check: {
|
|
111
|
+
name: 'Config',
|
|
112
|
+
status: 'ok',
|
|
113
|
+
details: path.relative(cwd, resolvedConfig.filePath) || 'zw.yml',
|
|
114
|
+
},
|
|
115
|
+
resolvedConfig,
|
|
116
|
+
checkedInvalidConfig: false,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return {
|
|
121
|
+
check: {
|
|
122
|
+
name: 'Config',
|
|
123
|
+
status: 'warning',
|
|
124
|
+
details: path.relative(cwd, configFile) || 'zw.yml',
|
|
125
|
+
fix: isZaoWuError(error)
|
|
126
|
+
? error.fix
|
|
127
|
+
: 'Run `zw config validate` to inspect and repair the config file.',
|
|
128
|
+
},
|
|
129
|
+
checkedInvalidConfig: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const checkAIProvider = (resolvedConfig, checkedInvalidConfig) => {
|
|
134
|
+
if (!resolvedConfig && checkedInvalidConfig) {
|
|
135
|
+
return {
|
|
136
|
+
name: 'AI provider',
|
|
137
|
+
status: 'warning',
|
|
138
|
+
details: 'not checked because config is invalid',
|
|
139
|
+
fix: 'Run `zw config validate` before enabling provider-backed AI commands.',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const validation = validateAIProviderConfig(resolvedConfig?.config.ai.provider);
|
|
144
|
+
const provider = validation.provider;
|
|
145
|
+
const location = provider.network ? 'network' : 'local';
|
|
146
|
+
const configStatus = provider.configured ? 'configured' : 'missing config';
|
|
147
|
+
return {
|
|
148
|
+
name: 'AI provider',
|
|
149
|
+
status: validation.status,
|
|
150
|
+
details: `${provider.id} (${location}, ${configStatus})`,
|
|
151
|
+
fix: validation.warnings[0],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return {
|
|
156
|
+
name: 'AI provider',
|
|
157
|
+
status: 'warning',
|
|
158
|
+
details: String(resolvedConfig?.config.ai.provider ?? 'default'),
|
|
159
|
+
fix: isZaoWuError(error)
|
|
160
|
+
? error.fix
|
|
161
|
+
: 'Run `zw ai providers --json` to inspect supported AI providers.',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const checkCommandMatrix = () => ({
|
|
166
|
+
name: 'Command matrix',
|
|
167
|
+
status: 'ok',
|
|
168
|
+
details: `${COMMAND_CONTRACTS.length + ADDITIONAL_ROOT_SURFACES_IN_CAPABILITY_MATRIX} command surface(s) tracked`,
|
|
169
|
+
});
|
|
170
|
+
export const buildDoctorResult = async (options = {}) => {
|
|
171
|
+
const cwd = options.cwd ?? process.cwd();
|
|
172
|
+
const nodeVersion = options.nodeVersion ?? process.versions.node;
|
|
173
|
+
const commandRunner = options.commandRunner ?? runSystemCommand;
|
|
174
|
+
const checks = [];
|
|
175
|
+
checks.push({
|
|
176
|
+
name: 'Node.js',
|
|
177
|
+
status: satisfiesMinimumVersion(nodeVersion, MINIMUM_NODE_VERSION) ? 'ok' : 'warning',
|
|
178
|
+
version: `v${nodeVersion.replace(/^v/, '')}`,
|
|
179
|
+
fix: satisfiesMinimumVersion(nodeVersion, MINIMUM_NODE_VERSION)
|
|
180
|
+
? undefined
|
|
181
|
+
: `Install Node.js ${MINIMUM_NODE_VERSION} or newer.`,
|
|
182
|
+
});
|
|
183
|
+
checks.push(checkCommand('Git', 'git', ['--version'], 'Install Git and make sure it is on PATH.', commandRunner));
|
|
184
|
+
checks.push(checkPnpm(commandRunner));
|
|
185
|
+
const config = await getConfigCheck(cwd);
|
|
186
|
+
checks.push(config.check);
|
|
187
|
+
checks.push(checkAIProvider(config.resolvedConfig, config.checkedInvalidConfig ?? false));
|
|
188
|
+
checks.push(checkCommandMatrix());
|
|
189
|
+
const nextSteps = checks
|
|
190
|
+
.filter((check) => check.status !== 'ok' && check.fix)
|
|
191
|
+
.map((check) => check.fix);
|
|
192
|
+
return {
|
|
193
|
+
schemaVersion: 1,
|
|
194
|
+
status: checks.some((check) => check.status !== 'ok') ? 'warning' : 'ok',
|
|
195
|
+
checks,
|
|
196
|
+
nextSteps,
|
|
197
|
+
operationPlan: createOperationPlan({
|
|
198
|
+
risk: 'low',
|
|
199
|
+
reads: [
|
|
200
|
+
'nearest ZaoWu config path',
|
|
201
|
+
'resolved ZaoWu config',
|
|
202
|
+
'AI provider environment variable presence',
|
|
203
|
+
'command contract registry',
|
|
204
|
+
],
|
|
205
|
+
executes: ['git --version', 'pnpm --version', 'corepack pnpm --version'],
|
|
206
|
+
notes: ['Doctor runs fixed local diagnostics and does not write files.'],
|
|
207
|
+
}),
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
export const formatDoctorHuman = (doctor) => {
|
|
211
|
+
const lines = [
|
|
212
|
+
'ZaoWu Doctor',
|
|
213
|
+
'',
|
|
214
|
+
`Status: ${doctor.status === 'ok' ? 'OK' : 'Warning'}`,
|
|
215
|
+
'',
|
|
216
|
+
'Checks:',
|
|
217
|
+
];
|
|
218
|
+
for (const check of doctor.checks) {
|
|
219
|
+
const parts = [check.status, check.version, check.details].filter(Boolean);
|
|
220
|
+
const suffix = parts.join(' ');
|
|
221
|
+
lines.push(`- ${check.name}: ${suffix}`);
|
|
222
|
+
}
|
|
223
|
+
if (doctor.nextSteps.length > 0) {
|
|
224
|
+
lines.push('', 'Next steps:');
|
|
225
|
+
doctor.nextSteps.forEach((step, index) => {
|
|
226
|
+
lines.push(`${index + 1}. ${step}`);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return lines.join('\n');
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=root-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-doctor.js","sourceRoot":"","sources":["../src/root-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DomainDefinition, OperationPlan } from '@zaowu-labs/core';
|
|
2
|
+
export declare const formatHelp: () => string;
|
|
3
|
+
export declare const formatDomainHelp: (domain: DomainDefinition) => string;
|
|
4
|
+
export declare const formatActionHelp: (domain: DomainDefinition, action: string) => string;
|
|
5
|
+
export declare const formatInitHelp: () => string;
|
|
6
|
+
export declare const formatDoctorHelp: () => string;
|
|
7
|
+
export declare const formatInlineOperationPlan: (plan: OperationPlan) => string;
|
|
8
|
+
//# sourceMappingURL=root-help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-help.d.ts","sourceRoot":"","sources":["../src/root-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOxE,eAAO,MAAM,UAAU,QAAO,MAoC7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,gBAAgB,KAAG,MAoC3D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,gBAAgB,EAAE,QAAQ,MAAM,KAAG,MAS1B,CAAC;AAEnD,eAAO,MAAM,cAAc,QAAO,MAqBjB,CAAC;AAElB,eAAO,MAAM,gBAAgB,QAAO,MAcjB,CAAC;AAEpB,eAAO,MAAM,yBAAyB,GAAI,MAAM,aAAa,KAAG,MAYlD,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { DOMAIN_DEFINITIONS } from './domains.js';
|
|
2
|
+
import { ACTION_HELP } from './help-text.js';
|
|
3
|
+
import { formatRows } from './output.js';
|
|
4
|
+
const toTitleCase = (value) => `${value.charAt(0).toUpperCase()}${value.slice(1)}`;
|
|
5
|
+
export const formatHelp = () => {
|
|
6
|
+
const commands = formatRows([
|
|
7
|
+
['zw init', 'Preview or create a ZaoWu config file'],
|
|
8
|
+
['zw doctor', 'Check local environment health'],
|
|
9
|
+
['zw help', 'Show this help'],
|
|
10
|
+
]);
|
|
11
|
+
const domains = formatRows(DOMAIN_DEFINITIONS.map((domain) => [`zw ${domain.name}`, domain.summary]));
|
|
12
|
+
return `ZaoWu / 造物
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
zw <command> [options]
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
${commands}
|
|
19
|
+
|
|
20
|
+
Domains:
|
|
21
|
+
${domains}
|
|
22
|
+
|
|
23
|
+
Global options:
|
|
24
|
+
--help Show help
|
|
25
|
+
--version Show version
|
|
26
|
+
--json Output machine-readable JSON
|
|
27
|
+
--dry-run Preview without applying changes
|
|
28
|
+
--yes Apply a safe confirmed action
|
|
29
|
+
--plan-fingerprint <hash>
|
|
30
|
+
Require confirmed actions to match a previewed plan
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
zw doctor
|
|
34
|
+
zw doctor --json
|
|
35
|
+
zw init --dry-run
|
|
36
|
+
zw init --yes
|
|
37
|
+
zw dev --help`;
|
|
38
|
+
};
|
|
39
|
+
export const formatDomainHelp = (domain) => {
|
|
40
|
+
const commands = formatRows(domain.commands.map((command) => {
|
|
41
|
+
const flags = [command.status, command.sensitive ? 'sensitive' : undefined]
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join(', ');
|
|
44
|
+
return [`zw ${domain.name} ${command.name}`, `${flags} - ${command.summary}`];
|
|
45
|
+
}));
|
|
46
|
+
const capabilities = domain.capabilities
|
|
47
|
+
? Object.entries(domain.capabilities)
|
|
48
|
+
.filter(([, enabled]) => enabled)
|
|
49
|
+
.map(([name]) => `- ${name}`)
|
|
50
|
+
.join('\n') || '- none'
|
|
51
|
+
: '- none';
|
|
52
|
+
return `ZaoWu ${toTitleCase(domain.name)} Domain
|
|
53
|
+
|
|
54
|
+
Usage:
|
|
55
|
+
zw ${domain.name} <action> [target] [options]
|
|
56
|
+
|
|
57
|
+
Description:
|
|
58
|
+
${domain.summary}
|
|
59
|
+
|
|
60
|
+
Commands:
|
|
61
|
+
${commands}
|
|
62
|
+
|
|
63
|
+
Capabilities:
|
|
64
|
+
${capabilities}
|
|
65
|
+
|
|
66
|
+
Global options:
|
|
67
|
+
--help Show help
|
|
68
|
+
--json Output machine-readable JSON
|
|
69
|
+
--dry-run Preview without applying changes
|
|
70
|
+
--yes Apply a safe confirmed action`;
|
|
71
|
+
};
|
|
72
|
+
export const formatActionHelp = (domain, action) => ACTION_HELP[domain.name]?.[action] ??
|
|
73
|
+
`ZaoWu ${toTitleCase(domain.name)} ${toTitleCase(action)}
|
|
74
|
+
|
|
75
|
+
Usage:
|
|
76
|
+
zw ${domain.name} ${action} [target] [options]
|
|
77
|
+
|
|
78
|
+
Options:
|
|
79
|
+
--help Show help
|
|
80
|
+
--json Output machine-readable JSON`;
|
|
81
|
+
export const formatInitHelp = () => `ZaoWu Init
|
|
82
|
+
|
|
83
|
+
Usage:
|
|
84
|
+
zw init [options]
|
|
85
|
+
|
|
86
|
+
Description:
|
|
87
|
+
Preview or create a starter ZaoWu config file.
|
|
88
|
+
|
|
89
|
+
Options:
|
|
90
|
+
--dry-run Preview without writing files
|
|
91
|
+
--yes Create zw.yml
|
|
92
|
+
--plan-fingerprint <hash>
|
|
93
|
+
Require confirmed creation to match a preview
|
|
94
|
+
--json Output machine-readable JSON
|
|
95
|
+
--help Show this help
|
|
96
|
+
|
|
97
|
+
Examples:
|
|
98
|
+
zw init
|
|
99
|
+
zw init --dry-run
|
|
100
|
+
zw init --yes
|
|
101
|
+
zw init --yes --plan-fingerprint <hash>
|
|
102
|
+
zw init --json`;
|
|
103
|
+
export const formatDoctorHelp = () => `ZaoWu Doctor
|
|
104
|
+
|
|
105
|
+
Usage:
|
|
106
|
+
zw doctor [options]
|
|
107
|
+
|
|
108
|
+
Description:
|
|
109
|
+
Check local environment health.
|
|
110
|
+
|
|
111
|
+
Options:
|
|
112
|
+
--json Output machine-readable JSON
|
|
113
|
+
--help Show this help
|
|
114
|
+
|
|
115
|
+
Examples:
|
|
116
|
+
zw doctor
|
|
117
|
+
zw doctor --json`;
|
|
118
|
+
export const formatInlineOperationPlan = (plan) => [
|
|
119
|
+
'Operation plan:',
|
|
120
|
+
`Risk: ${plan.risk}`,
|
|
121
|
+
`Confirmation required: ${plan.confirmationRequired ? 'yes' : 'no'}`,
|
|
122
|
+
`Fingerprint: ${plan.fingerprint}`,
|
|
123
|
+
...(plan.confirmationRequired
|
|
124
|
+
? [`Base confirmation flags: --yes --plan-fingerprint ${plan.fingerprint}`]
|
|
125
|
+
: []),
|
|
126
|
+
`Subjects: ${plan.subjects.length > 0 ? plan.subjects.join(', ') : 'none'}`,
|
|
127
|
+
`Writes: ${plan.writes.length > 0 ? plan.writes.join(', ') : 'none'}`,
|
|
128
|
+
`Deletes: ${plan.deletes.length > 0 ? plan.deletes.join(', ') : 'none'}`,
|
|
129
|
+
].join('\n');
|
|
130
|
+
//# sourceMappingURL=root-help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-help.js","sourceRoot":"","sources":["../src/root-help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CliExecutionOptions, CliResult } from './types.js';
|
|
2
|
+
export declare const DEFAULT_CONFIG_FILE_NAME = "zw.yml";
|
|
3
|
+
export declare const handleInit: (args: readonly string[], options: CliExecutionOptions, json: boolean) => Promise<CliResult>;
|
|
4
|
+
//# sourceMappingURL=root-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-init.d.ts","sourceRoot":"","sources":["../src/root-init.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,wBAAwB,WAAW,CAAC;AA2BjD,eAAO,MAAM,UAAU,GACrB,MAAM,SAAS,MAAM,EAAE,EACvB,SAAS,mBAAmB,EAC5B,MAAM,OAAO,KACZ,OAAO,CAAC,SAAS,CA2EnB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getDefaultConfigContent } from '@zaowu-labs/config';
|
|
5
|
+
import { assertOperationPlanFingerprint, createContentOperationSubjects, createOperationPlan, ZaoWuError, } from '@zaowu-labs/core';
|
|
6
|
+
import { getValue, parseArgs } from './args.js';
|
|
7
|
+
import { createResult } from './output.js';
|
|
8
|
+
import { formatInlineOperationPlan } from './root-help.js';
|
|
9
|
+
export const DEFAULT_CONFIG_FILE_NAME = 'zw.yml';
|
|
10
|
+
const hasFlag = (args, flag) => args.includes(flag);
|
|
11
|
+
const formatInitPreview = (configPath, content, operationPlan) => `ZaoWu Init
|
|
12
|
+
|
|
13
|
+
No files were written.
|
|
14
|
+
|
|
15
|
+
Would create:
|
|
16
|
+
${path.basename(configPath)}
|
|
17
|
+
|
|
18
|
+
${formatInlineOperationPlan(operationPlan)}
|
|
19
|
+
|
|
20
|
+
Preview:
|
|
21
|
+
${content
|
|
22
|
+
.trimEnd()
|
|
23
|
+
.split('\n')
|
|
24
|
+
.map((line) => (line ? ` ${line}` : ''))
|
|
25
|
+
.join('\n')}
|
|
26
|
+
|
|
27
|
+
To create exactly this file, run:
|
|
28
|
+
zw init --yes --plan-fingerprint ${operationPlan.fingerprint}`;
|
|
29
|
+
export const handleInit = async (args, options, json) => {
|
|
30
|
+
const cwd = options.cwd ?? process.cwd();
|
|
31
|
+
const dryRun = hasFlag(args, '--dry-run');
|
|
32
|
+
const yes = hasFlag(args, '--yes');
|
|
33
|
+
const configPath = path.join(cwd, DEFAULT_CONFIG_FILE_NAME);
|
|
34
|
+
const content = getDefaultConfigContent(configPath);
|
|
35
|
+
const operationPlan = createOperationPlan({
|
|
36
|
+
risk: 'medium',
|
|
37
|
+
confirmationRequired: !yes || dryRun,
|
|
38
|
+
subjects: [`init:${configPath}`, ...createContentOperationSubjects(content)],
|
|
39
|
+
writes: [configPath],
|
|
40
|
+
notes: ['Init creates a config file only when --yes is provided and --dry-run is absent.'],
|
|
41
|
+
});
|
|
42
|
+
if (existsSync(configPath)) {
|
|
43
|
+
throw new ZaoWuError({
|
|
44
|
+
code: 'CONFIG_ALREADY_EXISTS',
|
|
45
|
+
message: 'ZaoWu config already exists.',
|
|
46
|
+
why: `${DEFAULT_CONFIG_FILE_NAME} already exists in the current directory.`,
|
|
47
|
+
fix: 'Open the existing config file or run `zw doctor` to check it.',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (dryRun || !yes) {
|
|
51
|
+
const payload = {
|
|
52
|
+
schemaVersion: 1,
|
|
53
|
+
status: 'ok',
|
|
54
|
+
dryRun: true,
|
|
55
|
+
wouldCreate: configPath,
|
|
56
|
+
content,
|
|
57
|
+
operationPlan,
|
|
58
|
+
};
|
|
59
|
+
return createResult(0, json ? JSON.stringify(payload) : formatInitPreview(configPath, content, operationPlan));
|
|
60
|
+
}
|
|
61
|
+
assertOperationPlanFingerprint(getValue(parseArgs(args), '--plan-fingerprint'), operationPlan, yes && !dryRun, ZaoWuError);
|
|
62
|
+
try {
|
|
63
|
+
await writeFile(configPath, content, { encoding: 'utf8', flag: 'wx' });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new ZaoWuError({
|
|
67
|
+
code: 'CONFIG_WRITE_FAILED',
|
|
68
|
+
message: 'Could not write ZaoWu config.',
|
|
69
|
+
why: `ZaoWu tried to create ${DEFAULT_CONFIG_FILE_NAME} in the current directory, ` +
|
|
70
|
+
'but the file system rejected the write.',
|
|
71
|
+
fix: 'Check directory permissions and make sure the config file does not already exist.',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const payload = {
|
|
75
|
+
schemaVersion: 1,
|
|
76
|
+
status: 'ok',
|
|
77
|
+
created: configPath,
|
|
78
|
+
operationPlan: {
|
|
79
|
+
...operationPlan,
|
|
80
|
+
confirmationRequired: false,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
return createResult(0, json
|
|
84
|
+
? JSON.stringify(payload)
|
|
85
|
+
: `ZaoWu Init\n\nCreated:\n ${path.basename(configPath)}\n\nNext step:\n zw doctor`);
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=root-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-init.js","sourceRoot":"","sources":["../src/root-init.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DOMAIN_DEFINITIONS } from './domains.js';
|
|
2
|
+
import { DEFAULT_CONFIG_FILE_NAME } from './root-init.js';
|
|
3
|
+
import type { CliExecutionOptions, CliResult } from './types.js';
|
|
4
|
+
export declare const ZAOWU_CLI_VERSION: string;
|
|
5
|
+
export { DEFAULT_CONFIG_FILE_NAME, DOMAIN_DEFINITIONS };
|
|
6
|
+
export declare const executeCli: (args: readonly string[], options?: CliExecutionOptions) => Promise<CliResult>;
|
|
7
|
+
export declare const runCli: (args: readonly string[]) => Promise<number>;
|
|
8
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAc,MAAM,cAAc,CAAC;AAe9D,OAAO,EAAE,wBAAwB,EAAc,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGjE,eAAO,MAAM,iBAAiB,QAAkB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,CAAC;AAyBxD,eAAO,MAAM,UAAU,GACrB,MAAM,SAAS,MAAM,EAAE,EACvB,UAAS,mBAAwB,KAChC,OAAO,CAAC,SAAS,CAyInB,CAAC;AAEF,eAAO,MAAM,MAAM,GAAU,MAAM,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAgBpE,CAAC"}
|
package/dist/run.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { findDomainCommand, isZaoWuError, ZaoWuError } from '@zaowu-labs/core';
|
|
2
|
+
import { getValue, hasFlag, parseArgs } from './args.js';
|
|
3
|
+
import { getDomainActionHandler } from './domain-handlers.js';
|
|
4
|
+
import { DOMAIN_DEFINITIONS, findDomain } from './domains.js';
|
|
5
|
+
import { assertNoMissingOptionValues, assertSupportedOptions, assertValidOptionValues, } from './option-validation.js';
|
|
6
|
+
import { createResult } from './output.js';
|
|
7
|
+
import { buildDoctorResult, formatDoctorHuman } from './root-doctor.js';
|
|
8
|
+
import { formatActionHelp, formatDoctorHelp, formatDomainHelp, formatHelp, formatInitHelp, } from './root-help.js';
|
|
9
|
+
import { DEFAULT_CONFIG_FILE_NAME, handleInit } from './root-init.js';
|
|
10
|
+
import { runSystemCommand } from './system-command.js';
|
|
11
|
+
import { getCliVersion } from './version.js';
|
|
12
|
+
export const ZAOWU_CLI_VERSION = getCliVersion();
|
|
13
|
+
export { DEFAULT_CONFIG_FILE_NAME, DOMAIN_DEFINITIONS };
|
|
14
|
+
const handleError = (error, json) => {
|
|
15
|
+
const zaowuError = isZaoWuError(error)
|
|
16
|
+
? error
|
|
17
|
+
: new ZaoWuError({
|
|
18
|
+
code: 'INTERNAL_ERROR',
|
|
19
|
+
message: 'Unexpected internal error.',
|
|
20
|
+
why: 'ZaoWu hit an error that is not yet handled as a user-facing case.',
|
|
21
|
+
fix: 'Report this issue at https://github.com/zaowu-labs/zaowu/issues with the command you ran.',
|
|
22
|
+
});
|
|
23
|
+
return createResult(zaowuError.exitCode, '', json ? zaowuError.formatJSON() : zaowuError.formatHuman());
|
|
24
|
+
};
|
|
25
|
+
const createHelpResult = (help, json, details = {}) => createResult(0, json ? JSON.stringify({ schemaVersion: 1, status: 'ok', ...details, help }) : help);
|
|
26
|
+
export const executeCli = async (args, options = {}) => {
|
|
27
|
+
const parsed = parseArgs(args);
|
|
28
|
+
const json = hasFlag(parsed, '--json');
|
|
29
|
+
const wantsHelp = hasFlag(parsed, '--help');
|
|
30
|
+
const wantsVersion = hasFlag(parsed, '--version');
|
|
31
|
+
const commandArgs = parsed.positionals;
|
|
32
|
+
const command = commandArgs[0];
|
|
33
|
+
const domain = command ? findDomain(command) : undefined;
|
|
34
|
+
const cwd = options.cwd ?? process.cwd();
|
|
35
|
+
const commandRunner = options.commandRunner ?? runSystemCommand;
|
|
36
|
+
try {
|
|
37
|
+
if (wantsVersion || command === 'version') {
|
|
38
|
+
return createResult(0, json
|
|
39
|
+
? JSON.stringify({ schemaVersion: 1, status: 'ok', version: ZAOWU_CLI_VERSION })
|
|
40
|
+
: ZAOWU_CLI_VERSION);
|
|
41
|
+
}
|
|
42
|
+
if (!command || command === 'help') {
|
|
43
|
+
return createHelpResult(formatHelp(), json);
|
|
44
|
+
}
|
|
45
|
+
if (wantsHelp) {
|
|
46
|
+
if (command === 'init') {
|
|
47
|
+
return createHelpResult(formatInitHelp(), json);
|
|
48
|
+
}
|
|
49
|
+
if (command === 'doctor') {
|
|
50
|
+
return createHelpResult(formatDoctorHelp(), json);
|
|
51
|
+
}
|
|
52
|
+
if (domain) {
|
|
53
|
+
const action = commandArgs[1];
|
|
54
|
+
if (action) {
|
|
55
|
+
const domainCommand = findDomainCommand(domain, action);
|
|
56
|
+
if (!domainCommand) {
|
|
57
|
+
throw new ZaoWuError({
|
|
58
|
+
code: 'UNKNOWN_DOMAIN_ACTION',
|
|
59
|
+
message: `Unknown command: zw ${domain.name} ${action}.`,
|
|
60
|
+
why: `ZaoWu has the \`${domain.name}\` domain, but it does not have an action named \`${action}\`.`,
|
|
61
|
+
fix: `Run \`zw ${domain.name} --help\` to see commands for this domain.`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return createHelpResult(formatActionHelp(domain, action), json, {
|
|
65
|
+
domain: domain.name,
|
|
66
|
+
action,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return createHelpResult(formatDomainHelp(domain), json, { domain });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
assertNoMissingOptionValues(parsed.missingValues);
|
|
73
|
+
assertSupportedOptions(parsed, commandArgs);
|
|
74
|
+
assertValidOptionValues(parsed, commandArgs);
|
|
75
|
+
if (command === 'doctor') {
|
|
76
|
+
const doctor = await buildDoctorResult(options);
|
|
77
|
+
return createResult(0, json ? JSON.stringify(doctor) : formatDoctorHuman(doctor));
|
|
78
|
+
}
|
|
79
|
+
if (command === 'init') {
|
|
80
|
+
return await handleInit(args, options, json);
|
|
81
|
+
}
|
|
82
|
+
if (domain) {
|
|
83
|
+
const action = commandArgs[1];
|
|
84
|
+
if (!action) {
|
|
85
|
+
return createHelpResult(formatDomainHelp(domain), json, { domain });
|
|
86
|
+
}
|
|
87
|
+
const domainCommand = findDomainCommand(domain, action);
|
|
88
|
+
if (!domainCommand) {
|
|
89
|
+
throw new ZaoWuError({
|
|
90
|
+
code: 'UNKNOWN_DOMAIN_ACTION',
|
|
91
|
+
message: `Unknown command: zw ${domain.name} ${action}.`,
|
|
92
|
+
why: `ZaoWu has the \`${domain.name}\` domain, but it does not have an action named \`${action}\`.`,
|
|
93
|
+
fix: `Run \`zw ${domain.name} --help\` to see commands for this domain.`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (domainCommand.status === 'planned') {
|
|
97
|
+
throw new ZaoWuError({
|
|
98
|
+
code: 'COMMAND_NOT_IMPLEMENTED',
|
|
99
|
+
message: `Command not implemented yet: zw ${domain.name} ${domainCommand.name}.`,
|
|
100
|
+
why: `The \`${domain.name}\` domain is scaffolded, but \`${domainCommand.name}\` ` +
|
|
101
|
+
'is still planned and has no implementation yet.',
|
|
102
|
+
fix: 'Create or update the related experience spec under `docs/experience/`, ' +
|
|
103
|
+
`then implement it inside the \`packages/${domain.name}\` package.`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const handler = getDomainActionHandler(domain.name, domainCommand.name);
|
|
107
|
+
if (handler) {
|
|
108
|
+
return await handler(commandArgs.slice(2), {
|
|
109
|
+
commandRunner,
|
|
110
|
+
cwd,
|
|
111
|
+
dryRun: hasFlag(parsed, '--dry-run'),
|
|
112
|
+
expectedPlanFingerprint: getValue(parsed, '--plan-fingerprint'),
|
|
113
|
+
json,
|
|
114
|
+
parsed,
|
|
115
|
+
yes: hasFlag(parsed, '--yes') && !hasFlag(parsed, '--dry-run'),
|
|
116
|
+
onChunk: options.onChunk,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
throw new ZaoWuError({
|
|
120
|
+
code: 'COMMAND_HANDLER_MISSING',
|
|
121
|
+
message: `Command handler missing: zw ${domain.name} ${domainCommand.name}.`,
|
|
122
|
+
why: `The \`${domain.name}\` domain marks \`${domainCommand.name}\` as available, ` +
|
|
123
|
+
'but the CLI has no handler wired for it.',
|
|
124
|
+
fix: 'Wire the command handler through `packages/cli` without moving domain logic into CLI.',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
throw new ZaoWuError({
|
|
128
|
+
code: 'UNKNOWN_COMMAND',
|
|
129
|
+
message: `Unknown command: ${command}.`,
|
|
130
|
+
why: `ZaoWu does not have a command named \`zw ${command}\`.`,
|
|
131
|
+
fix: 'Run `zw --help` to see available commands.',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return handleError(error, json);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
export const runCli = async (args) => {
|
|
139
|
+
const result = await executeCli(args, {
|
|
140
|
+
onChunk: (chunk) => {
|
|
141
|
+
process.stdout.write(chunk);
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
if (result.stdout) {
|
|
145
|
+
process.stdout.write(`${result.stdout}\n`);
|
|
146
|
+
}
|
|
147
|
+
if (result.stderr) {
|
|
148
|
+
process.stderr.write(`${result.stderr}\n`);
|
|
149
|
+
}
|
|
150
|
+
return result.exitCode;
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=run.js.map
|