@deftai/directive-core 0.55.2 → 0.56.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/cache/errors.d.ts +4 -1
- package/dist/cache/errors.js +8 -2
- package/dist/cache/fetch.d.ts +50 -0
- package/dist/cache/fetch.js +224 -3
- package/dist/cache/main.js +10 -5
- package/dist/cache/operations.js +6 -4
- package/dist/deposit/copy-tree.d.ts +16 -0
- package/dist/deposit/copy-tree.js +58 -0
- package/dist/deposit/resolve-content.d.ts +28 -0
- package/dist/deposit/resolve-content.js +70 -0
- package/dist/doctor/checks.d.ts +6 -0
- package/dist/doctor/checks.js +37 -0
- package/dist/doctor/constants.d.ts +2 -0
- package/dist/doctor/constants.js +8 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/init-deposit/gitignore.d.ts +51 -0
- package/dist/init-deposit/gitignore.js +200 -0
- package/dist/init-deposit/index.d.ts +6 -0
- package/dist/init-deposit/index.js +6 -0
- package/dist/init-deposit/init-deposit.d.ts +44 -0
- package/dist/init-deposit/init-deposit.js +197 -0
- package/dist/init-deposit/legacy-detect.d.ts +61 -0
- package/dist/init-deposit/legacy-detect.js +223 -0
- package/dist/init-deposit/migrate.d.ts +88 -0
- package/dist/init-deposit/migrate.js +196 -0
- package/dist/init-deposit/refresh.d.ts +50 -0
- package/dist/init-deposit/refresh.js +292 -0
- package/dist/init-deposit/scaffold.d.ts +41 -0
- package/dist/init-deposit/scaffold.js +753 -0
- package/dist/legacy-bridge/bridge-drift.d.ts +70 -0
- package/dist/legacy-bridge/bridge-drift.js +171 -0
- package/dist/legacy-bridge/freeze-gate.d.ts +79 -0
- package/dist/legacy-bridge/freeze-gate.js +168 -0
- package/dist/legacy-bridge/index.d.ts +4 -0
- package/dist/legacy-bridge/index.js +4 -0
- package/dist/legacy-bridge/sot.d.ts +45 -0
- package/dist/legacy-bridge/sot.js +49 -0
- package/dist/preflight-cache/evaluate.d.ts +11 -0
- package/dist/preflight-cache/evaluate.js +63 -13
- package/dist/release-e2e/flags.js +5 -1
- package/dist/release-e2e/legacy-bridge-leg.d.ts +134 -0
- package/dist/release-e2e/legacy-bridge-leg.js +478 -0
- package/dist/release-e2e/main.d.ts +2 -1
- package/dist/release-e2e/main.js +17 -1
- package/dist/release-e2e/types.d.ts +9 -0
- package/dist/render/index.d.ts +1 -1
- package/dist/render/index.js +1 -1
- package/dist/render/project-render.js +4 -3
- package/dist/render/roadmap-render.d.ts +4 -2
- package/dist/render/roadmap-render.js +14 -7
- package/dist/triage/actions/candidates-log.d.ts +12 -1
- package/dist/triage/actions/candidates-log.js +44 -7
- package/dist/triage/actions/index.d.ts +25 -1
- package/dist/triage/actions/index.js +94 -3
- package/dist/triage/summary/index.d.ts +1 -3
- package/dist/triage/summary/index.js +6 -57
- package/dist/triage/summary/reconcilable.js +4 -33
- package/dist/triage/welcome/default-mode.d.ts +1 -0
- package/dist/triage/welcome/default-mode.js +6 -0
- package/dist/vbrief-validate/project-definition.js +4 -69
- package/dist/vbrief-validate/registry-status.d.ts +20 -0
- package/dist/vbrief-validate/registry-status.js +85 -0
- package/package.json +11 -2
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TS-native healthy-path refresh for `directive update` (#1942 S3).
|
|
3
|
+
*
|
|
4
|
+
* Re-copies the pinned @deftai/directive-content into `.deft/core`, surgically
|
|
5
|
+
* re-renders the AGENTS.md managed-section, runs #1430 neutralization, and
|
|
6
|
+
* discloses refresh side-effects + engine/content version skew.
|
|
7
|
+
*
|
|
8
|
+
* Refs #1942, #1430, #1671.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
import { join, resolve } from "node:path";
|
|
12
|
+
import { copyTree } from "../deposit/copy-tree.js";
|
|
13
|
+
import { resolveInstalledContentRoot } from "../deposit/resolve-content.js";
|
|
14
|
+
import { manifestTagToVersion, parseInstallManifest } from "../doctor/manifest.js";
|
|
15
|
+
import { readCorePackageVersion } from "../engine-version.js";
|
|
16
|
+
import { gitPorcelain } from "../story-ready/git.js";
|
|
17
|
+
import { parseInitArgv } from "./init-deposit.js";
|
|
18
|
+
import { buildLegacyRefusalJson, buildLegacyRefusalMessage, detectLegacyLayout, LEGACY_LAYOUT_REFUSED_EXIT_CODE, LegacyLayoutRefusedError, } from "./legacy-detect.js";
|
|
19
|
+
import { CANONICAL_INSTALL_ROOT, depositNeutralization, writeAgentsMd, writeInstallManifest, } from "./scaffold.js";
|
|
20
|
+
const INSTALLER_MANAGED_EXACT = new Set([
|
|
21
|
+
"AGENTS.md",
|
|
22
|
+
".gitattributes",
|
|
23
|
+
".gitignore",
|
|
24
|
+
"greptile.json",
|
|
25
|
+
".github/codeql/codeql-config.yml",
|
|
26
|
+
".github/workflows/deft-core-guard.yml",
|
|
27
|
+
"vbrief/.deft-version",
|
|
28
|
+
"vbrief/vbrief.md",
|
|
29
|
+
"vbrief/proposed/.gitkeep",
|
|
30
|
+
"vbrief/pending/.gitkeep",
|
|
31
|
+
"vbrief/active/.gitkeep",
|
|
32
|
+
"vbrief/completed/.gitkeep",
|
|
33
|
+
"vbrief/cancelled/.gitkeep",
|
|
34
|
+
]);
|
|
35
|
+
const INSTALLER_MANAGED_PREFIXES = [
|
|
36
|
+
".agents/",
|
|
37
|
+
".githooks/",
|
|
38
|
+
"vbrief/schemas/",
|
|
39
|
+
"vbrief/migration/",
|
|
40
|
+
];
|
|
41
|
+
function normalizeVersion(version) {
|
|
42
|
+
return version.trim().replace(/^v/, "");
|
|
43
|
+
}
|
|
44
|
+
function readContentPackageVersion(contentRoot, fallback) {
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(readFileSync(join(contentRoot, "package.json"), "utf8"));
|
|
47
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
48
|
+
const version = parsed.version;
|
|
49
|
+
if (version?.trim())
|
|
50
|
+
return version.trim();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// fall through
|
|
55
|
+
}
|
|
56
|
+
return fallback();
|
|
57
|
+
}
|
|
58
|
+
function readRecordedDepositVersion(deftDir) {
|
|
59
|
+
const manifestPath = join(deftDir, "VERSION");
|
|
60
|
+
if (!existsSync(manifestPath))
|
|
61
|
+
return null;
|
|
62
|
+
try {
|
|
63
|
+
return manifestTagToVersion(parseInstallManifest(readFileSync(manifestPath, "utf8")));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function isInstallerManagedPath(path) {
|
|
70
|
+
if (INSTALLER_MANAGED_EXACT.has(path))
|
|
71
|
+
return true;
|
|
72
|
+
return INSTALLER_MANAGED_PREFIXES.some((prefix) => path.startsWith(prefix));
|
|
73
|
+
}
|
|
74
|
+
function unquoteGitPath(path) {
|
|
75
|
+
if (path.length >= 2 && path.startsWith('"') && path.endsWith('"')) {
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(path);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return path.slice(1, -1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return path;
|
|
84
|
+
}
|
|
85
|
+
function porcelainStatusPaths(porcelain) {
|
|
86
|
+
const paths = [];
|
|
87
|
+
for (const line of porcelain.split("\n")) {
|
|
88
|
+
if (line.length < 4)
|
|
89
|
+
continue;
|
|
90
|
+
let rest = line.slice(3);
|
|
91
|
+
const arrow = rest.indexOf(" -> ");
|
|
92
|
+
if (arrow >= 0)
|
|
93
|
+
rest = rest.slice(arrow + 4);
|
|
94
|
+
const trimmed = unquoteGitPath(rest.trim());
|
|
95
|
+
if (!trimmed)
|
|
96
|
+
continue;
|
|
97
|
+
paths.push(trimmed.replace(/\\/g, "/"));
|
|
98
|
+
}
|
|
99
|
+
return paths;
|
|
100
|
+
}
|
|
101
|
+
function classifyChangedPaths(changed) {
|
|
102
|
+
const core = [];
|
|
103
|
+
const installerManaged = [];
|
|
104
|
+
for (const path of changed) {
|
|
105
|
+
if (!path)
|
|
106
|
+
continue;
|
|
107
|
+
if (path.startsWith(".deft/core/") || path === ".deft/core") {
|
|
108
|
+
core.push(path);
|
|
109
|
+
}
|
|
110
|
+
else if (isInstallerManagedPath(path)) {
|
|
111
|
+
installerManaged.push(path);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { core, installerManaged };
|
|
115
|
+
}
|
|
116
|
+
/** Framework-managed uncommitted paths after refresh (#1671). */
|
|
117
|
+
export function frameworkRefreshSideEffects(projectDir, readPorcelain = gitPorcelain) {
|
|
118
|
+
const porcelain = readPorcelain(projectDir);
|
|
119
|
+
if (porcelain === null)
|
|
120
|
+
return [];
|
|
121
|
+
const changed = porcelainStatusPaths(porcelain);
|
|
122
|
+
const { core, installerManaged } = classifyChangedPaths(changed);
|
|
123
|
+
const files = [...core, ...installerManaged].sort();
|
|
124
|
+
return files.length > 0 ? files : [];
|
|
125
|
+
}
|
|
126
|
+
export function printRefreshSideEffects(io, files) {
|
|
127
|
+
if (files.length === 0)
|
|
128
|
+
return;
|
|
129
|
+
io.printf("\nAGENTS.md refresh side effects (#1671): the refresh and framework payload swap\n");
|
|
130
|
+
io.printf("left these framework files with uncommitted changes -- they belong in the\n");
|
|
131
|
+
io.printf("framework deposit commit (the installer stages them before printing the\n");
|
|
132
|
+
io.printf("`git add` list below, so there are no post-stage stragglers):\n");
|
|
133
|
+
for (const file of files) {
|
|
134
|
+
io.printf(` ${file}\n`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function buildVersionSkewNotice(engineVersion, contentVersion, previousDepositVersion) {
|
|
138
|
+
const engine = normalizeVersion(engineVersion);
|
|
139
|
+
const content = normalizeVersion(contentVersion);
|
|
140
|
+
if (engine !== content) {
|
|
141
|
+
return (`[deft update] Version skew: @deftai/directive-core is v${engine} but ` +
|
|
142
|
+
`@deftai/directive-content is v${content}. Consider aligning npm installs ` +
|
|
143
|
+
"(`npm i -g @deftai/directive@latest`).");
|
|
144
|
+
}
|
|
145
|
+
if (previousDepositVersion !== null) {
|
|
146
|
+
const recorded = normalizeVersion(previousDepositVersion);
|
|
147
|
+
if (recorded !== content) {
|
|
148
|
+
return (`[deft update] Version skew: deposited content is v${content} but the ` +
|
|
149
|
+
`recorded manifest was v${recorded}.`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
export function buildUpdateSummaryJson(result, options) {
|
|
155
|
+
return {
|
|
156
|
+
success: true,
|
|
157
|
+
action: "upgrade",
|
|
158
|
+
version: result.engineVersion,
|
|
159
|
+
project_dir: result.projectDir,
|
|
160
|
+
deft_dir: result.deftDir,
|
|
161
|
+
legacy_layout: result.legacyLayout,
|
|
162
|
+
update: true,
|
|
163
|
+
non_interactive: options.nonInteractive,
|
|
164
|
+
upgrade: options.upgrade,
|
|
165
|
+
taskfile_wired: false,
|
|
166
|
+
missing_tools: [],
|
|
167
|
+
maintainer_mode: false,
|
|
168
|
+
maintainer_tools: [],
|
|
169
|
+
skipped_consumer_projections: [],
|
|
170
|
+
user_config_dir: "",
|
|
171
|
+
skills_created: false,
|
|
172
|
+
payload_layout: "vendored",
|
|
173
|
+
strategy: "file-swap",
|
|
174
|
+
dirty_tree: false,
|
|
175
|
+
dirty_files: [],
|
|
176
|
+
staged_paths: [],
|
|
177
|
+
backup_path: "",
|
|
178
|
+
previous_version: result.previousDepositVersion ?? "",
|
|
179
|
+
content_version: result.contentVersion,
|
|
180
|
+
version_skew_notice: result.versionSkewNotice,
|
|
181
|
+
agents_md_updated: result.agentsMdUpdated,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export function printUpdateComplete(result, io) {
|
|
185
|
+
io.printf("\n✓ Deft framework payload refreshed.\n\n");
|
|
186
|
+
io.printf(` Location : ${result.deftDir}\n`);
|
|
187
|
+
io.printf(` Content : v${normalizeVersion(result.contentVersion)}\n`);
|
|
188
|
+
io.printf(` AGENTS.md : ${result.agentsMdUpdated ? "updated" : "already current"}\n`);
|
|
189
|
+
if (result.versionSkewNotice) {
|
|
190
|
+
io.printf(`\n${result.versionSkewNotice}\n`);
|
|
191
|
+
}
|
|
192
|
+
io.printf("\n");
|
|
193
|
+
}
|
|
194
|
+
export async function runRefreshDeposit(args, io, seams = {}) {
|
|
195
|
+
const projectDir = resolve(args.projectDir);
|
|
196
|
+
const deftDir = join(projectDir, CANONICAL_INSTALL_ROOT);
|
|
197
|
+
// #1912: refuse a legacy on-disk layout BEFORE any refresh. The npm CLI never
|
|
198
|
+
// migrates -- the frozen Go bridge does (stage 1), then the npm path (stage 2).
|
|
199
|
+
const detectLegacy = seams.detectLegacy ?? detectLegacyLayout;
|
|
200
|
+
const legacy = detectLegacy(projectDir);
|
|
201
|
+
if (legacy.legacy) {
|
|
202
|
+
throw new LegacyLayoutRefusedError(legacy);
|
|
203
|
+
}
|
|
204
|
+
const resolveContent = seams.resolveContentRoot ?? resolveInstalledContentRoot;
|
|
205
|
+
const copyContent = seams.copyContent ?? copyTree;
|
|
206
|
+
const readEngine = seams.readEngineVersion ?? readCorePackageVersion;
|
|
207
|
+
const readPackageVersion = seams.readPackageVersion ?? readCorePackageVersion;
|
|
208
|
+
const contentRoot = await resolveContent();
|
|
209
|
+
const previousDepositVersion = readRecordedDepositVersion(deftDir);
|
|
210
|
+
const engineVersion = readEngine();
|
|
211
|
+
const contentVersion = readContentPackageVersion(contentRoot, readPackageVersion);
|
|
212
|
+
const versionSkewNotice = buildVersionSkewNotice(engineVersion, contentVersion, previousDepositVersion);
|
|
213
|
+
await copyContent(contentRoot, deftDir);
|
|
214
|
+
const nowIso = seams.nowIso ?? (() => new Date().toISOString().replace(/\.\d{3}Z$/, "Z"));
|
|
215
|
+
const manifestFields = {
|
|
216
|
+
ref: contentVersion.startsWith("v") ? contentVersion : `v${contentVersion}`,
|
|
217
|
+
sha: "content-package",
|
|
218
|
+
tag: contentVersion.startsWith("v") ? contentVersion : `v${contentVersion}`,
|
|
219
|
+
installRoot: CANONICAL_INSTALL_ROOT,
|
|
220
|
+
fetchedAt: nowIso(),
|
|
221
|
+
fetchedBy: "directive-update",
|
|
222
|
+
};
|
|
223
|
+
writeInstallManifest(projectDir, deftDir, manifestFields);
|
|
224
|
+
const agentsMdUpdated = writeAgentsMd(projectDir, deftDir, io);
|
|
225
|
+
await depositNeutralization(projectDir, io);
|
|
226
|
+
const readPorcelain = seams.gitPorcelain ?? gitPorcelain;
|
|
227
|
+
printRefreshSideEffects(io, frameworkRefreshSideEffects(projectDir, readPorcelain));
|
|
228
|
+
if (versionSkewNotice) {
|
|
229
|
+
io.printf(`${versionSkewNotice}\n`);
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
projectDir,
|
|
233
|
+
deftDir,
|
|
234
|
+
contentVersion,
|
|
235
|
+
engineVersion,
|
|
236
|
+
previousDepositVersion,
|
|
237
|
+
agentsMdUpdated,
|
|
238
|
+
versionSkewNotice,
|
|
239
|
+
legacyLayout: false,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** CLI-facing wrapper: runs refresh, emits JSON or wizard UX, returns exit code. */
|
|
243
|
+
export async function runRefreshDepositCli(options) {
|
|
244
|
+
const io = {
|
|
245
|
+
printf: (text) => {
|
|
246
|
+
if (options.jsonOut) {
|
|
247
|
+
options.writeErr(text);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
options.writeOut(text);
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
try {
|
|
255
|
+
const result = await runRefreshDeposit(options, io, options.seams);
|
|
256
|
+
if (options.jsonOut) {
|
|
257
|
+
options.writeOut(`${JSON.stringify(buildUpdateSummaryJson(result, options), null, 2)}\n`);
|
|
258
|
+
printUpdateComplete(result, { printf: options.writeErr });
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
printUpdateComplete(result, io);
|
|
262
|
+
}
|
|
263
|
+
return 0;
|
|
264
|
+
}
|
|
265
|
+
catch (cause) {
|
|
266
|
+
if (cause instanceof LegacyLayoutRefusedError) {
|
|
267
|
+
io.printf(buildLegacyRefusalMessage("update", cause.detection));
|
|
268
|
+
if (options.jsonOut) {
|
|
269
|
+
options.writeOut(`${JSON.stringify(buildLegacyRefusalJson("update", resolve(options.projectDir), cause.detection), null, 2)}\n`);
|
|
270
|
+
}
|
|
271
|
+
return LEGACY_LAYOUT_REFUSED_EXIT_CODE;
|
|
272
|
+
}
|
|
273
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
274
|
+
options.writeErr(`directive update: ${message}\n`);
|
|
275
|
+
if (options.jsonOut) {
|
|
276
|
+
options.writeOut(`${JSON.stringify({ success: false, error: message, error_code: "refresh_deposit_failed" }, null, 2)}\n`);
|
|
277
|
+
}
|
|
278
|
+
return 1;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
export function parseUpdateArgv(canonicalArgv, userArgv = []) {
|
|
282
|
+
const base = parseInitArgv(canonicalArgv, userArgv);
|
|
283
|
+
const args = [...canonicalArgv, ...userArgv];
|
|
284
|
+
let upgrade = false;
|
|
285
|
+
for (const arg of args) {
|
|
286
|
+
if (arg === "--upgrade" || arg === "/upgrade") {
|
|
287
|
+
upgrade = true;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return { ...base, upgrade };
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greenfield deposit scaffold helpers — TS port of cmd/deft-install/setup.go +
|
|
3
|
+
* deposit.go + githooks.go surfaces consumed by directive init (#1942 S2).
|
|
4
|
+
*
|
|
5
|
+
* Refs #1942, #1430, #1463, #1179.
|
|
6
|
+
*/
|
|
7
|
+
export interface InitDepositIo {
|
|
8
|
+
printf: (text: string) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare const CANONICAL_INSTALL_ROOT = ".deft/core";
|
|
11
|
+
export declare const CORE_GLOB = ".deft/core/**";
|
|
12
|
+
export declare const MINIMAL_TASKFILE = "version: '3'\n\n# Taskfile for this project.\n# Installed by deft-install --yes (Epic-4). Add your own tasks below or in\n# additional included files. The deft include makes all framework tasks\n# (task check, task vbrief:*, task doctor, etc.) available from the project root.\n\nincludes:\n deft:\n taskfile: ./.deft/core/Taskfile.yml\n optional: true\n";
|
|
13
|
+
export declare const CANONICAL_TASKFILE_INCLUDE = "taskfile: ./.deft/core/Taskfile.yml";
|
|
14
|
+
export interface InstallManifestFields {
|
|
15
|
+
ref: string;
|
|
16
|
+
sha: string;
|
|
17
|
+
tag: string;
|
|
18
|
+
installRoot: string;
|
|
19
|
+
fetchedAt: string;
|
|
20
|
+
fetchedBy: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function buildInstallManifestText(fields: InstallManifestFields): string;
|
|
23
|
+
export declare function writeInstallManifest(projectDir: string, deftDir: string, fields: InstallManifestFields): string;
|
|
24
|
+
export declare function writeAgentsMd(projectDir: string, deftDir: string, io: InitDepositIo): boolean;
|
|
25
|
+
export declare function writeConsumerVbrief(projectDir: string, deftDir: string, io: InitDepositIo): Promise<boolean>;
|
|
26
|
+
export declare function writeAgentsSkills(projectDir: string, io: InitDepositIo): boolean;
|
|
27
|
+
export declare function ensureTaskfile(projectDir: string, io: InitDepositIo): boolean;
|
|
28
|
+
export interface GitHooksSeams {
|
|
29
|
+
getHooksPath?: (projectDir: string) => string | null;
|
|
30
|
+
setHooksPath?: (projectDir: string, value: string) => boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function writeConsumerGitHooks(projectDir: string, deftDir: string, io: InitDepositIo, seams?: GitHooksSeams): boolean;
|
|
33
|
+
export declare function ensureGitattributes(projectDir: string, io: InitDepositIo): boolean;
|
|
34
|
+
export declare function ensureGreptileIgnore(projectDir: string, io: InitDepositIo): boolean;
|
|
35
|
+
export declare function ensureCodeqlPathsIgnore(projectDir: string, io: InitDepositIo): boolean;
|
|
36
|
+
export declare function ensureCoreGuardWorkflow(projectDir: string, io: InitDepositIo): boolean;
|
|
37
|
+
export declare function pruneFrameworkSelfTests(projectDir: string, io: InitDepositIo): Promise<boolean>;
|
|
38
|
+
export declare function pruneVendoredTsTests(projectDir: string, io: InitDepositIo): Promise<number>;
|
|
39
|
+
/** Best-effort #1430 neutralization deposit (mirrors depositNeutralization). */
|
|
40
|
+
export declare function depositNeutralization(projectDir: string, io: InitDepositIo): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=scaffold.d.ts.map
|