@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,159 @@
|
|
|
1
|
+
import { askAI, listAIProviders, previewAIRequest, resolveAIProviderNetworkTarget, resolveAIModel, validateAIProviderConfig, } from '@zaowu-labs/ai';
|
|
2
|
+
import { assertOperationPlanFingerprint, createOperationPlan, formatConfirmCommand, formatOperationPlan, getValue, result, withOperationPlan, } from '../handler-utils.js';
|
|
3
|
+
export const handleAiAsk = async (args, context) => {
|
|
4
|
+
const prompt = args.join(' ').trim();
|
|
5
|
+
const filePath = getValue(context.parsed, '--file');
|
|
6
|
+
const requestedProvider = getValue(context.parsed, '--provider');
|
|
7
|
+
const requestedModel = getValue(context.parsed, '--model');
|
|
8
|
+
const providerValidation = validateAIProviderConfig(requestedProvider);
|
|
9
|
+
const provider = providerValidation.provider;
|
|
10
|
+
const resolvedModel = resolveAIModel(provider, { model: requestedModel });
|
|
11
|
+
const networkTarget = provider.network ? resolveAIProviderNetworkTarget(provider.id) : undefined;
|
|
12
|
+
const operationPlan = createOperationPlan({
|
|
13
|
+
risk: provider.network ? 'medium' : 'low',
|
|
14
|
+
confirmationRequired: provider.network && !context.yes,
|
|
15
|
+
subjects: [`ai:${provider.id}`, `model:${resolvedModel}`],
|
|
16
|
+
reads: filePath ? [filePath] : [],
|
|
17
|
+
network: networkTarget ? [networkTarget] : [],
|
|
18
|
+
secrets: provider.requiredEnv,
|
|
19
|
+
notes: [
|
|
20
|
+
provider.network
|
|
21
|
+
? 'Network AI providers preview by default and require --yes to send a request.'
|
|
22
|
+
: 'The local echo provider does not call external services.',
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
if (provider.network && !context.yes) {
|
|
26
|
+
const preview = await previewAIRequest({
|
|
27
|
+
prompt,
|
|
28
|
+
filePath,
|
|
29
|
+
provider: requestedProvider,
|
|
30
|
+
model: requestedModel,
|
|
31
|
+
});
|
|
32
|
+
const payload = {
|
|
33
|
+
schemaVersion: preview.schemaVersion,
|
|
34
|
+
status: 'preview',
|
|
35
|
+
provider,
|
|
36
|
+
model: preview.model,
|
|
37
|
+
endpoint: preview.endpoint,
|
|
38
|
+
input: preview.input,
|
|
39
|
+
output: null,
|
|
40
|
+
usage: null,
|
|
41
|
+
validation: preview.validation,
|
|
42
|
+
};
|
|
43
|
+
const confirmCommand = formatConfirmCommand([
|
|
44
|
+
'zw',
|
|
45
|
+
'ai',
|
|
46
|
+
'ask',
|
|
47
|
+
...args,
|
|
48
|
+
...(filePath ? ['--file', filePath] : []),
|
|
49
|
+
...(requestedProvider ? ['--provider', requestedProvider] : []),
|
|
50
|
+
...(requestedModel ? ['--model', requestedModel] : []),
|
|
51
|
+
'--yes',
|
|
52
|
+
'--plan-fingerprint',
|
|
53
|
+
operationPlan.fingerprint,
|
|
54
|
+
]);
|
|
55
|
+
const human = [
|
|
56
|
+
'ZaoWu AI Ask',
|
|
57
|
+
'',
|
|
58
|
+
'Status: preview',
|
|
59
|
+
`Provider: ${provider.id} (${provider.name})`,
|
|
60
|
+
`Model: ${preview.model}`,
|
|
61
|
+
`Endpoint: ${preview.endpoint ?? 'local'}`,
|
|
62
|
+
'',
|
|
63
|
+
formatOperationPlan(operationPlan),
|
|
64
|
+
'',
|
|
65
|
+
'No provider request was sent.',
|
|
66
|
+
'',
|
|
67
|
+
'To send exactly this AI request, run:',
|
|
68
|
+
` ${confirmCommand}`,
|
|
69
|
+
].join('\n');
|
|
70
|
+
return result(context, withOperationPlan(payload, operationPlan), human);
|
|
71
|
+
}
|
|
72
|
+
assertOperationPlanFingerprint(context, operationPlan);
|
|
73
|
+
if (context.onChunk && !context.json) {
|
|
74
|
+
const onChunk = context.onChunk;
|
|
75
|
+
const plannedEndpoint = operationPlan.network[0] ?? null;
|
|
76
|
+
const header = [
|
|
77
|
+
'ZaoWu AI Ask',
|
|
78
|
+
'',
|
|
79
|
+
`Provider: ${provider.id} (${provider.name})`,
|
|
80
|
+
`Model: ${resolvedModel}`,
|
|
81
|
+
`Endpoint: ${plannedEndpoint ?? 'local'}`,
|
|
82
|
+
'',
|
|
83
|
+
formatOperationPlan(operationPlan),
|
|
84
|
+
'',
|
|
85
|
+
'Output:',
|
|
86
|
+
'',
|
|
87
|
+
].join('\n');
|
|
88
|
+
onChunk(header);
|
|
89
|
+
let streamedAnyChunk = false;
|
|
90
|
+
const response = await askAI({
|
|
91
|
+
prompt,
|
|
92
|
+
filePath,
|
|
93
|
+
provider: requestedProvider,
|
|
94
|
+
model: requestedModel,
|
|
95
|
+
allowNetwork: context.yes,
|
|
96
|
+
onChunk: (chunk) => {
|
|
97
|
+
streamedAnyChunk = true;
|
|
98
|
+
onChunk(chunk);
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
// Providers that do not support streaming (echo, OpenAI, non-stream paths)
|
|
102
|
+
// never call onChunk. Print their full output so the human-readable
|
|
103
|
+
// command does not silently produce an empty result.
|
|
104
|
+
if (!streamedAnyChunk) {
|
|
105
|
+
onChunk(response.output);
|
|
106
|
+
}
|
|
107
|
+
onChunk('\n');
|
|
108
|
+
return result(context, withOperationPlan(response, operationPlan), '');
|
|
109
|
+
}
|
|
110
|
+
const response = await askAI({
|
|
111
|
+
prompt,
|
|
112
|
+
filePath,
|
|
113
|
+
provider: requestedProvider,
|
|
114
|
+
model: requestedModel,
|
|
115
|
+
allowNetwork: context.yes,
|
|
116
|
+
});
|
|
117
|
+
const payload = response;
|
|
118
|
+
const human = [
|
|
119
|
+
'ZaoWu AI Ask',
|
|
120
|
+
'',
|
|
121
|
+
`Provider: ${response.provider.id} (${response.provider.name})`,
|
|
122
|
+
`Model: ${response.model}`,
|
|
123
|
+
`Endpoint: ${response.endpoint ?? 'local'}`,
|
|
124
|
+
'',
|
|
125
|
+
formatOperationPlan(operationPlan),
|
|
126
|
+
'',
|
|
127
|
+
'Output:',
|
|
128
|
+
response.output,
|
|
129
|
+
].join('\n');
|
|
130
|
+
return result(context, withOperationPlan(payload, operationPlan), human);
|
|
131
|
+
};
|
|
132
|
+
export const handleAiProviders = async (_args, context) => {
|
|
133
|
+
const providers = listAIProviders();
|
|
134
|
+
const activeProvider = getValue(context.parsed, '--provider');
|
|
135
|
+
const validation = activeProvider ? validateAIProviderConfig(activeProvider) : undefined;
|
|
136
|
+
const payload = {
|
|
137
|
+
schemaVersion: 1,
|
|
138
|
+
status: validation?.status ?? 'ok',
|
|
139
|
+
providers,
|
|
140
|
+
validation,
|
|
141
|
+
};
|
|
142
|
+
const human = [
|
|
143
|
+
'ZaoWu AI Providers',
|
|
144
|
+
'',
|
|
145
|
+
...providers.map((provider) => {
|
|
146
|
+
const flags = [
|
|
147
|
+
provider.network ? 'network' : 'local',
|
|
148
|
+
provider.configured ? 'configured' : 'missing config',
|
|
149
|
+
];
|
|
150
|
+
return `- ${provider.id}: ${provider.name} (${flags.join(', ')})`;
|
|
151
|
+
}),
|
|
152
|
+
'',
|
|
153
|
+
validation?.warnings.length
|
|
154
|
+
? ['Warnings:', ...validation.warnings.map((warning) => `- ${warning}`)].join('\n')
|
|
155
|
+
: 'Warnings: none',
|
|
156
|
+
].join('\n');
|
|
157
|
+
return result(context, payload, human);
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=ai-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-handlers.js","sourceRoot":"","sources":["../../src/handlers/ai-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type DomainActionHandler } from '../handler-utils.js';
|
|
2
|
+
export declare const handleAutoValidate: DomainActionHandler;
|
|
3
|
+
export declare const handleAutoRun: DomainActionHandler;
|
|
4
|
+
export declare const handleAutoPlan: DomainActionHandler;
|
|
5
|
+
//# sourceMappingURL=auto-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/auto-handlers.ts"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,kBAAkB,EAAE,mBAuBhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,mBA4E3B,CAAC;AAkBF,eAAO,MAAM,cAAc,EAAE,mBAwB5B,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { planWorkflowFile, runWorkflowPlan, validateWorkflowFile } from '@zaowu-labs/auto';
|
|
2
|
+
import { assertOperationPlanFingerprint, createOperationPlan, formatOperationPlan, formatPolicy, formatSandbox, requireTarget, result, withOperationPlan, } from '../handler-utils.js';
|
|
3
|
+
export const handleAutoValidate = async (args, context) => {
|
|
4
|
+
const target = requireTarget(args, 'zw auto validate');
|
|
5
|
+
const validation = await validateWorkflowFile(target);
|
|
6
|
+
const human = [
|
|
7
|
+
'ZaoWu Auto Validate',
|
|
8
|
+
'',
|
|
9
|
+
`File: ${validation.filePath}`,
|
|
10
|
+
`Workflow: ${validation.workflow.name}`,
|
|
11
|
+
`Version: ${validation.workflow.version}`,
|
|
12
|
+
`Steps: ${validation.workflow.steps.length}`,
|
|
13
|
+
'',
|
|
14
|
+
'Policy:',
|
|
15
|
+
formatPolicy(validation.policy),
|
|
16
|
+
'',
|
|
17
|
+
'Sandbox:',
|
|
18
|
+
formatSandbox(validation.sandbox),
|
|
19
|
+
'',
|
|
20
|
+
validation.warnings.length > 0
|
|
21
|
+
? ['Warnings:', ...validation.warnings.map((warning) => `- ${warning}`)].join('\n')
|
|
22
|
+
: 'Warnings: none',
|
|
23
|
+
].join('\n');
|
|
24
|
+
return result(context, validation, human);
|
|
25
|
+
};
|
|
26
|
+
export const handleAutoRun = async (args, context) => {
|
|
27
|
+
const target = requireTarget(args, 'zw auto run');
|
|
28
|
+
const plan = await planWorkflowFile(target);
|
|
29
|
+
const readySteps = plan.steps
|
|
30
|
+
.filter((step) => (step.action === 'message' || step.action === 'shell' || step.action === 'writeFile') &&
|
|
31
|
+
!step.blocked)
|
|
32
|
+
.map((step) => step.name);
|
|
33
|
+
const writeTargets = plan.steps
|
|
34
|
+
.filter((step) => step.action === 'writeFile' && !step.blocked && step.targetPath)
|
|
35
|
+
.map((step) => step.targetPath);
|
|
36
|
+
const writeSubjects = plan.steps
|
|
37
|
+
.filter((step) => step.action === 'writeFile' && !step.blocked && step.contentSha256)
|
|
38
|
+
.flatMap((step) => [
|
|
39
|
+
`step:${step.name}`,
|
|
40
|
+
`content-sha256:${step.contentSha256}`,
|
|
41
|
+
`content-length:${step.contentLength ?? 0}`,
|
|
42
|
+
]);
|
|
43
|
+
const blockedSteps = plan.steps
|
|
44
|
+
.filter((step) => step.blocked)
|
|
45
|
+
.map((step) => `${step.name}: ${step.reason ?? 'blocked'}`);
|
|
46
|
+
const operationPlan = createOperationPlan({
|
|
47
|
+
risk: writeTargets.length > 0 ? 'high' : 'medium',
|
|
48
|
+
confirmationRequired: !context.yes,
|
|
49
|
+
subjects: [`workflow:${plan.filePath}`, ...writeSubjects],
|
|
50
|
+
reads: [plan.filePath],
|
|
51
|
+
writes: writeTargets,
|
|
52
|
+
notes: [
|
|
53
|
+
'Workflow runs preview by default.',
|
|
54
|
+
`Policy shell: ${plan.policy.shell}.`,
|
|
55
|
+
`Policy fileWrites: ${plan.policy.fileWrites}.`,
|
|
56
|
+
`Sandbox shellCommands: ${plan.sandbox.shellCommands}.`,
|
|
57
|
+
`Sandbox fileWrites: ${plan.sandbox.fileWrites}.`,
|
|
58
|
+
`Ready steps: ${readySteps.length > 0 ? readySteps.join(', ') : 'none'}.`,
|
|
59
|
+
`Blocked steps: ${blockedSteps.length > 0 ? blockedSteps.join('; ') : 'none'}.`,
|
|
60
|
+
'Shell steps remain blocked in this foundation version, including with --yes.',
|
|
61
|
+
'writeFile steps can only create new files inside the workflow directory.',
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
assertOperationPlanFingerprint(context, operationPlan);
|
|
65
|
+
const run = await runWorkflowPlan(plan, { yes: context.yes });
|
|
66
|
+
const human = [
|
|
67
|
+
'ZaoWu Auto Run',
|
|
68
|
+
'',
|
|
69
|
+
`Status: ${run.status}`,
|
|
70
|
+
`Workflow: ${run.workflow.name}`,
|
|
71
|
+
`Version: ${run.workflow.version}`,
|
|
72
|
+
'',
|
|
73
|
+
'Sandbox:',
|
|
74
|
+
formatSandbox(run.sandbox),
|
|
75
|
+
'',
|
|
76
|
+
formatOperationPlan(operationPlan),
|
|
77
|
+
'',
|
|
78
|
+
'Executed:',
|
|
79
|
+
...(run.executed.length > 0 ? run.executed.map((item) => `- ${item}`) : ['- none']),
|
|
80
|
+
'',
|
|
81
|
+
'Skipped:',
|
|
82
|
+
...(run.skipped.length > 0 ? run.skipped.map((item) => `- ${item}`) : ['- none']),
|
|
83
|
+
'',
|
|
84
|
+
'Receipts:',
|
|
85
|
+
...(run.receipts.length > 0
|
|
86
|
+
? run.receipts.map((receipt) => {
|
|
87
|
+
const target = receipt.targetPath ? `; target: ${receipt.targetPath}` : '';
|
|
88
|
+
const hash = receipt.contentSha256 ? `; sha256: ${receipt.contentSha256}` : '';
|
|
89
|
+
const length = receipt.contentLength !== undefined ? `; length: ${receipt.contentLength}` : '';
|
|
90
|
+
return `- ${receipt.index}. ${receipt.name} [${receipt.action}] ${receipt.status}: ${receipt.detail}${target}${hash}${length}`;
|
|
91
|
+
})
|
|
92
|
+
: ['- none']),
|
|
93
|
+
].join('\n');
|
|
94
|
+
return result(context, withOperationPlan(run, operationPlan), human);
|
|
95
|
+
};
|
|
96
|
+
const formatAutoPlanStep = (step) => {
|
|
97
|
+
const state = step.blocked ? 'blocked' : 'ready';
|
|
98
|
+
const confirmation = step.operationPlan.confirmationRequired ? 'yes' : 'no';
|
|
99
|
+
const details = [
|
|
100
|
+
step.targetPath ? `target: ${step.targetPath}` : undefined,
|
|
101
|
+
step.contentSha256 ? `sha256: ${step.contentSha256}` : undefined,
|
|
102
|
+
step.contentLength !== undefined ? `length: ${step.contentLength}` : undefined,
|
|
103
|
+
step.reason ? `reason: ${step.reason}` : undefined,
|
|
104
|
+
].filter((item) => Boolean(item));
|
|
105
|
+
const suffix = details.length > 0 ? `; ${details.join('; ')}` : '';
|
|
106
|
+
return `${step.index}. ${step.name} [${step.action}] ${state} (${step.policyDecision}; risk: ${step.operationPlan.risk}; confirmation: ${confirmation}${suffix}) - ${step.preview}`;
|
|
107
|
+
};
|
|
108
|
+
export const handleAutoPlan = async (args, context) => {
|
|
109
|
+
const target = requireTarget(args, 'zw auto plan');
|
|
110
|
+
const plan = await planWorkflowFile(target);
|
|
111
|
+
const human = [
|
|
112
|
+
'ZaoWu Auto Plan',
|
|
113
|
+
'',
|
|
114
|
+
`File: ${plan.filePath}`,
|
|
115
|
+
`Workflow: ${plan.workflow.name}`,
|
|
116
|
+
`Version: ${plan.workflow.version}`,
|
|
117
|
+
'',
|
|
118
|
+
'Policy:',
|
|
119
|
+
formatPolicy(plan.policy),
|
|
120
|
+
'',
|
|
121
|
+
'Sandbox:',
|
|
122
|
+
formatSandbox(plan.sandbox),
|
|
123
|
+
'',
|
|
124
|
+
...plan.steps.map((step) => formatAutoPlanStep(step)),
|
|
125
|
+
'',
|
|
126
|
+
plan.warnings.length > 0
|
|
127
|
+
? ['Warnings:', ...plan.warnings.map((warning) => `- ${warning}`)].join('\n')
|
|
128
|
+
: 'Warnings: none',
|
|
129
|
+
].join('\n');
|
|
130
|
+
return result(context, plan, human);
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=auto-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-handlers.js","sourceRoot":"","sources":["../../src/handlers/auto-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DomainActionHandler } from '../handler-utils.js';
|
|
2
|
+
export declare const handleConfigPath: DomainActionHandler;
|
|
3
|
+
export declare const handleConfigShow: DomainActionHandler;
|
|
4
|
+
export declare const handleConfigValidate: DomainActionHandler;
|
|
5
|
+
export declare const handleConfigGet: DomainActionHandler;
|
|
6
|
+
export declare const handleConfigSet: DomainActionHandler;
|
|
7
|
+
export declare const handleConfigMigrate: DomainActionHandler;
|
|
8
|
+
//# sourceMappingURL=config-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/config-handlers.ts"],"names":[],"mappings":"AAQA,OAAO,EAUL,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,gBAAgB,EAAE,mBAS9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,mBAoB9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,mBAclC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,mBAW7B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,mBA8C7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,mBAwCjC,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { findConfigPathOrThrow, getResolvedConfigValue, loadResolvedConfig, migrateResolvedConfig, setResolvedConfigValue, validateResolvedConfig, } from '@zaowu-labs/config';
|
|
2
|
+
import { assertOperationPlanFingerprint, createContentOperationSubjects, createOperationPlan, formatOperationPlan, hasFlag, requireSecondTarget, requireTarget, result, withOperationPlan, } from '../handler-utils.js';
|
|
3
|
+
export const handleConfigPath = async (_args, context) => {
|
|
4
|
+
const filePath = await findConfigPathOrThrow(context.cwd);
|
|
5
|
+
const payload = {
|
|
6
|
+
schemaVersion: 1,
|
|
7
|
+
status: 'ok',
|
|
8
|
+
path: filePath,
|
|
9
|
+
};
|
|
10
|
+
return result(context, payload, `ZaoWu Config Path\n\n${filePath}`);
|
|
11
|
+
};
|
|
12
|
+
export const handleConfigShow = async (_args, context) => {
|
|
13
|
+
const resolved = await loadResolvedConfig(context.cwd);
|
|
14
|
+
const payload = {
|
|
15
|
+
schemaVersion: resolved.schemaVersion,
|
|
16
|
+
status: 'ok',
|
|
17
|
+
filePath: resolved.filePath,
|
|
18
|
+
config: resolved.config,
|
|
19
|
+
};
|
|
20
|
+
const human = [
|
|
21
|
+
'ZaoWu Config',
|
|
22
|
+
'',
|
|
23
|
+
`File: ${resolved.filePath}`,
|
|
24
|
+
`Project: ${resolved.config.project.name}`,
|
|
25
|
+
`AI provider: ${resolved.config.ai.provider ?? 'none'}`,
|
|
26
|
+
`Default output: ${resolved.config.defaults.output}`,
|
|
27
|
+
`Workspace: ${resolved.config.paths.workspace}`,
|
|
28
|
+
`Cache: ${resolved.config.paths.cache}`,
|
|
29
|
+
].join('\n');
|
|
30
|
+
return result(context, payload, human);
|
|
31
|
+
};
|
|
32
|
+
export const handleConfigValidate = async (_args, context) => {
|
|
33
|
+
const validation = await validateResolvedConfig(context.cwd);
|
|
34
|
+
const human = [
|
|
35
|
+
'ZaoWu Config Validate',
|
|
36
|
+
'',
|
|
37
|
+
`Status: ${validation.status}`,
|
|
38
|
+
`File: ${validation.filePath}`,
|
|
39
|
+
'',
|
|
40
|
+
validation.warnings.length > 0
|
|
41
|
+
? ['Warnings:', ...validation.warnings.map((warning) => `- ${warning}`)].join('\n')
|
|
42
|
+
: 'Warnings: none',
|
|
43
|
+
].join('\n');
|
|
44
|
+
return result(context, validation, human);
|
|
45
|
+
};
|
|
46
|
+
export const handleConfigGet = async (args, context) => {
|
|
47
|
+
const key = requireTarget(args, 'zw config get');
|
|
48
|
+
const value = await getResolvedConfigValue(key, context.cwd);
|
|
49
|
+
const human = [
|
|
50
|
+
'ZaoWu Config Get',
|
|
51
|
+
'',
|
|
52
|
+
`File: ${value.filePath}`,
|
|
53
|
+
`${value.key}: ${value.value ?? 'null'}`,
|
|
54
|
+
].join('\n');
|
|
55
|
+
return result(context, value, human);
|
|
56
|
+
};
|
|
57
|
+
export const handleConfigSet = async (args, context) => {
|
|
58
|
+
const key = requireTarget(args, 'zw config set');
|
|
59
|
+
const value = requireSecondTarget(args, 'zw config set', 'value');
|
|
60
|
+
const isGlobal = hasFlag(context.parsed, '--global');
|
|
61
|
+
const preview = await setResolvedConfigValue(key, value, {
|
|
62
|
+
cwd: context.cwd,
|
|
63
|
+
global: isGlobal,
|
|
64
|
+
});
|
|
65
|
+
const operationPlan = createOperationPlan({
|
|
66
|
+
risk: 'medium',
|
|
67
|
+
confirmationRequired: !context.yes,
|
|
68
|
+
subjects: [
|
|
69
|
+
`config:${preview.key}`,
|
|
70
|
+
`old-value:${JSON.stringify(preview.oldValue)}`,
|
|
71
|
+
`new-value:${JSON.stringify(preview.newValue)}`,
|
|
72
|
+
...createContentOperationSubjects(preview.content),
|
|
73
|
+
],
|
|
74
|
+
reads: [preview.filePath],
|
|
75
|
+
writes: [preview.filePath],
|
|
76
|
+
notes: ['Config writes are previewed unless --yes is provided.'],
|
|
77
|
+
});
|
|
78
|
+
assertOperationPlanFingerprint(context, operationPlan);
|
|
79
|
+
const updated = context.yes
|
|
80
|
+
? await setResolvedConfigValue(key, value, {
|
|
81
|
+
cwd: context.cwd,
|
|
82
|
+
yes: true,
|
|
83
|
+
global: isGlobal,
|
|
84
|
+
})
|
|
85
|
+
: preview;
|
|
86
|
+
const human = [
|
|
87
|
+
'ZaoWu Config Set',
|
|
88
|
+
'',
|
|
89
|
+
`Status: ${updated.status}`,
|
|
90
|
+
`File: ${updated.filePath}`,
|
|
91
|
+
`Key: ${updated.key}`,
|
|
92
|
+
`Old: ${updated.oldValue ?? 'null'}`,
|
|
93
|
+
`New: ${updated.newValue ?? 'null'}`,
|
|
94
|
+
`Wrote file: ${updated.wroteFile ? 'yes' : 'no'}`,
|
|
95
|
+
'',
|
|
96
|
+
formatOperationPlan(operationPlan),
|
|
97
|
+
'',
|
|
98
|
+
updated.wroteFile ? 'Config updated.' : updated.content,
|
|
99
|
+
].join('\n');
|
|
100
|
+
return result(context, withOperationPlan(updated, operationPlan), human);
|
|
101
|
+
};
|
|
102
|
+
export const handleConfigMigrate = async (_args, context) => {
|
|
103
|
+
const preview = await migrateResolvedConfig({
|
|
104
|
+
cwd: context.cwd,
|
|
105
|
+
});
|
|
106
|
+
const operationPlan = createOperationPlan({
|
|
107
|
+
risk: 'medium',
|
|
108
|
+
confirmationRequired: preview.changed && !context.yes,
|
|
109
|
+
subjects: [
|
|
110
|
+
`config:${preview.filePath}`,
|
|
111
|
+
...(preview.changed ? createContentOperationSubjects(preview.content) : []),
|
|
112
|
+
],
|
|
113
|
+
reads: [preview.filePath],
|
|
114
|
+
writes: preview.changed ? [preview.filePath] : [],
|
|
115
|
+
notes: ['Config migrations are previewed unless --yes is provided.'],
|
|
116
|
+
});
|
|
117
|
+
assertOperationPlanFingerprint(context, operationPlan);
|
|
118
|
+
const migrated = context.yes && preview.changed
|
|
119
|
+
? await migrateResolvedConfig({
|
|
120
|
+
cwd: context.cwd,
|
|
121
|
+
yes: true,
|
|
122
|
+
})
|
|
123
|
+
: preview;
|
|
124
|
+
const human = [
|
|
125
|
+
'ZaoWu Config Migrate',
|
|
126
|
+
'',
|
|
127
|
+
`Status: ${migrated.status}`,
|
|
128
|
+
`File: ${migrated.filePath}`,
|
|
129
|
+
`From: ${migrated.fromVersion ?? 'legacy'}`,
|
|
130
|
+
`To: ${migrated.toVersion}`,
|
|
131
|
+
`Changed: ${migrated.changed ? 'yes' : 'no'}`,
|
|
132
|
+
`Wrote file: ${migrated.wroteFile ? 'yes' : 'no'}`,
|
|
133
|
+
'',
|
|
134
|
+
formatOperationPlan(operationPlan),
|
|
135
|
+
'',
|
|
136
|
+
migrated.wroteFile || !migrated.changed ? 'Migration complete.' : migrated.content,
|
|
137
|
+
].join('\n');
|
|
138
|
+
return result(context, withOperationPlan(migrated, operationPlan), human);
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=config-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-handlers.js","sourceRoot":"","sources":["../../src/handlers/config-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DomainActionHandler } from '../handler-utils.js';
|
|
2
|
+
export declare const handleDataInspect: DomainActionHandler;
|
|
3
|
+
export declare const handleDataAnalyze: DomainActionHandler;
|
|
4
|
+
export declare const handleDataClean: DomainActionHandler;
|
|
5
|
+
export declare const handleDataSchema: DomainActionHandler;
|
|
6
|
+
export declare const handleDataSample: DomainActionHandler;
|
|
7
|
+
export declare const handleDataSheets: DomainActionHandler;
|
|
8
|
+
//# sourceMappingURL=data-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/data-handlers.ts"],"names":[],"mappings":"AAQA,OAAO,EAYL,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,iBAAiB,EAAE,mBAgB/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,mBAkB/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,mBA8D7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,mBAgB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,mBAgB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,mBAY9B,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { analyzeData, cleanData, inferDataSchema, inspectData, sampleData, listSheets, } from '@zaowu-labs/data';
|
|
2
|
+
import { assertOperationPlanFingerprint, createContentOperationSubjects, createOperationPlan, formatConfirmCommand, formatObject, formatOperationPlan, getValue, parsePositiveInteger, requireTarget, result, withOperationPlan, } from '../handler-utils.js';
|
|
3
|
+
export const handleDataInspect = async (args, context) => {
|
|
4
|
+
const target = requireTarget(args, 'zw data inspect');
|
|
5
|
+
const inspected = await inspectData(target, {
|
|
6
|
+
sheet: getValue(context.parsed, '--sheet'),
|
|
7
|
+
});
|
|
8
|
+
const human = [
|
|
9
|
+
'ZaoWu Data Inspect',
|
|
10
|
+
'',
|
|
11
|
+
`File: ${inspected.filePath}`,
|
|
12
|
+
`Rows: ${inspected.rowCount}`,
|
|
13
|
+
`Columns: ${inspected.columnCount}`,
|
|
14
|
+
'',
|
|
15
|
+
`Columns: ${inspected.columns.join(', ')}`,
|
|
16
|
+
].join('\n');
|
|
17
|
+
return result(context, inspected, human);
|
|
18
|
+
};
|
|
19
|
+
export const handleDataAnalyze = async (args, context) => {
|
|
20
|
+
const target = requireTarget(args, 'zw data analyze');
|
|
21
|
+
const analysis = await analyzeData(target, {
|
|
22
|
+
sheet: getValue(context.parsed, '--sheet'),
|
|
23
|
+
});
|
|
24
|
+
const human = [
|
|
25
|
+
'ZaoWu Data Analyze',
|
|
26
|
+
'',
|
|
27
|
+
`File: ${analysis.filePath}`,
|
|
28
|
+
`Numeric columns: ${analysis.numericColumns.length}`,
|
|
29
|
+
'',
|
|
30
|
+
...analysis.numericColumns.map((column) => `- ${column.column}: count ${column.count}, min ${column.min}, max ${column.max}, avg ${column.average}`),
|
|
31
|
+
].join('\n');
|
|
32
|
+
return result(context, analysis, human);
|
|
33
|
+
};
|
|
34
|
+
export const handleDataClean = async (args, context) => {
|
|
35
|
+
const target = requireTarget(args, 'zw data clean');
|
|
36
|
+
const outputPath = getValue(context.parsed, '--output');
|
|
37
|
+
const sheet = getValue(context.parsed, '--sheet');
|
|
38
|
+
const preview = await cleanData(target, {
|
|
39
|
+
outputPath,
|
|
40
|
+
sheet,
|
|
41
|
+
});
|
|
42
|
+
const operationPlan = createOperationPlan({
|
|
43
|
+
risk: preview.outputPath ? 'medium' : 'low',
|
|
44
|
+
confirmationRequired: Boolean(preview.outputPath && !context.yes),
|
|
45
|
+
subjects: [
|
|
46
|
+
`data:${preview.inputPath}`,
|
|
47
|
+
...(preview.sheetName ? [`sheet:${preview.sheetName}`] : []),
|
|
48
|
+
...createContentOperationSubjects(preview.content),
|
|
49
|
+
],
|
|
50
|
+
reads: [preview.inputPath],
|
|
51
|
+
writes: preview.outputPath ? [preview.outputPath] : [],
|
|
52
|
+
notes: ['Data cleaning writes require --yes when --output is used.'],
|
|
53
|
+
});
|
|
54
|
+
assertOperationPlanFingerprint(context, operationPlan);
|
|
55
|
+
const cleaned = context.yes && preview.outputPath
|
|
56
|
+
? await cleanData(target, {
|
|
57
|
+
outputPath,
|
|
58
|
+
sheet,
|
|
59
|
+
yes: true,
|
|
60
|
+
})
|
|
61
|
+
: preview;
|
|
62
|
+
const confirmCommand = preview.outputPath && !context.yes
|
|
63
|
+
? formatConfirmCommand([
|
|
64
|
+
'zw',
|
|
65
|
+
'data',
|
|
66
|
+
'clean',
|
|
67
|
+
target,
|
|
68
|
+
...(sheet ? ['--sheet', sheet] : []),
|
|
69
|
+
'--output',
|
|
70
|
+
preview.outputPath,
|
|
71
|
+
'--yes',
|
|
72
|
+
'--plan-fingerprint',
|
|
73
|
+
operationPlan.fingerprint,
|
|
74
|
+
])
|
|
75
|
+
: undefined;
|
|
76
|
+
const human = [
|
|
77
|
+
'ZaoWu Data Clean',
|
|
78
|
+
'',
|
|
79
|
+
`Status: ${cleaned.status}`,
|
|
80
|
+
`Input: ${cleaned.inputPath}`,
|
|
81
|
+
`Output: ${cleaned.outputPath ?? 'stdout'}`,
|
|
82
|
+
`Wrote file: ${cleaned.wroteFile ? 'yes' : 'no'}`,
|
|
83
|
+
'',
|
|
84
|
+
formatOperationPlan(operationPlan),
|
|
85
|
+
...(confirmCommand
|
|
86
|
+
? ['', 'To write exactly this cleaned output, run:', ` ${confirmCommand}`]
|
|
87
|
+
: []),
|
|
88
|
+
'',
|
|
89
|
+
cleaned.wroteFile ? 'Clean complete.' : cleaned.content,
|
|
90
|
+
].join('\n');
|
|
91
|
+
return result(context, withOperationPlan(cleaned, operationPlan), human);
|
|
92
|
+
};
|
|
93
|
+
export const handleDataSchema = async (args, context) => {
|
|
94
|
+
const target = requireTarget(args, 'zw data schema');
|
|
95
|
+
const schema = await inferDataSchema(target, {
|
|
96
|
+
sheet: getValue(context.parsed, '--sheet'),
|
|
97
|
+
});
|
|
98
|
+
const human = [
|
|
99
|
+
'ZaoWu Data Schema',
|
|
100
|
+
'',
|
|
101
|
+
`File: ${schema.filePath}`,
|
|
102
|
+
'',
|
|
103
|
+
...schema.columns.map((column) => `- ${column.column}: ${column.type}${column.nullable ? ', nullable' : ''}`),
|
|
104
|
+
].join('\n');
|
|
105
|
+
return result(context, schema, human);
|
|
106
|
+
};
|
|
107
|
+
export const handleDataSample = async (args, context) => {
|
|
108
|
+
const target = requireTarget(args, 'zw data sample');
|
|
109
|
+
const sampled = await sampleData(target, {
|
|
110
|
+
rows: parsePositiveInteger(getValue(context.parsed, '--rows'), 5),
|
|
111
|
+
sheet: getValue(context.parsed, '--sheet'),
|
|
112
|
+
});
|
|
113
|
+
const human = [
|
|
114
|
+
'ZaoWu Data Sample',
|
|
115
|
+
'',
|
|
116
|
+
`File: ${sampled.filePath}`,
|
|
117
|
+
`Rows: ${sampled.rowCount}`,
|
|
118
|
+
'',
|
|
119
|
+
formatObject(sampled.rows),
|
|
120
|
+
].join('\n');
|
|
121
|
+
return result(context, sampled, human);
|
|
122
|
+
};
|
|
123
|
+
export const handleDataSheets = async (args, context) => {
|
|
124
|
+
const target = requireTarget(args, 'zw data sheets');
|
|
125
|
+
const sheetsResult = await listSheets(target);
|
|
126
|
+
const human = [
|
|
127
|
+
'ZaoWu Data Sheets',
|
|
128
|
+
'',
|
|
129
|
+
`File: ${sheetsResult.filePath}`,
|
|
130
|
+
`Sheets (${sheetsResult.sheets.length}):`,
|
|
131
|
+
...sheetsResult.sheets.map((sheet) => `- ${sheet}`),
|
|
132
|
+
].join('\n');
|
|
133
|
+
return result(context, sheetsResult, human);
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=data-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-handlers.js","sourceRoot":"","sources":["../../src/handlers/data-handlers.ts"],"names":[],"mappings":"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"}
|