@deftai/directive 0.79.2 → 0.79.4
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 +40 -6
- package/dist/coverage-hotspots.d.ts +18 -0
- package/dist/coverage-hotspots.js +148 -0
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +11 -0
- package/dist/hook-dispatch.d.ts +6 -1
- package/dist/hook-dispatch.js +16 -7
- package/dist/review-monitor-register.d.ts +17 -0
- package/dist/review-monitor-register.js +166 -0
- package/dist/verify-review-monitor.d.ts +18 -0
- package/dist/verify-review-monitor.js +156 -0
- package/dist/verify-session-ritual.js +3 -0
- package/package.json +3 -3
|
@@ -129,6 +129,14 @@ function routeNamespaceVerb(ns, verb, rest) {
|
|
|
129
129
|
const subcommand = routeSubcommandKey(ns, verb, rest);
|
|
130
130
|
if (subcommand !== null)
|
|
131
131
|
return subcommand;
|
|
132
|
+
// PR stems (watch → pr-watch) must win over colon aliases like pr:watch (#2652),
|
|
133
|
+
// otherwise `directive pr watch` would dispatch the colon token and break PR_VERB_MAP.
|
|
134
|
+
if (ns === "pr") {
|
|
135
|
+
const prStem = PR_VERB_MAP[verb];
|
|
136
|
+
if (prStem !== undefined) {
|
|
137
|
+
return { kind: "dispatch", argv: [prStem, ...rest] };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
132
140
|
if (resolveCanonicalVerb(colonKey) !== null) {
|
|
133
141
|
return { kind: "dispatch", argv: [colonKey, ...rest] };
|
|
134
142
|
}
|
|
@@ -149,12 +157,6 @@ function routeNamespaceVerb(ns, verb, rest) {
|
|
|
149
157
|
if (verb === "undo")
|
|
150
158
|
return { kind: "dispatch", argv: ["scope-undo", ...rest] };
|
|
151
159
|
}
|
|
152
|
-
if (ns === "pr") {
|
|
153
|
-
const prStem = PR_VERB_MAP[verb];
|
|
154
|
-
if (prStem !== undefined) {
|
|
155
|
-
return { kind: "dispatch", argv: [prStem, ...rest] };
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
160
|
if (ns === "verify") {
|
|
159
161
|
const verifyStem = VERIFY_VERB_MAP[verb];
|
|
160
162
|
if (verifyStem !== undefined) {
|
|
@@ -179,6 +181,32 @@ function routeNamespaceVerb(ns, verb, rest) {
|
|
|
179
181
|
}
|
|
180
182
|
return null;
|
|
181
183
|
}
|
|
184
|
+
/** Split `namespace:verb` task keys (e.g. scope:promote) for namespace routing (#2654). */
|
|
185
|
+
function tryColonNamespaceRoute(first, rest) {
|
|
186
|
+
// Registered colon aliases (policy:show, pr:watch, …) stay on the flat path.
|
|
187
|
+
if (resolveCanonicalVerb(first) !== null)
|
|
188
|
+
return null;
|
|
189
|
+
const colon = first.indexOf(":");
|
|
190
|
+
if (colon <= 0)
|
|
191
|
+
return null;
|
|
192
|
+
const ns = first.slice(0, colon);
|
|
193
|
+
const verb = first.slice(colon + 1);
|
|
194
|
+
if (verb.length === 0)
|
|
195
|
+
return null;
|
|
196
|
+
return routeNamespaceVerb(ns, verb, [...rest]);
|
|
197
|
+
}
|
|
198
|
+
/** Split `scope-<verb>` dash aliases (e.g. scope-promote) for namespace routing (#2654). */
|
|
199
|
+
function tryScopeDashRoute(first, rest) {
|
|
200
|
+
if (resolveCanonicalVerb(first) !== null)
|
|
201
|
+
return null;
|
|
202
|
+
const prefix = "scope-";
|
|
203
|
+
if (!first.startsWith(prefix))
|
|
204
|
+
return null;
|
|
205
|
+
const verb = first.slice(prefix.length);
|
|
206
|
+
if (verb.length === 0)
|
|
207
|
+
return null;
|
|
208
|
+
return routeNamespaceVerb("scope", verb, [...rest]);
|
|
209
|
+
}
|
|
182
210
|
function routeThreeToken(ns, verb, subverb, rest) {
|
|
183
211
|
if (ns === "scm" && verb === "issue") {
|
|
184
212
|
return { kind: "dispatch", argv: ["scm", "issue", subverb, ...rest] };
|
|
@@ -214,6 +242,12 @@ export function routeArgv(argv) {
|
|
|
214
242
|
const topLevel = routeTopLevel(first, argv.slice(1));
|
|
215
243
|
if (topLevel !== null)
|
|
216
244
|
return topLevel;
|
|
245
|
+
const colonRoute = tryColonNamespaceRoute(first, argv.slice(1));
|
|
246
|
+
if (colonRoute !== null)
|
|
247
|
+
return colonRoute;
|
|
248
|
+
const scopeDashRoute = tryScopeDashRoute(first, argv.slice(1));
|
|
249
|
+
if (scopeDashRoute !== null)
|
|
250
|
+
return scopeDashRoute;
|
|
217
251
|
if (argv.length === 1 && resolveCanonicalVerb(first) !== null) {
|
|
218
252
|
return { kind: "dispatch", argv: [first] };
|
|
219
253
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
coverageDir: string | null;
|
|
5
|
+
minHeadroomPp: number | null;
|
|
6
|
+
baseRef: string | null;
|
|
7
|
+
pathFilter: string[];
|
|
8
|
+
useDiffPaths: boolean;
|
|
9
|
+
json: boolean;
|
|
10
|
+
quiet: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Parse coverage-hotspots CLI args. */
|
|
14
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
15
|
+
/** Run coverage-hotspots and return the process exit code. */
|
|
16
|
+
export declare function run(argv: string[]): number;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=coverage-hotspots.d.ts.map
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { evaluateCoverageHotspots, formatJsonReport } from "@deftai/directive-core";
|
|
5
|
+
function parseNumber(raw) {
|
|
6
|
+
const value = Number.parseFloat(raw);
|
|
7
|
+
if (!Number.isFinite(value)) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
/** Parse coverage-hotspots CLI args. */
|
|
13
|
+
export function parseArgs(argv) {
|
|
14
|
+
const parsed = {
|
|
15
|
+
projectRoot: ".",
|
|
16
|
+
coverageDir: null,
|
|
17
|
+
minHeadroomPp: null,
|
|
18
|
+
baseRef: null,
|
|
19
|
+
pathFilter: [],
|
|
20
|
+
useDiffPaths: true,
|
|
21
|
+
json: false,
|
|
22
|
+
quiet: false,
|
|
23
|
+
};
|
|
24
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
25
|
+
const arg = argv[i];
|
|
26
|
+
if (arg === "--json") {
|
|
27
|
+
parsed.json = true;
|
|
28
|
+
}
|
|
29
|
+
else if (arg === "--quiet") {
|
|
30
|
+
parsed.quiet = true;
|
|
31
|
+
}
|
|
32
|
+
else if (arg === "--no-diff-filter") {
|
|
33
|
+
parsed.useDiffPaths = false;
|
|
34
|
+
}
|
|
35
|
+
else if (arg === "--project-root") {
|
|
36
|
+
const value = argv[i + 1];
|
|
37
|
+
if (value === undefined) {
|
|
38
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
39
|
+
}
|
|
40
|
+
parsed.projectRoot = value;
|
|
41
|
+
i += 1;
|
|
42
|
+
}
|
|
43
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
44
|
+
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
45
|
+
}
|
|
46
|
+
else if (arg === "--coverage-dir") {
|
|
47
|
+
const value = argv[i + 1];
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
return { ...parsed, error: "argument --coverage-dir: expected one argument" };
|
|
50
|
+
}
|
|
51
|
+
parsed.coverageDir = value;
|
|
52
|
+
i += 1;
|
|
53
|
+
}
|
|
54
|
+
else if (arg?.startsWith("--coverage-dir=")) {
|
|
55
|
+
parsed.coverageDir = arg.slice("--coverage-dir=".length);
|
|
56
|
+
}
|
|
57
|
+
else if (arg === "--min-headroom-pp") {
|
|
58
|
+
const value = argv[i + 1];
|
|
59
|
+
if (value === undefined) {
|
|
60
|
+
return { ...parsed, error: "argument --min-headroom-pp: expected one argument" };
|
|
61
|
+
}
|
|
62
|
+
const num = parseNumber(value);
|
|
63
|
+
if (num === null) {
|
|
64
|
+
return { ...parsed, error: "argument --min-headroom-pp: expected a number" };
|
|
65
|
+
}
|
|
66
|
+
parsed.minHeadroomPp = num;
|
|
67
|
+
i += 1;
|
|
68
|
+
}
|
|
69
|
+
else if (arg?.startsWith("--min-headroom-pp=")) {
|
|
70
|
+
const num = parseNumber(arg.slice("--min-headroom-pp=".length));
|
|
71
|
+
if (num === null) {
|
|
72
|
+
return { ...parsed, error: "argument --min-headroom-pp: expected a number" };
|
|
73
|
+
}
|
|
74
|
+
parsed.minHeadroomPp = num;
|
|
75
|
+
}
|
|
76
|
+
else if (arg === "--base-ref") {
|
|
77
|
+
const value = argv[i + 1];
|
|
78
|
+
if (value === undefined) {
|
|
79
|
+
return { ...parsed, error: "argument --base-ref: expected one argument" };
|
|
80
|
+
}
|
|
81
|
+
parsed.baseRef = value;
|
|
82
|
+
i += 1;
|
|
83
|
+
}
|
|
84
|
+
else if (arg?.startsWith("--base-ref=")) {
|
|
85
|
+
parsed.baseRef = arg.slice("--base-ref=".length);
|
|
86
|
+
}
|
|
87
|
+
else if (arg === "--path" || arg === "--paths") {
|
|
88
|
+
const value = argv[i + 1];
|
|
89
|
+
if (value === undefined) {
|
|
90
|
+
return { ...parsed, error: `argument ${arg}: expected one argument` };
|
|
91
|
+
}
|
|
92
|
+
parsed.pathFilter.push(...value
|
|
93
|
+
.split(",")
|
|
94
|
+
.map((part) => part.trim())
|
|
95
|
+
.filter(Boolean));
|
|
96
|
+
parsed.useDiffPaths = false;
|
|
97
|
+
i += 1;
|
|
98
|
+
}
|
|
99
|
+
else if (arg?.startsWith("--path=") || arg?.startsWith("--paths=")) {
|
|
100
|
+
const prefix = arg.startsWith("--path=") ? "--path=" : "--paths=";
|
|
101
|
+
parsed.pathFilter.push(...arg
|
|
102
|
+
.slice(prefix.length)
|
|
103
|
+
.split(",")
|
|
104
|
+
.map((part) => part.trim())
|
|
105
|
+
.filter(Boolean));
|
|
106
|
+
parsed.useDiffPaths = false;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return parsed;
|
|
113
|
+
}
|
|
114
|
+
/** Run coverage-hotspots and return the process exit code. */
|
|
115
|
+
export function run(argv) {
|
|
116
|
+
const args = parseArgs(argv);
|
|
117
|
+
if (args.error !== undefined) {
|
|
118
|
+
process.stderr.write(`coverage-hotspots: ${args.error}\n`);
|
|
119
|
+
return 2;
|
|
120
|
+
}
|
|
121
|
+
const projectRoot = resolve(args.projectRoot);
|
|
122
|
+
const result = evaluateCoverageHotspots({
|
|
123
|
+
projectRoot,
|
|
124
|
+
coverageDir: args.coverageDir ?? undefined,
|
|
125
|
+
minHeadroomPp: args.minHeadroomPp ?? undefined,
|
|
126
|
+
baseRef: args.baseRef,
|
|
127
|
+
pathFilter: args.pathFilter.length > 0 ? args.pathFilter : null,
|
|
128
|
+
useDiffPaths: args.useDiffPaths,
|
|
129
|
+
});
|
|
130
|
+
if (result.exitCode === 2 || result.report === null) {
|
|
131
|
+
process.stderr.write(`${result.message}\n`);
|
|
132
|
+
return result.exitCode;
|
|
133
|
+
}
|
|
134
|
+
const payload = args.json ? formatJsonReport(result.report) : result.message;
|
|
135
|
+
if (result.exitCode === 0) {
|
|
136
|
+
if (!args.quiet) {
|
|
137
|
+
process.stdout.write(payload);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
process.stderr.write(payload);
|
|
142
|
+
}
|
|
143
|
+
return result.exitCode;
|
|
144
|
+
}
|
|
145
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
146
|
+
process.exit(run(process.argv.slice(2)));
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=coverage-hotspots.js.map
|
package/dist/dispatch.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ 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", "hook-dispatch", "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", "lifecycle-event", "session-start", "plan-sequence", "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-plan-sequence", "verify-stubs", "verify-xbrief-drift", "rule-ownership-lint", "verify-story-ready", "verify-tools", "verify-wip-cap", "verify-agents-md-budget", "verify-agents-md-advisory", "verify-eval-health-relocation", "verify-eval-triggers-relocation", "eval-health", "eval-run", "eval-report", "eval-triggers"];
|
|
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", "hook-dispatch", "umbrella-current-shape", "changelog-check", "change-init", "commit-lint", "coverage-hotspots", "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", "lifecycle-event", "session-start", "plan-sequence", "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-plan-sequence", "verify-stubs", "verify-xbrief-drift", "rule-ownership-lint", "verify-story-ready", "verify-review-monitor", "review-monitor-register", "verify-tools", "verify-wip-cap", "verify-agents-md-budget", "verify-agents-md-advisory", "verify-eval-health-relocation", "verify-eval-triggers-relocation", "eval-health", "eval-run", "eval-report", "eval-triggers"];
|
|
14
14
|
/** Core-only CLI entrypoints without a packages/cli wrapper. */
|
|
15
15
|
export declare const CORE_MODULE_VERBS: readonly ["scm", "github-auth-modes", "github-body", "issue-emit", "issue-ingest", "issue-sync-from-xbrief", "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). */
|
package/dist/dispatch.js
CHANGED
|
@@ -46,6 +46,7 @@ export const CLI_MODULE_VERBS = [
|
|
|
46
46
|
"changelog-check",
|
|
47
47
|
"change-init",
|
|
48
48
|
"commit-lint",
|
|
49
|
+
"coverage-hotspots",
|
|
49
50
|
"policy",
|
|
50
51
|
"pr-closing-keywords",
|
|
51
52
|
"pr-merge-readiness",
|
|
@@ -111,6 +112,8 @@ export const CLI_MODULE_VERBS = [
|
|
|
111
112
|
"verify-xbrief-drift",
|
|
112
113
|
"rule-ownership-lint",
|
|
113
114
|
"verify-story-ready",
|
|
115
|
+
"verify-review-monitor",
|
|
116
|
+
"review-monitor-register",
|
|
114
117
|
"verify-tools",
|
|
115
118
|
"verify-wip-cap",
|
|
116
119
|
"verify-agents-md-budget",
|
|
@@ -197,6 +200,7 @@ export const VERB_ALIASES = {
|
|
|
197
200
|
"hook:dispatch": "hook-dispatch",
|
|
198
201
|
"verify:encoding": "verify-encoding",
|
|
199
202
|
"verify:forward-coverage": "verify-forward-coverage",
|
|
203
|
+
"coverage:hotspots": "coverage-hotspots",
|
|
200
204
|
"verify:branch": "verify-branch",
|
|
201
205
|
"verify:vbrief-conformance": "vbrief-validate",
|
|
202
206
|
"verify:wip-cap": "verify-wip-cap",
|
|
@@ -211,6 +215,8 @@ export const VERB_ALIASES = {
|
|
|
211
215
|
"xbrief:preflight": "vbrief-preflight",
|
|
212
216
|
"vbrief:activate": "vbrief-activate",
|
|
213
217
|
"verify:story-ready": "verify-story-ready",
|
|
218
|
+
"verify:review-monitor": "verify-review-monitor",
|
|
219
|
+
"review-monitor:register": "review-monitor-register",
|
|
214
220
|
"verify:tools": "verify-tools",
|
|
215
221
|
"verify:investigation": "verify-investigation",
|
|
216
222
|
"verify:judgment-gates": "verify-judgment-gates",
|
|
@@ -259,6 +265,7 @@ export const VERB_ALIASES = {
|
|
|
259
265
|
"prd:render": "prd-render",
|
|
260
266
|
"project:render": "project-render",
|
|
261
267
|
"project:export-spec": "export-spec",
|
|
268
|
+
"pr:watch": "pr-watch",
|
|
262
269
|
doctor: "doctor",
|
|
263
270
|
"eval:health": "eval-health",
|
|
264
271
|
"feedback:file": "feedback-file",
|
|
@@ -2540,6 +2547,10 @@ export async function dispatch(argv, io = defaultIo()) {
|
|
|
2540
2547
|
const canonical = resolveCanonicalVerb(verb ?? "");
|
|
2541
2548
|
if (canonical === null) {
|
|
2542
2549
|
io.writeErr(`directive: unknown verb '${verb}'\n`);
|
|
2550
|
+
if (verb?.includes(":")) {
|
|
2551
|
+
io.writeErr(`hint: prefer \`task ${verb}\` (Taskfile) or the hyphen stem ` +
|
|
2552
|
+
`(e.g. pr:watch → pr-watch / \`task pr:watch\`)\n`);
|
|
2553
|
+
}
|
|
2543
2554
|
return 1;
|
|
2544
2555
|
}
|
|
2545
2556
|
try {
|
package/dist/hook-dispatch.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { type HookEvent, type HookHost } from "@deftai/directive-core/hooks";
|
|
2
|
+
import { type HookEvent, type HookHost, type HookPayloadContext } from "@deftai/directive-core/hooks";
|
|
3
3
|
interface ParsedArgs {
|
|
4
4
|
host?: HookHost;
|
|
5
5
|
event?: HookEvent;
|
|
@@ -13,6 +13,11 @@ export interface HookDispatchCliSeams {
|
|
|
13
13
|
readonly cwd?: () => string;
|
|
14
14
|
}
|
|
15
15
|
export declare function parseArgs(argv: readonly string[]): ParsedArgs;
|
|
16
|
+
export interface ParsedPayload {
|
|
17
|
+
readonly payload: unknown;
|
|
18
|
+
readonly context: HookPayloadContext;
|
|
19
|
+
}
|
|
20
|
+
export declare function parsePayload(raw: string): ParsedPayload;
|
|
16
21
|
export declare function run(argv: string[], seams?: HookDispatchCliSeams): number;
|
|
17
22
|
export {};
|
|
18
23
|
//# sourceMappingURL=hook-dispatch.d.ts.map
|
package/dist/hook-dispatch.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { decideHook, isHookEvent, isHookHost, projectRootFromHookPayload, renderHostDecision, } from "@deftai/directive-core/hooks";
|
|
5
|
+
import { decideHook, hookPayloadTopLevelKeys, isHookEvent, isHookHost, projectRootFromHookPayload, renderHostDecision, } from "@deftai/directive-core/hooks";
|
|
6
6
|
function takeValue(argv, index, flag) {
|
|
7
7
|
const token = argv[index];
|
|
8
8
|
const prefix = `${flag}=`;
|
|
@@ -57,16 +57,17 @@ export function parseArgs(argv) {
|
|
|
57
57
|
return { error: "--event is required" };
|
|
58
58
|
return parsed;
|
|
59
59
|
}
|
|
60
|
-
function parsePayload(raw) {
|
|
61
|
-
if (raw.trim().length === 0)
|
|
62
|
-
return {};
|
|
60
|
+
export function parsePayload(raw) {
|
|
61
|
+
if (raw.trim().length === 0) {
|
|
62
|
+
return { payload: {}, context: { stdinEmpty: true } };
|
|
63
|
+
}
|
|
63
64
|
try {
|
|
64
|
-
return JSON.parse(raw);
|
|
65
|
+
return { payload: JSON.parse(raw), context: {} };
|
|
65
66
|
}
|
|
66
67
|
catch {
|
|
67
68
|
// tool.before is installed only on direct-write matchers, so an unreadable
|
|
68
69
|
// payload becomes a missing-tool denial rather than a fail-open crash.
|
|
69
|
-
return {};
|
|
70
|
+
return { payload: {}, context: { parseFailed: true } };
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
export function run(argv, seams = {}) {
|
|
@@ -79,7 +80,7 @@ export function run(argv, seams = {}) {
|
|
|
79
80
|
}
|
|
80
81
|
const readStdin = seams.readStdin ?? (() => readFileSync(0, "utf8"));
|
|
81
82
|
const cwd = (seams.cwd ?? process.cwd)();
|
|
82
|
-
const payload = parsePayload(readStdin());
|
|
83
|
+
const { payload, context: payloadContext } = parsePayload(readStdin());
|
|
83
84
|
const projectRoot = args.projectRoot
|
|
84
85
|
? resolve(args.projectRoot)
|
|
85
86
|
: projectRootFromHookPayload(payload, cwd);
|
|
@@ -88,10 +89,18 @@ export function run(argv, seams = {}) {
|
|
|
88
89
|
event: args.event,
|
|
89
90
|
projectRoot,
|
|
90
91
|
payload,
|
|
92
|
+
payloadContext,
|
|
91
93
|
});
|
|
92
94
|
const rendered = renderHostDecision(args.host, decision);
|
|
93
95
|
if (rendered.length > 0)
|
|
94
96
|
writeOut(`${rendered}\n`);
|
|
97
|
+
if (decision.code === "invalid-input" && args.host === "cursor") {
|
|
98
|
+
// Keys are already embedded in decision.message; stderr helps operators tailing logs.
|
|
99
|
+
const keys = hookPayloadTopLevelKeys(payload);
|
|
100
|
+
if (keys.length > 0) {
|
|
101
|
+
writeErr(`Directive hook diagnostic: payload top-level keys: ${keys.join(", ")}\n`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
95
104
|
if (decision.code === "session-start-degraded")
|
|
96
105
|
writeErr(`${decision.message}\n`);
|
|
97
106
|
return 0;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type PlatformPrimitive } from "@deftai/directive-core/review-monitor";
|
|
3
|
+
interface ParsedArgs {
|
|
4
|
+
pr: number | null;
|
|
5
|
+
monitorAgentId: string | null;
|
|
6
|
+
platformPrimitive: PlatformPrimitive | null;
|
|
7
|
+
repo: string | null;
|
|
8
|
+
headSha: string | null;
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
parentSessionId: string | null;
|
|
11
|
+
help: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function parseRegisterArgs(argv: readonly string[]): ParsedArgs;
|
|
15
|
+
export declare function run(argv: readonly string[]): number;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=review-monitor-register.d.ts.map
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { REGISTER_HELP, registerReviewMonitor, } from "@deftai/directive-core/review-monitor";
|
|
5
|
+
const PRIMITIVES = new Set(["start_agent", "spawn_subagent", "cursor-task"]);
|
|
6
|
+
export function parseRegisterArgs(argv) {
|
|
7
|
+
const acc = {
|
|
8
|
+
pr: null,
|
|
9
|
+
monitorAgentId: null,
|
|
10
|
+
platformPrimitive: null,
|
|
11
|
+
repo: null,
|
|
12
|
+
headSha: null,
|
|
13
|
+
projectRoot: ".",
|
|
14
|
+
parentSessionId: null,
|
|
15
|
+
help: false,
|
|
16
|
+
};
|
|
17
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
18
|
+
const arg = argv[i];
|
|
19
|
+
if (arg === "--help" || arg === "-h") {
|
|
20
|
+
return { ...acc, help: true };
|
|
21
|
+
}
|
|
22
|
+
if (arg === "--pr") {
|
|
23
|
+
const value = argv[i + 1];
|
|
24
|
+
if (value === undefined) {
|
|
25
|
+
return { ...acc, error: "argument --pr: expected one argument" };
|
|
26
|
+
}
|
|
27
|
+
const n = Number(value);
|
|
28
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
29
|
+
return { ...acc, error: `invalid --pr value: ${value}` };
|
|
30
|
+
}
|
|
31
|
+
acc.pr = n;
|
|
32
|
+
i += 1;
|
|
33
|
+
}
|
|
34
|
+
else if (arg?.startsWith("--pr=")) {
|
|
35
|
+
const n = Number(arg.slice("--pr=".length));
|
|
36
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
37
|
+
return { ...acc, error: `invalid --pr value: ${arg}` };
|
|
38
|
+
}
|
|
39
|
+
acc.pr = n;
|
|
40
|
+
}
|
|
41
|
+
else if (arg === "--monitor-agent-id") {
|
|
42
|
+
const value = argv[i + 1];
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
return { ...acc, error: "argument --monitor-agent-id: expected one argument" };
|
|
45
|
+
}
|
|
46
|
+
acc.monitorAgentId = value;
|
|
47
|
+
i += 1;
|
|
48
|
+
}
|
|
49
|
+
else if (arg?.startsWith("--monitor-agent-id=")) {
|
|
50
|
+
acc.monitorAgentId = arg.slice("--monitor-agent-id=".length);
|
|
51
|
+
}
|
|
52
|
+
else if (arg === "--platform-primitive") {
|
|
53
|
+
const value = argv[i + 1];
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
return { ...acc, error: "argument --platform-primitive: expected one argument" };
|
|
56
|
+
}
|
|
57
|
+
if (!PRIMITIVES.has(value)) {
|
|
58
|
+
return { ...acc, error: `invalid --platform-primitive: ${value}` };
|
|
59
|
+
}
|
|
60
|
+
acc.platformPrimitive = value;
|
|
61
|
+
i += 1;
|
|
62
|
+
}
|
|
63
|
+
else if (arg?.startsWith("--platform-primitive=")) {
|
|
64
|
+
const value = arg.slice("--platform-primitive=".length);
|
|
65
|
+
if (!PRIMITIVES.has(value)) {
|
|
66
|
+
return { ...acc, error: `invalid --platform-primitive: ${value}` };
|
|
67
|
+
}
|
|
68
|
+
acc.platformPrimitive = value;
|
|
69
|
+
}
|
|
70
|
+
else if (arg === "--repo") {
|
|
71
|
+
const value = argv[i + 1];
|
|
72
|
+
if (value === undefined) {
|
|
73
|
+
return { ...acc, error: "argument --repo: expected one argument" };
|
|
74
|
+
}
|
|
75
|
+
acc.repo = value;
|
|
76
|
+
i += 1;
|
|
77
|
+
}
|
|
78
|
+
else if (arg?.startsWith("--repo=")) {
|
|
79
|
+
acc.repo = arg.slice("--repo=".length);
|
|
80
|
+
}
|
|
81
|
+
else if (arg === "--head-sha") {
|
|
82
|
+
const value = argv[i + 1];
|
|
83
|
+
if (value === undefined) {
|
|
84
|
+
return { ...acc, error: "argument --head-sha: expected one argument" };
|
|
85
|
+
}
|
|
86
|
+
acc.headSha = value;
|
|
87
|
+
i += 1;
|
|
88
|
+
}
|
|
89
|
+
else if (arg?.startsWith("--head-sha=")) {
|
|
90
|
+
acc.headSha = arg.slice("--head-sha=".length);
|
|
91
|
+
}
|
|
92
|
+
else if (arg === "--project-root") {
|
|
93
|
+
const value = argv[i + 1];
|
|
94
|
+
if (value === undefined) {
|
|
95
|
+
return { ...acc, error: "argument --project-root: expected one argument" };
|
|
96
|
+
}
|
|
97
|
+
acc.projectRoot = value;
|
|
98
|
+
i += 1;
|
|
99
|
+
}
|
|
100
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
101
|
+
acc.projectRoot = arg.slice("--project-root=".length);
|
|
102
|
+
}
|
|
103
|
+
else if (arg === "--parent-session-id") {
|
|
104
|
+
const value = argv[i + 1];
|
|
105
|
+
if (value === undefined) {
|
|
106
|
+
return { ...acc, error: "argument --parent-session-id: expected one argument" };
|
|
107
|
+
}
|
|
108
|
+
acc.parentSessionId = value;
|
|
109
|
+
i += 1;
|
|
110
|
+
}
|
|
111
|
+
else if (arg?.startsWith("--parent-session-id=")) {
|
|
112
|
+
acc.parentSessionId = arg.slice("--parent-session-id=".length);
|
|
113
|
+
}
|
|
114
|
+
else if (arg?.startsWith("-")) {
|
|
115
|
+
return { ...acc, error: `unrecognized argument: ${arg}` };
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
return { ...acc, error: `unrecognized argument: ${arg}` };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return acc;
|
|
122
|
+
}
|
|
123
|
+
export function run(argv) {
|
|
124
|
+
const args = parseRegisterArgs(argv);
|
|
125
|
+
if (args.help) {
|
|
126
|
+
process.stdout.write(REGISTER_HELP);
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
if (args.error !== undefined) {
|
|
130
|
+
process.stderr.write(`review_monitor_register: ${args.error}\n`);
|
|
131
|
+
return 2;
|
|
132
|
+
}
|
|
133
|
+
if (args.pr === null) {
|
|
134
|
+
process.stderr.write("review_monitor_register: --pr is required\n");
|
|
135
|
+
return 2;
|
|
136
|
+
}
|
|
137
|
+
if (args.monitorAgentId === null || args.monitorAgentId.trim().length === 0) {
|
|
138
|
+
process.stderr.write("review_monitor_register: --monitor-agent-id is required\n");
|
|
139
|
+
return 2;
|
|
140
|
+
}
|
|
141
|
+
if (args.platformPrimitive === null) {
|
|
142
|
+
process.stderr.write("review_monitor_register: --platform-primitive is required\n");
|
|
143
|
+
return 2;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const { path, record } = registerReviewMonitor({
|
|
147
|
+
pr: args.pr,
|
|
148
|
+
repo: args.repo,
|
|
149
|
+
headSha: args.headSha,
|
|
150
|
+
platformPrimitive: args.platformPrimitive,
|
|
151
|
+
monitorAgentId: args.monitorAgentId,
|
|
152
|
+
projectRoot: resolve(args.projectRoot),
|
|
153
|
+
parentSessionId: args.parentSessionId,
|
|
154
|
+
});
|
|
155
|
+
process.stdout.write(`review_monitor_register: recorded PR #${record.pr} monitor ${record.monitor_agent_id} at ${path}\n`);
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
process.stderr.write(`review_monitor_register: ${String(err.message ?? err)}\n`);
|
|
160
|
+
return 2;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
164
|
+
process.exit(run(process.argv.slice(2)));
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=review-monitor-register.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type ReviewMonitorCallSite } from "@deftai/directive-core/review-monitor";
|
|
3
|
+
interface ParsedArgs {
|
|
4
|
+
pr: number | null;
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
repo: string | null;
|
|
7
|
+
headSha: string | null;
|
|
8
|
+
callSite: ReviewMonitorCallSite;
|
|
9
|
+
approach3: boolean;
|
|
10
|
+
approach3Warned: boolean;
|
|
11
|
+
emitJson: boolean;
|
|
12
|
+
help: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function parseVerifyReviewMonitorArgs(argv: readonly string[]): ParsedArgs;
|
|
16
|
+
export declare function run(argv: readonly string[]): number;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=verify-review-monitor.d.ts.map
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { evaluateReviewMonitorGate, REVIEW_MONITOR_HELP, verifyResultToJson, } from "@deftai/directive-core/review-monitor";
|
|
5
|
+
const CALL_SITES = new Set([
|
|
6
|
+
"solo",
|
|
7
|
+
"swarm-phase5-6",
|
|
8
|
+
"swarm-phase6-cascade",
|
|
9
|
+
"unspecified",
|
|
10
|
+
]);
|
|
11
|
+
export function parseVerifyReviewMonitorArgs(argv) {
|
|
12
|
+
const acc = {
|
|
13
|
+
pr: null,
|
|
14
|
+
projectRoot: ".",
|
|
15
|
+
repo: null,
|
|
16
|
+
headSha: null,
|
|
17
|
+
callSite: "unspecified",
|
|
18
|
+
approach3: false,
|
|
19
|
+
approach3Warned: false,
|
|
20
|
+
emitJson: false,
|
|
21
|
+
help: false,
|
|
22
|
+
};
|
|
23
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
24
|
+
const arg = argv[i];
|
|
25
|
+
if (arg === "--help" || arg === "-h") {
|
|
26
|
+
return { ...acc, help: true };
|
|
27
|
+
}
|
|
28
|
+
if (arg === "--json") {
|
|
29
|
+
acc.emitJson = true;
|
|
30
|
+
}
|
|
31
|
+
else if (arg === "--approach3") {
|
|
32
|
+
acc.approach3 = true;
|
|
33
|
+
}
|
|
34
|
+
else if (arg === "--approach3-warned") {
|
|
35
|
+
acc.approach3Warned = true;
|
|
36
|
+
}
|
|
37
|
+
else if (arg === "--pr") {
|
|
38
|
+
const value = argv[i + 1];
|
|
39
|
+
if (value === undefined) {
|
|
40
|
+
return { ...acc, error: "argument --pr: expected one argument" };
|
|
41
|
+
}
|
|
42
|
+
const n = Number(value);
|
|
43
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
44
|
+
return { ...acc, error: `invalid --pr value: ${value}` };
|
|
45
|
+
}
|
|
46
|
+
acc.pr = n;
|
|
47
|
+
i += 1;
|
|
48
|
+
}
|
|
49
|
+
else if (arg?.startsWith("--pr=")) {
|
|
50
|
+
const n = Number(arg.slice("--pr=".length));
|
|
51
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
52
|
+
return { ...acc, error: `invalid --pr value: ${arg}` };
|
|
53
|
+
}
|
|
54
|
+
acc.pr = n;
|
|
55
|
+
}
|
|
56
|
+
else if (arg === "--repo") {
|
|
57
|
+
const value = argv[i + 1];
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
return { ...acc, error: "argument --repo: expected one argument" };
|
|
60
|
+
}
|
|
61
|
+
acc.repo = value;
|
|
62
|
+
i += 1;
|
|
63
|
+
}
|
|
64
|
+
else if (arg?.startsWith("--repo=")) {
|
|
65
|
+
acc.repo = arg.slice("--repo=".length);
|
|
66
|
+
}
|
|
67
|
+
else if (arg === "--head-sha") {
|
|
68
|
+
const value = argv[i + 1];
|
|
69
|
+
if (value === undefined) {
|
|
70
|
+
return { ...acc, error: "argument --head-sha: expected one argument" };
|
|
71
|
+
}
|
|
72
|
+
acc.headSha = value;
|
|
73
|
+
i += 1;
|
|
74
|
+
}
|
|
75
|
+
else if (arg?.startsWith("--head-sha=")) {
|
|
76
|
+
acc.headSha = arg.slice("--head-sha=".length);
|
|
77
|
+
}
|
|
78
|
+
else if (arg === "--project-root") {
|
|
79
|
+
const value = argv[i + 1];
|
|
80
|
+
if (value === undefined) {
|
|
81
|
+
return { ...acc, error: "argument --project-root: expected one argument" };
|
|
82
|
+
}
|
|
83
|
+
acc.projectRoot = value;
|
|
84
|
+
i += 1;
|
|
85
|
+
}
|
|
86
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
87
|
+
acc.projectRoot = arg.slice("--project-root=".length);
|
|
88
|
+
}
|
|
89
|
+
else if (arg === "--call-site") {
|
|
90
|
+
const value = argv[i + 1];
|
|
91
|
+
if (value === undefined) {
|
|
92
|
+
return { ...acc, error: "argument --call-site: expected one argument" };
|
|
93
|
+
}
|
|
94
|
+
if (!CALL_SITES.has(value)) {
|
|
95
|
+
return { ...acc, error: `invalid --call-site: ${value}` };
|
|
96
|
+
}
|
|
97
|
+
acc.callSite = value;
|
|
98
|
+
i += 1;
|
|
99
|
+
}
|
|
100
|
+
else if (arg?.startsWith("--call-site=")) {
|
|
101
|
+
const value = arg.slice("--call-site=".length);
|
|
102
|
+
if (!CALL_SITES.has(value)) {
|
|
103
|
+
return { ...acc, error: `invalid --call-site: ${value}` };
|
|
104
|
+
}
|
|
105
|
+
acc.callSite = value;
|
|
106
|
+
}
|
|
107
|
+
else if (arg?.startsWith("-")) {
|
|
108
|
+
return { ...acc, error: `unrecognized argument: ${arg}` };
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return { ...acc, error: `unrecognized argument: ${arg}` };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return acc;
|
|
115
|
+
}
|
|
116
|
+
export function run(argv) {
|
|
117
|
+
const args = parseVerifyReviewMonitorArgs(argv);
|
|
118
|
+
if (args.help) {
|
|
119
|
+
process.stdout.write(REVIEW_MONITOR_HELP);
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
if (args.error !== undefined) {
|
|
123
|
+
process.stderr.write(`verify_review_monitor: ${args.error}\n`);
|
|
124
|
+
process.stderr.write("Try: task verify:review-monitor -- --help\n");
|
|
125
|
+
return 2;
|
|
126
|
+
}
|
|
127
|
+
if (args.pr === null) {
|
|
128
|
+
process.stderr.write("verify_review_monitor: --pr is required\n");
|
|
129
|
+
process.stderr.write("Try: task verify:review-monitor -- --help\n");
|
|
130
|
+
return 2;
|
|
131
|
+
}
|
|
132
|
+
const result = evaluateReviewMonitorGate({
|
|
133
|
+
pr: args.pr,
|
|
134
|
+
projectRoot: resolve(args.projectRoot),
|
|
135
|
+
repo: args.repo,
|
|
136
|
+
headSha: args.headSha,
|
|
137
|
+
callSite: args.callSite,
|
|
138
|
+
approach3: args.approach3,
|
|
139
|
+
approach3Warned: args.approach3Warned,
|
|
140
|
+
environ: process.env,
|
|
141
|
+
});
|
|
142
|
+
if (args.emitJson) {
|
|
143
|
+
process.stdout.write(`${JSON.stringify(verifyResultToJson(result), null, 2)}\n`);
|
|
144
|
+
}
|
|
145
|
+
else if (result.exitCode === 0) {
|
|
146
|
+
process.stdout.write(`${result.message}\n`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
process.stderr.write(`${result.message}\n`);
|
|
150
|
+
}
|
|
151
|
+
return result.exitCode;
|
|
152
|
+
}
|
|
153
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
154
|
+
process.exit(run(process.argv.slice(2)));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=verify-review-monitor.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive",
|
|
3
|
-
"version": "0.79.
|
|
3
|
+
"version": "0.79.4",
|
|
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.79.
|
|
35
|
-
"@deftai/directive-content": "^0.79.
|
|
34
|
+
"@deftai/directive-core": "^0.79.4",
|
|
35
|
+
"@deftai/directive-content": "^0.79.4"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc -b"
|