@deftai/directive 0.70.0 → 0.71.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/dist/cli-router/route-argv.js +1 -0
- package/dist/dispatch.d.ts +2 -2
- package/dist/dispatch.js +19 -0
- package/dist/eval-health.d.ts +13 -0
- package/dist/eval-health.js +63 -0
- package/dist/eval-report.d.ts +15 -0
- package/dist/eval-report.js +97 -0
- package/dist/eval-run.d.ts +17 -0
- package/dist/eval-run.js +122 -0
- package/dist/policy.d.ts +1 -1
- package/dist/policy.js +27 -4
- package/dist/triage-queue.js +3 -3
- package/dist/triage-summary.js +2 -2
- package/package.json +3 -3
|
@@ -71,6 +71,7 @@ export const SUBCOMMAND_ROUTES = {
|
|
|
71
71
|
"policy:show": ["policy", "show"],
|
|
72
72
|
"policy:enforce-branches": ["policy", "enforce-branches"],
|
|
73
73
|
"policy:allow-direct-commits": ["policy", "allow-direct-commits"],
|
|
74
|
+
"policy:enable-value-feedback": ["policy", "enable-value-feedback"],
|
|
74
75
|
"vbrief:reconcile-graph": ["vbrief-reconcile", "graph"],
|
|
75
76
|
"vbrief:reconcile-labels": ["vbrief-reconcile", "labels"],
|
|
76
77
|
"vbrief:reconcile-umbrellas": ["vbrief-reconcile", "umbrellas"],
|
package/dist/dispatch.d.ts
CHANGED
|
@@ -10,9 +10,9 @@ export interface DispatchIo {
|
|
|
10
10
|
writeErr: (text: string) => void;
|
|
11
11
|
}
|
|
12
12
|
/** CLI modules in packages/cli/src (excluding parity harnesses and bin/index). */
|
|
13
|
-
export declare const CLI_MODULE_VERBS: readonly ["agents-refresh", "cache", "check", "capacity-backfill", "capacity-show", "codebase-default-extractor", "codebase-map", "codebase-map-fresh", "codebase-projection-registry", "codebase-provider", "doctor", "install-upgrade", "install-uninstall", "migrate-preflight", "migrate-xbrief", "migrate-category-b", "framework-check-updates", "umbrella-current-shape", "changelog-check", "change-init", "commit-lint", "policy", "pr-closing-keywords", "pr-merge-readiness", "pr-monitor", "pr-protected-issues", "pr-wait-mergeable", "pr-watch", "preflight-cache", "preflight-gh", "probe-session", "release", "release-e2e", "release-publish", "release-rollback", "scope-lifecycle", "session-start", "slice", "subagent-monitor", "toolchain-check", "triage-actions", "triage-bootstrap", "triage-bulk", "triage-classify", "triage-help", "triage-queue", "triage-reconcile", "triage-refresh", "triage-scope", "triage-scope-drift", "triage-smoketest", "triage-subscribe", "triage-summary", "triage-welcome", "ts-check-lane", "vbrief-activate", "vbrief-build", "vbrief-preflight", "vbrief-reconcile", "vbrief-validate", "vbrief-validation", "verify-branch", "verify-encoding", "verify-forward-coverage", "verify-hooks-installed", "verify-investigation", "verify-judgment-gates", "verify-no-task-runtime", "validate-links", "validate-strategy-output", "verify-biome-config", "verify-bridge-drift", "verify-capacity", "verify-content-manifest", "verify-contract-drift", "verify-cursor-tier1", "verify-go-freeze", "verify-scm-boundary", "verify-session-ritual", "verify-stubs", "verify-xbrief-drift", "rule-ownership-lint", "verify-story-ready", "verify-tools", "verify-wip-cap", "verify-agents-md-budget", "verify-agents-md-advisory"];
|
|
13
|
+
export declare const CLI_MODULE_VERBS: readonly ["agents-refresh", "cache", "check", "capacity-backfill", "capacity-show", "codebase-default-extractor", "codebase-map", "codebase-map-fresh", "codebase-projection-registry", "codebase-provider", "doctor", "install-upgrade", "install-uninstall", "migrate-preflight", "migrate-xbrief", "migrate-category-b", "framework-check-updates", "umbrella-current-shape", "changelog-check", "change-init", "commit-lint", "policy", "pr-closing-keywords", "pr-merge-readiness", "pr-monitor", "pr-protected-issues", "pr-wait-mergeable", "pr-watch", "preflight-cache", "preflight-gh", "probe-session", "release", "release-e2e", "release-publish", "release-rollback", "scope-lifecycle", "session-start", "slice", "subagent-monitor", "toolchain-check", "triage-actions", "triage-bootstrap", "triage-bulk", "triage-classify", "triage-help", "triage-queue", "triage-reconcile", "triage-refresh", "triage-scope", "triage-scope-drift", "triage-smoketest", "triage-subscribe", "triage-summary", "triage-welcome", "ts-check-lane", "vbrief-activate", "vbrief-build", "vbrief-preflight", "vbrief-reconcile", "vbrief-validate", "vbrief-validation", "verify-branch", "verify-encoding", "verify-forward-coverage", "verify-hooks-installed", "verify-investigation", "verify-judgment-gates", "verify-no-task-runtime", "validate-links", "validate-strategy-output", "verify-biome-config", "verify-bridge-drift", "verify-capacity", "verify-content-manifest", "verify-contract-drift", "verify-cursor-tier1", "verify-go-freeze", "verify-scm-boundary", "verify-session-ritual", "verify-stubs", "verify-xbrief-drift", "rule-ownership-lint", "verify-story-ready", "verify-tools", "verify-wip-cap", "verify-agents-md-budget", "verify-agents-md-advisory", "eval-health", "eval-run", "eval-report"];
|
|
14
14
|
/** Core-only CLI entrypoints without a packages/cli wrapper. */
|
|
15
|
-
export declare const CORE_MODULE_VERBS: readonly ["scm", "github-auth-modes", "github-body", "issue-emit", "issue-ingest", "reconcile-issues", "swarm-launch", "swarm-complete-cohort", "swarm-finalize-cohort", "swarm-readiness", "swarm-routing-verify", "swarm-routing-set", "swarm-verify-review-clean", "swarm-worktrees", "framework-commands", "pack-render", "packs-slice", "prd-render", "export-spec", "project-render", "roadmap-render", "spec-render", "spec-validate", "code-structure-validate", "pack-migrate-skills", "pack-migrate-rules", "pack-migrate-strategies", "pack-migrate-patterns", "pack-migrate-swarm-spec", "policy-set", "setup-ghx", "scope-undo", "scope-demote", "scope-decompose", "changelog-resolve-unreleased", "architecture-preflight-sor"];
|
|
15
|
+
export declare const CORE_MODULE_VERBS: readonly ["scm", "github-auth-modes", "github-body", "issue-emit", "issue-ingest", "reconcile-issues", "swarm-launch", "swarm-complete-cohort", "swarm-finalize-cohort", "swarm-readiness", "swarm-routing-verify", "swarm-routing-set", "swarm-verify-review-clean", "swarm-worktrees", "framework-commands", "pack-render", "packs-slice", "prd-render", "export-spec", "project-render", "roadmap-render", "spec-render", "spec-validate", "code-structure-validate", "pack-migrate-skills", "pack-migrate-rules", "pack-migrate-strategies", "pack-migrate-patterns", "pack-migrate-swarm-spec", "policy-set", "setup-ghx", "scope-undo", "scope-demote", "scope-decompose", "changelog-resolve-unreleased", "architecture-preflight-sor", "feedback-file", "value-readback"];
|
|
16
16
|
/** Colon aliases for triage-actions (mirrors cli-router SUBCOMMAND_ROUTES). */
|
|
17
17
|
export declare const TRIAGE_ACTION_ALIAS_SUBCOMMANDS: Readonly<Record<string, string>>;
|
|
18
18
|
/** Task-style aliases (framework_commands / Taskfile names). */
|
package/dist/dispatch.js
CHANGED
|
@@ -111,6 +111,9 @@ export const CLI_MODULE_VERBS = [
|
|
|
111
111
|
"verify-wip-cap",
|
|
112
112
|
"verify-agents-md-budget",
|
|
113
113
|
"verify-agents-md-advisory",
|
|
114
|
+
"eval-health",
|
|
115
|
+
"eval-run",
|
|
116
|
+
"eval-report",
|
|
114
117
|
];
|
|
115
118
|
/** Core-only CLI entrypoints without a packages/cli wrapper. */
|
|
116
119
|
export const CORE_MODULE_VERBS = [
|
|
@@ -150,6 +153,8 @@ export const CORE_MODULE_VERBS = [
|
|
|
150
153
|
"scope-decompose",
|
|
151
154
|
"changelog-resolve-unreleased",
|
|
152
155
|
"architecture-preflight-sor",
|
|
156
|
+
"feedback-file",
|
|
157
|
+
"value-readback",
|
|
153
158
|
];
|
|
154
159
|
/** Colon aliases for triage-actions (mirrors cli-router SUBCOMMAND_ROUTES). */
|
|
155
160
|
export const TRIAGE_ACTION_ALIAS_SUBCOMMANDS = {
|
|
@@ -222,6 +227,12 @@ export const VERB_ALIASES = {
|
|
|
222
227
|
"project:render": "project-render",
|
|
223
228
|
"project:export-spec": "export-spec",
|
|
224
229
|
doctor: "doctor",
|
|
230
|
+
"eval:health": "eval-health",
|
|
231
|
+
"feedback:file": "feedback-file",
|
|
232
|
+
"value:show": "value-readback",
|
|
233
|
+
"triage:metrics": "value-readback",
|
|
234
|
+
"eval:run": "eval-run",
|
|
235
|
+
"eval:report": "eval-report",
|
|
225
236
|
build: "framework-commands",
|
|
226
237
|
"setup:ghx": "setup-ghx",
|
|
227
238
|
};
|
|
@@ -2282,6 +2293,14 @@ async function loadCoreModuleHandler(verb, io) {
|
|
|
2282
2293
|
const { architecturePreflightSorMain } = await import("@deftai/directive-core/dist/architecture/sor-preflight.js");
|
|
2283
2294
|
return architecturePreflightSorMain;
|
|
2284
2295
|
}
|
|
2296
|
+
case "feedback-file": {
|
|
2297
|
+
const { mainEntry } = await import("@deftai/directive-core/dist/value/feedback-file.js");
|
|
2298
|
+
return mainEntry;
|
|
2299
|
+
}
|
|
2300
|
+
case "value-readback": {
|
|
2301
|
+
const { mainEntry } = await import("@deftai/directive-core/dist/value/readback.js");
|
|
2302
|
+
return mainEntry;
|
|
2303
|
+
}
|
|
2285
2304
|
default:
|
|
2286
2305
|
throw new Error(`unknown core verb: ${verb}`);
|
|
2287
2306
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
json: boolean;
|
|
5
|
+
noPersist: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Parse eval-health CLI args. */
|
|
9
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
10
|
+
/** Run eval:health and return the process exit code. */
|
|
11
|
+
export declare function run(argv: string[]): number;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=eval-health.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { evaluateHealth } from "@deftai/directive-core/eval";
|
|
5
|
+
/** Parse eval-health CLI args. */
|
|
6
|
+
export function parseArgs(argv) {
|
|
7
|
+
const parsed = {
|
|
8
|
+
projectRoot: ".",
|
|
9
|
+
json: false,
|
|
10
|
+
noPersist: false,
|
|
11
|
+
};
|
|
12
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
13
|
+
const arg = argv[i];
|
|
14
|
+
if (arg === "--json") {
|
|
15
|
+
parsed.json = true;
|
|
16
|
+
}
|
|
17
|
+
else if (arg === "--no-persist") {
|
|
18
|
+
parsed.noPersist = true;
|
|
19
|
+
}
|
|
20
|
+
else if (arg === "--project-root") {
|
|
21
|
+
const value = argv[i + 1];
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
24
|
+
}
|
|
25
|
+
parsed.projectRoot = value;
|
|
26
|
+
i += 1;
|
|
27
|
+
}
|
|
28
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
29
|
+
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return parsed;
|
|
36
|
+
}
|
|
37
|
+
/** Run eval:health and return the process exit code. */
|
|
38
|
+
export function run(argv) {
|
|
39
|
+
const args = parseArgs(argv);
|
|
40
|
+
if (args.error !== undefined) {
|
|
41
|
+
process.stderr.write(`eval:health: ${args.error}\n`);
|
|
42
|
+
return 2;
|
|
43
|
+
}
|
|
44
|
+
const result = evaluateHealth({
|
|
45
|
+
projectRoot: resolve(args.projectRoot),
|
|
46
|
+
persist: !args.noPersist,
|
|
47
|
+
});
|
|
48
|
+
if (result.report === null) {
|
|
49
|
+
process.stderr.write(`${result.message}\n`);
|
|
50
|
+
return result.code;
|
|
51
|
+
}
|
|
52
|
+
if (args.json) {
|
|
53
|
+
process.stdout.write(`${JSON.stringify(result.report, null, 2)}\n`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
process.stdout.write(`${result.message}\n`);
|
|
57
|
+
}
|
|
58
|
+
return result.code;
|
|
59
|
+
}
|
|
60
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
61
|
+
process.exit(run(process.argv.slice(2)));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=eval-health.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
championVersion: string;
|
|
5
|
+
challengerVersion: string;
|
|
6
|
+
model: string;
|
|
7
|
+
json: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Parse eval-report CLI args. */
|
|
11
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
12
|
+
/** Run eval:report and return the process exit code. */
|
|
13
|
+
export declare function run(argv: string[]): number;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=eval-report.d.ts.map
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { reportGoldenEval } from "@deftai/directive-core/eval/report";
|
|
5
|
+
/** Parse eval-report CLI args. */
|
|
6
|
+
export function parseArgs(argv) {
|
|
7
|
+
const parsed = {
|
|
8
|
+
projectRoot: ".",
|
|
9
|
+
championVersion: "",
|
|
10
|
+
challengerVersion: "",
|
|
11
|
+
model: "",
|
|
12
|
+
json: false,
|
|
13
|
+
};
|
|
14
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
15
|
+
const arg = argv[i];
|
|
16
|
+
if (arg === "--json") {
|
|
17
|
+
parsed.json = true;
|
|
18
|
+
}
|
|
19
|
+
else if (arg === "--champion") {
|
|
20
|
+
const value = argv[i + 1];
|
|
21
|
+
if (value === undefined) {
|
|
22
|
+
return { ...parsed, error: "argument --champion: expected one argument" };
|
|
23
|
+
}
|
|
24
|
+
parsed.championVersion = value;
|
|
25
|
+
i += 1;
|
|
26
|
+
}
|
|
27
|
+
else if (arg?.startsWith("--champion=")) {
|
|
28
|
+
parsed.championVersion = arg.slice("--champion=".length);
|
|
29
|
+
}
|
|
30
|
+
else if (arg === "--challenger") {
|
|
31
|
+
const value = argv[i + 1];
|
|
32
|
+
if (value === undefined) {
|
|
33
|
+
return { ...parsed, error: "argument --challenger: expected one argument" };
|
|
34
|
+
}
|
|
35
|
+
parsed.challengerVersion = value;
|
|
36
|
+
i += 1;
|
|
37
|
+
}
|
|
38
|
+
else if (arg?.startsWith("--challenger=")) {
|
|
39
|
+
parsed.challengerVersion = arg.slice("--challenger=".length);
|
|
40
|
+
}
|
|
41
|
+
else if (arg === "--model") {
|
|
42
|
+
const value = argv[i + 1];
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
return { ...parsed, error: "argument --model: expected one argument" };
|
|
45
|
+
}
|
|
46
|
+
parsed.model = value;
|
|
47
|
+
i += 1;
|
|
48
|
+
}
|
|
49
|
+
else if (arg?.startsWith("--model=")) {
|
|
50
|
+
parsed.model = arg.slice("--model=".length);
|
|
51
|
+
}
|
|
52
|
+
else if (arg === "--project-root") {
|
|
53
|
+
const value = argv[i + 1];
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
56
|
+
}
|
|
57
|
+
parsed.projectRoot = value;
|
|
58
|
+
i += 1;
|
|
59
|
+
}
|
|
60
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
61
|
+
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return parsed;
|
|
68
|
+
}
|
|
69
|
+
/** Run eval:report and return the process exit code. */
|
|
70
|
+
export function run(argv) {
|
|
71
|
+
const args = parseArgs(argv);
|
|
72
|
+
if (args.error !== undefined) {
|
|
73
|
+
process.stderr.write(`eval:report: ${args.error}\n`);
|
|
74
|
+
return 2;
|
|
75
|
+
}
|
|
76
|
+
const result = reportGoldenEval({
|
|
77
|
+
projectRoot: resolve(args.projectRoot),
|
|
78
|
+
championVersion: args.championVersion,
|
|
79
|
+
challengerVersion: args.challengerVersion,
|
|
80
|
+
model: args.model,
|
|
81
|
+
});
|
|
82
|
+
if (result.report === null) {
|
|
83
|
+
process.stderr.write(`${result.message}\n`);
|
|
84
|
+
return result.code;
|
|
85
|
+
}
|
|
86
|
+
if (args.json) {
|
|
87
|
+
process.stdout.write(`${JSON.stringify(result.report, null, 2)}\n`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
process.stdout.write(`${result.message}\n`);
|
|
91
|
+
}
|
|
92
|
+
return result.code;
|
|
93
|
+
}
|
|
94
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
95
|
+
process.exit(run(process.argv.slice(2)));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=eval-report.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
model: string;
|
|
5
|
+
seeds: number[];
|
|
6
|
+
directiveVersion?: string;
|
|
7
|
+
harness?: string;
|
|
8
|
+
json: boolean;
|
|
9
|
+
noPersist: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Parse eval-run CLI args. */
|
|
13
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
14
|
+
/** Run eval:run and return the process exit code. */
|
|
15
|
+
export declare function run(argv: string[]): number;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=eval-run.d.ts.map
|
package/dist/eval-run.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { runGoldenEval } from "@deftai/directive-core/eval/run";
|
|
5
|
+
/** Parse eval-run CLI args. */
|
|
6
|
+
export function parseArgs(argv) {
|
|
7
|
+
const parsed = {
|
|
8
|
+
projectRoot: ".",
|
|
9
|
+
model: "",
|
|
10
|
+
seeds: [],
|
|
11
|
+
json: false,
|
|
12
|
+
noPersist: false,
|
|
13
|
+
};
|
|
14
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
15
|
+
const arg = argv[i];
|
|
16
|
+
if (arg === "--json") {
|
|
17
|
+
parsed.json = true;
|
|
18
|
+
}
|
|
19
|
+
else if (arg === "--no-persist") {
|
|
20
|
+
parsed.noPersist = true;
|
|
21
|
+
}
|
|
22
|
+
else if (arg === "--model") {
|
|
23
|
+
const value = argv[i + 1];
|
|
24
|
+
if (value === undefined) {
|
|
25
|
+
return { ...parsed, error: "argument --model: expected one argument" };
|
|
26
|
+
}
|
|
27
|
+
parsed.model = value;
|
|
28
|
+
i += 1;
|
|
29
|
+
}
|
|
30
|
+
else if (arg?.startsWith("--model=")) {
|
|
31
|
+
parsed.model = arg.slice("--model=".length);
|
|
32
|
+
}
|
|
33
|
+
else if (arg === "--seed") {
|
|
34
|
+
const value = argv[i + 1];
|
|
35
|
+
if (value === undefined) {
|
|
36
|
+
return { ...parsed, error: "argument --seed: expected one argument" };
|
|
37
|
+
}
|
|
38
|
+
const seedNum = Number(value);
|
|
39
|
+
if (!Number.isFinite(seedNum)) {
|
|
40
|
+
return { ...parsed, error: `argument --seed: expected an integer, got: ${value}` };
|
|
41
|
+
}
|
|
42
|
+
parsed.seeds.push(seedNum);
|
|
43
|
+
i += 1;
|
|
44
|
+
}
|
|
45
|
+
else if (arg?.startsWith("--seed=")) {
|
|
46
|
+
const rawSeed = arg.slice("--seed=".length);
|
|
47
|
+
const seedNum = Number(rawSeed);
|
|
48
|
+
if (!Number.isFinite(seedNum)) {
|
|
49
|
+
return { ...parsed, error: `argument --seed: expected an integer, got: ${rawSeed}` };
|
|
50
|
+
}
|
|
51
|
+
parsed.seeds.push(seedNum);
|
|
52
|
+
}
|
|
53
|
+
else if (arg === "--directive-version") {
|
|
54
|
+
const value = argv[i + 1];
|
|
55
|
+
if (value === undefined) {
|
|
56
|
+
return { ...parsed, error: "argument --directive-version: expected one argument" };
|
|
57
|
+
}
|
|
58
|
+
parsed.directiveVersion = value;
|
|
59
|
+
i += 1;
|
|
60
|
+
}
|
|
61
|
+
else if (arg?.startsWith("--directive-version=")) {
|
|
62
|
+
parsed.directiveVersion = arg.slice("--directive-version=".length);
|
|
63
|
+
}
|
|
64
|
+
else if (arg === "--harness") {
|
|
65
|
+
const value = argv[i + 1];
|
|
66
|
+
if (value === undefined) {
|
|
67
|
+
return { ...parsed, error: "argument --harness: expected one argument" };
|
|
68
|
+
}
|
|
69
|
+
parsed.harness = value;
|
|
70
|
+
i += 1;
|
|
71
|
+
}
|
|
72
|
+
else if (arg?.startsWith("--harness=")) {
|
|
73
|
+
parsed.harness = arg.slice("--harness=".length);
|
|
74
|
+
}
|
|
75
|
+
else if (arg === "--project-root") {
|
|
76
|
+
const value = argv[i + 1];
|
|
77
|
+
if (value === undefined) {
|
|
78
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
79
|
+
}
|
|
80
|
+
parsed.projectRoot = value;
|
|
81
|
+
i += 1;
|
|
82
|
+
}
|
|
83
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
84
|
+
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
/** Run eval:run and return the process exit code. */
|
|
93
|
+
export function run(argv) {
|
|
94
|
+
const args = parseArgs(argv);
|
|
95
|
+
if (args.error !== undefined) {
|
|
96
|
+
process.stderr.write(`eval:run: ${args.error}\n`);
|
|
97
|
+
return 2;
|
|
98
|
+
}
|
|
99
|
+
const result = runGoldenEval({
|
|
100
|
+
projectRoot: resolve(args.projectRoot),
|
|
101
|
+
model: args.model,
|
|
102
|
+
seeds: args.seeds.length > 0 ? args.seeds : undefined,
|
|
103
|
+
directiveVersion: args.directiveVersion,
|
|
104
|
+
harness: args.harness,
|
|
105
|
+
persist: !args.noPersist,
|
|
106
|
+
});
|
|
107
|
+
if (result.record === null) {
|
|
108
|
+
process.stderr.write(`${result.message}\n`);
|
|
109
|
+
return result.code;
|
|
110
|
+
}
|
|
111
|
+
if (args.json) {
|
|
112
|
+
process.stdout.write(`${JSON.stringify(result.record, null, 2)}\n`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
process.stdout.write(`${result.message}\n`);
|
|
116
|
+
}
|
|
117
|
+
return result.code;
|
|
118
|
+
}
|
|
119
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
120
|
+
process.exit(run(process.argv.slice(2)));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=eval-run.js.map
|
package/dist/policy.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ interface ShowArgs {
|
|
|
7
7
|
error?: string;
|
|
8
8
|
}
|
|
9
9
|
interface SetArgs {
|
|
10
|
-
cmd: "show" | "enforce-branches" | "allow-direct-commits" | "resolve";
|
|
10
|
+
cmd: "show" | "enforce-branches" | "allow-direct-commits" | "enable-value-feedback" | "resolve";
|
|
11
11
|
confirm: boolean;
|
|
12
12
|
actor: string;
|
|
13
13
|
note: string;
|
package/dist/policy.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
7
|
import { resolve as pathResolve, relative } from "node:path";
|
|
8
8
|
import { fileURLToPath } from "node:url";
|
|
9
|
-
import { describeShadowedPlanExtension, detectShadowedPlanExtensions, disclosureLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, projectDefinitionPath, pythonListRepr, pythonStringRepr, registeredPolicyNames, renderJson, renderText, resolvePolicy, setPolicy, } from "@deftai/directive-core/policy";
|
|
9
|
+
import { describeShadowedPlanExtension, detectShadowedPlanExtensions, disclosureLine, enableValueFeedback, FIELD_VALUE_FEEDBACK, FIELD_VALUE_FEEDBACK_CLI_ALIAS, formatValueFeedbackStatusLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, projectDefinitionPath, pythonListRepr, pythonStringRepr, registeredPolicyNames, renderJson, renderText, resolvePolicy, resolveValueFeedback, setPolicy, } from "@deftai/directive-core/policy";
|
|
10
10
|
const CAPABILITY_COST_DISCLOSURE = "\u26a0 Capability-cost disclosure -- enabling direct commits to the default " +
|
|
11
11
|
"branch turns OFF the deft branch-protection policy.\n" +
|
|
12
12
|
" \u2022 Pre-commit + pre-push hooks will no longer block default-branch " +
|
|
@@ -112,7 +112,8 @@ export function parseShowArgs(argv) {
|
|
|
112
112
|
/** Parse argv for the policy CLI (show + set subcommands). */
|
|
113
113
|
export function parseArgs(argv) {
|
|
114
114
|
if (argv.length === 0) {
|
|
115
|
-
|
|
115
|
+
const usage = "usage: policy [show|enforce-branches|allow-direct-commits|enable-value-feedback|resolve] ...";
|
|
116
|
+
return makeSetError(usage);
|
|
116
117
|
}
|
|
117
118
|
const cmd = argv[0];
|
|
118
119
|
if (cmd === "show") {
|
|
@@ -143,11 +144,15 @@ export function parseArgs(argv) {
|
|
|
143
144
|
error: root.error,
|
|
144
145
|
};
|
|
145
146
|
}
|
|
146
|
-
if (cmd === "enforce-branches" ||
|
|
147
|
+
if (cmd === "enforce-branches" ||
|
|
148
|
+
cmd === "allow-direct-commits" ||
|
|
149
|
+
cmd === "enable-value-feedback") {
|
|
147
150
|
let confirm = false;
|
|
148
151
|
let actor = cmd === "enforce-branches"
|
|
149
152
|
? "task policy:enforce-branches"
|
|
150
|
-
: "
|
|
153
|
+
: cmd === "allow-direct-commits"
|
|
154
|
+
? "task policy:allow-direct-commits"
|
|
155
|
+
: "task policy:enable-value-feedback";
|
|
151
156
|
let note = "";
|
|
152
157
|
let projectRoot = ".";
|
|
153
158
|
for (let i = 1; i < argv.length; i += 1) {
|
|
@@ -216,6 +221,9 @@ function emitPlanExtensionShadowWarnings(projectRoot) {
|
|
|
216
221
|
process.stderr.write(`[policy:show] WARNING: ${describeShadowedPlanExtension(shadow)}\n`);
|
|
217
222
|
}
|
|
218
223
|
}
|
|
224
|
+
function valueFeedbackGateSummary(projectRoot) {
|
|
225
|
+
return formatValueFeedbackStatusLine(resolveValueFeedback(projectRoot));
|
|
226
|
+
}
|
|
219
227
|
function runShow(args) {
|
|
220
228
|
const projectRoot = pathResolve(args.projectRoot);
|
|
221
229
|
// Layout-aware (#2302): name the resolved PROJECT-DEFINITION path (xbrief on a
|
|
@@ -239,6 +247,9 @@ function runShow(args) {
|
|
|
239
247
|
}
|
|
240
248
|
else {
|
|
241
249
|
process.stdout.write(`${renderText([field])}\n`);
|
|
250
|
+
if (field.name === FIELD_VALUE_FEEDBACK || args.field === FIELD_VALUE_FEEDBACK_CLI_ALIAS) {
|
|
251
|
+
process.stdout.write(`\n${valueFeedbackGateSummary(projectRoot)}\n`);
|
|
252
|
+
}
|
|
242
253
|
}
|
|
243
254
|
return 0;
|
|
244
255
|
}
|
|
@@ -267,6 +278,15 @@ function runResolve(projectRoot) {
|
|
|
267
278
|
process.stdout.write(`${disclosureLine(result)}\n`);
|
|
268
279
|
return 0;
|
|
269
280
|
}
|
|
281
|
+
function runEnableValueFeedback(args) {
|
|
282
|
+
const result = enableValueFeedback(pathResolve(args.projectRoot), {
|
|
283
|
+
confirm: args.confirm,
|
|
284
|
+
actor: args.actor,
|
|
285
|
+
note: args.note,
|
|
286
|
+
});
|
|
287
|
+
process.stdout.write(result.stdout);
|
|
288
|
+
return result.exitCode;
|
|
289
|
+
}
|
|
270
290
|
function runSet(args) {
|
|
271
291
|
const projectRoot = pathResolve(args.projectRoot);
|
|
272
292
|
if (args.cmd === "allow-direct-commits" && !args.confirm) {
|
|
@@ -326,6 +346,9 @@ export function run(argv) {
|
|
|
326
346
|
if (args.cmd === "enforce-branches" || args.cmd === "allow-direct-commits") {
|
|
327
347
|
return runSet(args);
|
|
328
348
|
}
|
|
349
|
+
if (args.cmd === "enable-value-feedback") {
|
|
350
|
+
return runEnableValueFeedback(args);
|
|
351
|
+
}
|
|
329
352
|
return 2;
|
|
330
353
|
}
|
|
331
354
|
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
package/dist/triage-queue.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import {
|
|
4
|
+
import { resolveTriageCachePath } from "@deftai/directive-core/dist/triage/cache-path.js";
|
|
5
5
|
import { activeReferencedIssueNumbers, buildQueue, collectOrphanIssueNumbers, DEFAULT_QUEUE_LIMIT, loadCachedIssues, loadSliceRecords, readAuditEntries, reconcileLiveOpenState, renderQueue, resolveRankingLabels, resolveRepo, } from "@deftai/directive-core/dist/triage/queue/index.js";
|
|
6
6
|
import { resolveScopeIgnores } from "@deftai/directive-core/dist/triage/scope-drift/index.js";
|
|
7
7
|
/** Parse triage-queue CLI args for the queue subcommand. */
|
|
@@ -146,12 +146,12 @@ export function run(argv, options = {}) {
|
|
|
146
146
|
const issuesWithClosed = loadCachedIssues(repo, { projectRoot, includeClosed: true });
|
|
147
147
|
const issuesByNumber = new Map(issuesWithClosed.map((row) => [row.number, row]));
|
|
148
148
|
const auditEntries = readAuditEntries(repo, {
|
|
149
|
-
auditLogPath: args.auditLog ??
|
|
149
|
+
auditLogPath: args.auditLog ?? resolveTriageCachePath(projectRoot, "candidates.jsonl"),
|
|
150
150
|
});
|
|
151
151
|
const rankingLabels = resolveRankingLabels(projectRoot);
|
|
152
152
|
const activeRefs = activeReferencedIssueNumbers(projectRoot);
|
|
153
153
|
const sliceRecords = loadSliceRecords({
|
|
154
|
-
slicesLogPath: args.slicesLog ??
|
|
154
|
+
slicesLogPath: args.slicesLog ?? resolveTriageCachePath(projectRoot, "slices.jsonl"),
|
|
155
155
|
});
|
|
156
156
|
const orphanNumbers = collectOrphanIssueNumbers(sliceRecords, issuesByNumber);
|
|
157
157
|
const limit = args.limit === 0 ? null : Math.max(0, args.limit);
|
package/dist/triage-summary.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import {
|
|
4
|
+
import { resolveTriageCachePath } from "@deftai/directive-core/dist/triage/cache-path.js";
|
|
5
5
|
import { appendHistory, computeSummary, formatSummary, pythonStyleStringify, summaryResultToRecord, utcIso, } from "@deftai/directive-core/dist/triage/summary/index.js";
|
|
6
6
|
/** Parse triage-summary CLI args, mirroring the Python argparse surface. */
|
|
7
7
|
export function parseArgs(argv) {
|
|
@@ -67,7 +67,7 @@ export function run(argv) {
|
|
|
67
67
|
process.stdout.write(`${line}\n`);
|
|
68
68
|
}
|
|
69
69
|
if (!args.noHistory) {
|
|
70
|
-
const historyPath =
|
|
70
|
+
const historyPath = resolveTriageCachePath(projectRoot, "summary-history.jsonl");
|
|
71
71
|
appendHistory(historyPath, result, line, { emittedAt });
|
|
72
72
|
}
|
|
73
73
|
return 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.71.1",
|
|
4
4
|
"description": "Directive CLI — npm install path for the Deft Directive framework.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"provenance": true
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@deftai/directive-core": "^0.
|
|
35
|
-
"@deftai/directive-content": "^0.
|
|
34
|
+
"@deftai/directive-core": "^0.71.1",
|
|
35
|
+
"@deftai/directive-content": "^0.71.1"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc -b"
|