@delfini/cli 0.2.0 → 0.3.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/README.md +37 -70
- package/dist/__engine-probe__.js +1 -1
- package/dist/{chunk-K5X5TSUR.js → chunk-IU4AWQKF.js} +143 -77
- package/dist/{chunk-LJKEHO6F.js → chunk-IUXS75FH.js} +24 -1
- package/dist/cli.cjs +157 -70
- package/dist/cli.js +2 -2
- package/dist/index.cjs +177 -86
- package/dist/index.d.cts +69 -19
- package/dist/index.d.ts +69 -19
- package/dist/index.js +22 -18
- package/package.json +2 -2
- package/templates/SKILL.md +20 -7
package/dist/cli.cjs
CHANGED
|
@@ -1962,7 +1962,7 @@ var import_node_path3 = require("path");
|
|
|
1962
1962
|
var import_promises = require("readline/promises");
|
|
1963
1963
|
var import_node_url = require("url");
|
|
1964
1964
|
|
|
1965
|
-
// src/
|
|
1965
|
+
// src/config.ts
|
|
1966
1966
|
init_cjs_shims();
|
|
1967
1967
|
var import_node_fs = require("fs");
|
|
1968
1968
|
var import_node_path = __toESM(require("path"), 1);
|
|
@@ -6611,6 +6611,18 @@ function classifyEntry(entry) {
|
|
|
6611
6611
|
return "dir";
|
|
6612
6612
|
return lastSegment.includes(".") ? "file" : "dir";
|
|
6613
6613
|
}
|
|
6614
|
+
function isFileInDocScope(filePath, scope) {
|
|
6615
|
+
const file = posixNormalize(toPosix(filePath).replace(/^\/+/, ""));
|
|
6616
|
+
if (file === "" || file === ".")
|
|
6617
|
+
return false;
|
|
6618
|
+
const entries = normalizeDocScope(scope);
|
|
6619
|
+
for (const entry of entries) {
|
|
6620
|
+
const pattern = classifyEntry(entry) === "dir" ? `${entry}/**` : entry;
|
|
6621
|
+
if ((0, import_picomatch.default)(pattern, { dot: false, nocase: true })(file))
|
|
6622
|
+
return true;
|
|
6623
|
+
}
|
|
6624
|
+
return false;
|
|
6625
|
+
}
|
|
6614
6626
|
function toPosix(p) {
|
|
6615
6627
|
return p.split("\\").join("/");
|
|
6616
6628
|
}
|
|
@@ -6644,7 +6656,10 @@ function posixNormalize(input) {
|
|
|
6644
6656
|
|
|
6645
6657
|
// ../drift-engine/dist/diff-filter.js
|
|
6646
6658
|
init_cjs_shims();
|
|
6647
|
-
function filterDiff(diff) {
|
|
6659
|
+
function filterDiff(diff, options = {}) {
|
|
6660
|
+
const builtins = options.builtins ?? true;
|
|
6661
|
+
const ignorePaths = options.ignorePaths ?? [];
|
|
6662
|
+
const hasIgnore = ignorePaths.length > 0;
|
|
6648
6663
|
const droppedPaths = [];
|
|
6649
6664
|
const droppedHunks = [];
|
|
6650
6665
|
const files = parseDiffIntoFiles(diff);
|
|
@@ -6653,6 +6668,14 @@ function filterDiff(diff) {
|
|
|
6653
6668
|
keptParts.push(files.preamble);
|
|
6654
6669
|
}
|
|
6655
6670
|
for (const file of files.files) {
|
|
6671
|
+
if (hasIgnore && isFileInDocScope(file.path, ignorePaths)) {
|
|
6672
|
+
droppedPaths.push({ path: file.path, reason: "ignored" });
|
|
6673
|
+
continue;
|
|
6674
|
+
}
|
|
6675
|
+
if (!builtins) {
|
|
6676
|
+
keptParts.push(file.rawSlice);
|
|
6677
|
+
continue;
|
|
6678
|
+
}
|
|
6656
6679
|
const pathReason = classifyPath(file.path);
|
|
6657
6680
|
if (pathReason !== null) {
|
|
6658
6681
|
droppedPaths.push({ path: file.path, reason: pathReason });
|
|
@@ -7084,42 +7107,48 @@ function mostCommonHunkReason(droppedHunks) {
|
|
|
7084
7107
|
return bestReason;
|
|
7085
7108
|
}
|
|
7086
7109
|
|
|
7087
|
-
// src/
|
|
7088
|
-
var
|
|
7089
|
-
var
|
|
7090
|
-
var
|
|
7110
|
+
// src/config.ts
|
|
7111
|
+
var DELFINI_CONFIG_RELATIVE_PATH = ".claude/skills/delfini/delfini-config.json";
|
|
7112
|
+
var LEGACY_DOC_SCOPE_RELATIVE_PATH = ".claude/skills/delfini/doc-scope.json";
|
|
7113
|
+
var DELFINI_CONFIG_VERSION = 1;
|
|
7114
|
+
var CONFIG_VERSION_MISMATCH_MESSAGE = "your delfini-config.json is for a newer @delfini/cli; please upgrade.";
|
|
7091
7115
|
var REPO_ROOT_REL = ".";
|
|
7092
|
-
var
|
|
7093
|
-
code = "
|
|
7094
|
-
constructor(message =
|
|
7116
|
+
var ConfigVersionMismatchError = class extends Error {
|
|
7117
|
+
code = "CONFIG_VERSION_MISMATCH";
|
|
7118
|
+
constructor(message = CONFIG_VERSION_MISMATCH_MESSAGE) {
|
|
7095
7119
|
super(message);
|
|
7096
|
-
this.name = "
|
|
7120
|
+
this.name = "ConfigVersionMismatchError";
|
|
7097
7121
|
}
|
|
7098
7122
|
};
|
|
7099
|
-
var
|
|
7100
|
-
code = "
|
|
7123
|
+
var ConfigCorruptError = class extends Error {
|
|
7124
|
+
code = "CONFIG_CORRUPT";
|
|
7101
7125
|
constructor(message) {
|
|
7102
7126
|
super(message);
|
|
7103
|
-
this.name = "
|
|
7127
|
+
this.name = "ConfigCorruptError";
|
|
7104
7128
|
}
|
|
7105
7129
|
};
|
|
7106
|
-
var
|
|
7107
|
-
code = "
|
|
7130
|
+
var ConfigValidationError = class extends Error {
|
|
7131
|
+
code = "CONFIG_VALIDATION";
|
|
7108
7132
|
constructor(message) {
|
|
7109
7133
|
super(message);
|
|
7110
|
-
this.name = "
|
|
7134
|
+
this.name = "ConfigValidationError";
|
|
7111
7135
|
}
|
|
7112
7136
|
};
|
|
7113
|
-
var
|
|
7137
|
+
var configSchemaV1 = external_exports.object({
|
|
7114
7138
|
version: external_exports.literal(1),
|
|
7115
|
-
doc_scope: external_exports.array(external_exports.string().min(1))
|
|
7139
|
+
doc_scope: external_exports.array(external_exports.string().min(1)),
|
|
7140
|
+
ignore_code_scope: external_exports.array(external_exports.string().min(1)).optional()
|
|
7116
7141
|
});
|
|
7117
7142
|
var versionProbeSchema = external_exports.object({
|
|
7118
7143
|
version: external_exports.number().int().positive()
|
|
7119
7144
|
});
|
|
7120
|
-
async function
|
|
7145
|
+
async function readConfig(repoRoot) {
|
|
7121
7146
|
const root = repoRoot ?? await getRepoRoot();
|
|
7122
|
-
const
|
|
7147
|
+
const primary = await readConfigFile(import_node_path.default.join(root, DELFINI_CONFIG_RELATIVE_PATH));
|
|
7148
|
+
if (primary !== null) return primary;
|
|
7149
|
+
return readConfigFile(import_node_path.default.join(root, LEGACY_DOC_SCOPE_RELATIVE_PATH));
|
|
7150
|
+
}
|
|
7151
|
+
async function readConfigFile(target) {
|
|
7123
7152
|
let raw;
|
|
7124
7153
|
try {
|
|
7125
7154
|
raw = await import_node_fs.promises.readFile(target, "utf8");
|
|
@@ -7131,54 +7160,96 @@ async function readDocScope(repoRoot) {
|
|
|
7131
7160
|
try {
|
|
7132
7161
|
parsed = JSON.parse(raw);
|
|
7133
7162
|
} catch (err) {
|
|
7134
|
-
throw new
|
|
7135
|
-
`${
|
|
7163
|
+
throw new ConfigCorruptError(
|
|
7164
|
+
`${import_node_path.default.basename(target)} is malformed: ${err.message}`
|
|
7136
7165
|
);
|
|
7137
7166
|
}
|
|
7138
7167
|
const probe = versionProbeSchema.safeParse(parsed);
|
|
7139
|
-
if (probe.success && probe.data.version >
|
|
7140
|
-
throw new
|
|
7168
|
+
if (probe.success && probe.data.version > DELFINI_CONFIG_VERSION) {
|
|
7169
|
+
throw new ConfigVersionMismatchError();
|
|
7141
7170
|
}
|
|
7142
|
-
const result =
|
|
7171
|
+
const result = configSchemaV1.safeParse(parsed);
|
|
7143
7172
|
if (!result.success) {
|
|
7144
|
-
throw new
|
|
7145
|
-
`${
|
|
7173
|
+
throw new ConfigCorruptError(
|
|
7174
|
+
`${import_node_path.default.basename(target)} is malformed: ${result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`
|
|
7146
7175
|
);
|
|
7147
7176
|
}
|
|
7148
|
-
return
|
|
7177
|
+
return {
|
|
7178
|
+
version: DELFINI_CONFIG_VERSION,
|
|
7179
|
+
doc_scope: result.data.doc_scope,
|
|
7180
|
+
ignore_code_scope: result.data.ignore_code_scope ?? []
|
|
7181
|
+
};
|
|
7149
7182
|
}
|
|
7150
|
-
async function
|
|
7183
|
+
async function writeConfig(update, options) {
|
|
7151
7184
|
const root = options?.repoRoot ?? await getRepoRoot();
|
|
7185
|
+
const existing = await readConfig(root);
|
|
7186
|
+
let docScope = existing?.doc_scope ?? [];
|
|
7187
|
+
let ignoreCodeScope = existing?.ignore_code_scope ?? [];
|
|
7188
|
+
if (update.doc_scope !== void 0) {
|
|
7189
|
+
docScope = validateAndNormalize(update.doc_scope, "doc_scope", { requireNonEmpty: true });
|
|
7190
|
+
}
|
|
7191
|
+
if (update.ignore_code_scope !== void 0) {
|
|
7192
|
+
ignoreCodeScope = validateAndNormalize(update.ignore_code_scope, "ignore_code_scope", {
|
|
7193
|
+
requireNonEmpty: false
|
|
7194
|
+
});
|
|
7195
|
+
}
|
|
7196
|
+
if (docScope.length === 0) {
|
|
7197
|
+
throw new ConfigValidationError(
|
|
7198
|
+
`${DELFINI_CONFIG_RELATIVE_PATH}: doc_scope requires at least one path`
|
|
7199
|
+
);
|
|
7200
|
+
}
|
|
7201
|
+
const payload = {
|
|
7202
|
+
version: DELFINI_CONFIG_VERSION,
|
|
7203
|
+
doc_scope: docScope
|
|
7204
|
+
};
|
|
7205
|
+
if (ignoreCodeScope.length > 0) {
|
|
7206
|
+
payload.ignore_code_scope = ignoreCodeScope;
|
|
7207
|
+
}
|
|
7208
|
+
const target = import_node_path.default.join(root, DELFINI_CONFIG_RELATIVE_PATH);
|
|
7209
|
+
await import_node_fs.promises.mkdir(import_node_path.default.dirname(target), { recursive: true });
|
|
7210
|
+
await import_node_fs.promises.writeFile(target, `${JSON.stringify(payload, null, 2)}
|
|
7211
|
+
`, "utf8");
|
|
7212
|
+
await removeLegacyDocScope(root);
|
|
7213
|
+
}
|
|
7214
|
+
async function writeDocScope(paths, options) {
|
|
7152
7215
|
if (!Array.isArray(paths) || paths.length === 0) {
|
|
7153
|
-
throw new
|
|
7216
|
+
throw new ConfigValidationError("at least one path is required");
|
|
7154
7217
|
}
|
|
7218
|
+
await writeConfig({ doc_scope: paths }, options);
|
|
7219
|
+
}
|
|
7220
|
+
function validateAndNormalize(paths, field, opts) {
|
|
7155
7221
|
const errors = [];
|
|
7156
7222
|
for (const entry of paths) {
|
|
7157
7223
|
const err = validateDocScopeEntry(entry, REPO_ROOT_REL);
|
|
7158
7224
|
if (err !== null) errors.push(err);
|
|
7159
7225
|
}
|
|
7160
7226
|
if (errors.length > 0) {
|
|
7161
|
-
throw new
|
|
7162
|
-
`${
|
|
7227
|
+
throw new ConfigValidationError(
|
|
7228
|
+
`${DELFINI_CONFIG_RELATIVE_PATH}: invalid ${field} path(s):
|
|
7163
7229
|
${errors.map((e) => ` - ${e}`).join("\n")}`
|
|
7164
7230
|
);
|
|
7165
7231
|
}
|
|
7166
7232
|
const normalised = normalizeDocScope(paths);
|
|
7167
|
-
if (normalised.length === 0) {
|
|
7168
|
-
throw new
|
|
7169
|
-
`${
|
|
7233
|
+
if (opts.requireNonEmpty && normalised.length === 0) {
|
|
7234
|
+
throw new ConfigValidationError(
|
|
7235
|
+
`${DELFINI_CONFIG_RELATIVE_PATH}: every ${field} entry collapses to an empty scope after normalisation (e.g. '.', './', 'docs/..') \u2014 provide at least one concrete path`
|
|
7170
7236
|
);
|
|
7171
7237
|
}
|
|
7172
|
-
|
|
7173
|
-
|
|
7174
|
-
|
|
7175
|
-
const
|
|
7176
|
-
|
|
7177
|
-
|
|
7238
|
+
return normalised;
|
|
7239
|
+
}
|
|
7240
|
+
async function removeLegacyDocScope(root) {
|
|
7241
|
+
const legacy = import_node_path.default.join(root, LEGACY_DOC_SCOPE_RELATIVE_PATH);
|
|
7242
|
+
try {
|
|
7243
|
+
await import_node_fs.promises.unlink(legacy);
|
|
7244
|
+
} catch (err) {
|
|
7245
|
+
if (!isNoEntError(err)) throw err;
|
|
7246
|
+
}
|
|
7178
7247
|
}
|
|
7179
|
-
async function
|
|
7248
|
+
async function configExists(repoRoot) {
|
|
7180
7249
|
const root = repoRoot ?? await getRepoRoot();
|
|
7181
|
-
|
|
7250
|
+
return await isFile(import_node_path.default.join(root, DELFINI_CONFIG_RELATIVE_PATH)) || await isFile(import_node_path.default.join(root, LEGACY_DOC_SCOPE_RELATIVE_PATH));
|
|
7251
|
+
}
|
|
7252
|
+
async function isFile(target) {
|
|
7182
7253
|
try {
|
|
7183
7254
|
const st = await import_node_fs.promises.stat(target);
|
|
7184
7255
|
return st.isFile();
|
|
@@ -7186,13 +7257,14 @@ async function docScopeExists(repoRoot) {
|
|
|
7186
7257
|
return false;
|
|
7187
7258
|
}
|
|
7188
7259
|
}
|
|
7189
|
-
async function
|
|
7260
|
+
async function deleteConfig(repoRoot) {
|
|
7190
7261
|
const root = repoRoot ?? await getRepoRoot();
|
|
7191
|
-
const
|
|
7192
|
-
|
|
7193
|
-
|
|
7194
|
-
|
|
7195
|
-
|
|
7262
|
+
for (const rel of [DELFINI_CONFIG_RELATIVE_PATH, LEGACY_DOC_SCOPE_RELATIVE_PATH]) {
|
|
7263
|
+
try {
|
|
7264
|
+
await import_node_fs.promises.unlink(import_node_path.default.join(root, rel));
|
|
7265
|
+
} catch (err) {
|
|
7266
|
+
if (!isNoEntError(err)) throw err;
|
|
7267
|
+
}
|
|
7196
7268
|
}
|
|
7197
7269
|
}
|
|
7198
7270
|
async function expandDocScope(paths, repoRoot) {
|
|
@@ -7384,24 +7456,24 @@ function sanitiseScope(paths) {
|
|
|
7384
7456
|
return paths.map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
7385
7457
|
}
|
|
7386
7458
|
async function applyDocScope(repoRoot, logger, provideDocScope) {
|
|
7387
|
-
const target = (0, import_node_path3.join)(repoRoot,
|
|
7459
|
+
const target = (0, import_node_path3.join)(repoRoot, DELFINI_CONFIG_RELATIVE_PATH);
|
|
7388
7460
|
if (provideDocScope) {
|
|
7389
7461
|
const paths2 = sanitiseScope(await provideDocScope());
|
|
7390
7462
|
if (paths2.length === 0) {
|
|
7391
|
-
log(logger, `
|
|
7463
|
+
log(logger, `delfini-config.json \u2192 ${target} (no paths provided, no change)`);
|
|
7392
7464
|
return;
|
|
7393
7465
|
}
|
|
7394
7466
|
await persistDocScope(repoRoot, logger, target, paths2);
|
|
7395
7467
|
return;
|
|
7396
7468
|
}
|
|
7397
|
-
if (await
|
|
7398
|
-
log(logger, `
|
|
7469
|
+
if (await configExists(repoRoot)) {
|
|
7470
|
+
log(logger, `delfini-config.json \u2192 ${target} (already configured, no change)`);
|
|
7399
7471
|
return;
|
|
7400
7472
|
}
|
|
7401
7473
|
if (!process.stdin.isTTY) {
|
|
7402
7474
|
log(
|
|
7403
7475
|
logger,
|
|
7404
|
-
`
|
|
7476
|
+
`delfini-config.json \u2192 ${target} (non-interactive shell: scope prompt skipped, no change)`
|
|
7405
7477
|
);
|
|
7406
7478
|
return;
|
|
7407
7479
|
}
|
|
@@ -7409,7 +7481,7 @@ async function applyDocScope(repoRoot, logger, provideDocScope) {
|
|
|
7409
7481
|
if (paths.length === 0) {
|
|
7410
7482
|
log(
|
|
7411
7483
|
logger,
|
|
7412
|
-
`
|
|
7484
|
+
`delfini-config.json \u2192 ${target} (no paths provided, no change \u2014 first /delfini run will prompt)`
|
|
7413
7485
|
);
|
|
7414
7486
|
return;
|
|
7415
7487
|
}
|
|
@@ -7429,12 +7501,12 @@ async function promptDocScope() {
|
|
|
7429
7501
|
async function persistDocScope(repoRoot, logger, target, paths) {
|
|
7430
7502
|
try {
|
|
7431
7503
|
await writeDocScope(paths, { repoRoot });
|
|
7432
|
-
log(logger, `
|
|
7504
|
+
log(logger, `delfini-config.json \u2192 ${target} (wrote ${paths.length} path(s))`);
|
|
7433
7505
|
} catch (err) {
|
|
7434
|
-
if (err instanceof
|
|
7506
|
+
if (err instanceof ConfigValidationError) {
|
|
7435
7507
|
log(
|
|
7436
7508
|
logger,
|
|
7437
|
-
`
|
|
7509
|
+
`delfini-config.json \u2192 ${target} (skipped \u2014 ${err.message}). Fix the path(s) and re-run \`delfini install\`, edit the file directly, or set the scope on the first /delfini run.`
|
|
7438
7510
|
);
|
|
7439
7511
|
return;
|
|
7440
7512
|
}
|
|
@@ -7860,13 +7932,15 @@ async function runLocalPrepare(options = {}) {
|
|
|
7860
7932
|
);
|
|
7861
7933
|
}
|
|
7862
7934
|
const repoRoot = options.repoRoot ?? await getRepoRoot();
|
|
7863
|
-
const
|
|
7935
|
+
const config = await readConfig(repoRoot);
|
|
7936
|
+
const scopePaths = resolveScopePaths(options.scope, config);
|
|
7864
7937
|
if (scopePaths === null) {
|
|
7865
7938
|
stderr.write(
|
|
7866
|
-
"No doc-scope configured. Pass `--scope <paths>` or run the skill\nfirst-run setup to create `.claude/skills/delfini/
|
|
7939
|
+
"No doc-scope configured. Pass `--scope <paths>` or run the skill\nfirst-run setup to create `.claude/skills/delfini/delfini-config.json`.\n"
|
|
7867
7940
|
);
|
|
7868
7941
|
return 2;
|
|
7869
7942
|
}
|
|
7943
|
+
const ignoreCodeScope = resolveIgnoreCodeScope(options.ignoreCodeScope, config);
|
|
7870
7944
|
const expansion = await expandDocScope(scopePaths, repoRoot);
|
|
7871
7945
|
for (const missing of expansion.missingPaths) {
|
|
7872
7946
|
stderr.write(formatMissingPathWarning(missing));
|
|
@@ -7876,8 +7950,12 @@ async function runLocalPrepare(options = {}) {
|
|
|
7876
7950
|
const rawDiff = await computeDiff(git, repoRoot, baseRef, diffSource);
|
|
7877
7951
|
let diff = rawDiff;
|
|
7878
7952
|
let filterResult = null;
|
|
7879
|
-
|
|
7880
|
-
|
|
7953
|
+
const enableBuiltins = options.enableDiffPreFilter === true;
|
|
7954
|
+
if (enableBuiltins || ignoreCodeScope.length > 0) {
|
|
7955
|
+
filterResult = filterDiff(rawDiff, {
|
|
7956
|
+
builtins: enableBuiltins,
|
|
7957
|
+
ignorePaths: ignoreCodeScope
|
|
7958
|
+
});
|
|
7881
7959
|
diff = filterResult.keptDiff;
|
|
7882
7960
|
}
|
|
7883
7961
|
const docs = await readDocs(expansion.files, repoRoot, stderr);
|
|
@@ -7926,7 +8004,7 @@ async function runLocalPrepare(options = {}) {
|
|
|
7926
8004
|
`);
|
|
7927
8005
|
return 0;
|
|
7928
8006
|
}
|
|
7929
|
-
|
|
8007
|
+
function resolveScopePaths(scopeOption, config) {
|
|
7930
8008
|
if (scopeOption !== void 0) {
|
|
7931
8009
|
const normalised = normaliseScopeOption(scopeOption);
|
|
7932
8010
|
if (normalised.length === 0) {
|
|
@@ -7934,11 +8012,16 @@ async function resolveScopePaths(scopeOption, repoRoot) {
|
|
|
7934
8012
|
}
|
|
7935
8013
|
return normalised;
|
|
7936
8014
|
}
|
|
7937
|
-
|
|
7938
|
-
if (persisted === null) {
|
|
8015
|
+
if (config === null) {
|
|
7939
8016
|
return null;
|
|
7940
8017
|
}
|
|
7941
|
-
return
|
|
8018
|
+
return config.doc_scope;
|
|
8019
|
+
}
|
|
8020
|
+
function resolveIgnoreCodeScope(ignoreOption, config) {
|
|
8021
|
+
if (ignoreOption !== void 0) {
|
|
8022
|
+
return normaliseScopeOption(ignoreOption);
|
|
8023
|
+
}
|
|
8024
|
+
return config?.ignore_code_scope ?? [];
|
|
7942
8025
|
}
|
|
7943
8026
|
function normaliseScopeOption(scope) {
|
|
7944
8027
|
const raw = Array.isArray(scope) ? scope : scope.split(",");
|
|
@@ -8138,7 +8221,7 @@ function readPackageJson() {
|
|
|
8138
8221
|
}
|
|
8139
8222
|
async function main(argv) {
|
|
8140
8223
|
const program = new import_commander.Command();
|
|
8141
|
-
program.name("delfini").description("Delfini Skill CLI \u2014 deterministic, never calls an LLM.").version(pkg.version, "-V, --version", "print the @delfini/cli version").option("--reset-scope", "delete the persisted doc-scope.json").exitOverride();
|
|
8224
|
+
program.name("delfini").description("Delfini Skill CLI \u2014 deterministic, never calls an LLM.").version(pkg.version, "-V, --version", "print the @delfini/cli version").option("--reset-scope", "delete the persisted delfini-config.json (and any legacy doc-scope.json)").exitOverride();
|
|
8142
8225
|
program.action(async (opts) => {
|
|
8143
8226
|
if (opts.resetScope) {
|
|
8144
8227
|
await handleResetScope();
|
|
@@ -8148,7 +8231,7 @@ async function main(argv) {
|
|
|
8148
8231
|
"Scaffold .claude/skills/delfini/SKILL.md + CLAUDE.md auto-invoke + .gitignore append"
|
|
8149
8232
|
).option("--tool <agent>", "Coding agent target (only 'CLAUDE' supported in V1)", "CLAUDE").option("--auto-invoke", "append the CLAUDE.md auto-invoke block without prompting").option("--no-auto-invoke", "strip the CLAUDE.md auto-invoke block without prompting").option(
|
|
8150
8233
|
"--scope <paths>",
|
|
8151
|
-
"Seed
|
|
8234
|
+
"Seed delfini-config.json doc_scope with these paths (space- or comma-separated; overwrites any existing scope) without prompting. Omit to be prompted interactively on a TTY."
|
|
8152
8235
|
).action(
|
|
8153
8236
|
async (targetPath, opts) => {
|
|
8154
8237
|
const confirmAutoInvoke = opts.autoInvoke === void 0 ? void 0 : () => Promise.resolve(opts.autoInvoke);
|
|
@@ -8158,7 +8241,10 @@ async function main(argv) {
|
|
|
8158
8241
|
);
|
|
8159
8242
|
program.command("local-prepare").description(
|
|
8160
8243
|
"Compute diff + doc-scope + prompt + token-budget gate; write .delfini-trace/"
|
|
8161
|
-
).option("--scope <paths>", "Comma-separated doc-scope paths (overrides
|
|
8244
|
+
).option("--scope <paths>", "Comma-separated doc-scope paths (overrides delfini-config.json doc_scope)").option(
|
|
8245
|
+
"--ignore-code-scope <paths>",
|
|
8246
|
+
"Comma-separated code paths whose changes are ignored for analysis (overrides delfini-config.json ignore_code_scope). Each entry is a directory, file, or glob."
|
|
8247
|
+
).option("--base <ref>", "Diff base ref (default: git merge-base HEAD origin/main)").option(
|
|
8162
8248
|
"--diff-source <source>",
|
|
8163
8249
|
"Which diff to analyse: 'local' (default), 'committed', or 'both'",
|
|
8164
8250
|
"local"
|
|
@@ -8187,6 +8273,7 @@ async function main(argv) {
|
|
|
8187
8273
|
async (opts) => {
|
|
8188
8274
|
const exitCode = await runLocalPrepare({
|
|
8189
8275
|
scope: opts.scope,
|
|
8276
|
+
ignoreCodeScope: opts.ignoreCodeScope,
|
|
8190
8277
|
base: opts.base,
|
|
8191
8278
|
diffSource: opts.diffSource,
|
|
8192
8279
|
relevanceThreshold: opts.relevanceThreshold,
|
|
@@ -8216,7 +8303,7 @@ async function main(argv) {
|
|
|
8216
8303
|
}
|
|
8217
8304
|
async function handleResetScope() {
|
|
8218
8305
|
try {
|
|
8219
|
-
await
|
|
8306
|
+
await deleteConfig();
|
|
8220
8307
|
} catch (err) {
|
|
8221
8308
|
if (err instanceof RepoRootNotFoundError) {
|
|
8222
8309
|
return;
|