mustflow 2.22.46 → 2.22.49
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 +8 -0
- package/dist/cli/commands/api.js +1110 -0
- package/dist/cli/commands/run.js +107 -9
- package/dist/cli/commands/verify.js +4 -43
- package/dist/cli/i18n/en.js +19 -0
- package/dist/cli/i18n/es.js +19 -0
- package/dist/cli/i18n/fr.js +19 -0
- package/dist/cli/i18n/hi.js +19 -0
- package/dist/cli/i18n/ko.js +19 -0
- package/dist/cli/i18n/zh.js +19 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/lib/command-registry.js +6 -0
- package/dist/core/active-run-locks.js +10 -0
- package/dist/core/public-json-contracts.js +56 -0
- package/dist/core/verification-plan-id.js +44 -0
- package/package.json +1 -1
- package/schemas/README.md +7 -0
- package/schemas/command-catalog.schema.json +158 -0
- package/schemas/diff-risk.schema.json +149 -0
- package/schemas/health.schema.json +45 -0
- package/schemas/latest-evidence.schema.json +95 -0
- package/schemas/locks.schema.json +102 -0
- package/schemas/verification-plan.schema.json +245 -0
- package/schemas/workspace-summary.schema.json +282 -0
- package/templates/default/manifest.toml +1 -1
package/dist/cli/commands/run.js
CHANGED
|
@@ -18,6 +18,13 @@ import { getRunStatus, runArgvCommandStreaming, runShellCommandStreaming } from
|
|
|
18
18
|
import { emitOutput, isOutputLimitExceededError } from './run/output.js';
|
|
19
19
|
import { createPendingTimeoutTermination, getKillMethod, terminateProcessTree } from './run/process-tree.js';
|
|
20
20
|
import { assembleRunReceipt } from './run/receipt.js';
|
|
21
|
+
const DEFAULT_ACTIVE_LOCK_WAIT_TIMEOUT_SECONDS = 300;
|
|
22
|
+
const ACTIVE_LOCK_WAIT_POLL_MS = 1_000;
|
|
23
|
+
function delay(milliseconds) {
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
setTimeout(resolve, milliseconds);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
21
28
|
function getRunPlanDetail(plan, lang, fallbackKey) {
|
|
22
29
|
return plan.detail ?? t(lang, fallbackKey);
|
|
23
30
|
}
|
|
@@ -117,6 +124,77 @@ function renderActiveLockConflictMessage(intentName, conflicts, lang) {
|
|
|
117
124
|
: t(lang, 'run.error.activeLockConflictUnknown');
|
|
118
125
|
return t(lang, 'run.error.activeLockConflict', { intent: intentName, detail });
|
|
119
126
|
}
|
|
127
|
+
function parseRunArguments(args) {
|
|
128
|
+
const supportedBooleanOptions = new Set(['--json', '--dry-run', '--plan-only', '--wait', ALLOW_UNTRUSTED_ROOT_OPTION]);
|
|
129
|
+
const supportedValueOptions = new Set(['--wait-timeout']);
|
|
130
|
+
const positional = [];
|
|
131
|
+
const unsupported = [];
|
|
132
|
+
let waitTimeoutSeconds = DEFAULT_ACTIVE_LOCK_WAIT_TIMEOUT_SECONDS;
|
|
133
|
+
let invalidWaitTimeout = false;
|
|
134
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
135
|
+
const arg = args[index];
|
|
136
|
+
if (supportedBooleanOptions.has(arg)) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (supportedValueOptions.has(arg)) {
|
|
140
|
+
const value = args[index + 1];
|
|
141
|
+
if (!value || value.startsWith('-')) {
|
|
142
|
+
invalidWaitTimeout = true;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const parsed = Number(value);
|
|
146
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
147
|
+
invalidWaitTimeout = true;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
waitTimeoutSeconds = parsed;
|
|
151
|
+
}
|
|
152
|
+
index += 1;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (arg.startsWith('-')) {
|
|
156
|
+
unsupported.push(arg);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
positional.push(arg);
|
|
160
|
+
}
|
|
161
|
+
const [intentName, ...extra] = positional;
|
|
162
|
+
return {
|
|
163
|
+
json: args.includes('--json'),
|
|
164
|
+
dryRun: args.includes('--dry-run'),
|
|
165
|
+
planOnly: args.includes('--plan-only'),
|
|
166
|
+
allowUntrustedRoot: args.includes(ALLOW_UNTRUSTED_ROOT_OPTION),
|
|
167
|
+
wait: args.includes('--wait'),
|
|
168
|
+
waitTimeoutSeconds,
|
|
169
|
+
intentName: intentName ?? null,
|
|
170
|
+
extra,
|
|
171
|
+
unsupported,
|
|
172
|
+
invalidWaitTimeout,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
async function acquireActiveRunLockWithOptionalWait(input) {
|
|
176
|
+
const startedAt = Date.now();
|
|
177
|
+
let reportedWait = false;
|
|
178
|
+
while (true) {
|
|
179
|
+
const result = acquireActiveRunLock(input.projectRoot, input.contract, input.intentName, { commandHash: input.commandHash });
|
|
180
|
+
if (result.ok || !input.enabled || result.conflicts.length === 0) {
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
if (!input.json && !reportedWait) {
|
|
184
|
+
const [first] = result.conflicts;
|
|
185
|
+
input.reporter.stderr(t(input.lang, 'run.progress.waitingForActiveLock', {
|
|
186
|
+
intent: input.intentName,
|
|
187
|
+
activeIntent: first?.conflictsWithIntent ?? 'unknown',
|
|
188
|
+
seconds: input.waitTimeoutSeconds,
|
|
189
|
+
}));
|
|
190
|
+
reportedWait = true;
|
|
191
|
+
}
|
|
192
|
+
if (Date.now() - startedAt >= input.waitTimeoutSeconds * 1000) {
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
await delay(Math.min(ACTIVE_LOCK_WAIT_POLL_MS, Math.max(1, input.waitTimeoutSeconds * 1000 - (Date.now() - startedAt))));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
120
198
|
function createRunProgressReporter(input) {
|
|
121
199
|
if (!input.enabled) {
|
|
122
200
|
return () => undefined;
|
|
@@ -150,6 +228,8 @@ export function getRunHelp(lang = 'en') {
|
|
|
150
228
|
{ label: '--dry-run', description: t(lang, 'run.help.option.dryRun') },
|
|
151
229
|
{ label: '--plan-only', description: t(lang, 'run.help.option.planOnly') },
|
|
152
230
|
{ label: '--json', description: t(lang, 'run.help.option.json') },
|
|
231
|
+
{ label: '--wait', description: t(lang, 'run.help.option.wait') },
|
|
232
|
+
{ label: '--wait-timeout <seconds>', description: t(lang, 'run.help.option.waitTimeout') },
|
|
153
233
|
{ label: ALLOW_UNTRUSTED_ROOT_OPTION, description: t(lang, 'run.help.option.allowUntrustedRoot') },
|
|
154
234
|
{ label: '-h, --help', description: t(lang, 'cli.option.help') },
|
|
155
235
|
],
|
|
@@ -180,23 +260,31 @@ export async function runRun(args, reporter, lang = 'en', options = {}) {
|
|
|
180
260
|
reporter.stdout(getRunHelp(lang));
|
|
181
261
|
return 0;
|
|
182
262
|
}
|
|
183
|
-
const
|
|
184
|
-
const unsupported =
|
|
263
|
+
const parsedArgs = parseRunArguments(args);
|
|
264
|
+
const unsupported = parsedArgs.unsupported;
|
|
185
265
|
if (unsupported.length > 0) {
|
|
186
266
|
printUsageError(reporter, t(lang, 'cli.error.unknownOption', { option: unsupported[0] }), 'mf run --help', getRunHelp(lang), lang);
|
|
187
267
|
return 1;
|
|
188
268
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
269
|
+
if (parsedArgs.invalidWaitTimeout) {
|
|
270
|
+
printUsageError(reporter, t(lang, 'run.error.invalidWaitTimeout'), 'mf run --help', getRunHelp(lang), lang);
|
|
271
|
+
return 1;
|
|
272
|
+
}
|
|
273
|
+
const json = parsedArgs.json;
|
|
274
|
+
const dryRun = parsedArgs.dryRun;
|
|
275
|
+
const planOnly = parsedArgs.planOnly;
|
|
276
|
+
const allowUntrustedRoot = parsedArgs.allowUntrustedRoot;
|
|
193
277
|
const previewMode = dryRun ? 'dry-run' : planOnly ? 'plan-only' : null;
|
|
194
278
|
if (dryRun && planOnly) {
|
|
195
279
|
printUsageError(reporter, t(lang, 'run.error.conflictingPreviewModes'), 'mf run --help', getRunHelp(lang), lang);
|
|
196
280
|
return 1;
|
|
197
281
|
}
|
|
198
|
-
|
|
199
|
-
|
|
282
|
+
if (parsedArgs.wait && previewMode) {
|
|
283
|
+
printUsageError(reporter, t(lang, 'run.error.waitRequiresExecution'), 'mf run --help', getRunHelp(lang), lang);
|
|
284
|
+
return 1;
|
|
285
|
+
}
|
|
286
|
+
const intentName = parsedArgs.intentName;
|
|
287
|
+
const extra = parsedArgs.extra;
|
|
200
288
|
if (!intentName) {
|
|
201
289
|
printUsageError(reporter, t(lang, 'run.error.missingIntent'), 'mf run --help', getRunHelp(lang), lang);
|
|
202
290
|
return 1;
|
|
@@ -243,7 +331,17 @@ export async function runRun(args, reporter, lang = 'en', options = {}) {
|
|
|
243
331
|
});
|
|
244
332
|
return 1;
|
|
245
333
|
}
|
|
246
|
-
const activeRunLock = profiler.
|
|
334
|
+
const activeRunLock = await profiler.measureAsync('active_lock_acquire', () => acquireActiveRunLockWithOptionalWait({
|
|
335
|
+
enabled: parsedArgs.wait,
|
|
336
|
+
waitTimeoutSeconds: parsedArgs.waitTimeoutSeconds,
|
|
337
|
+
projectRoot,
|
|
338
|
+
contract,
|
|
339
|
+
intentName,
|
|
340
|
+
commandHash: createPlanCommandHash(plan),
|
|
341
|
+
json,
|
|
342
|
+
reporter,
|
|
343
|
+
lang,
|
|
344
|
+
}));
|
|
247
345
|
if (!activeRunLock.ok) {
|
|
248
346
|
reporter.stderr(renderCliError(renderActiveLockConflictMessage(intentName, activeRunLock.conflicts, lang), 'mf run --dry-run --json', lang));
|
|
249
347
|
writeLatestProfile(profiler, options, {
|
|
@@ -6,6 +6,7 @@ import { readUtf8FileInsideWithoutSymlinks, writeJsonFileInsideWithoutSymlinks }
|
|
|
6
6
|
import { createVerifyCompletionVerdict, } from '../../core/completion-verdict.js';
|
|
7
7
|
import { createExternalEvidenceRisks, } from '../../core/external-evidence.js';
|
|
8
8
|
import { createRepeatedFailureRisks, createVerificationFailureFingerprint, updateRepeatedFailureState, } from '../../core/repeated-failure.js';
|
|
9
|
+
import { createVerificationPlanId } from '../../core/verification-plan-id.js';
|
|
9
10
|
import { countReproEvidenceVerdictEffects, createReproEvidenceRisks, } from '../../core/repro-evidence.js';
|
|
10
11
|
import { createVerifyEvidenceModel } from '../../core/verification-evidence.js';
|
|
11
12
|
import { createScopeDiffRisks } from '../../core/scope-risk.js';
|
|
@@ -24,6 +25,9 @@ import { readLocalCommandEffectGraphs, readLocalPathSurfaces, readLocalSourceAnc
|
|
|
24
25
|
import { resolveMustflowRoot } from '../lib/project-root.js';
|
|
25
26
|
export { planErrorMessageKey, readInputFromClassificationReport } from './verify/input.js';
|
|
26
27
|
const VERIFY_SCHEMA_VERSION = '1';
|
|
28
|
+
function hashTextSha256(content) {
|
|
29
|
+
return `sha256:${createHash('sha256').update(content).digest('hex')}`;
|
|
30
|
+
}
|
|
27
31
|
function createBufferedOutput() {
|
|
28
32
|
const stdout = [];
|
|
29
33
|
const stderr = [];
|
|
@@ -569,49 +573,6 @@ function readPreviousVerifyLatestSummary(projectRoot) {
|
|
|
569
573
|
return null;
|
|
570
574
|
}
|
|
571
575
|
}
|
|
572
|
-
function hashTextSha256(content) {
|
|
573
|
-
return `sha256:${createHash('sha256').update(content).digest('hex')}`;
|
|
574
|
-
}
|
|
575
|
-
function stableJson(value) {
|
|
576
|
-
if (Array.isArray(value)) {
|
|
577
|
-
return `[${value.map((entry) => stableJson(entry)).join(',')}]`;
|
|
578
|
-
}
|
|
579
|
-
if (value && typeof value === 'object') {
|
|
580
|
-
const record = value;
|
|
581
|
-
return `{${Object.keys(record)
|
|
582
|
-
.sort((left, right) => left.localeCompare(right))
|
|
583
|
-
.map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`)
|
|
584
|
-
.join(',')}}`;
|
|
585
|
-
}
|
|
586
|
-
return JSON.stringify(value) ?? 'null';
|
|
587
|
-
}
|
|
588
|
-
function getCandidateIntentNames(report) {
|
|
589
|
-
return [...new Set(report.candidates.map((candidate) => candidate.intent).filter((intent) => Boolean(intent)))]
|
|
590
|
-
.sort((left, right) => left.localeCompare(right));
|
|
591
|
-
}
|
|
592
|
-
function createVerificationPlanId(report, contract) {
|
|
593
|
-
const relatedIntents = Object.fromEntries(getCandidateIntentNames(report).map((intent) => [intent, contract.intents[intent] ?? null]));
|
|
594
|
-
const fingerprintSource = {
|
|
595
|
-
schema_version: '1',
|
|
596
|
-
algorithm: 'mustflow.verify_plan_id.v1',
|
|
597
|
-
report: {
|
|
598
|
-
source: report.source,
|
|
599
|
-
files: report.files,
|
|
600
|
-
classification_summary: report.classification_summary,
|
|
601
|
-
requirements: report.requirements,
|
|
602
|
-
candidates: report.candidates,
|
|
603
|
-
gaps: report.gaps,
|
|
604
|
-
schedule: report.schedule,
|
|
605
|
-
test_selection: report.test_selection,
|
|
606
|
-
},
|
|
607
|
-
command_contract: {
|
|
608
|
-
defaults: contract.defaults,
|
|
609
|
-
resources: contract.resources,
|
|
610
|
-
intents: relatedIntents,
|
|
611
|
-
},
|
|
612
|
-
};
|
|
613
|
-
return hashTextSha256(stableJson(fingerprintSource));
|
|
614
|
-
}
|
|
615
576
|
function toParallelismReport(settings) {
|
|
616
577
|
return {
|
|
617
578
|
requested: settings.requested,
|
package/dist/cli/i18n/en.js
CHANGED
|
@@ -24,6 +24,7 @@ export const enMessages = {
|
|
|
24
24
|
"value.missing": "missing",
|
|
25
25
|
"value.passed": "passed",
|
|
26
26
|
"value.failed": "failed",
|
|
27
|
+
"command.api.summary": "Print stable machine-readable API reports for agents",
|
|
27
28
|
"command.adapters.summary": "Inspect host adapter compatibility without generating adapter files",
|
|
28
29
|
"command.init.summary": "Copy the default mustflow agent workflow",
|
|
29
30
|
"command.check.summary": "Validate mustflow files",
|
|
@@ -86,6 +87,19 @@ export const enMessages = {
|
|
|
86
87
|
"context.help.option.cacheProfile": "Print a prompt-cache profile: stable, task, volatile, or all",
|
|
87
88
|
"context.help.exit.ok": "Context was inspected and printed",
|
|
88
89
|
"context.title": "mustflow context",
|
|
90
|
+
"api.help.summary": "Print stable machine-readable API reports for the current mustflow root.",
|
|
91
|
+
"api.help.action.workspaceSummary": "Print a read-only workspace briefing for coding agents",
|
|
92
|
+
"api.help.action.commandCatalog": "Print command intent availability without exposing raw command execution strings",
|
|
93
|
+
"api.help.action.verificationPlan": "Print a read-only verification plan for changed files",
|
|
94
|
+
"api.help.action.latestEvidence": "Print bounded latest run or verify evidence for agents",
|
|
95
|
+
"api.help.action.diffRisk": "Print a compact changed-file risk and verification summary",
|
|
96
|
+
"api.help.action.health": "Print a compact workspace health summary",
|
|
97
|
+
"api.help.action.locks": "Print active mf run locks for multi-session coordination",
|
|
98
|
+
"api.help.exit.ok": "The API report was inspected and printed",
|
|
99
|
+
"api.error.missingAction": "Specify an api action: workspace-summary, command-catalog, verification-plan, latest-evidence, diff-risk, health, or locks",
|
|
100
|
+
"api.error.unknownAction": "Unknown api action: {action}",
|
|
101
|
+
"api.error.actionRequiresJson": "{action} requires --json",
|
|
102
|
+
"api.error.actionRequiresChanged": "{action} currently requires --changed",
|
|
89
103
|
"label.installed": "Installed",
|
|
90
104
|
"label.mustflowRoot": "mustflow root",
|
|
91
105
|
"label.commandContract": "Command specification",
|
|
@@ -661,12 +675,15 @@ Read these files before working:
|
|
|
661
675
|
"run.help.option.dryRun": "Print a non-executing command plan",
|
|
662
676
|
"run.help.option.planOnly": "Alias for --dry-run",
|
|
663
677
|
"run.help.option.json": "Print the run record or command plan as JSON",
|
|
678
|
+
"run.help.option.wait": "Wait for conflicting active run locks before executing",
|
|
679
|
+
"run.help.option.waitTimeout": "Maximum seconds to wait for active run locks. Default: 300",
|
|
664
680
|
"run.help.option.allowUntrustedRoot": "Allow one execution from a root with a missing or invalid manifest lock after manual review",
|
|
665
681
|
"run.help.exit.ok": "The command completed with an allowed exit code",
|
|
666
682
|
"run.help.exit.fail": "The command was invalid, refused, timed out, or failed",
|
|
667
683
|
"run.label.suggestedIntentSnippet": "Suggested command contract snippet",
|
|
668
684
|
"run.progress.started": "Running {intent} (timeout: {seconds}s)...",
|
|
669
685
|
"run.progress.timeoutWarning": "Still running {intent}... ({seconds}s elapsed, {percent}% of timeout)",
|
|
686
|
+
"run.progress.waitingForActiveLock": "Waiting to run {intent}; active intent {activeIntent} holds a conflicting lock (timeout: {seconds}s)",
|
|
670
687
|
"run.error.missingIntent": "Missing command name",
|
|
671
688
|
"run.error.unknownIntent": "Unknown command: {intent}",
|
|
672
689
|
"run.error.statusNotConfigured": 'Command "{intent}" is {status}; only configured commands can be run',
|
|
@@ -689,6 +706,8 @@ Read these files before working:
|
|
|
689
706
|
"run.error.maxOutputBytes": 'Command "{intent}" has invalid max_output_bytes. {detail}',
|
|
690
707
|
"run.error.maxOutputBytesDetail": "The output limit must stay within the allowed maximum.",
|
|
691
708
|
"run.error.conflictingPreviewModes": "Use either --dry-run or --plan-only, not both",
|
|
709
|
+
"run.error.invalidWaitTimeout": "--wait-timeout must be a positive integer",
|
|
710
|
+
"run.error.waitRequiresExecution": "--wait can only be used when executing a command, not with --dry-run or --plan-only",
|
|
692
711
|
"run.error.untrustedRootMissing": "Refused to execute commands because {path} is missing. Run mf init/update to install the workflow, or pass --allow-untrusted-root after reviewing AGENTS.md and .mustflow/config/commands.toml.",
|
|
693
712
|
"run.error.untrustedRootInvalid": "Refused to execute commands because the manifest lock is invalid: {detail}. Restore or regenerate it, or pass --allow-untrusted-root after reviewing AGENTS.md and .mustflow/config/commands.toml.",
|
|
694
713
|
"run.error.timedOut": 'Command "{intent}" timed out after {seconds} seconds',
|
package/dist/cli/i18n/es.js
CHANGED
|
@@ -24,6 +24,7 @@ export const esMessages = {
|
|
|
24
24
|
"value.missing": "faltante",
|
|
25
25
|
"value.passed": "superado",
|
|
26
26
|
"value.failed": "fallido",
|
|
27
|
+
"command.api.summary": "Imprime informes API estables legibles por máquinas para agentes",
|
|
27
28
|
"command.adapters.summary": "Inspecciona compatibilidad de adaptadores sin generar archivos",
|
|
28
29
|
"command.init.summary": "Copia el flujo de trabajo de agente mustflow predeterminado",
|
|
29
30
|
"command.check.summary": "Valida los archivos mustflow",
|
|
@@ -86,6 +87,19 @@ export const esMessages = {
|
|
|
86
87
|
"context.help.option.cacheProfile": "Imprime un perfil de caché de prompt: stable, task, volatile o all",
|
|
87
88
|
"context.help.exit.ok": "El contexto se inspeccionó e imprimió",
|
|
88
89
|
"context.title": "contexto mustflow",
|
|
90
|
+
"api.help.summary": "Imprime informes API estables legibles por máquinas para la raíz mustflow actual.",
|
|
91
|
+
"api.help.action.workspaceSummary": "Imprime un briefing de workspace de solo lectura para agentes de código",
|
|
92
|
+
"api.help.action.commandCatalog": "Imprime disponibilidad de intents de comandos sin exponer cadenas de ejecución sin procesar",
|
|
93
|
+
"api.help.action.verificationPlan": "Imprime un verification plan de solo lectura para archivos cambiados",
|
|
94
|
+
"api.help.action.latestEvidence": "Imprime evidencia bounded del último run o verify para agentes",
|
|
95
|
+
"api.help.action.diffRisk": "Imprime un resumen compacto de riesgo y verificación para archivos cambiados",
|
|
96
|
+
"api.help.action.health": "Imprime un resumen compacto de salud del workspace",
|
|
97
|
+
"api.help.action.locks": "Imprime bloqueos mf run activos para coordinar varias sesiones",
|
|
98
|
+
"api.help.exit.ok": "El informe API se inspeccionó e imprimió",
|
|
99
|
+
"api.error.missingAction": "Especifica una acción api: workspace-summary, command-catalog, verification-plan, latest-evidence, diff-risk, health o locks",
|
|
100
|
+
"api.error.unknownAction": "Acción api desconocida: {action}",
|
|
101
|
+
"api.error.actionRequiresJson": "{action} requiere --json",
|
|
102
|
+
"api.error.actionRequiresChanged": "{action} actualmente requiere --changed",
|
|
89
103
|
"label.installed": "Instalado",
|
|
90
104
|
"label.mustflowRoot": "raíz mustflow",
|
|
91
105
|
"label.commandContract": "Especificación de comandos",
|
|
@@ -661,12 +675,15 @@ Lee estos archivos antes de trabajar:
|
|
|
661
675
|
"run.help.option.dryRun": "Imprime un plan de comando sin ejecutarlo",
|
|
662
676
|
"run.help.option.planOnly": "Alias de --dry-run",
|
|
663
677
|
"run.help.option.json": "Imprime el registro de ejecución o el plan de comando como JSON",
|
|
678
|
+
"run.help.option.wait": "Espera bloqueos activos en conflicto antes de ejecutar",
|
|
679
|
+
"run.help.option.waitTimeout": "Segundos máximos para esperar bloqueos activos. Predeterminado: 300",
|
|
664
680
|
"run.help.option.allowUntrustedRoot": "Permite una ejecución desde una raíz con bloqueo de manifiesto ausente o inválido tras revisión manual",
|
|
665
681
|
"run.help.exit.ok": "El comando se completo con un codigo de salida permitido",
|
|
666
682
|
"run.help.exit.fail": "El comando no era válido, fue rechazado, agotó el tiempo o falló",
|
|
667
683
|
"run.label.suggestedIntentSnippet": "Snippet sugerido para el contrato de comandos",
|
|
668
684
|
"run.progress.started": "Ejecutando {intent} (timeout: {seconds}s)...",
|
|
669
685
|
"run.progress.timeoutWarning": "{intent} sigue ejecutándose... ({seconds}s transcurridos, {percent}% del timeout)",
|
|
686
|
+
"run.progress.waitingForActiveLock": "Esperando para ejecutar {intent}; el intent activo {activeIntent} mantiene un bloqueo en conflicto (timeout: {seconds}s)",
|
|
670
687
|
"run.error.missingIntent": "Falta el nombre del comando",
|
|
671
688
|
"run.error.unknownIntent": "Comando desconocido: {intent}",
|
|
672
689
|
"run.error.statusNotConfigured": 'El comando "{intent}" está en estado {status}; sólo se pueden ejecutar comandos configurados',
|
|
@@ -689,6 +706,8 @@ Lee estos archivos antes de trabajar:
|
|
|
689
706
|
"run.error.maxOutputBytes": 'El comando "{intent}" tiene max_output_bytes no válido. {detail}',
|
|
690
707
|
"run.error.maxOutputBytesDetail": "El límite de salida debe permanecer dentro del máximo permitido.",
|
|
691
708
|
"run.error.conflictingPreviewModes": "Usa --dry-run o --plan-only, no ambos",
|
|
709
|
+
"run.error.invalidWaitTimeout": "--wait-timeout debe ser un entero positivo",
|
|
710
|
+
"run.error.waitRequiresExecution": "--wait solo se puede usar al ejecutar un comando, no con --dry-run o --plan-only",
|
|
692
711
|
"run.error.untrustedRootMissing": "Se rechazó ejecutar comandos porque falta {path}. Ejecuta mf init/update para instalar el flujo, o usa --allow-untrusted-root tras revisar AGENTS.md y .mustflow/config/commands.toml.",
|
|
693
712
|
"run.error.untrustedRootInvalid": "Se rechazó ejecutar comandos porque el bloqueo de manifiesto no es válido: {detail}. Restáuralo o regenéralo, o usa --allow-untrusted-root tras revisar AGENTS.md y .mustflow/config/commands.toml.",
|
|
694
713
|
"run.error.timedOut": 'El comando "{intent}" agotó el tiempo después de {seconds} segundos',
|
package/dist/cli/i18n/fr.js
CHANGED
|
@@ -24,6 +24,7 @@ export const frMessages = {
|
|
|
24
24
|
"value.missing": "manquant",
|
|
25
25
|
"value.passed": "réussi",
|
|
26
26
|
"value.failed": "échoué",
|
|
27
|
+
"command.api.summary": "Imprime des rapports API stables lisibles par machine pour les agents",
|
|
27
28
|
"command.adapters.summary": "Inspecte la compatibilité des adaptateurs sans générer de fichiers",
|
|
28
29
|
"command.init.summary": "Copie le flux de travail d'agent mustflow par défaut",
|
|
29
30
|
"command.check.summary": "Valide les fichiers mustflow",
|
|
@@ -86,6 +87,19 @@ export const frMessages = {
|
|
|
86
87
|
"context.help.option.cacheProfile": "Imprime un profil de cache de prompt : stable, task, volatile ou all",
|
|
87
88
|
"context.help.exit.ok": "Le contexte a été inspecté et imprimé",
|
|
88
89
|
"context.title": "contexte mustflow",
|
|
90
|
+
"api.help.summary": "Imprime des rapports API stables lisibles par machine pour la racine mustflow actuelle.",
|
|
91
|
+
"api.help.action.workspaceSummary": "Imprime un briefing de workspace en lecture seule pour les agents de code",
|
|
92
|
+
"api.help.action.commandCatalog": "Affiche la disponibilité des intents de commande sans exposer les chaînes d'exécution brutes",
|
|
93
|
+
"api.help.action.verificationPlan": "Affiche un verification plan en lecture seule pour les fichiers modifiés",
|
|
94
|
+
"api.help.action.latestEvidence": "Affiche les dernières preuves bounded de run ou verify pour les agents",
|
|
95
|
+
"api.help.action.diffRisk": "Affiche un résumé compact du risque et de la vérification des fichiers modifiés",
|
|
96
|
+
"api.help.action.health": "Affiche un résumé compact de santé du workspace",
|
|
97
|
+
"api.help.action.locks": "Affiche les verrous mf run actifs pour coordonner plusieurs sessions",
|
|
98
|
+
"api.help.exit.ok": "Le rapport API a été inspecté et imprimé",
|
|
99
|
+
"api.error.missingAction": "Indiquez une action api : workspace-summary, command-catalog, verification-plan, latest-evidence, diff-risk, health ou locks",
|
|
100
|
+
"api.error.unknownAction": "Action api inconnue : {action}",
|
|
101
|
+
"api.error.actionRequiresJson": "{action} exige --json",
|
|
102
|
+
"api.error.actionRequiresChanged": "{action} exige actuellement --changed",
|
|
89
103
|
"label.installed": "Installé",
|
|
90
104
|
"label.mustflowRoot": "racine mustflow",
|
|
91
105
|
"label.commandContract": "Spécification des commandes",
|
|
@@ -661,12 +675,15 @@ Lisez ces fichiers avant de travailler :
|
|
|
661
675
|
"run.help.option.dryRun": "Imprime un plan de commande sans l'exécuter",
|
|
662
676
|
"run.help.option.planOnly": "Alias de --dry-run",
|
|
663
677
|
"run.help.option.json": "Imprime l'enregistrement d'exécution ou le plan de commande en JSON",
|
|
678
|
+
"run.help.option.wait": "Attend les verrous actifs en conflit avant d'exécuter",
|
|
679
|
+
"run.help.option.waitTimeout": "Nombre maximal de secondes d'attente des verrous actifs. Par défaut : 300",
|
|
664
680
|
"run.help.option.allowUntrustedRoot": "Autorise une seule exécution depuis une racine sans verrou de manifeste valide après revue manuelle",
|
|
665
681
|
"run.help.exit.ok": "La commande s'est terminée avec un code de sortie autorisé",
|
|
666
682
|
"run.help.exit.fail": "La commande était non valide, refusée, expirée ou a échoué",
|
|
667
683
|
"run.label.suggestedIntentSnippet": "Extrait suggéré de contrat de commande",
|
|
668
684
|
"run.progress.started": "Exécution de {intent} (timeout : {seconds}s)...",
|
|
669
685
|
"run.progress.timeoutWarning": "{intent} est toujours en cours... ({seconds}s écoulées, {percent}% du timeout)",
|
|
686
|
+
"run.progress.waitingForActiveLock": "Attente avant d'exécuter {intent} ; l'intention active {activeIntent} détient un verrou en conflit (timeout : {seconds}s)",
|
|
670
687
|
"run.error.missingIntent": "Nom de commande manquant",
|
|
671
688
|
"run.error.unknownIntent": "Commande inconnue : {intent}",
|
|
672
689
|
"run.error.statusNotConfigured": 'La commande "{intent}" est {status} ; seules les commandes configurées peuvent être exécutées',
|
|
@@ -689,6 +706,8 @@ Lisez ces fichiers avant de travailler :
|
|
|
689
706
|
"run.error.maxOutputBytes": 'La commande "{intent}" a une valeur max_output_bytes non valide. {detail}',
|
|
690
707
|
"run.error.maxOutputBytesDetail": "La limite de sortie doit rester dans le maximum autorisé.",
|
|
691
708
|
"run.error.conflictingPreviewModes": "Utilisez --dry-run ou --plan-only, pas les deux",
|
|
709
|
+
"run.error.invalidWaitTimeout": "--wait-timeout doit être un entier positif",
|
|
710
|
+
"run.error.waitRequiresExecution": "--wait ne peut être utilisé que lors de l'exécution d'une commande, pas avec --dry-run ou --plan-only",
|
|
692
711
|
"run.error.untrustedRootMissing": "Exécution refusée car {path} est absent. Lancez mf init/update pour installer le workflow, ou ajoutez --allow-untrusted-root après avoir relu AGENTS.md et .mustflow/config/commands.toml.",
|
|
693
712
|
"run.error.untrustedRootInvalid": "Exécution refusée car le verrou de manifeste est invalide : {detail}. Restaurez-le ou régénérez-le, ou ajoutez --allow-untrusted-root après avoir relu AGENTS.md et .mustflow/config/commands.toml.",
|
|
694
713
|
"run.error.timedOut": 'La commande "{intent}" a expiré après {seconds} secondes',
|
package/dist/cli/i18n/hi.js
CHANGED
|
@@ -24,6 +24,7 @@ export const hiMessages = {
|
|
|
24
24
|
"value.missing": "गुम",
|
|
25
25
|
"value.passed": "पास",
|
|
26
26
|
"value.failed": "फेल",
|
|
27
|
+
"command.api.summary": "एजेंटों के लिए स्थिर machine-readable API रिपोर्ट प्रिंट करें",
|
|
27
28
|
"command.adapters.summary": "एडाप्टर फ़ाइलें बनाए बिना होस्ट संगतता जाँचें",
|
|
28
29
|
"command.init.summary": "डिफ़ॉल्ट mustflow एजेंट वर्कफ़्लो कॉपी करें",
|
|
29
30
|
"command.check.summary": "mustflow फ़ाइलों की जाँच करें",
|
|
@@ -86,6 +87,19 @@ export const hiMessages = {
|
|
|
86
87
|
"context.help.option.cacheProfile": "prompt cache profile प्रिंट करें: stable, task, volatile, या all",
|
|
87
88
|
"context.help.exit.ok": "संदर्भ जाँचा और प्रिंट किया गया",
|
|
88
89
|
"context.title": "mustflow संदर्भ",
|
|
90
|
+
"api.help.summary": "वर्तमान mustflow रूट के लिए स्थिर machine-readable API रिपोर्ट प्रिंट करें।",
|
|
91
|
+
"api.help.action.workspaceSummary": "कोडिंग एजेंटों के लिए read-only workspace briefing प्रिंट करें",
|
|
92
|
+
"api.help.action.commandCatalog": "raw command execution strings दिखाए बिना command intent availability प्रिंट करें",
|
|
93
|
+
"api.help.action.verificationPlan": "बदली गई फ़ाइलों के लिए read-only verification plan प्रिंट करें",
|
|
94
|
+
"api.help.action.latestEvidence": "agents के लिए bounded latest run या verify evidence प्रिंट करें",
|
|
95
|
+
"api.help.action.diffRisk": "बदली गई files के लिए compact risk और verification summary प्रिंट करें",
|
|
96
|
+
"api.help.action.health": "workspace health की compact summary प्रिंट करें",
|
|
97
|
+
"api.help.action.locks": "multi-session coordination के लिए active mf run locks प्रिंट करें",
|
|
98
|
+
"api.help.exit.ok": "API रिपोर्ट जाँची और प्रिंट की गई",
|
|
99
|
+
"api.error.missingAction": "api action बताएँ: workspace-summary, command-catalog, verification-plan, latest-evidence, diff-risk, health, या locks",
|
|
100
|
+
"api.error.unknownAction": "अज्ञात api action: {action}",
|
|
101
|
+
"api.error.actionRequiresJson": "{action} के लिए --json चाहिए",
|
|
102
|
+
"api.error.actionRequiresChanged": "{action} को अभी --changed चाहिए",
|
|
89
103
|
"label.installed": "इंस्टॉल किया गया",
|
|
90
104
|
"label.mustflowRoot": "mustflow रूट",
|
|
91
105
|
"label.commandContract": "कमांड विनिर्देश",
|
|
@@ -661,12 +675,15 @@ export const hiMessages = {
|
|
|
661
675
|
"run.help.option.dryRun": "कमांड चलाए बिना उसका plan प्रिंट करें",
|
|
662
676
|
"run.help.option.planOnly": "--dry-run का alias",
|
|
663
677
|
"run.help.option.json": "Run record या command plan को JSON के रूप में प्रिंट करें",
|
|
678
|
+
"run.help.option.wait": "चलाने से पहले conflicting active run locks के लिए wait करें",
|
|
679
|
+
"run.help.option.waitTimeout": "active run locks के लिए wait करने की maximum seconds. Default: 300",
|
|
664
680
|
"run.help.option.allowUntrustedRoot": "Manual review के बाद missing या invalid manifest lock वाली root से एक execution allow करें",
|
|
665
681
|
"run.help.exit.ok": "कमांड अनुमत exit code के साथ पूरी हुई",
|
|
666
682
|
"run.help.exit.fail": "कमांड अमान्य थी, अस्वीकार हुई, timed out हुई या विफल हुई",
|
|
667
683
|
"run.label.suggestedIntentSnippet": "Suggested command contract snippet",
|
|
668
684
|
"run.progress.started": "{intent} चल रहा है (timeout: {seconds}s)...",
|
|
669
685
|
"run.progress.timeoutWarning": "{intent} अभी भी चल रहा है... ({seconds}s बीते, timeout का {percent}%)",
|
|
686
|
+
"run.progress.waitingForActiveLock": "{intent} चलाने के लिए wait कर रहे हैं; active intent {activeIntent} conflicting lock रखता है (timeout: {seconds}s)",
|
|
670
687
|
"run.error.missingIntent": "कमांड नाम नहीं दिया गया",
|
|
671
688
|
"run.error.unknownIntent": "अज्ञात कमांड: {intent}",
|
|
672
689
|
"run.error.statusNotConfigured": 'कमांड "{intent}" {status} है; केवल configured कमांड चलाई जा सकती हैं',
|
|
@@ -689,6 +706,8 @@ export const hiMessages = {
|
|
|
689
706
|
"run.error.maxOutputBytes": 'कमांड "{intent}" में max_output_bytes अमान्य है। {detail}',
|
|
690
707
|
"run.error.maxOutputBytesDetail": "Output limit अनुमत maximum के अंदर रहनी चाहिए।",
|
|
691
708
|
"run.error.conflictingPreviewModes": "--dry-run या --plan-only में से एक इस्तेमाल करें, दोनों नहीं",
|
|
709
|
+
"run.error.invalidWaitTimeout": "--wait-timeout positive integer होना चाहिए",
|
|
710
|
+
"run.error.waitRequiresExecution": "--wait केवल command execute करते समय इस्तेमाल हो सकता है, --dry-run या --plan-only के साथ नहीं",
|
|
692
711
|
"run.error.untrustedRootMissing": "{path} missing है, इसलिए commands execute करने से मना किया गया। Workflow install करने के लिए mf init/update चलाएँ, या AGENTS.md और .mustflow/config/commands.toml review करने के बाद --allow-untrusted-root पास करें।",
|
|
693
712
|
"run.error.untrustedRootInvalid": "Manifest lock invalid है, इसलिए commands execute करने से मना किया गया: {detail}. इसे restore या regenerate करें, या AGENTS.md और .mustflow/config/commands.toml review करने के बाद --allow-untrusted-root पास करें।",
|
|
694
713
|
"run.error.timedOut": 'कमांड "{intent}" {seconds} सेकंड बाद time out हुई',
|
package/dist/cli/i18n/ko.js
CHANGED
|
@@ -24,6 +24,7 @@ export const koMessages = {
|
|
|
24
24
|
"value.missing": "없음",
|
|
25
25
|
"value.passed": "통과",
|
|
26
26
|
"value.failed": "실패",
|
|
27
|
+
"command.api.summary": "에이전트용 안정적 JSON API 보고서를 출력합니다",
|
|
27
28
|
"command.adapters.summary": "어댑터 파일을 만들지 않고 호스트 호환성을 확인합니다",
|
|
28
29
|
"command.init.summary": "기본 mustflow 에이전트 워크플로우를 복사합니다",
|
|
29
30
|
"command.check.summary": "mustflow 파일을 검사합니다",
|
|
@@ -86,6 +87,19 @@ export const koMessages = {
|
|
|
86
87
|
"context.help.option.cacheProfile": "프롬프트 캐시 프로필을 출력합니다: stable, task, volatile, all",
|
|
87
88
|
"context.help.exit.ok": "맥락을 확인하고 출력했습니다",
|
|
88
89
|
"context.title": "mustflow 맥락",
|
|
90
|
+
"api.help.summary": "현재 mustflow 루트의 안정적 JSON API 보고서를 출력합니다.",
|
|
91
|
+
"api.help.action.workspaceSummary": "코딩 에이전트용 읽기 전용 workspace briefing을 출력합니다",
|
|
92
|
+
"api.help.action.commandCatalog": "원본 실행 문자열을 노출하지 않고 command intent 실행 가능성을 출력합니다",
|
|
93
|
+
"api.help.action.verificationPlan": "변경 파일에 대한 읽기 전용 verification plan을 출력합니다",
|
|
94
|
+
"api.help.action.latestEvidence": "에이전트용 bounded 최신 run 또는 verify evidence를 출력합니다",
|
|
95
|
+
"api.help.action.diffRisk": "변경 파일 risk와 verification 요약을 작게 출력합니다",
|
|
96
|
+
"api.help.action.health": "workspace health 요약을 작게 출력합니다",
|
|
97
|
+
"api.help.action.locks": "여러 세션 조율용 활성 mf run 잠금을 출력합니다",
|
|
98
|
+
"api.help.exit.ok": "API 보고서를 확인하고 출력했습니다",
|
|
99
|
+
"api.error.missingAction": "api 작업을 지정하세요: workspace-summary, command-catalog, verification-plan, latest-evidence, diff-risk, health 또는 locks",
|
|
100
|
+
"api.error.unknownAction": "알 수 없는 api 작업: {action}",
|
|
101
|
+
"api.error.actionRequiresJson": "{action}에는 --json이 필요합니다",
|
|
102
|
+
"api.error.actionRequiresChanged": "{action}은 현재 --changed가 필요합니다",
|
|
89
103
|
"label.installed": "설치됨",
|
|
90
104
|
"label.mustflowRoot": "mustflow 루트",
|
|
91
105
|
"label.commandContract": "명령 계약",
|
|
@@ -661,12 +675,15 @@ export const koMessages = {
|
|
|
661
675
|
"run.help.option.dryRun": "실행하지 않고 명령 계획을 출력합니다",
|
|
662
676
|
"run.help.option.planOnly": "--dry-run과 같은 동작입니다",
|
|
663
677
|
"run.help.option.json": "실행 결과 또는 명령 계획을 JSON으로 출력합니다",
|
|
678
|
+
"run.help.option.wait": "충돌하는 활성 실행 잠금이 풀릴 때까지 기다린 뒤 실행합니다",
|
|
679
|
+
"run.help.option.waitTimeout": "활성 실행 잠금을 기다릴 최대 초입니다. 기본값: 300",
|
|
664
680
|
"run.help.option.allowUntrustedRoot": "잠금 파일이 없거나 올바르지 않은 루트에서 수동 검토 후 이번 실행만 허용합니다",
|
|
665
681
|
"run.help.exit.ok": "명령이 허용된 종료 코드로 완료되었습니다",
|
|
666
682
|
"run.help.exit.fail": "명령이 잘못되었거나, 거부되었거나, 시간 초과되었거나, 실패했습니다",
|
|
667
683
|
"run.label.suggestedIntentSnippet": "제안 명령 계약 조각",
|
|
668
684
|
"run.progress.started": "{intent} 실행 중(timeout: {seconds}초)...",
|
|
669
685
|
"run.progress.timeoutWarning": "{intent} 계속 실행 중... ({seconds}초 경과, timeout의 {percent}%)",
|
|
686
|
+
"run.progress.waitingForActiveLock": "{intent} 실행 대기 중; 활성 intent {activeIntent}가 충돌하는 잠금을 보유 중입니다(timeout: {seconds}초)",
|
|
670
687
|
"run.error.missingIntent": "명령 이름이 없습니다",
|
|
671
688
|
"run.error.unknownIntent": "알 수 없는 명령: {intent}",
|
|
672
689
|
"run.error.statusNotConfigured": '명령 "{intent}"의 상태는 {status}입니다. 설정된 상태(configured)인 명령만 실행할 수 있습니다',
|
|
@@ -689,6 +706,8 @@ export const koMessages = {
|
|
|
689
706
|
"run.error.maxOutputBytes": '명령 "{intent}"의 max_output_bytes 값이 올바르지 않습니다. {detail}',
|
|
690
707
|
"run.error.maxOutputBytesDetail": "출력 상한은 허용된 최댓값 안에 있어야 합니다.",
|
|
691
708
|
"run.error.conflictingPreviewModes": "--dry-run과 --plan-only 중 하나만 사용하세요",
|
|
709
|
+
"run.error.invalidWaitTimeout": "--wait-timeout은 양의 정수여야 합니다",
|
|
710
|
+
"run.error.waitRequiresExecution": "--wait는 --dry-run 또는 --plan-only가 아닌 실제 명령 실행에만 사용할 수 있습니다",
|
|
692
711
|
"run.error.untrustedRootMissing": "{path}이 없어 명령 실행을 거부했습니다. mf init/update로 워크플로우를 설치하거나, AGENTS.md와 .mustflow/config/commands.toml을 검토한 뒤 --allow-untrusted-root를 붙이세요.",
|
|
693
712
|
"run.error.untrustedRootInvalid": "잠금 파일이 올바르지 않아 명령 실행을 거부했습니다: {detail}. 파일을 복구하거나 다시 생성하거나, AGENTS.md와 .mustflow/config/commands.toml을 검토한 뒤 --allow-untrusted-root를 붙이세요.",
|
|
694
713
|
"run.error.timedOut": '명령 "{intent}"가 {seconds}초 뒤 시간 초과되었습니다',
|
package/dist/cli/i18n/zh.js
CHANGED
|
@@ -24,6 +24,7 @@ export const zhMessages = {
|
|
|
24
24
|
"value.missing": "缺失",
|
|
25
25
|
"value.passed": "通过",
|
|
26
26
|
"value.failed": "失败",
|
|
27
|
+
"command.api.summary": "为代理输出稳定的机器可读 API 报告",
|
|
27
28
|
"command.adapters.summary": "不生成适配器文件,检查宿主兼容性",
|
|
28
29
|
"command.init.summary": "复制默认的 mustflow 代理工作流",
|
|
29
30
|
"command.check.summary": "验证 mustflow 文件",
|
|
@@ -86,6 +87,19 @@ export const zhMessages = {
|
|
|
86
87
|
"context.help.option.cacheProfile": "输出提示缓存配置文件:stable、task、volatile 或 all",
|
|
87
88
|
"context.help.exit.ok": "已检查并输出上下文",
|
|
88
89
|
"context.title": "mustflow 上下文",
|
|
90
|
+
"api.help.summary": "为当前 mustflow 根目录输出稳定的机器可读 API 报告。",
|
|
91
|
+
"api.help.action.workspaceSummary": "为代码代理输出只读 workspace 简报",
|
|
92
|
+
"api.help.action.commandCatalog": "输出命令 intent 可用性,但不暴露原始执行字符串",
|
|
93
|
+
"api.help.action.verificationPlan": "为已变更文件输出只读 verification plan",
|
|
94
|
+
"api.help.action.latestEvidence": "为代理输出 bounded 最新 run 或 verify evidence",
|
|
95
|
+
"api.help.action.diffRisk": "为已变更文件输出紧凑 risk 和 verification 摘要",
|
|
96
|
+
"api.help.action.health": "输出紧凑 workspace health 摘要",
|
|
97
|
+
"api.help.action.locks": "输出用于多会话协调的活动 mf run 锁",
|
|
98
|
+
"api.help.exit.ok": "已检查并输出 API 报告",
|
|
99
|
+
"api.error.missingAction": "请指定 api 操作:workspace-summary、command-catalog、verification-plan、latest-evidence、diff-risk、health 或 locks",
|
|
100
|
+
"api.error.unknownAction": "未知 api 操作:{action}",
|
|
101
|
+
"api.error.actionRequiresJson": "{action} 需要 --json",
|
|
102
|
+
"api.error.actionRequiresChanged": "{action} 当前需要 --changed",
|
|
89
103
|
"label.installed": "已安装",
|
|
90
104
|
"label.mustflowRoot": "mustflow 根目录",
|
|
91
105
|
"label.commandContract": "命令规范",
|
|
@@ -661,12 +675,15 @@ export const zhMessages = {
|
|
|
661
675
|
"run.help.option.dryRun": "输出命令计划但不执行",
|
|
662
676
|
"run.help.option.planOnly": "--dry-run 的别名",
|
|
663
677
|
"run.help.option.json": "将运行记录或命令计划输出为 JSON",
|
|
678
|
+
"run.help.option.wait": "执行前等待冲突的活动运行锁释放",
|
|
679
|
+
"run.help.option.waitTimeout": "等待活动运行锁的最大秒数。默认值:300",
|
|
664
680
|
"run.help.option.allowUntrustedRoot": "人工复核后,允许从缺失或无效清单锁的根目录执行一次命令",
|
|
665
681
|
"run.help.exit.ok": "命令已以允许的退出码完成",
|
|
666
682
|
"run.help.exit.fail": "命令无效、被拒绝、超时或失败",
|
|
667
683
|
"run.label.suggestedIntentSnippet": "建议的命令契约片段",
|
|
668
684
|
"run.progress.started": "正在运行 {intent}(超时:{seconds} 秒)...",
|
|
669
685
|
"run.progress.timeoutWarning": "{intent} 仍在运行...(已用 {seconds} 秒,达到超时的 {percent}%)",
|
|
686
|
+
"run.progress.waitingForActiveLock": "正在等待运行 {intent};活动 intent {activeIntent} 持有冲突锁(超时:{seconds} 秒)",
|
|
670
687
|
"run.error.missingIntent": "缺少命令名称",
|
|
671
688
|
"run.error.unknownIntent": "未知命令:{intent}",
|
|
672
689
|
"run.error.statusNotConfigured": '命令 "{intent}" 的状态为 {status};只能运行已配置的命令',
|
|
@@ -689,6 +706,8 @@ export const zhMessages = {
|
|
|
689
706
|
"run.error.maxOutputBytes": '命令 "{intent}" 的 max_output_bytes 无效。{detail}',
|
|
690
707
|
"run.error.maxOutputBytesDetail": "输出限制必须保持在允许的最大值内。",
|
|
691
708
|
"run.error.conflictingPreviewModes": "只能使用 --dry-run 或 --plan-only,不能同时使用",
|
|
709
|
+
"run.error.invalidWaitTimeout": "--wait-timeout 必须是正整数",
|
|
710
|
+
"run.error.waitRequiresExecution": "--wait 只能用于实际执行命令,不能与 --dry-run 或 --plan-only 一起使用",
|
|
692
711
|
"run.error.untrustedRootMissing": "已拒绝执行命令,因为缺少 {path}。请运行 mf init/update 安装工作流,或在检查 AGENTS.md 和 .mustflow/config/commands.toml 后传入 --allow-untrusted-root。",
|
|
693
712
|
"run.error.untrustedRootInvalid": "已拒绝执行命令,因为清单锁无效:{detail}。请恢复或重新生成它,或在检查 AGENTS.md 和 .mustflow/config/commands.toml 后传入 --allow-untrusted-root。",
|
|
694
713
|
"run.error.timedOut": '命令 "{intent}" 在 {seconds} 秒后超时',
|
package/dist/cli/index.js
CHANGED
|
@@ -268,6 +268,16 @@ export function inspectActiveRunLocks(projectRoot, contract, intentName) {
|
|
|
268
268
|
staleRecords,
|
|
269
269
|
};
|
|
270
270
|
}
|
|
271
|
+
export function listActiveRunLocks(projectRoot) {
|
|
272
|
+
const records = readActiveRecords(projectRoot);
|
|
273
|
+
const staleRecords = records.map(staleRecordFor).filter((record) => record !== null);
|
|
274
|
+
const activeRecords = records.filter((record) => !staleRecords.some((stale) => stale.runId === record.run_id));
|
|
275
|
+
return {
|
|
276
|
+
records,
|
|
277
|
+
activeRecords,
|
|
278
|
+
staleRecords,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
271
281
|
export function acquireActiveRunLock(projectRoot, contract, intentName, options = {}) {
|
|
272
282
|
const effects = normalizeCommandEffects(projectRoot, contract, intentName);
|
|
273
283
|
if (effects.length === 0) {
|