@deftai/directive-core 0.87.0 → 0.89.0
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/authz/actions.d.ts +55 -0
- package/dist/authz/actions.js +125 -0
- package/dist/authz/classify.d.ts +23 -0
- package/dist/authz/classify.js +217 -0
- package/dist/authz/closed-verb.d.ts +42 -0
- package/dist/authz/closed-verb.js +279 -0
- package/dist/authz/evaluate.d.ts +41 -0
- package/dist/authz/evaluate.js +298 -0
- package/dist/authz/index.d.ts +15 -0
- package/dist/authz/index.js +15 -0
- package/dist/authz/origin.d.ts +28 -0
- package/dist/authz/origin.js +64 -0
- package/dist/authz/paths.d.ts +6 -0
- package/dist/authz/paths.js +19 -0
- package/dist/authz/store.d.ts +40 -0
- package/dist/authz/store.js +317 -0
- package/dist/authz/templates.d.ts +139 -0
- package/dist/authz/templates.js +241 -0
- package/dist/authz/types.d.ts +111 -0
- package/dist/authz/types.js +41 -0
- package/dist/authz/verb-classification.d.ts +44 -0
- package/dist/authz/verb-classification.js +237 -0
- package/dist/branch/evaluate.js +6 -1
- package/dist/cache/fetch.js +10 -5
- package/dist/cache/io.d.ts +9 -2
- package/dist/cache/io.js +30 -10
- package/dist/cache/scanner.d.ts +11 -1
- package/dist/cache/scanner.js +29 -4
- package/dist/cache/task-cache/store.js +11 -7
- package/dist/capacity/backfill.js +10 -4
- package/dist/category-b-namespace/index.js +10 -4
- package/dist/check/gate-lists.js +1 -0
- package/dist/codebase/default-extractor.js +3 -0
- package/dist/codebase/map.js +11 -4
- package/dist/content-contracts/skills/helpers.d.ts +10 -0
- package/dist/content-contracts/skills/helpers.js +35 -0
- package/dist/deposit/copy-tree.d.ts +19 -1
- package/dist/deposit/copy-tree.js +134 -5
- package/dist/doctor/doctor-state.js +28 -4
- package/dist/doctor/main.d.ts +10 -0
- package/dist/doctor/main.js +208 -0
- package/dist/doctor/types.d.ts +11 -0
- package/dist/escalation/actions.d.ts +63 -0
- package/dist/escalation/actions.js +137 -0
- package/dist/escalation/index.d.ts +8 -0
- package/dist/escalation/index.js +8 -0
- package/dist/escalation/paths.d.ts +3 -0
- package/dist/escalation/paths.js +10 -0
- package/dist/escalation/store.d.ts +17 -0
- package/dist/escalation/store.js +172 -0
- package/dist/escalation/types.d.ts +73 -0
- package/dist/escalation/types.js +43 -0
- package/dist/eval/crud-telemetry.js +30 -10
- package/dist/eval/health.js +22 -7
- package/dist/eval/readback.js +11 -10
- package/dist/eval/run.js +32 -16
- package/dist/events/attribution-enrichment.js +10 -4
- package/dist/finish-loop/directive-finish-loop.d.ts +37 -0
- package/dist/finish-loop/directive-finish-loop.js +239 -0
- package/dist/finish-loop/grant-gate.d.ts +31 -0
- package/dist/finish-loop/grant-gate.js +169 -0
- package/dist/finish-loop/index.d.ts +11 -0
- package/dist/finish-loop/index.js +11 -0
- package/dist/finish-loop/main.d.ts +35 -0
- package/dist/finish-loop/main.js +365 -0
- package/dist/finish-loop/pr-finish-loop.d.ts +34 -0
- package/dist/finish-loop/pr-finish-loop.js +217 -0
- package/dist/finish-loop/progress.d.ts +17 -0
- package/dist/finish-loop/progress.js +45 -0
- package/dist/finish-loop/queue.d.ts +16 -0
- package/dist/finish-loop/queue.js +65 -0
- package/dist/finish-loop/types.d.ts +52 -0
- package/dist/finish-loop/types.js +10 -0
- package/dist/fs/contained-write.d.ts +101 -0
- package/dist/fs/contained-write.js +281 -0
- package/dist/fs/projection-containment.d.ts +18 -0
- package/dist/fs/projection-containment.js +40 -0
- package/dist/hooks/classify/classify.d.ts +10 -0
- package/dist/hooks/classify/classify.js +37 -0
- package/dist/hooks/classify/index.d.ts +14 -0
- package/dist/hooks/classify/index.js +13 -0
- package/dist/hooks/classify/paths.d.ts +22 -0
- package/dist/hooks/classify/paths.js +72 -0
- package/dist/hooks/classify/payload.d.ts +16 -0
- package/dist/hooks/classify/payload.js +45 -0
- package/dist/hooks/classify/stdin.d.ts +12 -0
- package/dist/hooks/classify/stdin.js +63 -0
- package/dist/hooks/classify/tool-name.d.ts +18 -0
- package/dist/hooks/classify/tool-name.js +85 -0
- package/dist/hooks/classify/types.d.ts +41 -0
- package/dist/hooks/classify/types.js +7 -0
- package/dist/hooks/dispatcher.d.ts +30 -15
- package/dist/hooks/dispatcher.js +326 -134
- package/dist/hooks/fixtures/cases.d.ts +44 -0
- package/dist/hooks/fixtures/cases.js +595 -0
- package/dist/hooks/fixtures/index.d.ts +2 -0
- package/dist/hooks/fixtures/index.js +2 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/tools.d.ts +31 -0
- package/dist/hooks/tools.js +74 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/init-deposit/agent-hooks.d.ts +1 -1
- package/dist/init-deposit/agent-hooks.js +65 -10
- package/dist/init-deposit/gitignore.js +11 -3
- package/dist/init-deposit/headless-manifest.js +12 -4
- package/dist/init-deposit/hygiene.d.ts +16 -0
- package/dist/init-deposit/hygiene.js +26 -0
- package/dist/init-deposit/init-dispatch.js +28 -0
- package/dist/init-deposit/migrate.d.ts +1 -1
- package/dist/init-deposit/migrate.js +13 -3
- package/dist/init-deposit/prettierignore.js +12 -5
- package/dist/init-deposit/refresh.js +38 -7
- package/dist/init-deposit/scaffold.js +42 -29
- package/dist/init-deposit/xbrief-projections.js +17 -10
- package/dist/intake/candidates-log.js +46 -35
- package/dist/intake/github-body-cli.d.ts +6 -0
- package/dist/intake/github-body-cli.js +17 -0
- package/dist/intake/github-body.d.ts +46 -3
- package/dist/intake/github-body.js +191 -20
- package/dist/intake/issue-emit.d.ts +1 -0
- package/dist/intake/issue-emit.js +41 -23
- package/dist/intake/issue-ingest.js +11 -2
- package/dist/lifecycle/event-detect.js +12 -4
- package/dist/lifecycle/events.js +29 -20
- package/dist/lifecycle/lifecycle-hygiene.js +9 -3
- package/dist/packs/pack-render.d.ts +33 -0
- package/dist/packs/pack-render.js +172 -13
- package/dist/packs/quarantine-ext.d.ts +10 -0
- package/dist/packs/quarantine-ext.js +26 -2
- package/dist/plan-sequence/store.js +11 -4
- package/dist/policy/hotfix-criteria.d.ts +79 -0
- package/dist/policy/hotfix-criteria.js +197 -0
- package/dist/policy/index.d.ts +5 -0
- package/dist/policy/index.js +32 -1
- package/dist/policy/intent-ceiling.d.ts +79 -0
- package/dist/policy/intent-ceiling.js +181 -0
- package/dist/policy/no-deft-directive.d.ts +59 -0
- package/dist/policy/no-deft-directive.js +110 -0
- package/dist/policy/org-force-on-migration.d.ts +52 -0
- package/dist/policy/org-force-on-migration.js +269 -27
- package/dist/policy/require-human-merge.d.ts +75 -0
- package/dist/policy/require-human-merge.js +324 -0
- package/dist/policy/resolve.js +17 -6
- package/dist/policy/runtime-authority.d.ts +56 -2
- package/dist/policy/runtime-authority.js +297 -3
- package/dist/policy/write-fence.d.ts +78 -0
- package/dist/policy/write-fence.js +164 -0
- package/dist/pr-wait-mergeable/cascade.d.ts +10 -0
- package/dist/pr-wait-mergeable/cascade.js +28 -0
- package/dist/preflight/evaluate.js +10 -0
- package/dist/product-signal/consent.js +21 -5
- package/dist/product-signal/submit.js +22 -12
- package/dist/release/build-dist-runner.js +5 -2
- package/dist/release/build-dist.d.ts +19 -1
- package/dist/release/build-dist.js +50 -2
- package/dist/release/native-steps.js +7 -2
- package/dist/release-publish/pipeline.d.ts +13 -0
- package/dist/release-publish/pipeline.js +46 -1
- package/dist/scope/audit-log.js +19 -24
- package/dist/scope/decompose.js +10 -5
- package/dist/scope/decomposed-refs.js +18 -3
- package/dist/scope/demote.js +9 -2
- package/dist/scope/undo.js +9 -2
- package/dist/session/release-availability.js +26 -6
- package/dist/session/ritual-sentinel.js +19 -12
- package/dist/session/session-start-hook.d.ts +3 -0
- package/dist/session/session-start-hook.js +15 -0
- package/dist/session/session-start.js +37 -0
- package/dist/staleness-tickler/state.js +26 -6
- package/dist/swarm/launch.js +13 -3
- package/dist/swarm/routing.js +9 -3
- package/dist/task-surface/index.js +24 -9
- package/dist/triage/bootstrap/gitignore.js +53 -10
- package/dist/triage/cache-path.js +10 -3
- package/dist/triage/welcome/summary.js +11 -4
- package/dist/triage/welcome/writers.js +45 -16
- package/dist/validate-content/validate-links.js +5 -0
- package/dist/value/readback.js +11 -6
- package/dist/vbrief-activate/activate.js +12 -4
- package/dist/vbrief-build/project-definition-io.js +14 -6
- package/dist/verify-source/contained-writes.d.ts +59 -0
- package/dist/verify-source/contained-writes.js +272 -0
- package/dist/verify-source/cursor-tier1.js +7 -2
- package/dist/verify-source/index.d.ts +1 -0
- package/dist/verify-source/index.js +1 -0
- package/dist/verify-source/openclaw-tier1.js +19 -1
- package/dist/verify-source/verify-stubs.js +3 -0
- package/dist/xbrief-migrate/migrate-project.js +26 -12
- package/dist/xbrief-migrate/transforms.d.ts +4 -2
- package/dist/xbrief-migrate/transforms.js +37 -14
- package/package.json +16 -3
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* contained-writes.ts — inventory gate for raw product write sinks (#2951).
|
|
3
|
+
*
|
|
4
|
+
* Scans TypeScript under packages/core/src (and optional roots) for raw write
|
|
5
|
+
* call patterns (`writeFileSync`, `appendFileSync`, `fs.writeFile`, etc.)
|
|
6
|
+
* outside an allowlist. Default remains **fail-open** (advisory exit 0) while
|
|
7
|
+
* mass migration continues; pass `--enforce` to fail closed (Phase 2+).
|
|
8
|
+
*
|
|
9
|
+
* Allowlist is the residual set of modules not yet migrated onto containedWrite.
|
|
10
|
+
* Phase 2 removed cache/io + lifecycle/events after sink migration.
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* 0 — clean OR fail-open with findings (default)
|
|
14
|
+
* 1 — findings under `--enforce` (fail-closed)
|
|
15
|
+
* 2 — config error (project root missing)
|
|
16
|
+
*
|
|
17
|
+
* Refs #2951, #2980 (e2e/parity harness exclusions).
|
|
18
|
+
*/
|
|
19
|
+
/** Patterns that indicate a raw filesystem write sink in product code. */
|
|
20
|
+
export declare const RAW_WRITE_PATTERNS: readonly RegExp[];
|
|
21
|
+
/**
|
|
22
|
+
* Relative path prefixes (posix-style) allowed to use raw write sinks.
|
|
23
|
+
* Shrink as sinks migrate onto containedWrite (#2951 Phase 2+).
|
|
24
|
+
*/
|
|
25
|
+
export declare const CONTAINED_WRITES_ALLOWLIST: readonly string[];
|
|
26
|
+
/**
|
|
27
|
+
* Non-product harness path markers excluded from the product inventory (#2980).
|
|
28
|
+
* Prefer exclusion over permanent CONTAINED_WRITES_ALLOWLIST entries for e2e/parity noise.
|
|
29
|
+
* Paths are matched as posix substrings after `toPosix` (always `/` separators).
|
|
30
|
+
*/
|
|
31
|
+
export declare const NON_PRODUCT_HARNESS_PATH_MARKERS: readonly string[];
|
|
32
|
+
export interface ContainedWriteFinding {
|
|
33
|
+
readonly path: string;
|
|
34
|
+
readonly line: number;
|
|
35
|
+
readonly match: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ContainedWritesOptions {
|
|
38
|
+
readonly projectRoot: string;
|
|
39
|
+
/** When true, exit 1 if any non-allowlisted raw write is found. Default false (fail-open). */
|
|
40
|
+
readonly enforce?: boolean;
|
|
41
|
+
/** Extra relative path prefixes to allow. */
|
|
42
|
+
readonly extraAllowlist?: readonly string[];
|
|
43
|
+
/** Roots to scan relative to projectRoot. Default packages/core/src. */
|
|
44
|
+
readonly scanRoots?: readonly string[];
|
|
45
|
+
}
|
|
46
|
+
export interface ContainedWritesResult {
|
|
47
|
+
readonly code: 0 | 1 | 2;
|
|
48
|
+
readonly message: string;
|
|
49
|
+
readonly stream: "stdout" | "stderr";
|
|
50
|
+
readonly findings: readonly ContainedWriteFinding[];
|
|
51
|
+
readonly enforce: boolean;
|
|
52
|
+
readonly failOpen: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Inventory raw write sinks under scan roots; fail-open by default (#2951).
|
|
56
|
+
* Pass `enforce: true` / `--enforce` to fail closed on findings (Phase 2 path).
|
|
57
|
+
*/
|
|
58
|
+
export declare function evaluateContainedWrites(options: ContainedWritesOptions): ContainedWritesResult;
|
|
59
|
+
//# sourceMappingURL=contained-writes.d.ts.map
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* contained-writes.ts — inventory gate for raw product write sinks (#2951).
|
|
3
|
+
*
|
|
4
|
+
* Scans TypeScript under packages/core/src (and optional roots) for raw write
|
|
5
|
+
* call patterns (`writeFileSync`, `appendFileSync`, `fs.writeFile`, etc.)
|
|
6
|
+
* outside an allowlist. Default remains **fail-open** (advisory exit 0) while
|
|
7
|
+
* mass migration continues; pass `--enforce` to fail closed (Phase 2+).
|
|
8
|
+
*
|
|
9
|
+
* Allowlist is the residual set of modules not yet migrated onto containedWrite.
|
|
10
|
+
* Phase 2 removed cache/io + lifecycle/events after sink migration.
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* 0 — clean OR fail-open with findings (default)
|
|
14
|
+
* 1 — findings under `--enforce` (fail-closed)
|
|
15
|
+
* 2 — config error (project root missing)
|
|
16
|
+
*
|
|
17
|
+
* Refs #2951, #2980 (e2e/parity harness exclusions).
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
20
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
21
|
+
const EXIT_OK = 0;
|
|
22
|
+
const EXIT_ENFORCE_FINDINGS = 1;
|
|
23
|
+
const EXIT_CONFIG = 2;
|
|
24
|
+
/** Patterns that indicate a raw filesystem write sink in product code. */
|
|
25
|
+
export const RAW_WRITE_PATTERNS = [
|
|
26
|
+
/\bwriteFileSync\s*\(/,
|
|
27
|
+
/\bappendFileSync\s*\(/,
|
|
28
|
+
/\bfs\.writeFile\s*\(/,
|
|
29
|
+
/\bfs\.promises\.writeFile\s*\(/,
|
|
30
|
+
/\bcreateWriteStream\s*\(/,
|
|
31
|
+
/\bwriteFile\s*\(\s*[^)]+,\s*[^)]+,\s*['"]utf8['"]/,
|
|
32
|
+
// Low-level / async forms that also bypass containedWrite (#2951 Greptile P1).
|
|
33
|
+
/\bopenSync\s*\(/,
|
|
34
|
+
/\bwriteSync\s*\(/,
|
|
35
|
+
/\bappendFile\s*\(/,
|
|
36
|
+
/\.writeFile\s*\(/,
|
|
37
|
+
/\bpromises\.writeFile\s*\(/,
|
|
38
|
+
/\bfs\.open\s*\(/,
|
|
39
|
+
/\bfs\.write\s*\(/,
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Relative path prefixes (posix-style) allowed to use raw write sinks.
|
|
43
|
+
* Shrink as sinks migrate onto containedWrite (#2951 Phase 2+).
|
|
44
|
+
*/
|
|
45
|
+
export const CONTAINED_WRITES_ALLOWLIST = [
|
|
46
|
+
// Implementation modules for containment + contained write.
|
|
47
|
+
"packages/core/src/fs/contained-write.ts",
|
|
48
|
+
"packages/core/src/fs/projection-containment.ts",
|
|
49
|
+
// Deposit tree copy / contain primitives (low-level install sinks).
|
|
50
|
+
"packages/core/src/deposit/copy-tree.ts",
|
|
51
|
+
"packages/core/src/deposit/contain.ts",
|
|
52
|
+
// Lock / stream primitives (not product payload writers) — #2980 residual.
|
|
53
|
+
"packages/core/src/slice/lock.ts",
|
|
54
|
+
"packages/core/src/vbrief-build/project-definition-io.ts", // openSync mutation lock only
|
|
55
|
+
"packages/core/src/release/build-dist.ts", // createWriteStream archive packer
|
|
56
|
+
// Temporary residual product sinks (#2980 wave D). Shrink as modules migrate.
|
|
57
|
+
"packages/core/src/doctor/main.ts",
|
|
58
|
+
"packages/core/src/eval-health-relocation/evaluate.ts",
|
|
59
|
+
"packages/core/src/intake/issue-ingest.ts",
|
|
60
|
+
"packages/core/src/intake/reconcile-issues.ts",
|
|
61
|
+
"packages/core/src/issue-sync/sync-from-xbrief.ts",
|
|
62
|
+
"packages/core/src/orchestration/probe-session.ts",
|
|
63
|
+
"packages/core/src/orchestration/verify-judgment-gates.ts",
|
|
64
|
+
"packages/core/src/platform/changelog-cli.ts",
|
|
65
|
+
"packages/core/src/release/gh.ts",
|
|
66
|
+
"packages/core/src/release/pipeline-fixture.ts",
|
|
67
|
+
"packages/core/src/release/pipeline.ts",
|
|
68
|
+
"packages/core/src/render/export-spec.ts",
|
|
69
|
+
"packages/core/src/render/prd-render.ts",
|
|
70
|
+
"packages/core/src/render/roadmap-render.ts",
|
|
71
|
+
"packages/core/src/render/rule-map.ts",
|
|
72
|
+
"packages/core/src/render/spec-render.ts",
|
|
73
|
+
"packages/core/src/scm/gh-rest.ts",
|
|
74
|
+
"packages/core/src/triage/actions/candidates-log.ts",
|
|
75
|
+
"packages/core/src/triage/bootstrap/index.ts",
|
|
76
|
+
"packages/core/src/triage/reconcile/reconcile.ts",
|
|
77
|
+
"packages/core/src/triage/scope-drift/add-ignore.ts",
|
|
78
|
+
"packages/core/src/triage/scope/coverage.ts",
|
|
79
|
+
"packages/core/src/triage/scope/mutations-core.ts",
|
|
80
|
+
"packages/core/src/triage/smoketest/index.ts",
|
|
81
|
+
"packages/core/src/triage/subscribe/index.ts",
|
|
82
|
+
"packages/core/src/triage/summary/index.ts",
|
|
83
|
+
"packages/core/src/vbrief-build/speckit.ts",
|
|
84
|
+
"packages/core/src/vbrief-reconcile/reconciliation.ts",
|
|
85
|
+
"packages/core/src/vbrief-validation/safety.ts",
|
|
86
|
+
"packages/core/src/xbrief-migrate/agents-header.ts",
|
|
87
|
+
// Phase 2 removed: cache/io.ts, lifecycle/events.ts (migrated to containedWrite).
|
|
88
|
+
];
|
|
89
|
+
/** Path segments that mark a file as test or fixture (always allowlisted). */
|
|
90
|
+
const TEST_PATH_MARKERS = [
|
|
91
|
+
".test.ts",
|
|
92
|
+
".test.tsx",
|
|
93
|
+
"/test-helpers.ts",
|
|
94
|
+
"/fixtures/",
|
|
95
|
+
"\\fixtures\\",
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* Non-product harness path markers excluded from the product inventory (#2980).
|
|
99
|
+
* Prefer exclusion over permanent CONTAINED_WRITES_ALLOWLIST entries for e2e/parity noise.
|
|
100
|
+
* Paths are matched as posix substrings after `toPosix` (always `/` separators).
|
|
101
|
+
*/
|
|
102
|
+
export const NON_PRODUCT_HARNESS_PATH_MARKERS = [
|
|
103
|
+
"/release-e2e/",
|
|
104
|
+
"/integration-e2e/",
|
|
105
|
+
"parity-scenarios.ts",
|
|
106
|
+
"parity-scenarios.tsx",
|
|
107
|
+
];
|
|
108
|
+
function toPosix(p) {
|
|
109
|
+
return p.split(sep).join("/");
|
|
110
|
+
}
|
|
111
|
+
function isTestPath(relPosix) {
|
|
112
|
+
return TEST_PATH_MARKERS.some((m) => relPosix.includes(m.replace(/\\/g, "/")));
|
|
113
|
+
}
|
|
114
|
+
/** E2E / parity harness under src/ — not product sinks (#2980 scanner hygiene). */
|
|
115
|
+
function isNonProductHarnessPath(relPosix) {
|
|
116
|
+
return NON_PRODUCT_HARNESS_PATH_MARKERS.some((m) => relPosix.includes(m));
|
|
117
|
+
}
|
|
118
|
+
/** Strip trailing `/` without regex (CodeQL js/polynomial-redos safe). */
|
|
119
|
+
function stripTrailingSlashes(path) {
|
|
120
|
+
let end = path.length;
|
|
121
|
+
while (end > 0 && path.charCodeAt(end - 1) === 47 /* / */) {
|
|
122
|
+
end -= 1;
|
|
123
|
+
}
|
|
124
|
+
return end === path.length ? path : path.slice(0, end);
|
|
125
|
+
}
|
|
126
|
+
function isAllowlisted(relPosix, allow) {
|
|
127
|
+
if (isTestPath(relPosix) || isNonProductHarnessPath(relPosix)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
return allow.some((entry) => {
|
|
131
|
+
// Avoid regex on path input (CodeQL js/polynomial-redos on /\/+$/).
|
|
132
|
+
const e = stripTrailingSlashes(entry.split("\\").join("/"));
|
|
133
|
+
// Exact file match, or directory-prefix only (never bare endsWith — that
|
|
134
|
+
// lets `evil/.../packages/core/src/fs/contained-write.ts` slip through).
|
|
135
|
+
return relPosix === e || relPosix.startsWith(`${e}/`);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function walkTsFiles(dir, out) {
|
|
139
|
+
let entries;
|
|
140
|
+
try {
|
|
141
|
+
entries = readdirSync(dir);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
for (const name of entries) {
|
|
147
|
+
if (name === "node_modules" || name === "dist" || name === ".git") {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const full = join(dir, name);
|
|
151
|
+
let st;
|
|
152
|
+
try {
|
|
153
|
+
st = statSync(full);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (st.isDirectory()) {
|
|
159
|
+
walkTsFiles(full, out);
|
|
160
|
+
}
|
|
161
|
+
else if (st.isFile() && (name.endsWith(".ts") || name.endsWith(".tsx"))) {
|
|
162
|
+
out.push(full);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function scanFile(absPath, relPosix) {
|
|
167
|
+
let text;
|
|
168
|
+
try {
|
|
169
|
+
text = readFileSync(absPath, "utf8");
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
const findings = [];
|
|
175
|
+
const lines = text.split(/\r?\n/);
|
|
176
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
177
|
+
const line = lines[i] ?? "";
|
|
178
|
+
// Skip import lines and comments-only lines for noise reduction.
|
|
179
|
+
const trimmed = line.trim();
|
|
180
|
+
if (trimmed.startsWith("import ") ||
|
|
181
|
+
trimmed.startsWith("//") ||
|
|
182
|
+
trimmed.startsWith("*") ||
|
|
183
|
+
trimmed.startsWith("/*")) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
for (const re of RAW_WRITE_PATTERNS) {
|
|
187
|
+
if (re.test(line)) {
|
|
188
|
+
findings.push({
|
|
189
|
+
path: relPosix,
|
|
190
|
+
line: i + 1,
|
|
191
|
+
match: trimmed.length > 100 ? `${trimmed.slice(0, 97)}...` : trimmed,
|
|
192
|
+
});
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return findings;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Inventory raw write sinks under scan roots; fail-open by default (#2951).
|
|
201
|
+
* Pass `enforce: true` / `--enforce` to fail closed on findings (Phase 2 path).
|
|
202
|
+
*/
|
|
203
|
+
export function evaluateContainedWrites(options) {
|
|
204
|
+
const root = resolve(options.projectRoot);
|
|
205
|
+
if (!existsSync(root)) {
|
|
206
|
+
return {
|
|
207
|
+
code: EXIT_CONFIG,
|
|
208
|
+
message: `verify:contained-writes: project root not found: ${root}`,
|
|
209
|
+
stream: "stderr",
|
|
210
|
+
findings: [],
|
|
211
|
+
enforce: Boolean(options.enforce),
|
|
212
|
+
failOpen: !options.enforce,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const enforce = options.enforce === true;
|
|
216
|
+
const allow = [...CONTAINED_WRITES_ALLOWLIST, ...(options.extraAllowlist ?? [])];
|
|
217
|
+
const scanRoots = options.scanRoots ?? ["packages/core/src"];
|
|
218
|
+
const findings = [];
|
|
219
|
+
for (const scanRel of scanRoots) {
|
|
220
|
+
const scanAbs = resolve(root, scanRel);
|
|
221
|
+
if (!existsSync(scanAbs)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const files = [];
|
|
225
|
+
walkTsFiles(scanAbs, files);
|
|
226
|
+
for (const abs of files) {
|
|
227
|
+
const relPosix = toPosix(relative(root, abs));
|
|
228
|
+
if (isAllowlisted(relPosix, allow)) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
findings.push(...scanFile(abs, relPosix));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (findings.length === 0) {
|
|
235
|
+
return {
|
|
236
|
+
code: EXIT_OK,
|
|
237
|
+
message: `OK: verify:contained-writes — no non-allowlisted raw write sinks under ${scanRoots.join(", ")} (enforce=${enforce}).`,
|
|
238
|
+
stream: "stdout",
|
|
239
|
+
findings: [],
|
|
240
|
+
enforce,
|
|
241
|
+
failOpen: !enforce,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const lines = [
|
|
245
|
+
`verify:contained-writes: found ${findings.length} raw write sink(s) outside allowlist:`,
|
|
246
|
+
...findings.slice(0, 50).map((f) => ` ${f.path}:${f.line}: ${f.match}`),
|
|
247
|
+
];
|
|
248
|
+
if (findings.length > 50) {
|
|
249
|
+
lines.push(` ... and ${findings.length - 50} more`);
|
|
250
|
+
}
|
|
251
|
+
if (enforce) {
|
|
252
|
+
lines.push("FAIL: --enforce is set; migrate sinks to packages/core/src/fs/contained-write.ts or add a justified allowlist entry (#2951).");
|
|
253
|
+
return {
|
|
254
|
+
code: EXIT_ENFORCE_FINDINGS,
|
|
255
|
+
message: lines.join("\n"),
|
|
256
|
+
stream: "stderr",
|
|
257
|
+
findings,
|
|
258
|
+
enforce: true,
|
|
259
|
+
failOpen: false,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
lines.push("ADVISORY (fail-open): exit 0. Prefer containedWrite() for new sinks; pass --enforce to fail closed. See docs/reference/contained-write.md (#2951 Phase 2).");
|
|
263
|
+
return {
|
|
264
|
+
code: EXIT_OK,
|
|
265
|
+
message: lines.join("\n"),
|
|
266
|
+
stream: "stdout",
|
|
267
|
+
findings,
|
|
268
|
+
enforce: false,
|
|
269
|
+
failOpen: true,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=contained-writes.js.map
|
|
@@ -3,14 +3,19 @@ import { join, resolve } from "node:path";
|
|
|
3
3
|
export const CURSOR_TIER1_TARGETS = [
|
|
4
4
|
{
|
|
5
5
|
path: "content/skills/deft-directive-swarm/SKILL.md",
|
|
6
|
-
label: "swarm Phase 3 capability matrix",
|
|
6
|
+
label: "swarm Phase 3 capability matrix (thin skill)",
|
|
7
7
|
markers: [
|
|
8
8
|
"Probe for the Cursor `Task` tool",
|
|
9
9
|
"cursor-composer",
|
|
10
10
|
"cursor-cloud-agent",
|
|
11
|
-
"
|
|
11
|
+
"host-cursor.md",
|
|
12
12
|
],
|
|
13
13
|
},
|
|
14
|
+
{
|
|
15
|
+
path: "content/skills/deft-directive-swarm/references/host-cursor.md",
|
|
16
|
+
label: "swarm Cursor host adapter",
|
|
17
|
+
markers: ["Step 2e: Cursor Launch", "cursor-composer", "Task"],
|
|
18
|
+
},
|
|
14
19
|
{
|
|
15
20
|
path: "content/skills/deft-directive-review-cycle/SKILL.md",
|
|
16
21
|
label: "review-cycle monitoring tier selection",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from "./biome-config.js";
|
|
2
2
|
export * from "./code-structure-validate.js";
|
|
3
|
+
export * from "./contained-writes.js";
|
|
3
4
|
export * from "./content-manifest.js";
|
|
4
5
|
export { CANONICAL_SCHEMA_REL, type ContractDriftOptions, type ContractDriftResult, evaluateContractDrift, PUBLISHED_SCHEMA_REL, } from "./contract-drift.js";
|
|
5
6
|
export * from "./cursor-tier1.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from "./biome-config.js";
|
|
2
2
|
export * from "./code-structure-validate.js";
|
|
3
|
+
export * from "./contained-writes.js";
|
|
3
4
|
export * from "./content-manifest.js";
|
|
4
5
|
export { CANONICAL_SCHEMA_REL, evaluateContractDrift, PUBLISHED_SCHEMA_REL, } from "./contract-drift.js";
|
|
5
6
|
export * from "./cursor-tier1.js";
|
|
@@ -3,14 +3,32 @@ import { join, resolve } from "node:path";
|
|
|
3
3
|
export const OPENCLAW_TIER1_TARGETS = [
|
|
4
4
|
{
|
|
5
5
|
path: "content/skills/deft-directive-swarm/SKILL.md",
|
|
6
|
-
label: "swarm Phase 3 capability matrix",
|
|
6
|
+
label: "swarm Phase 3 capability matrix (thin skill)",
|
|
7
7
|
markers: [
|
|
8
8
|
"Probe for the OpenClaw `sessions_spawn` tool",
|
|
9
9
|
"sessions_spawn",
|
|
10
10
|
"openclaw",
|
|
11
|
+
"host-openclaw.md",
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
path: "content/skills/deft-directive-swarm/references/host-openclaw.md",
|
|
16
|
+
label: "swarm OpenClaw host adapter",
|
|
17
|
+
// Cold-start (#2968 A7): project root + Skills Index before freestyle; keep Tier-1 launch markers.
|
|
18
|
+
markers: [
|
|
11
19
|
"Step 2f: OpenClaw Launch",
|
|
20
|
+
"sessions_spawn",
|
|
21
|
+
"openclaw",
|
|
22
|
+
"Cold-start",
|
|
23
|
+
"Skills Index",
|
|
24
|
+
"project root",
|
|
12
25
|
],
|
|
13
26
|
},
|
|
27
|
+
{
|
|
28
|
+
path: "content/contracts/host-lifecycle-duties.md",
|
|
29
|
+
label: "host lifecycle duty list contract (#2968 A3)",
|
|
30
|
+
markers: ["Session start", "Deft-shaped user intent", "Skills Index", "project root"],
|
|
31
|
+
},
|
|
14
32
|
{
|
|
15
33
|
path: "packages/core/src/swarm/routing.ts",
|
|
16
34
|
label: "swarm routing dispatch_provider",
|
|
@@ -11,6 +11,9 @@ export const EXCLUDE_DIRS = new Set([
|
|
|
11
11
|
"__pycache__",
|
|
12
12
|
"dist",
|
|
13
13
|
"scripts",
|
|
14
|
+
// Swarm / agent worktrees are not product source (#2953, #1656).
|
|
15
|
+
".deft-scratch",
|
|
16
|
+
"swarm-worktrees",
|
|
14
17
|
]);
|
|
15
18
|
export const EXTENSIONS = new Set([".py", ".go", ".sh"]);
|
|
16
19
|
function isWordChar(ch) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync
|
|
2
|
-
import {
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from "node:fs";
|
|
2
|
+
import { join, relative, resolve } from "node:path";
|
|
3
|
+
import { containedWrite } from "../fs/contained-write.js";
|
|
3
4
|
import { assertWriteTargetSafe, ProjectionContainmentError } from "../fs/projection-containment.js";
|
|
4
5
|
import { checkGitClean } from "../migrate-preflight/index.js";
|
|
5
6
|
import { applyAgentsRefresh } from "../platform/agents-md.js";
|
|
@@ -48,19 +49,30 @@ function mapRelativePath(relativePath) {
|
|
|
48
49
|
: segment)
|
|
49
50
|
.join("/");
|
|
50
51
|
}
|
|
51
|
-
function writeMigratedFile(srcPath, destPath) {
|
|
52
|
-
|
|
52
|
+
function writeMigratedFile(projectRoot, srcPath, destPath) {
|
|
53
|
+
// #2980 wave C: product write sink routes through containedWrite.
|
|
54
|
+
const root = resolve(projectRoot);
|
|
53
55
|
if (srcPath.endsWith(LEGACY_ARTIFACT_SUFFIX)) {
|
|
54
56
|
const parsed = JSON.parse(readFileSync(srcPath, "utf8"));
|
|
55
57
|
const result = transformArtifactV06ToV08Transactional(parsed);
|
|
56
58
|
if (!result.ok) {
|
|
57
59
|
throw new Error(result.error);
|
|
58
60
|
}
|
|
59
|
-
|
|
61
|
+
containedWrite({
|
|
62
|
+
root,
|
|
63
|
+
target: destPath,
|
|
64
|
+
data: `${JSON.stringify(result.artifact, null, 2)}\n`,
|
|
65
|
+
mode: "replace",
|
|
66
|
+
});
|
|
60
67
|
return;
|
|
61
68
|
}
|
|
62
69
|
const raw = readFileSync(srcPath, "utf8");
|
|
63
|
-
|
|
70
|
+
containedWrite({
|
|
71
|
+
root,
|
|
72
|
+
target: destPath,
|
|
73
|
+
data: rewriteEmbeddedTokens(raw),
|
|
74
|
+
mode: "replace",
|
|
75
|
+
});
|
|
64
76
|
}
|
|
65
77
|
function backupMigrationInputs(projectRoot, legacyDir, migratedDir) {
|
|
66
78
|
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
@@ -100,7 +112,7 @@ function migrateLegacyTree(projectRoot, legacyDir, options) {
|
|
|
100
112
|
if (shouldOmitLegacyMigrationFile(rel))
|
|
101
113
|
continue;
|
|
102
114
|
const destPath = join(stagedDir, mapRelativePath(rel));
|
|
103
|
-
writeMigratedFile(srcPath, destPath);
|
|
115
|
+
writeMigratedFile(projectRoot, srcPath, destPath);
|
|
104
116
|
}
|
|
105
117
|
overlayCanonicalTriageCache(migratedDir, stagedDir);
|
|
106
118
|
renameOrReplace(stagedDir, migratedDir);
|
|
@@ -123,14 +135,16 @@ function migrateLegacyTree(projectRoot, legacyDir, options) {
|
|
|
123
135
|
/** Idempotently write the legacy-root deprecation marker (#2270 / #2869). */
|
|
124
136
|
function writeVbriefDeprecationMarker(projectRoot, legacyDir) {
|
|
125
137
|
const markerPath = join(legacyDir, VBRIEF_DEPRECATION_MARKER_FILENAME);
|
|
126
|
-
// Refuse leaf or parent-dir symlink escapes
|
|
127
|
-
assertWriteTargetSafe(projectRoot, legacyDir);
|
|
128
|
-
assertWriteTargetSafe(projectRoot, markerPath);
|
|
129
|
-
mkdirSync(legacyDir, { recursive: true });
|
|
138
|
+
// Refuse leaf or parent-dir symlink escapes via containedWrite (#2869 / #2980 wave C).
|
|
130
139
|
if (hasVbriefDeprecationMarker(legacyDir)) {
|
|
131
140
|
return;
|
|
132
141
|
}
|
|
133
|
-
|
|
142
|
+
containedWrite({
|
|
143
|
+
root: resolve(projectRoot),
|
|
144
|
+
target: markerPath,
|
|
145
|
+
data: VBRIEF_DEPRECATION_MARKER_BODY,
|
|
146
|
+
mode: "replace",
|
|
147
|
+
});
|
|
134
148
|
}
|
|
135
149
|
/**
|
|
136
150
|
* Converge a leftover legacy `vbrief/` root to an unambiguous state (#2270).
|
|
@@ -15,8 +15,10 @@ export declare function readDeclaredArtifactVersion(artifact: JsonObject): strin
|
|
|
15
15
|
export declare function rewriteEmbeddedTokens(value: string): string;
|
|
16
16
|
/**
|
|
17
17
|
* Convert a single v0.6 in-document artifact to v0.8 semantics.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* Accepts classic `vBRIEFInfo@0.6` or hybrid `xBRIEFInfo@0.6` (layout renamed,
|
|
19
|
+
* envelope not bumped — #2970). Idempotent: v0.8 artifacts are returned
|
|
20
|
+
* unchanged (deep-cloned). Transactional: on failure the original input
|
|
21
|
+
* object is not mutated.
|
|
20
22
|
*/
|
|
21
23
|
export declare function transformArtifactV06ToV08(input: JsonObject): JsonObject;
|
|
22
24
|
/**
|
|
@@ -74,30 +74,53 @@ function isAlreadyV08Artifact(artifact) {
|
|
|
74
74
|
const info = artifact[MIGRATED_INFO_ROOT_KEY];
|
|
75
75
|
return isPlainObject(info) && info.version === VBRIEF_VERSION;
|
|
76
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve a v0.6 info block from classic `vBRIEFInfo` or hybrid `xBRIEFInfo@0.6`.
|
|
79
|
+
* Prefer the classic key when both are present. Layout rename ≠ envelope bump (#2970).
|
|
80
|
+
*/
|
|
81
|
+
function resolveV06InfoBlock(artifact) {
|
|
82
|
+
if (LEGACY_INFO_ROOT_KEY in artifact) {
|
|
83
|
+
const legacyInfo = artifact[LEGACY_INFO_ROOT_KEY];
|
|
84
|
+
if (!isPlainObject(legacyInfo)) {
|
|
85
|
+
throw new TransformError(`'${LEGACY_INFO_ROOT_KEY}' must be an object`);
|
|
86
|
+
}
|
|
87
|
+
const declaredVersion = legacyInfo.version;
|
|
88
|
+
if (declaredVersion !== LEGACY_VBRIEF_VERSION) {
|
|
89
|
+
throw new TransformError(`expected ${LEGACY_INFO_ROOT_KEY}.version ${LEGACY_VBRIEF_VERSION}, got ${String(declaredVersion)}`);
|
|
90
|
+
}
|
|
91
|
+
return legacyInfo;
|
|
92
|
+
}
|
|
93
|
+
if (MIGRATED_INFO_ROOT_KEY in artifact) {
|
|
94
|
+
const hybridInfo = artifact[MIGRATED_INFO_ROOT_KEY];
|
|
95
|
+
if (!isPlainObject(hybridInfo)) {
|
|
96
|
+
throw new TransformError(`'${MIGRATED_INFO_ROOT_KEY}' must be an object`);
|
|
97
|
+
}
|
|
98
|
+
const declaredVersion = hybridInfo.version;
|
|
99
|
+
if (declaredVersion !== LEGACY_VBRIEF_VERSION) {
|
|
100
|
+
throw new TransformError(`expected hybrid ${MIGRATED_INFO_ROOT_KEY}.version ${LEGACY_VBRIEF_VERSION} (or ${VBRIEF_VERSION} for already-migrated), got ${String(declaredVersion)}`);
|
|
101
|
+
}
|
|
102
|
+
return hybridInfo;
|
|
103
|
+
}
|
|
104
|
+
throw new TransformError(`missing required legacy info block '${LEGACY_INFO_ROOT_KEY}' or hybrid '${MIGRATED_INFO_ROOT_KEY}'@${LEGACY_VBRIEF_VERSION} for v0.6 -> v0.8 transform`);
|
|
105
|
+
}
|
|
77
106
|
/**
|
|
78
107
|
* Convert a single v0.6 in-document artifact to v0.8 semantics.
|
|
79
|
-
*
|
|
80
|
-
*
|
|
108
|
+
* Accepts classic `vBRIEFInfo@0.6` or hybrid `xBRIEFInfo@0.6` (layout renamed,
|
|
109
|
+
* envelope not bumped — #2970). Idempotent: v0.8 artifacts are returned
|
|
110
|
+
* unchanged (deep-cloned). Transactional: on failure the original input
|
|
111
|
+
* object is not mutated.
|
|
81
112
|
*/
|
|
82
113
|
export function transformArtifactV06ToV08(input) {
|
|
83
114
|
const working = structuredClone(input);
|
|
84
115
|
if (isAlreadyV08Artifact(working)) {
|
|
85
116
|
return working;
|
|
86
117
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
const legacyInfo = working[LEGACY_INFO_ROOT_KEY];
|
|
91
|
-
if (!isPlainObject(legacyInfo)) {
|
|
92
|
-
throw new TransformError(`'${LEGACY_INFO_ROOT_KEY}' must be an object`);
|
|
93
|
-
}
|
|
94
|
-
const declaredVersion = legacyInfo.version;
|
|
95
|
-
if (declaredVersion !== LEGACY_VBRIEF_VERSION) {
|
|
96
|
-
throw new TransformError(`expected ${LEGACY_INFO_ROOT_KEY}.version ${LEGACY_VBRIEF_VERSION}, got ${String(declaredVersion)}`);
|
|
97
|
-
}
|
|
118
|
+
const info = resolveV06InfoBlock(working);
|
|
119
|
+
// Drop both keys so a dual-key hybrid cannot leave a stale vBRIEFInfo behind.
|
|
98
120
|
delete working[LEGACY_INFO_ROOT_KEY];
|
|
121
|
+
delete working[MIGRATED_INFO_ROOT_KEY];
|
|
99
122
|
working[MIGRATED_INFO_ROOT_KEY] = {
|
|
100
|
-
...
|
|
123
|
+
...info,
|
|
101
124
|
version: VBRIEF_VERSION,
|
|
102
125
|
};
|
|
103
126
|
const rewritten = deepRewriteValues(working);
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.89.0",
|
|
4
4
|
"description": "TypeScript engine core for the Directive framework.",
|
|
5
|
+
"license": "MIT",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
@@ -74,6 +75,14 @@
|
|
|
74
75
|
"types": "./dist/hooks/index.d.ts",
|
|
75
76
|
"default": "./dist/hooks/index.js"
|
|
76
77
|
},
|
|
78
|
+
"./authz": {
|
|
79
|
+
"types": "./dist/authz/index.d.ts",
|
|
80
|
+
"default": "./dist/authz/index.js"
|
|
81
|
+
},
|
|
82
|
+
"./escalation": {
|
|
83
|
+
"types": "./dist/escalation/index.d.ts",
|
|
84
|
+
"default": "./dist/escalation/index.js"
|
|
85
|
+
},
|
|
77
86
|
"./plan-sequence": {
|
|
78
87
|
"types": "./dist/plan-sequence/index.d.ts",
|
|
79
88
|
"default": "./dist/plan-sequence/index.js"
|
|
@@ -178,6 +187,10 @@
|
|
|
178
187
|
"types": "./dist/pr-watch/index.d.ts",
|
|
179
188
|
"default": "./dist/pr-watch/index.js"
|
|
180
189
|
},
|
|
190
|
+
"./finish-loop": {
|
|
191
|
+
"types": "./dist/finish-loop/index.d.ts",
|
|
192
|
+
"default": "./dist/finish-loop/index.js"
|
|
193
|
+
},
|
|
181
194
|
"./vbrief-build": {
|
|
182
195
|
"types": "./dist/vbrief-build/index.d.ts",
|
|
183
196
|
"default": "./dist/vbrief-build/index.js"
|
|
@@ -317,8 +330,8 @@
|
|
|
317
330
|
"provenance": true
|
|
318
331
|
},
|
|
319
332
|
"dependencies": {
|
|
320
|
-
"@deftai/directive-content": "^0.
|
|
321
|
-
"@deftai/directive-types": "^0.
|
|
333
|
+
"@deftai/directive-content": "^0.89.0",
|
|
334
|
+
"@deftai/directive-types": "^0.89.0",
|
|
322
335
|
"archiver": "^8.0.0"
|
|
323
336
|
},
|
|
324
337
|
"scripts": {
|