@noclaf/cli 0.4.13 → 0.4.14
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/dist/cli/commands/validate-plan.js +42 -0
- package/dist/cli/commands/validate-plan.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/lib/validate-plan-delegate.js +105 -0
- package/dist/lib/validate-plan-delegate.js.map +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/validate-plan.js +57 -0
- package/dist/tools/validate-plan.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { runValidatePlan } from "../../lib/validate-plan-delegate.js";
|
|
3
|
+
import { ENGINES, PLAN_ENGINE, parseEngine } from "../../lib/exec-engines.js";
|
|
4
|
+
/**
|
|
5
|
+
* Superfície de CLI da triagem — mesmo contrato do `plan`/`exec`:
|
|
6
|
+
* **stdout = JSON**, **stderr = log ao vivo**, **exit ≠ 0 = falha**.
|
|
7
|
+
*/
|
|
8
|
+
function emit(payload) {
|
|
9
|
+
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
10
|
+
}
|
|
11
|
+
export function registerValidatePlanCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command("validate-plan")
|
|
14
|
+
.description("Lê o plan.md da raiz e roda o engine pensante para julgar se o plano precisa de " +
|
|
15
|
+
"uma spec antes de implementar. stdout = JSON { ok, needsSpec, reason, suggestedSlug?, engine }; " +
|
|
16
|
+
"stderr = log. suggestedSlug (slug do worktree) só sai quando needsSpec.")
|
|
17
|
+
.option("--project <path>", "raiz do projeto onde vive o plan.md", process.cwd())
|
|
18
|
+
.option("--engine <engine>", `agente pensante (${ENGINES.join(" | ")})`, PLAN_ENGINE)
|
|
19
|
+
.option("--quiet", "não streama o log do agente no stderr")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const engine = parseEngine(opts.engine, PLAN_ENGINE);
|
|
22
|
+
if (!engine) {
|
|
23
|
+
emit({ ok: false, error: `engine inválido: ${opts.engine} — suportados: ${ENGINES.join(", ")}` });
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!existsSync(opts.project)) {
|
|
28
|
+
emit({ ok: false, error: `projeto não encontrado: ${opts.project}` });
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const result = await runValidatePlan({
|
|
33
|
+
project: opts.project,
|
|
34
|
+
engine,
|
|
35
|
+
echo: opts.quiet !== true,
|
|
36
|
+
});
|
|
37
|
+
emit(result);
|
|
38
|
+
if (!result.ok)
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=validate-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plan.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE9E;;;GAGG;AAEH,SAAS,IAAI,CAAC,OAAgB;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CACV,kFAAkF;QAChF,kGAAkG;QAClG,yEAAyE,CAC5E;SACA,MAAM,CAAC,kBAAkB,EAAE,qCAAqC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAChF,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC;SACpF,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;SAC1D,MAAM,CACL,KAAK,EAAE,IAA2D,EAAE,EAAE;QACpE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,IAAI,CAAC,MAAM,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAClG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvC,CAAC,CACF,CAAC;AACN,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -10,6 +10,7 @@ import { registerSkillsCommands } from "./cli/commands/skills.js";
|
|
|
10
10
|
import { registerCleanCommand } from "./cli/commands/clean.js";
|
|
11
11
|
import { registerExecCommand } from "./cli/commands/exec.js";
|
|
12
12
|
import { registerPlanCommand } from "./cli/commands/plan.js";
|
|
13
|
+
import { registerValidatePlanCommand } from "./cli/commands/validate-plan.js";
|
|
13
14
|
import { registerCompletionCommand } from "./cli/commands/completion.js";
|
|
14
15
|
notifyCliIfUpdate();
|
|
15
16
|
const program = new Command();
|
|
@@ -25,6 +26,7 @@ registerSkillsCommands(program);
|
|
|
25
26
|
registerCleanCommand(program);
|
|
26
27
|
registerExecCommand(program);
|
|
27
28
|
registerPlanCommand(program);
|
|
29
|
+
registerValidatePlanCommand(program);
|
|
28
30
|
registerCompletionCommand(program);
|
|
29
31
|
program.parseAsync(process.argv).catch((err) => {
|
|
30
32
|
console.error(`Erro: ${err.message}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,iBAAiB,EAAE,CAAC;AAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAElC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAEnC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,SAAU,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,iBAAiB,EAAE,CAAC;AAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAElC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,2BAA2B,CAAC,OAAO,CAAC,CAAC;AACrC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAEnC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,SAAU,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { planPath, stripFence } from './plan-delegate.js';
|
|
4
|
+
import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
|
|
5
|
+
const SLUG_MAX = 50;
|
|
6
|
+
const SLUG_FALLBACK = 'plan';
|
|
7
|
+
/** Slug git-safe do título do plano p/ o Studio nomear o worktree; degenerado → fallback. Puro. */
|
|
8
|
+
export function suggestSlug(plan) {
|
|
9
|
+
const heading = /^#{1,6}\s+(.+?)\s*$/m.exec(plan)?.[1];
|
|
10
|
+
const title = (heading ?? plan.split('\n').find((l) => l.trim()) ?? '').trim();
|
|
11
|
+
const slug = title
|
|
12
|
+
.normalize('NFD')
|
|
13
|
+
.replace(/\p{Diacritic}/gu, '')
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
16
|
+
.replace(/^-+|-+$/g, '')
|
|
17
|
+
.slice(0, SLUG_MAX)
|
|
18
|
+
.replace(/-+$/g, '');
|
|
19
|
+
return slug || SLUG_FALLBACK;
|
|
20
|
+
}
|
|
21
|
+
export function planMissingError(project) {
|
|
22
|
+
return `plan.md não encontrado em ${project} — rode \`noclaf plan\` antes de validar`;
|
|
23
|
+
}
|
|
24
|
+
/** Lê o `plan.md` da raiz; ausente/vazio dispara — o caller vira em erro tratado. */
|
|
25
|
+
export function readPlan(project) {
|
|
26
|
+
const content = readFileSync(planPath(project), 'utf8');
|
|
27
|
+
if (!content.trim())
|
|
28
|
+
throw new Error('plan.md vazio');
|
|
29
|
+
return content;
|
|
30
|
+
}
|
|
31
|
+
/** Preâmbulo de triagem: ancora no harness e pede veredito + justificativa parseáveis. */
|
|
32
|
+
export function buildValidatePrompt(plan) {
|
|
33
|
+
return [
|
|
34
|
+
'Você está TRIANDO um plano — não implemente nada, não escreva código, não edite arquivos.',
|
|
35
|
+
'Antes: leia AGENTS.md e docs/_rules/noclaf.md deste projeto e respeite o harness.',
|
|
36
|
+
'Julgue a COMPLEXIDADE do plano frente ao IMPACTO REAL no código deste repositório:',
|
|
37
|
+
'plano amplo/abrangente (muitos módulos, decisões de arquitetura, risco) MERECE uma spec SDD antes;',
|
|
38
|
+
'plano pequeno/localizado pode ir direto para a implementação.',
|
|
39
|
+
'Responda APENAS neste formato, sem cercas de código:',
|
|
40
|
+
'VERDICT: yes|no',
|
|
41
|
+
'REASON: <uma ou duas frases legíveis explicando o porquê>',
|
|
42
|
+
'yes = precisa de spec antes; no = pode implementar direto.',
|
|
43
|
+
'',
|
|
44
|
+
'## Plano (plan.md)',
|
|
45
|
+
plan,
|
|
46
|
+
].join('\n');
|
|
47
|
+
}
|
|
48
|
+
/** Normaliza a resposta do engine em `{ needsSpec, reason }`; ambíguo → dispara. */
|
|
49
|
+
export function parseVerdict(text) {
|
|
50
|
+
const clean = stripFence(text);
|
|
51
|
+
const m = /^[ \t]*VERDICT:[ \t]*(yes|no)\b[ \t]*(.*)$/im.exec(clean);
|
|
52
|
+
if (!m)
|
|
53
|
+
throw new Error('veredito ambíguo: falta a linha `VERDICT: yes|no`');
|
|
54
|
+
const needsSpec = m[1].toLowerCase() === 'yes';
|
|
55
|
+
const rest = clean.replace(m[0], '').trim();
|
|
56
|
+
const reason = (rest || m[2].trim())
|
|
57
|
+
.replace(/^[ \t]*REASON:[ \t]*/i, '')
|
|
58
|
+
.replace(/^[\s—:-]+/, '')
|
|
59
|
+
.trim();
|
|
60
|
+
if (!reason)
|
|
61
|
+
throw new Error('veredito ambíguo: sem justificativa (reason vazio)');
|
|
62
|
+
return { needsSpec, reason };
|
|
63
|
+
}
|
|
64
|
+
function spawnValidate(bin, engine, prompt, project, echo) {
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
const child = spawn(bin, engineArgs(engine, prompt), {
|
|
67
|
+
cwd: project,
|
|
68
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
69
|
+
});
|
|
70
|
+
let out = '';
|
|
71
|
+
child.stdout.on('data', (d) => (out += d.toString()));
|
|
72
|
+
child.stderr.on('data', (d) => echo && process.stderr.write(d.toString()));
|
|
73
|
+
const fail = (error) => resolve({ ok: false, engine, error });
|
|
74
|
+
child.on('error', (e) => fail(e.message));
|
|
75
|
+
child.on('close', (code) => {
|
|
76
|
+
if (code !== 0)
|
|
77
|
+
return fail(`engine ${engine} falhou (exit ${code})`);
|
|
78
|
+
try {
|
|
79
|
+
resolve({ ok: true, engine, ...parseVerdict(out) });
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
fail(e.message);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Bloqueante: lê o plano, roda o engine pensante e devolve o veredito. `echo` streama log. */
|
|
88
|
+
export async function runValidatePlan(opts) {
|
|
89
|
+
const engine = opts.engine ?? PLAN_ENGINE;
|
|
90
|
+
let plan;
|
|
91
|
+
try {
|
|
92
|
+
plan = readPlan(opts.project);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { ok: false, engine, error: planMissingError(opts.project) };
|
|
96
|
+
}
|
|
97
|
+
const bin = resolveEngineBin(engine);
|
|
98
|
+
if (!bin)
|
|
99
|
+
return { ok: false, engine, error: engineMissingError(engine) };
|
|
100
|
+
const result = await spawnValidate(bin, engine, buildValidatePrompt(plan), opts.project, opts.echo === true);
|
|
101
|
+
if (result.ok && result.needsSpec)
|
|
102
|
+
result.suggestedSlug = suggestSlug(plan);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=validate-plan-delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plan-delegate.js","sourceRoot":"","sources":["../../src/lib/validate-plan-delegate.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import * as recordDelivery from './record-delivery.js';
|
|
|
17
17
|
import * as delegateExec from './delegate-exec.js';
|
|
18
18
|
import * as execStatus from './exec-status.js';
|
|
19
19
|
import * as plan from './plan.js';
|
|
20
|
+
import * as validatePlan from './validate-plan.js';
|
|
20
21
|
export const tools = {
|
|
21
22
|
[getContext.definition.name]: getContext,
|
|
22
23
|
[listProjects.definition.name]: listProjects,
|
|
@@ -37,6 +38,7 @@ export const tools = {
|
|
|
37
38
|
[delegateExec.definition.name]: delegateExec,
|
|
38
39
|
[execStatus.definition.name]: execStatus,
|
|
39
40
|
[plan.definition.name]: plan,
|
|
41
|
+
[validatePlan.definition.name]: validatePlan,
|
|
40
42
|
};
|
|
41
43
|
export const toolDefinitions = Object.values(tools).map((t) => t.definition);
|
|
42
44
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAanD,MAAM,CAAC,MAAM,KAAK,GAA+B;IAC/C,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY;IAC5C,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS;IACtC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO;IAClC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ;IACpC,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW;IAC1C,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe;IAClD,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa;IAC9C,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,mBAAmB;IAC1D,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB;IACtD,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,mBAAmB;IAC1D,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB;IACtD,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,cAAc;IAChD,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY;IAC5C,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI;IAC5B,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAW,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
4
|
+
import { runValidatePlan } from '../lib/validate-plan-delegate.js';
|
|
5
|
+
import { ENGINES, PLAN_ENGINE } from '../lib/exec-engines.js';
|
|
6
|
+
const ArgsSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
project: z.string().min(1),
|
|
9
|
+
engine: z.enum(ENGINES).optional(),
|
|
10
|
+
})
|
|
11
|
+
.strict();
|
|
12
|
+
export const definition = {
|
|
13
|
+
name: 'noclaf_validate_plan',
|
|
14
|
+
description: 'Lê o `plan.md` da raiz do projeto e roda o engine PENSANTE (claude ou codex local, na ' +
|
|
15
|
+
'assinatura — sem API) para julgar se o plano é complexo o bastante para virar uma spec SDD ' +
|
|
16
|
+
'antes de implementar. Devolve { needsSpec, reason, suggestedSlug? } — é triagem, NÃO gera spec ' +
|
|
17
|
+
'nem código. suggestedSlug (slug git-safe p/ nomear o worktree) só sai quando needsSpec. ' +
|
|
18
|
+
'Requer um `plan.md` (rode `noclaf_plan` antes).',
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
project: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Caminho absoluto da raiz do projeto onde vive o plan.md.',
|
|
25
|
+
},
|
|
26
|
+
engine: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
enum: [...ENGINES],
|
|
29
|
+
description: `Agente pensante a usar. Default: ${PLAN_ENGINE}.`,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
required: ['project'],
|
|
33
|
+
additionalProperties: false,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export async function handler(args, _ctx) {
|
|
37
|
+
const parsed = ArgsSchema.safeParse(args);
|
|
38
|
+
if (!parsed.success) {
|
|
39
|
+
return errorResult(`Argumento inválido: ${parsed.error.message}`);
|
|
40
|
+
}
|
|
41
|
+
const { project, engine } = parsed.data;
|
|
42
|
+
if (!existsSync(project)) {
|
|
43
|
+
return errorResult(`Projeto não encontrado: ${project}`);
|
|
44
|
+
}
|
|
45
|
+
const result = await runValidatePlan({ project, engine });
|
|
46
|
+
if (!result.ok) {
|
|
47
|
+
return errorResult(result.error ?? 'falha ao validar o plano');
|
|
48
|
+
}
|
|
49
|
+
return jsonResult({
|
|
50
|
+
ok: true,
|
|
51
|
+
needsSpec: result.needsSpec,
|
|
52
|
+
reason: result.reason,
|
|
53
|
+
suggestedSlug: result.suggestedSlug,
|
|
54
|
+
engine: result.engine,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=validate-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plan.js","sourceRoot":"","sources":["../../src/tools/validate-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,wFAAwF;QACxF,6FAA6F;QAC7F,iGAAiG;QACjG,0FAA0F;QAC1F,iDAAiD;IACnD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;aACxE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;gBAClB,WAAW,EAAE,oCAAoC,WAAW,GAAG;aAChE;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,IAAiB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,0BAA0B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU,CAAC;QAChB,EAAE,EAAE,IAAI;QACR,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED