@kingkyylian/handoffkit 0.3.0 → 0.4.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/CHANGELOG.md +7 -0
- package/README.md +13 -1
- package/dist/index.js +251 -65
- package/dist/index.js.map +1 -1
- package/docs/CACHE.md +23 -0
- package/examples/cache-backed-handoff.md +26 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
- Added `handoffkit cache list` and `handoffkit cache show` for inspecting local `.handoffkit` artifacts.
|
|
6
|
+
- Added `handoffkit resume --from-cache latest` and cache refs such as `resume/latest` for continuing from cached resume sources.
|
|
7
|
+
- Added `handoffkit pack --include-cache` to include recent cache summaries in handoff packets.
|
|
8
|
+
- Added cache-backed handoff workflow documentation and an end-to-end example.
|
|
9
|
+
|
|
3
10
|
## 0.3.0
|
|
4
11
|
|
|
5
12
|
- Added richer deterministic risk notes that map changed file groups to common failure modes across release, CI, tooling, CLI, resume, report rendering, docs, security, and generated artifact workflows.
|
package/README.md
CHANGED
|
@@ -134,6 +134,7 @@ Omit diff summaries and patches:
|
|
|
134
134
|
|
|
135
135
|
```sh
|
|
136
136
|
handoffkit pack --goal "Summarize repo state" --no-diff
|
|
137
|
+
handoffkit pack --goal "Continue from recent cache" --include-cache
|
|
137
138
|
```
|
|
138
139
|
|
|
139
140
|
Set a rough Markdown token budget:
|
|
@@ -166,6 +167,14 @@ Resume from a previous handoff or transcript:
|
|
|
166
167
|
```sh
|
|
167
168
|
handoffkit resume previous-handoff.md --goal "Continue from here"
|
|
168
169
|
handoffkit resume previous-handoff.md --goal "Continue from here" --cache
|
|
170
|
+
handoffkit resume --from-cache latest --goal "Continue cached session"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Inspect local cache artifacts:
|
|
174
|
+
|
|
175
|
+
```sh
|
|
176
|
+
handoffkit cache list
|
|
177
|
+
handoffkit cache show resume latest
|
|
169
178
|
```
|
|
170
179
|
|
|
171
180
|
## CLI Options
|
|
@@ -181,12 +190,14 @@ handoffkit resume previous-handoff.md --goal "Continue from here" --cache
|
|
|
181
190
|
| `--verify` | Run safe verification scripts and include results in the packet. |
|
|
182
191
|
| `--scan-secrets` | Run optional local secret scanners and include bounded redacted results. |
|
|
183
192
|
| `--cache` | Explicitly write local verification or resume artifacts under `.handoffkit/`. |
|
|
193
|
+
| `--include-cache` | Include recent `.handoffkit` artifact summaries in `pack` output. |
|
|
194
|
+
| `--from-cache <ref>` | Resume from a cached resume artifact such as `latest` or `resume/latest`. |
|
|
184
195
|
| `--include-diff` | Include full tracked patches and bounded untracked previews. |
|
|
185
196
|
| `--no-diff` | Omit diff summaries and full patches. |
|
|
186
197
|
|
|
187
198
|
## Local Cache
|
|
188
199
|
|
|
189
|
-
Cache writes are opt-in. `verify --cache`, `pack --verify --cache`, and `resume --cache` write redacted JSON artifacts under `.handoffkit/verification` or `.handoffkit/resume`. The cache directory is ignored by default so repeated handoffs do not pollute git status or generated reports.
|
|
200
|
+
Cache writes are opt-in. `verify --cache`, `pack --verify --cache`, and `resume --cache` write redacted JSON artifacts under `.handoffkit/verification` or `.handoffkit/resume`. Use `cache list` and `cache show` to inspect artifacts, `resume --from-cache latest` to continue from the latest cached resume source, and `pack --include-cache` to include recent cache summaries in a new handoff packet. The cache directory is ignored by default so repeated handoffs do not pollute git status or generated reports.
|
|
190
201
|
|
|
191
202
|
See [docs/CACHE.md](docs/CACHE.md) for the file layout.
|
|
192
203
|
|
|
@@ -200,6 +211,7 @@ HandoffKit reads local git and filesystem metadata from the current repository:
|
|
|
200
211
|
- compact previews of detected instruction files
|
|
201
212
|
- package manager and verification scripts from the root `package.json`
|
|
202
213
|
- optional verification results when `--verify` is used
|
|
214
|
+
- optional local cache summaries when `--include-cache` is used
|
|
203
215
|
- deterministic risk notes from changed file paths
|
|
204
216
|
- optional secret scanner availability, local config files, and install guidance for `gitleaks` and `secretlint`
|
|
205
217
|
- bounded, redacted secret scan results when `--scan-secrets` is used
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/cli/index.ts
|
|
4
|
-
import { Command as
|
|
4
|
+
import { Command as Command7 } from "commander";
|
|
5
5
|
|
|
6
|
-
// src/cli/commands/
|
|
6
|
+
// src/cli/commands/cache.ts
|
|
7
7
|
import { Command } from "commander";
|
|
8
|
-
import { z
|
|
8
|
+
import { z } from "zod";
|
|
9
9
|
|
|
10
10
|
// src/core/cache.ts
|
|
11
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
12
|
-
import { join } from "path";
|
|
11
|
+
import { mkdir, readdir, readFile, writeFile } from "fs/promises";
|
|
12
|
+
import { basename, join } from "path";
|
|
13
13
|
|
|
14
14
|
// src/core/redact.ts
|
|
15
15
|
var REDACTION = "[REDACTED]";
|
|
@@ -44,6 +44,7 @@ ${REDACTION}
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
// src/core/cache.ts
|
|
47
|
+
var CACHE_KINDS = ["resume", "verification"];
|
|
47
48
|
async function writeCacheArtifact(root, kind, data, options = {}) {
|
|
48
49
|
const createdAt = (options.now ?? /* @__PURE__ */ new Date()).toISOString();
|
|
49
50
|
const envelope = {
|
|
@@ -61,13 +62,93 @@ async function writeCacheArtifact(root, kind, data, options = {}) {
|
|
|
61
62
|
await Promise.all([writeFile(artifactPath, contents, "utf8"), writeFile(latestPath, contents, "utf8")]);
|
|
62
63
|
return { artifactPath, latestPath };
|
|
63
64
|
}
|
|
65
|
+
async function listCacheArtifacts(root) {
|
|
66
|
+
const summaries = await Promise.all(CACHE_KINDS.map((kind) => listCacheKind(root, kind)));
|
|
67
|
+
return summaries.flat().sort((a, b) => b.createdAt.localeCompare(a.createdAt) || a.kind.localeCompare(b.kind) || a.name.localeCompare(b.name));
|
|
68
|
+
}
|
|
69
|
+
async function readCacheArtifact(root, kind, name = "latest") {
|
|
70
|
+
const normalizedName = normalizeArtifactName(name);
|
|
71
|
+
const artifactPath = join(root, ".handoffkit", kind, `${normalizedName}.json`);
|
|
72
|
+
const envelope = JSON.parse(await readFile(artifactPath, "utf8"));
|
|
73
|
+
if (envelope.version !== 1 || envelope.kind !== kind || typeof envelope.createdAt !== "string") {
|
|
74
|
+
throw new Error(`Invalid cache artifact: .handoffkit/${kind}/${normalizedName}.json`);
|
|
75
|
+
}
|
|
76
|
+
return envelope;
|
|
77
|
+
}
|
|
78
|
+
async function readResumeSourceFromCache(root, ref) {
|
|
79
|
+
const { kind, name } = parseCacheRef(ref, "resume");
|
|
80
|
+
if (kind !== "resume") {
|
|
81
|
+
throw new Error("resume --from-cache only supports resume cache artifacts.");
|
|
82
|
+
}
|
|
83
|
+
const artifact = await readCacheArtifact(root, kind, name);
|
|
84
|
+
const source = resumeSourceFromArtifact(artifact);
|
|
85
|
+
if (!source) {
|
|
86
|
+
throw new Error(`Cache artifact does not contain a resume source: .handoffkit/${kind}/${name}.json`);
|
|
87
|
+
}
|
|
88
|
+
return source;
|
|
89
|
+
}
|
|
90
|
+
function parseCacheRef(ref, defaultKind) {
|
|
91
|
+
const normalized = ref.trim();
|
|
92
|
+
const parts = normalized.split("/");
|
|
93
|
+
if (parts.length === 1 && defaultKind) {
|
|
94
|
+
return { kind: defaultKind, name: normalizeArtifactName(parts[0] || "latest") };
|
|
95
|
+
}
|
|
96
|
+
const [kind, name] = parts;
|
|
97
|
+
if (parts.length === 2 && kind && isCacheArtifactKind(kind)) {
|
|
98
|
+
return { kind, name: normalizeArtifactName(name || "latest") };
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`Invalid cache ref: ${ref}`);
|
|
101
|
+
}
|
|
102
|
+
function resumeSourceFromArtifact(artifact) {
|
|
103
|
+
const data = artifact.data;
|
|
104
|
+
return data.source;
|
|
105
|
+
}
|
|
106
|
+
async function listCacheKind(root, kind) {
|
|
107
|
+
const cacheDir = join(root, ".handoffkit", kind);
|
|
108
|
+
let entries;
|
|
109
|
+
try {
|
|
110
|
+
entries = await readdir(cacheDir);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (error.code === "ENOENT") {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
const artifacts = await Promise.all(
|
|
118
|
+
entries.filter((entry) => entry.endsWith(".json")).map(async (entry) => {
|
|
119
|
+
const name = basename(entry, ".json");
|
|
120
|
+
try {
|
|
121
|
+
const artifact = await readCacheArtifact(root, kind, name);
|
|
122
|
+
return {
|
|
123
|
+
kind,
|
|
124
|
+
name,
|
|
125
|
+
createdAt: artifact.createdAt,
|
|
126
|
+
path: `.handoffkit/${kind}/${entry}`
|
|
127
|
+
};
|
|
128
|
+
} catch {
|
|
129
|
+
return void 0;
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
);
|
|
133
|
+
return artifacts.filter((artifact) => Boolean(artifact));
|
|
134
|
+
}
|
|
135
|
+
function isCacheArtifactKind(value) {
|
|
136
|
+
return CACHE_KINDS.includes(value);
|
|
137
|
+
}
|
|
138
|
+
function normalizeArtifactName(name) {
|
|
139
|
+
const withoutExtension = name.replace(/\.json$/i, "");
|
|
140
|
+
if (!/^[A-Za-z0-9_.-]+$/.test(withoutExtension)) {
|
|
141
|
+
throw new Error(`Invalid cache artifact name: ${name}`);
|
|
142
|
+
}
|
|
143
|
+
return withoutExtension;
|
|
144
|
+
}
|
|
64
145
|
function cacheTimestamp(timestamp) {
|
|
65
146
|
return timestamp.replace(/[:.]/g, "-");
|
|
66
147
|
}
|
|
67
148
|
|
|
68
149
|
// src/core/git.ts
|
|
69
|
-
import { readFile } from "fs/promises";
|
|
70
|
-
import { basename } from "path";
|
|
150
|
+
import { readFile as readFile2 } from "fs/promises";
|
|
151
|
+
import { basename as basename2 } from "path";
|
|
71
152
|
import { execa } from "execa";
|
|
72
153
|
|
|
73
154
|
// src/cli/errors.ts
|
|
@@ -113,7 +194,7 @@ async function collectGitInfo(root, options) {
|
|
|
113
194
|
const unstagedDiffSummary = options.includeDiffSummary ? joinSections([trackedUnstagedDiffSummary, renderUntrackedSummary(untrackedFiles)]) : "";
|
|
114
195
|
const diff = options.includeDiff ? await collectDiff(root, untrackedFiles) : void 0;
|
|
115
196
|
return {
|
|
116
|
-
name:
|
|
197
|
+
name: basename2(root),
|
|
117
198
|
branch,
|
|
118
199
|
...options.since ? { baseRef: options.since } : {},
|
|
119
200
|
status,
|
|
@@ -197,7 +278,7 @@ function renderUntrackedSummary(files) {
|
|
|
197
278
|
async function untrackedPatch(root, files) {
|
|
198
279
|
const patches = await Promise.all(
|
|
199
280
|
files.map(async (file) => {
|
|
200
|
-
const content = await
|
|
281
|
+
const content = await readFile2(`${root}/${file}`, "utf8");
|
|
201
282
|
const trimmedContent = content.length > UNTRACKED_PATCH_CHAR_LIMIT ? `${content.slice(0, UNTRACKED_PATCH_CHAR_LIMIT).trimEnd()}
|
|
202
283
|
[truncated]` : content.trimEnd();
|
|
203
284
|
return [`Untracked file: ${file}`, "```text", trimmedContent, "```"].join("\n");
|
|
@@ -215,8 +296,73 @@ function isIgnoredChangedPath(file) {
|
|
|
215
296
|
return IGNORED_CHANGED_PATH_PREFIXES.some((prefix) => file === prefix.slice(0, -1) || file.startsWith(prefix));
|
|
216
297
|
}
|
|
217
298
|
|
|
299
|
+
// src/cli/commands/cache.ts
|
|
300
|
+
var CacheFormatOptionsSchema = z.object({
|
|
301
|
+
format: z.enum(["markdown", "json"]).default("markdown")
|
|
302
|
+
});
|
|
303
|
+
var CacheKindSchema = z.enum(["verification", "resume"]);
|
|
304
|
+
function createCacheCommand() {
|
|
305
|
+
return new Command("cache").description("Inspect local .handoffkit cache artifacts.").summary("List and show explicit local cache artifacts.").addCommand(createCacheListCommand()).addCommand(createCacheShowCommand());
|
|
306
|
+
}
|
|
307
|
+
function createCacheListCommand() {
|
|
308
|
+
return new Command("list").description("List local cache artifacts.").option("--format <format>", "output format: markdown or json", "markdown").action(async (rawOptions) => {
|
|
309
|
+
const options = CacheFormatOptionsSchema.parse(rawOptions);
|
|
310
|
+
const root = await findGitRoot(process.cwd());
|
|
311
|
+
const artifacts = await listCacheArtifacts(root);
|
|
312
|
+
if (options.format === "json") {
|
|
313
|
+
process.stdout.write(`${JSON.stringify({ artifacts }, null, 2)}
|
|
314
|
+
`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
process.stdout.write(renderCacheListMarkdown(artifacts));
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function createCacheShowCommand() {
|
|
321
|
+
return new Command("show").description("Show one local cache artifact.").argument("<kind>", "cache kind: verification or resume").argument("[name]", "artifact name, defaults to latest", "latest").option("--format <format>", "output format: markdown or json", "markdown").action(async (kindInput, name, rawOptions) => {
|
|
322
|
+
const options = CacheFormatOptionsSchema.parse(rawOptions);
|
|
323
|
+
const kind = CacheKindSchema.parse(kindInput);
|
|
324
|
+
const root = await findGitRoot(process.cwd());
|
|
325
|
+
const artifact = await readCacheArtifact(root, kind, name);
|
|
326
|
+
if (options.format === "json") {
|
|
327
|
+
process.stdout.write(`${JSON.stringify(artifact, null, 2)}
|
|
328
|
+
`);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
process.stdout.write(renderCacheArtifactMarkdown(artifact, kind, name));
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
function renderCacheListMarkdown(artifacts) {
|
|
335
|
+
const lines = ["# Cache Artifacts", ""];
|
|
336
|
+
if (artifacts.length === 0) {
|
|
337
|
+
lines.push("No cache artifacts found.");
|
|
338
|
+
} else {
|
|
339
|
+
for (const artifact of artifacts) {
|
|
340
|
+
lines.push(`- ${artifact.kind}/${artifact.name} (${artifact.createdAt}) - \`${artifact.path}\``);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return `${lines.join("\n")}
|
|
344
|
+
`;
|
|
345
|
+
}
|
|
346
|
+
function renderCacheArtifactMarkdown(artifact, kind, name) {
|
|
347
|
+
return [
|
|
348
|
+
"# Cache Artifact",
|
|
349
|
+
"",
|
|
350
|
+
`- Artifact: ${kind}/${name}`,
|
|
351
|
+
`- Created: ${artifact.createdAt}`,
|
|
352
|
+
"",
|
|
353
|
+
"```json",
|
|
354
|
+
JSON.stringify(artifact, null, 2),
|
|
355
|
+
"```",
|
|
356
|
+
""
|
|
357
|
+
].join("\n");
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// src/cli/commands/pack.ts
|
|
361
|
+
import { Command as Command2 } from "commander";
|
|
362
|
+
import { z as z3 } from "zod";
|
|
363
|
+
|
|
218
364
|
// src/core/instructions.ts
|
|
219
|
-
import { readFile as
|
|
365
|
+
import { readFile as readFile3, stat } from "fs/promises";
|
|
220
366
|
import fg from "fast-glob";
|
|
221
367
|
var INSTRUCTION_PATTERNS = [
|
|
222
368
|
"**/AGENTS.md",
|
|
@@ -250,7 +396,7 @@ async function readPreview(root, path) {
|
|
|
250
396
|
if (!metadata.isFile()) {
|
|
251
397
|
return "Directory rule set detected.";
|
|
252
398
|
}
|
|
253
|
-
const content = await
|
|
399
|
+
const content = await readFile3(fullPath, "utf8");
|
|
254
400
|
const normalized = content.replace(/\r\n/g, "\n").trim();
|
|
255
401
|
const preview = normalized.length > PREVIEW_CHAR_LIMIT ? `${normalized.slice(0, PREVIEW_CHAR_LIMIT).trimEnd()}
|
|
256
402
|
[truncated]` : normalized;
|
|
@@ -276,13 +422,13 @@ function instructionKind(path) {
|
|
|
276
422
|
}
|
|
277
423
|
|
|
278
424
|
// src/core/package-json.ts
|
|
279
|
-
import { access, readFile as
|
|
425
|
+
import { access, readFile as readFile4 } from "fs/promises";
|
|
280
426
|
import { join as join2 } from "path";
|
|
281
|
-
import { z } from "zod";
|
|
282
|
-
var PackageJsonSchema =
|
|
283
|
-
name:
|
|
284
|
-
packageManager:
|
|
285
|
-
scripts:
|
|
427
|
+
import { z as z2 } from "zod";
|
|
428
|
+
var PackageJsonSchema = z2.object({
|
|
429
|
+
name: z2.string().optional(),
|
|
430
|
+
packageManager: z2.string().optional(),
|
|
431
|
+
scripts: z2.record(z2.string(), z2.string()).optional()
|
|
286
432
|
});
|
|
287
433
|
var VERIFY_SCRIPT_ORDER = ["build", "test", "typecheck", "lint", "check", "verify", "ci"];
|
|
288
434
|
var VERIFY_SCRIPT_PREFIX = /^(build|test|typecheck|lint|check|verify|ci)(:|$)/;
|
|
@@ -291,7 +437,7 @@ async function detectPackageInfo(root) {
|
|
|
291
437
|
if (!await pathExists(packageJsonPath)) {
|
|
292
438
|
return void 0;
|
|
293
439
|
}
|
|
294
|
-
const rawPackageJson = await
|
|
440
|
+
const rawPackageJson = await readFile4(packageJsonPath, "utf8");
|
|
295
441
|
const packageJson = PackageJsonSchema.parse(JSON.parse(rawPackageJson));
|
|
296
442
|
const packageManager = await detectPackageManager(root, packageJson.packageManager);
|
|
297
443
|
const verificationScripts = detectVerificationScripts(packageJson.scripts ?? {});
|
|
@@ -444,7 +590,7 @@ function isDocumentationFile(file) {
|
|
|
444
590
|
}
|
|
445
591
|
|
|
446
592
|
// src/core/scanners.ts
|
|
447
|
-
import { mkdtemp, readFile as
|
|
593
|
+
import { mkdtemp, readFile as readFile5 } from "fs/promises";
|
|
448
594
|
import { tmpdir } from "os";
|
|
449
595
|
import { relative, join as join3 } from "path";
|
|
450
596
|
import { performance } from "perf_hooks";
|
|
@@ -539,7 +685,7 @@ async function runGitleaks(root) {
|
|
|
539
685
|
["dir", root, "--no-banner", "--no-color", "--redact=100", "--report-format", "json", "--report-path", reportPath, "--max-target-megabytes", "2"],
|
|
540
686
|
{ reject: false, all: true }
|
|
541
687
|
);
|
|
542
|
-
const rawReport = await
|
|
688
|
+
const rawReport = await readFile5(reportPath, "utf8").catch(() => "[]");
|
|
543
689
|
const findings = normalizeGitleaksFindings(rawReport);
|
|
544
690
|
return {
|
|
545
691
|
name: "gitleaks",
|
|
@@ -686,6 +832,7 @@ async function collectHandoffReport(options) {
|
|
|
686
832
|
...packageInfo ? { packageInfo } : {},
|
|
687
833
|
...options.resumeSource ? { resumeSource: options.resumeSource } : {},
|
|
688
834
|
...options.includeVerification ? { verification: await runVerification(root) } : {},
|
|
835
|
+
...options.includeCache ? { cache: { artifacts: await listCacheArtifacts(root) } } : {},
|
|
689
836
|
secretScanning,
|
|
690
837
|
budget: {
|
|
691
838
|
requestedTokens: options.budget,
|
|
@@ -744,6 +891,7 @@ var genericOrder = [
|
|
|
744
891
|
"package",
|
|
745
892
|
"resume",
|
|
746
893
|
"verification",
|
|
894
|
+
"cache",
|
|
747
895
|
"risk",
|
|
748
896
|
"secretScanning"
|
|
749
897
|
];
|
|
@@ -764,6 +912,7 @@ var profiles = {
|
|
|
764
912
|
"gitStatus",
|
|
765
913
|
"changedFiles",
|
|
766
914
|
"verification",
|
|
915
|
+
"cache",
|
|
767
916
|
"risk",
|
|
768
917
|
"branchDelta",
|
|
769
918
|
"diffSummary",
|
|
@@ -788,6 +937,7 @@ var profiles = {
|
|
|
788
937
|
"resume",
|
|
789
938
|
"repository",
|
|
790
939
|
"verification",
|
|
940
|
+
"cache",
|
|
791
941
|
"risk",
|
|
792
942
|
"changedFiles",
|
|
793
943
|
"gitStatus",
|
|
@@ -820,6 +970,7 @@ var profiles = {
|
|
|
820
970
|
"instructionFiles",
|
|
821
971
|
"package",
|
|
822
972
|
"verification",
|
|
973
|
+
"cache",
|
|
823
974
|
"risk",
|
|
824
975
|
"resume",
|
|
825
976
|
"secretScanning",
|
|
@@ -894,6 +1045,8 @@ function renderSection(section, report) {
|
|
|
894
1045
|
return renderResumeSource(report);
|
|
895
1046
|
case "verification":
|
|
896
1047
|
return renderVerification(report);
|
|
1048
|
+
case "cache":
|
|
1049
|
+
return renderCache(report);
|
|
897
1050
|
case "risk":
|
|
898
1051
|
return renderRisk(report);
|
|
899
1052
|
case "secretScanning":
|
|
@@ -999,6 +1152,18 @@ function renderVerification(report) {
|
|
|
999
1152
|
""
|
|
1000
1153
|
];
|
|
1001
1154
|
}
|
|
1155
|
+
function renderCache(report) {
|
|
1156
|
+
if (!report.cache) {
|
|
1157
|
+
return [];
|
|
1158
|
+
}
|
|
1159
|
+
return ["## Cache Artifacts", renderCacheArtifacts(report.cache.artifacts), ""];
|
|
1160
|
+
}
|
|
1161
|
+
function renderCacheArtifacts(artifacts) {
|
|
1162
|
+
if (artifacts.length === 0) {
|
|
1163
|
+
return "No cache artifacts found.";
|
|
1164
|
+
}
|
|
1165
|
+
return artifacts.map((artifact) => `- ${artifact.kind}/${artifact.name} (${artifact.createdAt}) - \`${artifact.path}\``).join("\n");
|
|
1166
|
+
}
|
|
1002
1167
|
function renderRisk(report) {
|
|
1003
1168
|
if (!report.risk) {
|
|
1004
1169
|
return [];
|
|
@@ -1094,21 +1259,22 @@ function renderOutput(report, format, budget) {
|
|
|
1094
1259
|
}
|
|
1095
1260
|
|
|
1096
1261
|
// src/cli/commands/pack.ts
|
|
1097
|
-
var PackCliOptionsSchema =
|
|
1098
|
-
goal:
|
|
1099
|
-
output:
|
|
1100
|
-
format:
|
|
1101
|
-
for:
|
|
1102
|
-
budget:
|
|
1103
|
-
includeDiff:
|
|
1104
|
-
diff:
|
|
1105
|
-
since:
|
|
1106
|
-
verify:
|
|
1107
|
-
scanSecrets:
|
|
1108
|
-
cache:
|
|
1262
|
+
var PackCliOptionsSchema = z3.object({
|
|
1263
|
+
goal: z3.string().trim().min(1).default("Make your own goal"),
|
|
1264
|
+
output: z3.string().optional(),
|
|
1265
|
+
format: z3.enum(["markdown", "json"]).default("markdown"),
|
|
1266
|
+
for: z3.enum(["generic", "codex", "claude", "cursor"]).default("generic"),
|
|
1267
|
+
budget: z3.number().int().positive().default(4e3),
|
|
1268
|
+
includeDiff: z3.boolean().default(false),
|
|
1269
|
+
diff: z3.boolean().default(true),
|
|
1270
|
+
since: z3.string().trim().min(1).optional(),
|
|
1271
|
+
verify: z3.boolean().default(false),
|
|
1272
|
+
scanSecrets: z3.boolean().default(false),
|
|
1273
|
+
cache: z3.boolean().default(false),
|
|
1274
|
+
includeCache: z3.boolean().default(false)
|
|
1109
1275
|
});
|
|
1110
1276
|
function createPackCommand() {
|
|
1111
|
-
return new
|
|
1277
|
+
return new Command2("pack").description("Create a safe local handoff packet for another AI assistant.").summary("Create a Markdown or JSON packet from the current git state.").option("--goal <text>", "handoff goal", "Make your own goal").option("--output <path>", "write output to a file instead of stdout").option("--format <format>", "output format: markdown or json", "markdown").option("--for <agent>", "target output: generic, codex, claude, or cursor", "generic").option("--budget <tokens>", "rough output token budget", parseBudget, 4e3).option("--since <ref>", "focus committed branch delta on a base ref").option("--verify", "run safe verification scripts and include results").option("--scan-secrets", "run optional local secret scanners and include bounded results").option("--cache", "write explicit local cache artifacts under .handoffkit when available").option("--include-cache", "include recent .handoffkit artifact summaries").option("--include-diff", "include full staged and unstaged patches", false).option("--no-diff", "omit diff summaries and full patches").action(async (rawOptions) => {
|
|
1112
1278
|
const options = parseOptions(rawOptions);
|
|
1113
1279
|
const root = options.cache ? await findGitRoot(process.cwd()) : void 0;
|
|
1114
1280
|
const report = await collectHandoffReport({
|
|
@@ -1122,7 +1288,8 @@ function createPackCommand() {
|
|
|
1122
1288
|
includeDiffSummary: options.diff,
|
|
1123
1289
|
...options.since ? { since: options.since } : {},
|
|
1124
1290
|
includeVerification: options.verify,
|
|
1125
|
-
scanSecrets: options.scanSecrets
|
|
1291
|
+
scanSecrets: options.scanSecrets,
|
|
1292
|
+
includeCache: options.includeCache
|
|
1126
1293
|
});
|
|
1127
1294
|
if (options.cache && root && report.verification) {
|
|
1128
1295
|
const cache = await writeCacheArtifact(root, "verification", {
|
|
@@ -1154,9 +1321,9 @@ function parseBudget(value) {
|
|
|
1154
1321
|
}
|
|
1155
1322
|
|
|
1156
1323
|
// src/cli/commands/resume.ts
|
|
1157
|
-
import { readFile as
|
|
1158
|
-
import { Command as
|
|
1159
|
-
import { z as
|
|
1324
|
+
import { readFile as readFile6 } from "fs/promises";
|
|
1325
|
+
import { Command as Command3 } from "commander";
|
|
1326
|
+
import { z as z4 } from "zod";
|
|
1160
1327
|
|
|
1161
1328
|
// src/core/resume.ts
|
|
1162
1329
|
var RESUME_PREVIEW_LIMIT = 3e3;
|
|
@@ -1285,19 +1452,20 @@ function hasResumeState(state) {
|
|
|
1285
1452
|
}
|
|
1286
1453
|
|
|
1287
1454
|
// src/cli/commands/resume.ts
|
|
1288
|
-
var ResumeOptionsSchema =
|
|
1289
|
-
goal:
|
|
1290
|
-
output:
|
|
1291
|
-
format:
|
|
1292
|
-
for:
|
|
1293
|
-
budget:
|
|
1294
|
-
cache:
|
|
1455
|
+
var ResumeOptionsSchema = z4.object({
|
|
1456
|
+
goal: z4.string().trim().min(1).default("Resume interrupted AI coding session"),
|
|
1457
|
+
output: z4.string().optional(),
|
|
1458
|
+
format: z4.enum(["markdown", "json"]).default("markdown"),
|
|
1459
|
+
for: z4.enum(["generic", "codex", "claude", "cursor"]).default("generic"),
|
|
1460
|
+
budget: z4.number().int().positive().default(4e3),
|
|
1461
|
+
cache: z4.boolean().default(false),
|
|
1462
|
+
fromCache: z4.string().trim().min(1).optional()
|
|
1295
1463
|
});
|
|
1296
1464
|
function createResumeCommand() {
|
|
1297
|
-
return new
|
|
1465
|
+
return new Command3("resume").description("Create a fresh handoff packet using a previous handoff as resume context.").summary("Merge a previous handoff or transcript with fresh repo state.").argument("[path]", "previous handoff or transcript file").option("--goal <text>", "new handoff goal", "Resume interrupted AI coding session").option("--output <path>", "write output to a file instead of stdout").option("--format <format>", "output format: markdown or json", "markdown").option("--for <agent>", "target output: generic, codex, claude, or cursor", "generic").option("--budget <tokens>", "rough output token budget", parseBudget2, 4e3).option("--cache", "write a local resume artifact under .handoffkit/resume").option("--from-cache <ref>", "load resume source from .handoffkit/resume, for example latest or resume/latest").action(async (path, rawOptions) => {
|
|
1298
1466
|
const options = ResumeOptionsSchema.parse(rawOptions);
|
|
1299
|
-
const
|
|
1300
|
-
const
|
|
1467
|
+
const root = options.cache || options.fromCache ? await findGitRoot(process.cwd()) : void 0;
|
|
1468
|
+
const source = await resolveResumeSource(path, options.fromCache, root);
|
|
1301
1469
|
const report = await collectHandoffReport({
|
|
1302
1470
|
goal: options.goal,
|
|
1303
1471
|
cwd: process.cwd(),
|
|
@@ -1309,6 +1477,7 @@ function createResumeCommand() {
|
|
|
1309
1477
|
includeDiffSummary: true,
|
|
1310
1478
|
includeVerification: false,
|
|
1311
1479
|
scanSecrets: false,
|
|
1480
|
+
includeCache: false,
|
|
1312
1481
|
resumeSource: source
|
|
1313
1482
|
});
|
|
1314
1483
|
if (options.cache && root) {
|
|
@@ -1323,6 +1492,21 @@ function createResumeCommand() {
|
|
|
1323
1492
|
await writeRenderedReport(report, options.format, options.budget, options.output);
|
|
1324
1493
|
});
|
|
1325
1494
|
}
|
|
1495
|
+
async function resolveResumeSource(path, fromCache, root) {
|
|
1496
|
+
if (path && fromCache) {
|
|
1497
|
+
throw new Error("Pass either <path> or --from-cache, not both.");
|
|
1498
|
+
}
|
|
1499
|
+
if (fromCache) {
|
|
1500
|
+
if (!root) {
|
|
1501
|
+
throw new Error("--from-cache requires a git repository.");
|
|
1502
|
+
}
|
|
1503
|
+
return readResumeSourceFromCache(root, fromCache);
|
|
1504
|
+
}
|
|
1505
|
+
if (!path) {
|
|
1506
|
+
throw new Error("resume requires <path> or --from-cache <ref>.");
|
|
1507
|
+
}
|
|
1508
|
+
return createResumeSource(path, await readFile6(path, "utf8"));
|
|
1509
|
+
}
|
|
1326
1510
|
function parseBudget2(value) {
|
|
1327
1511
|
const parsed = Number.parseInt(value, 10);
|
|
1328
1512
|
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
@@ -1332,13 +1516,13 @@ function parseBudget2(value) {
|
|
|
1332
1516
|
}
|
|
1333
1517
|
|
|
1334
1518
|
// src/cli/commands/risk.ts
|
|
1335
|
-
import { Command as
|
|
1336
|
-
import { z as
|
|
1337
|
-
var RiskOptionsSchema =
|
|
1338
|
-
format:
|
|
1519
|
+
import { Command as Command4 } from "commander";
|
|
1520
|
+
import { z as z5 } from "zod";
|
|
1521
|
+
var RiskOptionsSchema = z5.object({
|
|
1522
|
+
format: z5.enum(["markdown", "json"]).default("markdown")
|
|
1339
1523
|
});
|
|
1340
1524
|
function createRiskCommand() {
|
|
1341
|
-
return new
|
|
1525
|
+
return new Command4("risk").description("Show deterministic risk notes for the current handoff.").summary("Show deterministic risk notes from changed files.").option("--format <format>", "output format: markdown or json", "markdown").action(async (rawOptions) => {
|
|
1342
1526
|
const options = RiskOptionsSchema.parse(rawOptions);
|
|
1343
1527
|
const report = await collectHandoffReport({
|
|
1344
1528
|
goal: "Review local risk",
|
|
@@ -1349,7 +1533,8 @@ function createRiskCommand() {
|
|
|
1349
1533
|
includeDiff: false,
|
|
1350
1534
|
includeDiffSummary: false,
|
|
1351
1535
|
includeVerification: false,
|
|
1352
|
-
scanSecrets: false
|
|
1536
|
+
scanSecrets: false,
|
|
1537
|
+
includeCache: false
|
|
1353
1538
|
});
|
|
1354
1539
|
if (options.format === "json") {
|
|
1355
1540
|
process.stdout.write(`${JSON.stringify(report.risk, null, 2)}
|
|
@@ -1364,13 +1549,13 @@ ${report.risk?.notes.map((note) => `- **${note.severity}**: ${note.title} - ${no
|
|
|
1364
1549
|
}
|
|
1365
1550
|
|
|
1366
1551
|
// src/cli/commands/scan-secrets.ts
|
|
1367
|
-
import { Command as
|
|
1368
|
-
import { z as
|
|
1369
|
-
var ScanSecretsOptionsSchema =
|
|
1370
|
-
format:
|
|
1552
|
+
import { Command as Command5 } from "commander";
|
|
1553
|
+
import { z as z6 } from "zod";
|
|
1554
|
+
var ScanSecretsOptionsSchema = z6.object({
|
|
1555
|
+
format: z6.enum(["markdown", "json"]).default("markdown")
|
|
1371
1556
|
});
|
|
1372
1557
|
function createScanSecretsCommand() {
|
|
1373
|
-
return new
|
|
1558
|
+
return new Command5("scan-secrets").description("Run optional local secret scanners and print bounded redacted results.").summary("Run optional local secret scanners.").option("--format <format>", "output format: markdown or json", "markdown").action(async (rawOptions) => {
|
|
1374
1559
|
const options = ScanSecretsOptionsSchema.parse(rawOptions);
|
|
1375
1560
|
const root = await findGitRoot(process.cwd());
|
|
1376
1561
|
const report = await runSecretScanners(root);
|
|
@@ -1411,14 +1596,14 @@ function scannerGuidanceLines2(scanner) {
|
|
|
1411
1596
|
}
|
|
1412
1597
|
|
|
1413
1598
|
// src/cli/commands/verify.ts
|
|
1414
|
-
import { Command as
|
|
1415
|
-
import { z as
|
|
1416
|
-
var VerifyOptionsSchema =
|
|
1417
|
-
format:
|
|
1418
|
-
cache:
|
|
1599
|
+
import { Command as Command6 } from "commander";
|
|
1600
|
+
import { z as z7 } from "zod";
|
|
1601
|
+
var VerifyOptionsSchema = z7.object({
|
|
1602
|
+
format: z7.enum(["markdown", "json"]).default("markdown"),
|
|
1603
|
+
cache: z7.boolean().default(false)
|
|
1419
1604
|
});
|
|
1420
1605
|
function createVerifyCommand() {
|
|
1421
|
-
return new
|
|
1606
|
+
return new Command6("verify").description("Run safe local verification scripts.").summary("Run safe detected verification scripts.").option("--format <format>", "output format: markdown or json", "markdown").option("--cache", "write a local verification artifact under .handoffkit/verification").action(async (rawOptions) => {
|
|
1422
1607
|
const options = VerifyOptionsSchema.parse(rawOptions);
|
|
1423
1608
|
const root = await findGitRoot(process.cwd());
|
|
1424
1609
|
const verification = await runVerification(root);
|
|
@@ -1449,12 +1634,13 @@ function renderVerificationMarkdown(commands) {
|
|
|
1449
1634
|
}
|
|
1450
1635
|
|
|
1451
1636
|
// src/cli/index.ts
|
|
1452
|
-
var program = new
|
|
1637
|
+
var program = new Command7().name("handoffkit").description("Create safe local handoff packets for AI-assisted coding sessions.").summary("Create local-first AI coding session handoff packets.").showHelpAfterError("(run with --help for usage)").version("0.4.0");
|
|
1453
1638
|
program.addCommand(createPackCommand());
|
|
1454
1639
|
program.addCommand(createVerifyCommand());
|
|
1455
1640
|
program.addCommand(createRiskCommand());
|
|
1456
1641
|
program.addCommand(createScanSecretsCommand());
|
|
1457
1642
|
program.addCommand(createResumeCommand());
|
|
1643
|
+
program.addCommand(createCacheCommand());
|
|
1458
1644
|
try {
|
|
1459
1645
|
await program.parseAsync(process.argv);
|
|
1460
1646
|
} catch (error) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/pack.ts","../src/core/cache.ts","../src/core/redact.ts","../src/core/git.ts","../src/cli/errors.ts","../src/core/instructions.ts","../src/core/package-json.ts","../src/core/risk.ts","../src/core/scanners.ts","../src/core/verify.ts","../src/core/collect.ts","../src/cli/output.ts","../src/core/budget.ts","../src/report/json.ts","../src/report/profiles.ts","../src/report/markdown.ts","../src/cli/commands/resume.ts","../src/core/resume.ts","../src/cli/commands/risk.ts","../src/cli/commands/scan-secrets.ts","../src/cli/commands/verify.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\n\nimport { createPackCommand } from \"./commands/pack.js\";\nimport { createResumeCommand } from \"./commands/resume.js\";\nimport { createRiskCommand } from \"./commands/risk.js\";\nimport { createScanSecretsCommand } from \"./commands/scan-secrets.js\";\nimport { createVerifyCommand } from \"./commands/verify.js\";\nimport { formatCliError } from \"./errors.js\";\n\nconst program = new Command()\n .name(\"handoffkit\")\n .description(\"Create safe local handoff packets for AI-assisted coding sessions.\")\n .summary(\"Create local-first AI coding session handoff packets.\")\n .showHelpAfterError(\"(run with --help for usage)\")\n .version(\"0.3.0\");\n\nprogram.addCommand(createPackCommand());\nprogram.addCommand(createVerifyCommand());\nprogram.addCommand(createRiskCommand());\nprogram.addCommand(createScanSecretsCommand());\nprogram.addCommand(createResumeCommand());\n\ntry {\n await program.parseAsync(process.argv);\n} catch (error) {\n process.stderr.write(`${formatCliError(error)}\\n`);\n process.exitCode = 1;\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { writeCacheArtifact } from \"../../core/cache.js\";\nimport { collectHandoffReport } from \"../../core/collect.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport { writeRenderedReport } from \"../output.js\";\n\nconst PackCliOptionsSchema = z.object({\n goal: z.string().trim().min(1).default(\"Make your own goal\"),\n output: z.string().optional(),\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\"),\n for: z.enum([\"generic\", \"codex\", \"claude\", \"cursor\"]).default(\"generic\"),\n budget: z.number().int().positive().default(4000),\n includeDiff: z.boolean().default(false),\n diff: z.boolean().default(true),\n since: z.string().trim().min(1).optional(),\n verify: z.boolean().default(false),\n scanSecrets: z.boolean().default(false),\n cache: z.boolean().default(false)\n});\n\nexport function createPackCommand() {\n return new Command(\"pack\")\n .description(\"Create a safe local handoff packet for another AI assistant.\")\n .summary(\"Create a Markdown or JSON packet from the current git state.\")\n .option(\"--goal <text>\", \"handoff goal\", \"Make your own goal\")\n .option(\"--output <path>\", \"write output to a file instead of stdout\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .option(\"--for <agent>\", \"target output: generic, codex, claude, or cursor\", \"generic\")\n .option(\"--budget <tokens>\", \"rough output token budget\", parseBudget, 4000)\n .option(\"--since <ref>\", \"focus committed branch delta on a base ref\")\n .option(\"--verify\", \"run safe verification scripts and include results\")\n .option(\"--scan-secrets\", \"run optional local secret scanners and include bounded results\")\n .option(\"--cache\", \"write explicit local cache artifacts under .handoffkit when available\")\n .option(\"--include-diff\", \"include full staged and unstaged patches\", false)\n .option(\"--no-diff\", \"omit diff summaries and full patches\")\n .action(async (rawOptions) => {\n const options = parseOptions(rawOptions);\n const root = options.cache ? await findGitRoot(process.cwd()) : undefined;\n const report = await collectHandoffReport({\n goal: options.goal,\n cwd: process.cwd(),\n ...(options.output ? { output: options.output } : {}),\n format: options.format,\n target: options.for,\n budget: options.budget,\n includeDiff: options.includeDiff,\n includeDiffSummary: options.diff,\n ...(options.since ? { since: options.since } : {}),\n includeVerification: options.verify,\n scanSecrets: options.scanSecrets\n });\n\n if (options.cache && root && report.verification) {\n const cache = await writeCacheArtifact(root, \"verification\", {\n goal: report.goal,\n target: report.target,\n verification: report.verification\n });\n process.stderr.write(`Wrote verification cache to ${cache.latestPath}\\n`);\n }\n\n await writeRenderedReport(report, options.format, options.budget, options.output);\n });\n}\n\nfunction parseOptions(rawOptions: unknown) {\n const result = PackCliOptionsSchema.safeParse(rawOptions);\n\n if (!result.success) {\n const message = result.error.issues.map((issue) => issue.message).join(\"\\n\");\n throw new Error(`Invalid pack options:\\n${message}`);\n }\n\n return result.data;\n}\n\nfunction parseBudget(value: string) {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\"--budget must be a positive integer.\");\n }\n\n return parsed;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { redactText } from \"./redact.js\";\n\nexport type CacheArtifactKind = \"verification\" | \"resume\";\n\ninterface CacheEnvelope<T> {\n version: 1;\n kind: CacheArtifactKind;\n createdAt: string;\n data: T;\n}\n\ninterface WriteCacheOptions {\n now?: Date;\n}\n\nexport async function writeCacheArtifact<T>(root: string, kind: CacheArtifactKind, data: T, options: WriteCacheOptions = {}) {\n const createdAt = (options.now ?? new Date()).toISOString();\n const envelope: CacheEnvelope<T> = {\n version: 1,\n kind,\n createdAt,\n data\n };\n const cacheDir = join(root, \".handoffkit\", kind);\n const artifactPath = join(cacheDir, `${cacheTimestamp(createdAt)}.json`);\n const latestPath = join(cacheDir, \"latest.json\");\n const contents = `${redactText(JSON.stringify(envelope, null, 2))}\\n`;\n\n await mkdir(cacheDir, { recursive: true });\n await Promise.all([writeFile(artifactPath, contents, \"utf8\"), writeFile(latestPath, contents, \"utf8\")]);\n\n return { artifactPath, latestPath };\n}\n\nfunction cacheTimestamp(timestamp: string) {\n return timestamp.replace(/[:.]/g, \"-\");\n}\n","const REDACTION = \"[REDACTED]\";\n\nconst SECRET_KEY_PATTERN =\n /(\\b(?:[A-Z0-9]+[_.-])*(?:API[_-]?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE[_-]?KEY|CLIENT[_-]?SECRET|ACCESS[_-]?TOKEN|REFRESH[_-]?TOKEN|COOKIE|SESSION|JWT|AUTH_TOKEN)(?:[_.-][A-Z0-9]+)*\\b\\s*(?:=|:)\\s*)([\"']?)([^\\s\"',}]+)/gi;\n\nconst TOKEN_PATTERNS: RegExp[] = [\n /\\bBearer\\s+[A-Za-z0-9._~+/=-]{12,}/gi,\n /\\bsk-[A-Za-z0-9_-]{16,}/g,\n /\\bgh[pousr]_[A-Za-z0-9_]{16,}/g,\n /\\bnpm_[A-Za-z0-9_-]{16,}/g,\n /\\bxox[baprs]-[A-Za-z0-9-]{16,}/g,\n /\\bAIza[0-9A-Za-z_-]{20,}/g,\n /\\bAKIA[0-9A-Z]{16}\\b/g,\n /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/g,\n /\\/\\/([^/\\s:@]+):([^@\\s/]+)@/g\n];\n\nexport function redactText(input: string): string {\n let output = input.replace(\n /-----BEGIN ([A-Z ]*PRIVATE KEY)-----[\\s\\S]*?-----END \\1-----/g,\n (_match, keyType: string) => `-----BEGIN ${keyType}-----\\n${REDACTION}\\n-----END ${keyType}-----`\n );\n\n output = output.replace(SECRET_KEY_PATTERN, (_match, prefix: string, quote: string) => {\n return `${prefix}${quote}${REDACTION}${quote}`;\n });\n\n output = output.replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]{12,}/gi, \"Bearer [REDACTED]\");\n output = output.replace(/\\/\\/([^/\\s:@]+):([^@\\s/]+)@/g, \"//[REDACTED]@\");\n\n for (const pattern of TOKEN_PATTERNS.slice(1, -1)) {\n output = output.replace(pattern, REDACTION);\n }\n\n return output;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { execa } from \"execa\";\n\nimport { HandoffKitCliError } from \"../cli/errors.js\";\nimport type { DiffInfo, RepositoryInfo } from \"../types.js\";\n\nconst UNTRACKED_PATCH_CHAR_LIMIT = 20_000;\nconst IGNORED_CHANGED_PATH_PREFIXES = [\"node_modules/\", \"dist/\", \"coverage/\", \".git/\", \".handoffkit/\"];\n\nexport interface GitCollectOptions {\n includeDiff: boolean;\n includeDiffSummary: boolean;\n since?: string;\n}\n\nexport async function findGitRoot(cwd: string): Promise<string> {\n const result = await execa(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n reject: false\n });\n\n if (result.exitCode !== 0) {\n throw new HandoffKitCliError([\n \"HandoffKit must be run inside a git repository.\",\n \"Run this command from a git checkout, or initialize one with `git init`.\"\n ].join(\"\\n\"));\n }\n\n return result.stdout.trimEnd();\n}\n\nexport async function collectGitInfo(root: string, options: GitCollectOptions): Promise<RepositoryInfo> {\n const [branch, status, porcelainStatus, recentCommits, stagedDiffSummary, trackedUnstagedDiffSummary, baseInfo] =\n await Promise.all([\n currentBranch(root),\n git(root, [\"status\", \"--short\", \"--branch\"]),\n git(root, [\"status\", \"--porcelain=v1\", \"--untracked-files=all\"]),\n recentCommitLines(root, options.since),\n options.includeDiffSummary ? git(root, [\"diff\", \"--cached\", \"--stat\"]) : Promise.resolve(\"\"),\n options.includeDiffSummary ? git(root, [\"diff\", \"--stat\"]) : Promise.resolve(\"\"),\n options.since ? collectBaseInfo(root, options.since, options.includeDiffSummary, options.includeDiff) : Promise.resolve(undefined)\n ]);\n\n const changedFiles = uniqueSorted([...(baseInfo?.changedFiles ?? []), ...parseChangedFiles(porcelainStatus)]);\n const untrackedFiles = parseUntrackedFiles(porcelainStatus);\n const unstagedDiffSummary = options.includeDiffSummary\n ? joinSections([trackedUnstagedDiffSummary, renderUntrackedSummary(untrackedFiles)])\n : \"\";\n const diff = options.includeDiff ? await collectDiff(root, untrackedFiles) : undefined;\n\n return {\n name: basename(root),\n branch,\n ...(options.since ? { baseRef: options.since } : {}),\n status,\n recentCommits,\n changedFiles,\n ...(baseInfo?.summary ? { baseDiffSummary: baseInfo.summary } : {}),\n stagedDiffSummary,\n unstagedDiffSummary,\n includeDiff: options.includeDiff,\n ...(baseInfo?.patch ? { baseDiff: baseInfo.patch } : {}),\n ...(diff ? { diff } : {})\n };\n}\n\nasync function currentBranch(root: string) {\n const branch = await git(root, [\"branch\", \"--show-current\"]);\n\n if (branch) {\n return branch;\n }\n\n const commit = await git(root, [\"rev-parse\", \"--short\", \"HEAD\"], { allowFailure: true });\n return commit ? `detached:${commit}` : \"unknown\";\n}\n\nasync function recentCommitLines(root: string, since?: string) {\n const args = since ? [\"log\", \"--oneline\", \"-n\", \"10\", `${since}..HEAD`] : [\"log\", \"--oneline\", \"-n\", \"10\"];\n const output = await git(root, args, { allowFailure: true });\n return output ? output.split(\"\\n\") : [];\n}\n\nasync function collectBaseInfo(root: string, since: string, includeDiffSummary: boolean, includeDiff: boolean) {\n await ensureRef(root, since);\n const range = `${since}...HEAD`;\n const [changedFiles, summary, patch] = await Promise.all([\n git(root, [\"diff\", \"--name-only\", range], { allowFailure: true }),\n includeDiffSummary ? git(root, [\"diff\", \"--stat\", range], { allowFailure: true }) : Promise.resolve(\"\"),\n includeDiff ? git(root, [\"diff\", \"--patch\", range], { allowFailure: true }) : Promise.resolve(\"\")\n ]);\n\n return {\n changedFiles: changedFiles ? changedFiles.split(\"\\n\").filter(Boolean) : [],\n summary,\n patch\n };\n}\n\nasync function ensureRef(root: string, ref: string) {\n const result = await execa(\"git\", [\"rev-parse\", \"--verify\", `${ref}^{commit}`], {\n cwd: root,\n reject: false\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`Could not resolve --since ref: ${ref}`);\n }\n}\n\nasync function collectDiff(root: string, untrackedFiles: string[]): Promise<DiffInfo> {\n const [staged, unstagedTracked, untracked] = await Promise.all([\n git(root, [\"diff\", \"--cached\", \"--patch\"]),\n git(root, [\"diff\", \"--patch\"]),\n untrackedPatch(root, untrackedFiles)\n ]);\n\n return { staged, unstaged: joinSections([unstagedTracked, untracked]) };\n}\n\nasync function git(root: string, args: string[], options: { allowFailure?: boolean } = {}) {\n const result = await execa(\"git\", args, {\n cwd: root,\n reject: false\n });\n\n if (result.exitCode !== 0 && !options.allowFailure) {\n throw new Error(result.stderr || `git ${args.join(\" \")} failed`);\n }\n\n return result.stdout.trim();\n}\n\nfunction parseChangedFiles(status: string) {\n const files = status\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter(Boolean)\n .map((line) => line.slice(line[2] === \" \" ? 3 : 2).trim())\n .map((path) => (path.includes(\" -> \") ? path.split(\" -> \").at(-1) ?? path : path))\n .map((path) => path.replace(/^\"|\"$/g, \"\"));\n\n return uniqueSorted(files.filter((file) => !isIgnoredChangedPath(file)));\n}\n\nfunction parseUntrackedFiles(status: string) {\n return status\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter((line) => line.startsWith(\"?? \"))\n .map((line) => line.slice(3).trim())\n .map((path) => path.replace(/^\"|\"$/g, \"\"))\n .filter((file) => !isIgnoredChangedPath(file))\n .sort();\n}\n\nfunction renderUntrackedSummary(files: string[]) {\n if (files.length === 0) {\n return \"\";\n }\n\n return files.map((file) => `${file} | untracked`).join(\"\\n\");\n}\n\nasync function untrackedPatch(root: string, files: string[]) {\n const patches = await Promise.all(\n files.map(async (file) => {\n const content = await readFile(`${root}/${file}`, \"utf8\");\n const trimmedContent =\n content.length > UNTRACKED_PATCH_CHAR_LIMIT\n ? `${content.slice(0, UNTRACKED_PATCH_CHAR_LIMIT).trimEnd()}\\n[truncated]`\n : content.trimEnd();\n\n return [`Untracked file: ${file}`, \"```text\", trimmedContent, \"```\"].join(\"\\n\");\n })\n );\n\n return patches.join(\"\\n\\n\");\n}\n\nfunction joinSections(sections: string[]) {\n return sections.filter(Boolean).join(\"\\n\\n\").trim();\n}\n\nfunction uniqueSorted(files: string[]) {\n return [...new Set(files.filter((file) => !isIgnoredChangedPath(file)))].sort();\n}\n\nfunction isIgnoredChangedPath(file: string) {\n return IGNORED_CHANGED_PATH_PREFIXES.some((prefix) => file === prefix.slice(0, -1) || file.startsWith(prefix));\n}\n","export class HandoffKitCliError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"HandoffKitCliError\";\n }\n}\n\nexport function formatCliError(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return message.trim();\n}\n","import { readFile, stat } from \"node:fs/promises\";\n\nimport fg from \"fast-glob\";\n\nimport type { InstructionFile } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst INSTRUCTION_PATTERNS = [\n \"**/AGENTS.md\",\n \"**/CLAUDE.md\",\n \"**/GEMINI.md\",\n \".cursor/rules\",\n \".cursor/rules/**/*\",\n \".github/copilot-instructions.md\"\n];\n\nconst PREVIEW_CHAR_LIMIT = 1200;\n\nexport async function detectInstructionFiles(root: string): Promise<InstructionFile[]> {\n const paths = await fg(INSTRUCTION_PATTERNS, {\n cwd: root,\n dot: true,\n onlyFiles: false,\n unique: true,\n ignore: [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/coverage/**\"]\n });\n\n return Promise.all(paths.sort().map((path) => instructionFile(root, path)));\n}\n\nasync function instructionFile(root: string, path: string): Promise<InstructionFile> {\n return {\n path,\n kind: instructionKind(path),\n preview: await readPreview(root, path)\n };\n}\n\nasync function readPreview(root: string, path: string) {\n const fullPath = `${root}/${path}`;\n const metadata = await stat(fullPath);\n\n if (!metadata.isFile()) {\n return \"Directory rule set detected.\";\n }\n\n const content = await readFile(fullPath, \"utf8\");\n const normalized = content.replace(/\\r\\n/g, \"\\n\").trim();\n const preview =\n normalized.length > PREVIEW_CHAR_LIMIT ? `${normalized.slice(0, PREVIEW_CHAR_LIMIT).trimEnd()}\\n[truncated]` : normalized;\n\n return redactText(preview);\n}\n\nfunction instructionKind(path: string): InstructionFile[\"kind\"] {\n if (path.endsWith(\"AGENTS.md\")) {\n return \"agents\";\n }\n\n if (path.endsWith(\"CLAUDE.md\")) {\n return \"claude\";\n }\n\n if (path.endsWith(\"GEMINI.md\")) {\n return \"gemini\";\n }\n\n if (path === \".cursor/rules\" || path.startsWith(\".cursor/rules/\")) {\n return \"cursor\";\n }\n\n if (path === \".github/copilot-instructions.md\") {\n return \"copilot\";\n }\n\n return \"instruction\";\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { PackageInfo, VerificationScript } from \"../types.js\";\n\nconst PackageJsonSchema = z.object({\n name: z.string().optional(),\n packageManager: z.string().optional(),\n scripts: z.record(z.string(), z.string()).optional()\n});\n\nconst VERIFY_SCRIPT_ORDER = [\"build\", \"test\", \"typecheck\", \"lint\", \"check\", \"verify\", \"ci\"];\nconst VERIFY_SCRIPT_PREFIX = /^(build|test|typecheck|lint|check|verify|ci)(:|$)/;\n\nexport async function detectPackageInfo(root: string): Promise<PackageInfo | undefined> {\n const packageJsonPath = join(root, \"package.json\");\n\n if (!(await pathExists(packageJsonPath))) {\n return undefined;\n }\n\n const rawPackageJson = await readFile(packageJsonPath, \"utf8\");\n const packageJson = PackageJsonSchema.parse(JSON.parse(rawPackageJson));\n const packageManager = await detectPackageManager(root, packageJson.packageManager);\n const verificationScripts = detectVerificationScripts(packageJson.scripts ?? {});\n\n return {\n ...(packageJson.name ? { name: packageJson.name } : {}),\n ...(packageManager ? { packageManager } : {}),\n verificationScripts\n };\n}\n\nexport async function detectPackageManager(root: string, packageManagerField?: string) {\n if (packageManagerField) {\n return packageManagerField.split(\"@\")[0] || packageManagerField;\n }\n\n const lockfiles: Array<[string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"]\n ];\n\n for (const [lockfile, manager] of lockfiles) {\n if (await pathExists(join(root, lockfile))) {\n return manager;\n }\n }\n\n return undefined;\n}\n\nexport function detectVerificationScripts(scripts: Record<string, string>): VerificationScript[] {\n return Object.entries(scripts)\n .filter(([name]) => VERIFY_SCRIPT_PREFIX.test(name))\n .sort(([left], [right]) => {\n const leftIndex = orderIndex(left);\n const rightIndex = orderIndex(right);\n\n if (leftIndex !== rightIndex) {\n return leftIndex - rightIndex;\n }\n\n return left.localeCompare(right);\n })\n .map(([name, command]) => ({ name, command }));\n}\n\nasync function pathExists(path: string) {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction orderIndex(name: string) {\n const baseName = name.split(\":\")[0] ?? name;\n const index = VERIFY_SCRIPT_ORDER.indexOf(baseName);\n return index === -1 ? VERIFY_SCRIPT_ORDER.length : index;\n}\n","import type { HandoffReport, RiskReport, RiskNote } from \"../types.js\";\n\ninterface RiskRule {\n severity: RiskNote[\"severity\"];\n title: string;\n detail: string;\n matches: (file: string) => boolean;\n}\n\nconst RISK_RULES: RiskRule[] = [\n {\n severity: \"high\",\n title: \"Security-sensitive code changed\",\n detail: \"Review redaction, auth, token, or secret-handling changes carefully before handoff.\",\n matches: (file) => /(^|\\/)(redact|secret|auth|token|security)/i.test(file)\n },\n {\n severity: \"high\",\n title: \"Release or package publishing path changed\",\n detail: \"Release and package changes can break install, provenance, or publish flow; run pnpm pack:dry-run and pnpm smoke:release before tagging or publishing.\",\n matches: isReleaseOrPackageFile\n },\n {\n severity: \"medium\",\n title: \"CI workflow changed\",\n detail: \"Workflow changes can fail only after push; confirm GitHub Actions still passes on the target branch.\",\n matches: (file) => file.startsWith(\".github/workflows/\")\n },\n {\n severity: \"medium\",\n title: \"Build tooling or TypeScript config changed\",\n detail: \"Tooling changes can break typecheck, lint, build output, or package entrypoints; run the full local check command.\",\n matches: isBuildToolingFile\n },\n {\n severity: \"medium\",\n title: \"CLI behavior changed\",\n detail: \"CLI entrypoint or command changes can break user-facing flags and output contracts; cover the changed command with unit or integration tests.\",\n matches: (file) => file.startsWith(\"src/cli/\")\n },\n {\n severity: \"medium\",\n title: \"Resume parsing changed\",\n detail: \"Resume parser changes can drop handoff context; verify completed work, next steps, failures, and open questions are still extracted.\",\n matches: (file) => file === \"src/core/resume.ts\" || file.includes(\"/resume\")\n },\n {\n severity: \"medium\",\n title: \"Handoff report rendering changed\",\n detail: \"Report rendering changes can hide critical context; verify Markdown and JSON output still include repository, verification, risk, and next-step sections.\",\n matches: (file) => file.startsWith(\"src/report/\")\n },\n {\n severity: \"medium\",\n title: \"Generated artifact or ignore policy changed\",\n detail: \"Ignore/cache policy changes can pollute changedFiles or published packages; verify generated directories remain ignored and excluded from reports.\",\n matches: isGeneratedOrIgnorePolicyFile\n },\n {\n severity: \"low\",\n title: \"Documentation changed\",\n detail: \"Documentation-only changes still need examples, command names, and release instructions checked against the current CLI behavior.\",\n matches: isDocumentationFile\n }\n];\n\nexport function analyzeRisk(report: HandoffReport): RiskReport {\n const files = report.repository.changedFiles;\n const notes: RiskNote[] = [];\n\n for (const rule of RISK_RULES) {\n if (files.some(rule.matches)) {\n notes.push({\n severity: rule.severity,\n title: rule.title,\n detail: rule.detail\n });\n }\n }\n\n const sourceFiles = files.filter((file) => file.startsWith(\"src/\") && file.endsWith(\".ts\"));\n const testFiles = files.filter((file) => file.startsWith(\"tests/\") && file.endsWith(\".test.ts\"));\n\n if (sourceFiles.length > 0 && testFiles.length === 0) {\n notes.push({\n severity: \"medium\",\n title: \"Source changed without matching tests\",\n detail: `Review test coverage for ${sourceFiles.slice(0, 5).join(\", \")}.`\n });\n }\n\n if (notes.length === 0) {\n notes.push({\n severity: \"low\",\n title: \"No obvious local risk signals\",\n detail: \"No deterministic risk rule matched the current changed file set.\"\n });\n }\n\n return { notes };\n}\n\nfunction isReleaseOrPackageFile(file: string) {\n return (\n file === \"package.json\" ||\n file === \"CHANGELOG.md\" ||\n file === \"docs/RELEASE.md\" ||\n file === \"scripts/release-smoke.mjs\" ||\n /^\\.github\\/workflows\\/.*release.*\\.ya?ml$/i.test(file) ||\n /(^|\\/)(pnpm-lock\\.yaml|package-lock\\.json|yarn\\.lock|bun\\.lockb?)$/i.test(file)\n );\n}\n\nfunction isBuildToolingFile(file: string) {\n return (\n /(^|\\/)(tsconfig(?:\\.[^/]*)?\\.json|tsup\\.config\\.ts|vitest\\.config\\.ts|eslint\\.config\\.[cm]?[jt]s|pnpm-workspace\\.yaml)$/i.test(file) ||\n file.startsWith(\"scripts/\")\n );\n}\n\nfunction isGeneratedOrIgnorePolicyFile(file: string) {\n return (\n file === \".gitignore\" ||\n file === \".npmignore\" ||\n file.startsWith(\".handoffkit/\") ||\n file.startsWith(\"docs/checkpoints/\") ||\n /(^|\\/)(dist|coverage|node_modules|\\.tmp-tests)\\//.test(file)\n );\n}\n\nfunction isDocumentationFile(file: string) {\n return file === \"README.md\" || file === \"ROADMAP.md\" || file === \"CONTRIBUTING.md\" || file === \"SECURITY.md\" || file.startsWith(\"docs/\");\n}\n","import { mkdtemp, readFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { relative, join } from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { execa } from \"execa\";\nimport fg from \"fast-glob\";\n\nimport type { SecretFinding, SecretScannerReport, SecretScannerStatus, SecretScanResult } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst MAX_FINDINGS = 20;\nconst ERROR_LIMIT = 2000;\n\nexport async function detectSecretScanners(root = process.cwd()): Promise<SecretScannerReport> {\n const [gitleaks, secretlint] = await Promise.all([scannerStatus(\"gitleaks\", root), scannerStatus(\"secretlint\", root)]);\n return { scanners: [gitleaks, secretlint] };\n}\n\nexport async function runSecretScanners(root: string): Promise<SecretScannerReport> {\n const report = await detectSecretScanners(root);\n const scans = await Promise.all(report.scanners.map((scanner) => runScanner(root, scanner)));\n return { ...report, scans };\n}\n\nexport function formatScannerSummary(report: SecretScannerReport): string {\n const availability = report.scanners.map(formatScannerStatus).join(\"\\n\");\n\n if (!report.scans) {\n return availability;\n }\n\n const scans = report.scans\n .map((scan) => `${scan.name}: ${scan.ran ? `${scan.findings.length} finding(s)` : scan.error ?? \"not run\"}`)\n .join(\"\\n\");\n\n return `${availability}\\n${scans}`;\n}\n\nexport function normalizeGitleaksFindings(rawJson: string, limit = MAX_FINDINGS): SecretFinding[] {\n const parsed = safeJson(rawJson);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n return parsed.slice(0, limit).map((finding) => {\n const ruleId = stringValue(finding.RuleID);\n const file = stringValue(finding.File);\n const line = numberValue(finding.StartLine);\n\n return {\n ...(ruleId ? { ruleId } : {}),\n message: redactText(stringValue(finding.Description) || \"Secret finding\"),\n ...(file ? { file } : {}),\n ...(line ? { line } : {})\n };\n });\n}\n\nexport function normalizeSecretlintFindings(rawJson: string, limit = MAX_FINDINGS, root?: string): SecretFinding[] {\n const parsed = safeJson(rawJson);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n const findings: SecretFinding[] = [];\n\n for (const fileResult of parsed) {\n const messages = Array.isArray(fileResult.messages) ? fileResult.messages : [];\n\n for (const message of messages) {\n if (findings.length >= limit) {\n return findings;\n }\n\n const filePath = stringValue(fileResult.filePath);\n const ruleId = stringValue(message.ruleId);\n const line = numberValue(message.line);\n findings.push({\n ...(ruleId ? { ruleId } : {}),\n message: redactText(stringValue(message.message) || \"Secret finding\"),\n ...(filePath ? { file: root ? relative(root, filePath) || filePath : filePath } : {}),\n ...(line ? { line } : {})\n });\n }\n }\n\n return findings;\n}\n\nasync function scannerStatus(name: \"gitleaks\" | \"secretlint\", root: string): Promise<SecretScannerStatus> {\n const result = await execa(name, [\"--version\"], {\n reject: false\n }).catch(() => undefined);\n const configFiles = await scannerConfigFiles(name, root);\n\n return {\n name,\n available: Boolean(result && result.exitCode === 0),\n ...(result?.stdout ? { version: result.stdout.trim() } : {}),\n configFiles,\n configHint: configHint(name, configFiles),\n installHint: installHint(name)\n };\n}\n\nasync function runScanner(root: string, scanner: SecretScannerStatus): Promise<SecretScanResult> {\n if (!scanner.available) {\n return {\n name: scanner.name,\n available: false,\n ran: false,\n findings: [],\n error: \"Scanner binary not found.\",\n truncated: false\n };\n }\n\n return scanner.name === \"gitleaks\" ? runGitleaks(root) : runSecretlint(root);\n}\n\nasync function runGitleaks(root: string): Promise<SecretScanResult> {\n const started = performance.now();\n const tempDir = await mkdtemp(join(tmpdir(), \"handoffkit-gitleaks-\"));\n const reportPath = join(tempDir, \"report.json\");\n const result = await execa(\n \"gitleaks\",\n [\"dir\", root, \"--no-banner\", \"--no-color\", \"--redact=100\", \"--report-format\", \"json\", \"--report-path\", reportPath, \"--max-target-megabytes\", \"2\"],\n { reject: false, all: true }\n );\n const rawReport = await readFile(reportPath, \"utf8\").catch(() => \"[]\");\n const findings = normalizeGitleaksFindings(rawReport);\n\n return {\n name: \"gitleaks\",\n available: true,\n ran: result.exitCode === 0 || result.exitCode === 1,\n exitCode: result.exitCode ?? 1,\n durationMs: Math.round(performance.now() - started),\n findings,\n ...(result.exitCode && result.exitCode > 1 ? { error: redactText(trimError(result.all ?? result.stderr ?? \"\")) } : {}),\n truncated: countJsonArray(rawReport) > findings.length\n };\n}\n\nasync function runSecretlint(root: string): Promise<SecretScanResult> {\n const started = performance.now();\n const result = await execa(\"secretlint\", [\"**/*\", \"--format\", \"json\", \"--no-color\"], {\n cwd: root,\n reject: false,\n all: true\n });\n const rawOutput = result.stdout || result.all || \"[]\";\n const findings = normalizeSecretlintFindings(rawOutput, MAX_FINDINGS, root);\n\n return {\n name: \"secretlint\",\n available: true,\n ran: result.exitCode === 0 || result.exitCode === 1,\n exitCode: result.exitCode ?? 1,\n durationMs: Math.round(performance.now() - started),\n findings,\n ...(result.exitCode && result.exitCode > 1 ? { error: redactText(trimError(result.all ?? result.stderr ?? \"\")) } : {}),\n truncated: countSecretlintMessages(rawOutput) > findings.length\n };\n}\n\nfunction safeJson(rawJson: string): unknown {\n try {\n return JSON.parse(rawJson || \"[]\");\n } catch {\n return [];\n }\n}\n\nfunction stringValue(value: unknown) {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction countJsonArray(rawJson: string) {\n const parsed = safeJson(rawJson);\n return Array.isArray(parsed) ? parsed.length : 0;\n}\n\nfunction countSecretlintMessages(rawJson: string) {\n const parsed = safeJson(rawJson);\n\n if (!Array.isArray(parsed)) {\n return 0;\n }\n\n return parsed.reduce((count, fileResult) => {\n return count + (Array.isArray(fileResult.messages) ? fileResult.messages.length : 0);\n }, 0);\n}\n\nfunction trimError(output: string) {\n const trimmed = output.trim();\n return trimmed.length > ERROR_LIMIT ? `${trimmed.slice(0, ERROR_LIMIT)}\\n[truncated]` : trimmed;\n}\n\nfunction formatScannerStatus(scanner: SecretScannerStatus) {\n const config = scanner.configFiles.length > 0 ? `; config: ${scanner.configFiles.join(\", \")}` : scanner.available ? \"\" : `; ${scanner.configHint}`;\n const install = scanner.available ? \"\" : `; ${scanner.installHint}`;\n return `${scanner.name}: ${scanner.available ? \"available\" : \"not found\"}${config}${install}`;\n}\n\nasync function scannerConfigFiles(name: \"gitleaks\" | \"secretlint\", root: string) {\n const patterns =\n name === \"gitleaks\"\n ? [\"gitleaks.toml\", \".gitleaks.toml\", \".gitleaksignore\", \".config/gitleaks/*.toml\"]\n : [\".secretlintrc\", \".secretlintrc.*\", \"secretlint.config.*\"];\n\n const matches = await fg(patterns, {\n cwd: root,\n dot: true,\n onlyFiles: true,\n unique: true\n });\n\n return matches.sort();\n}\n\nfunction configHint(name: \"gitleaks\" | \"secretlint\", configFiles: string[]) {\n if (configFiles.length > 0) {\n return `config: ${configFiles.join(\", \")}`;\n }\n\n return name === \"gitleaks\"\n ? \"config: none detected; optional files include .gitleaks.toml, gitleaks.toml, or .config/gitleaks/*.toml\"\n : \"config: none detected; optional files include .secretlintrc.*, .secretlintrc, or secretlint.config.*\";\n}\n\nfunction installHint(name: \"gitleaks\" | \"secretlint\") {\n return name === \"gitleaks\"\n ? \"Install gitleaks from https://github.com/gitleaks/gitleaks, then rerun with --scan-secrets.\"\n : \"Install secretlint from https://github.com/secretlint/secretlint, then rerun with --scan-secrets.\";\n}\n","import { performance } from \"node:perf_hooks\";\n\nimport { execa } from \"execa\";\n\nimport type { PackageInfo, VerificationReport, VerificationResult, VerificationScript } from \"../types.js\";\nimport { detectPackageInfo } from \"./package-json.js\";\n\nconst VERIFY_ORDER = [\"typecheck\", \"lint\", \"test\", \"build\"];\nconst OUTPUT_LIMIT = 4000;\n\nexport function selectVerificationScripts(packageInfo: PackageInfo | undefined): VerificationScript[] {\n if (!packageInfo) {\n return [];\n }\n\n return VERIFY_ORDER.flatMap((name) => packageInfo.verificationScripts.filter((script) => script.name === name));\n}\n\nexport async function runVerification(root: string): Promise<VerificationReport> {\n const packageInfo = await detectPackageInfo(root);\n const scripts = selectVerificationScripts(packageInfo);\n const commands: VerificationResult[] = [];\n\n for (const script of scripts) {\n commands.push(await runScript(root, packageInfo?.packageManager ?? \"npm\", script));\n }\n\n return { commands };\n}\n\nasync function runScript(root: string, packageManager: string, script: VerificationScript): Promise<VerificationResult> {\n const started = performance.now();\n const command = `${packageManager} run ${script.name}`;\n const result = await execa(packageManager, [\"run\", script.name], {\n cwd: root,\n reject: false,\n all: true\n });\n\n return {\n name: script.name,\n command,\n exitCode: result.exitCode ?? 1,\n durationMs: Math.round(performance.now() - started),\n output: trimOutput(result.all ?? result.stdout ?? result.stderr ?? \"\")\n };\n}\n\nfunction trimOutput(output: string) {\n const normalized = output.trim();\n return normalized.length > OUTPUT_LIMIT ? `${normalized.slice(-OUTPUT_LIMIT)}\\n[trimmed]` : normalized;\n}\n","import type { HandoffReport, PackOptions } from \"../types.js\";\nimport { collectGitInfo, findGitRoot } from \"./git.js\";\nimport { detectInstructionFiles } from \"./instructions.js\";\nimport { detectPackageInfo } from \"./package-json.js\";\nimport { analyzeRisk } from \"./risk.js\";\nimport { detectSecretScanners, runSecretScanners } from \"./scanners.js\";\nimport { runVerification } from \"./verify.js\";\n\nexport async function collectHandoffReport(options: PackOptions): Promise<HandoffReport> {\n const root = await findGitRoot(options.cwd);\n const [repository, instructionFiles, packageInfo, secretScanning] = await Promise.all([\n collectGitInfo(root, {\n includeDiff: options.includeDiff && options.includeDiffSummary,\n includeDiffSummary: options.includeDiffSummary,\n ...(options.since ? { since: options.since } : {})\n }),\n detectInstructionFiles(root),\n detectPackageInfo(root),\n options.scanSecrets ? runSecretScanners(root) : detectSecretScanners(root)\n ]);\n\n const report: HandoffReport = {\n goal: options.goal,\n target: options.target,\n repository,\n instructionFiles,\n ...(packageInfo ? { packageInfo } : {}),\n ...(options.resumeSource ? { resumeSource: options.resumeSource } : {}),\n ...(options.includeVerification ? { verification: await runVerification(root) } : {}),\n secretScanning,\n budget: {\n requestedTokens: options.budget,\n estimatedTokens: 0,\n wasTrimmed: false\n }\n };\n\n report.risk = analyzeRisk(report);\n return report;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { applyMarkdownBudget, estimateTokens } from \"../core/budget.js\";\nimport { redactText } from \"../core/redact.js\";\nimport { renderJsonReport } from \"../report/json.js\";\nimport { renderMarkdownReport } from \"../report/markdown.js\";\nimport type { HandoffReport, OutputFormat } from \"../types.js\";\n\nexport async function writeRenderedReport(report: HandoffReport, format: OutputFormat, budget: number, output?: string) {\n const rendered = redactText(renderOutput(report, format, budget));\n\n if (output) {\n const outputPath = resolve(process.cwd(), output);\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, rendered, \"utf8\");\n process.stderr.write(`Wrote handoff packet to ${outputPath}\\n`);\n return;\n }\n\n process.stdout.write(rendered);\n}\n\nfunction renderOutput(report: HandoffReport, format: OutputFormat, budget: number) {\n if (format === \"json\") {\n const rendered = renderJsonReport(report);\n report.budget.estimatedTokens = estimateTokens(rendered);\n return renderJsonReport(report);\n }\n\n const firstRender = renderMarkdownReport(report);\n const budgeted = applyMarkdownBudget(firstRender, budget);\n report.budget.estimatedTokens = budgeted.estimatedTokens;\n report.budget.wasTrimmed = budgeted.wasTrimmed;\n\n if (budgeted.wasTrimmed) {\n return budgeted.text;\n }\n\n return renderMarkdownReport(report);\n}\n","export function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nexport function applyMarkdownBudget(text: string, budget: number) {\n const estimatedTokens = estimateTokens(text);\n\n if (estimatedTokens <= budget) {\n return { text, estimatedTokens, wasTrimmed: false };\n }\n\n const notice = `\\n\\n> Output trimmed to fit --budget ${budget}. Re-run with a larger budget or --output for the full packet.\\n`;\n const charLimit = Math.max(0, budget * 4 - notice.length);\n const trimmed = `${text.slice(0, charLimit).trimEnd()}${notice}`;\n\n return {\n text: trimmed,\n estimatedTokens: estimateTokens(trimmed),\n wasTrimmed: true\n };\n}\n","import type { HandoffReport } from \"../types.js\";\n\nexport function renderJsonReport(report: HandoffReport): string {\n return `${JSON.stringify(report, null, 2)}\\n`;\n}\n","import type { AgentTarget } from \"../types.js\";\n\nexport type ReportSectionKey =\n | \"goal\"\n | \"repository\"\n | \"gitStatus\"\n | \"recentCommits\"\n | \"changedFiles\"\n | \"branchDelta\"\n | \"diffSummary\"\n | \"includedBranchDelta\"\n | \"includedDiff\"\n | \"instructionFiles\"\n | \"package\"\n | \"resume\"\n | \"verification\"\n | \"risk\"\n | \"secretScanning\";\n\nexport interface ReportProfile {\n title: string;\n sectionOrder: ReportSectionKey[];\n nextAgentNotes: string[];\n}\n\nconst genericOrder: ReportSectionKey[] = [\n \"goal\",\n \"repository\",\n \"gitStatus\",\n \"recentCommits\",\n \"changedFiles\",\n \"branchDelta\",\n \"diffSummary\",\n \"includedBranchDelta\",\n \"includedDiff\",\n \"instructionFiles\",\n \"package\",\n \"resume\",\n \"verification\",\n \"risk\",\n \"secretScanning\"\n];\n\nconst profiles: Record<AgentTarget, ReportProfile> = {\n generic: {\n title: \"Handoff Packet\",\n sectionOrder: genericOrder,\n nextAgentNotes: [\n \"Use this packet as the starting context for the next coding session.\",\n \"Verify commands locally before claiming completion.\"\n ]\n },\n codex: {\n title: \"Codex Handoff Packet\",\n sectionOrder: [\n \"goal\",\n \"repository\",\n \"gitStatus\",\n \"changedFiles\",\n \"verification\",\n \"risk\",\n \"branchDelta\",\n \"diffSummary\",\n \"includedBranchDelta\",\n \"includedDiff\",\n \"instructionFiles\",\n \"package\",\n \"resume\",\n \"secretScanning\",\n \"recentCommits\"\n ],\n nextAgentNotes: [\n \"Start by reading the goal, repository status, changed files, and verification state.\",\n \"Use local tools to inspect files before editing; do not assume hidden context.\",\n \"Keep edits scoped and rerun the relevant verification before reporting completion.\"\n ]\n },\n claude: {\n title: \"Claude Code Handoff Packet\",\n sectionOrder: [\n \"goal\",\n \"resume\",\n \"repository\",\n \"verification\",\n \"risk\",\n \"changedFiles\",\n \"gitStatus\",\n \"branchDelta\",\n \"diffSummary\",\n \"includedBranchDelta\",\n \"includedDiff\",\n \"instructionFiles\",\n \"package\",\n \"secretScanning\",\n \"recentCommits\"\n ],\n nextAgentNotes: [\n \"Treat this as concise project memory plus current branch state.\",\n \"Use the resume state to separate completed work from remaining work.\",\n \"Ask for clarification only when the packet leaves a blocking ambiguity.\"\n ]\n },\n cursor: {\n title: \"Cursor Handoff Packet\",\n sectionOrder: [\n \"goal\",\n \"repository\",\n \"changedFiles\",\n \"gitStatus\",\n \"includedDiff\",\n \"diffSummary\",\n \"branchDelta\",\n \"includedBranchDelta\",\n \"instructionFiles\",\n \"package\",\n \"verification\",\n \"risk\",\n \"resume\",\n \"secretScanning\",\n \"recentCommits\"\n ],\n nextAgentNotes: [\n \"Open the changed files first to build editor context.\",\n \"Use instruction files and package scripts to keep edits aligned with the workspace.\",\n \"Prefer small edits and rerun the detected verification scripts.\"\n ]\n }\n};\n\nexport function profileForTarget(target: AgentTarget): ReportProfile {\n return profiles[target] ?? profiles.generic;\n}\n","import type { HandoffReport, PackageInfo, ResumeItem, ResumeState } from \"../types.js\";\nimport { profileForTarget, type ReportSectionKey } from \"./profiles.js\";\n\nexport function renderMarkdownReport(report: HandoffReport): string {\n const profile = profileForTarget(report.target);\n const lines: string[] = [\n `# ${profile.title}`,\n \"\",\n ...profile.sectionOrder.flatMap((section) => renderSection(section, report)),\n \"## Next Agent Notes\",\n ...profile.nextAgentNotes.map((note) => `- ${note}`),\n \"- This packet was generated from local git and filesystem state.\",\n \"- Likely secrets were redacted from generated output.\",\n \"- No LLM APIs were called.\"\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderSection(section: ReportSectionKey, report: HandoffReport) {\n switch (section) {\n case \"goal\":\n return [\"## Goal\", report.goal, \"\"];\n case \"repository\":\n return [\n \"## Repository\",\n `- Repository: \\`${report.repository.name}\\``,\n `- Branch: \\`${report.repository.branch}\\``,\n `- Changed files: ${report.repository.changedFiles.length}`,\n \"\"\n ];\n case \"gitStatus\":\n return [\"## Git Status\", codeBlock(report.repository.status || \"Clean working tree.\"), \"\"];\n case \"recentCommits\":\n return [\"## Recent Commits\", listOrNone(report.repository.recentCommits.map((commit) => `- ${commit}`)), \"\"];\n case \"changedFiles\":\n return [\"## Changed Files\", listOrNone(report.repository.changedFiles.map((file) => `- \\`${file}\\``)), \"\"];\n case \"branchDelta\":\n return renderBaseDiffSummary(report);\n case \"diffSummary\":\n return [\n \"## Diff Summary\",\n \"### Staged\",\n codeBlock(report.repository.stagedDiffSummary || \"No staged diff.\"),\n \"\",\n \"### Unstaged\",\n codeBlock(report.repository.unstagedDiffSummary || \"No unstaged diff.\"),\n \"\"\n ];\n case \"includedBranchDelta\":\n return renderIncludedBranchDelta(report);\n case \"includedDiff\":\n return renderIncludedDiff(report);\n case \"instructionFiles\":\n return [\"## Instruction Files\", renderInstructionFiles(report.instructionFiles), \"\"];\n case \"package\":\n return [\"## Package\", renderPackage(report.packageInfo), \"\"];\n case \"resume\":\n return renderResumeSource(report);\n case \"verification\":\n return renderVerification(report);\n case \"risk\":\n return renderRisk(report);\n case \"secretScanning\":\n return renderSecretScanning(report);\n }\n}\n\nfunction renderBaseDiffSummary(report: HandoffReport) {\n if (!report.repository.baseRef) {\n return [];\n }\n\n return [\n `## Branch Delta Since \\`${report.repository.baseRef}\\``,\n codeBlock(report.repository.baseDiffSummary || \"No committed branch delta detected.\"),\n \"\"\n ];\n}\n\nfunction renderIncludedBranchDelta(report: HandoffReport) {\n if (!report.repository.includeDiff || !report.repository.baseDiff) {\n return [];\n }\n\n return [\n `## Included Branch Delta Since \\`${report.repository.baseRef}\\``,\n codeBlock(report.repository.baseDiff),\n \"\"\n ];\n}\n\nfunction renderIncludedDiff(report: HandoffReport) {\n if (!report.repository.includeDiff || !report.repository.diff) {\n return [];\n }\n\n return [\n \"## Included Diff\",\n \"### Staged Patch\",\n codeBlock(report.repository.diff.staged || \"No staged patch.\"),\n \"\",\n \"### Unstaged Patch\",\n codeBlock(report.repository.diff.unstaged || \"No unstaged patch.\"),\n \"\"\n ];\n}\n\nfunction renderPackage(packageInfo: PackageInfo | undefined) {\n if (!packageInfo) {\n return \"No package.json detected.\";\n }\n\n const lines = [\n packageInfo.name ? `- Package: \\`${packageInfo.name}\\`` : undefined,\n packageInfo.packageManager ? `- Package manager: \\`${packageInfo.packageManager}\\`` : undefined\n ].filter((line): line is string => Boolean(line));\n\n if (packageInfo.verificationScripts.length > 0) {\n const prefix = packageInfo.packageManager ?? \"npm\";\n lines.push(\"- Verification scripts:\");\n lines.push(...packageInfo.verificationScripts.map((script) => ` - \\`${prefix} ${script.name}\\``));\n } else {\n lines.push(\"- Verification scripts: none detected.\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderInstructionFiles(instructionFiles: HandoffReport[\"instructionFiles\"]) {\n if (instructionFiles.length === 0) {\n return \"None detected.\";\n }\n\n return instructionFiles\n .map((file) => [`- \\`${file.path}\\` (${file.kind})`, codeBlock(file.preview || \"No preview available.\")].join(\"\\n\"))\n .join(\"\\n\\n\");\n}\n\nfunction renderResumeSource(report: HandoffReport) {\n if (!report.resumeSource) {\n return [];\n }\n\n return [\n \"## Resume Source\",\n `- Source: \\`${report.resumeSource.path}\\``,\n codeBlock(report.resumeSource.preview),\n \"\",\n ...renderResumeState(report.resumeSource.state)\n ];\n}\n\nfunction renderResumeState(state: ResumeState | undefined) {\n if (!state) {\n return [];\n }\n\n return [\n \"## Resume State\",\n renderResumeItems(\"Completed\", state.completed),\n renderResumeItems(\"Remaining\", state.remaining),\n renderResumeItems(\"Failed Commands\", state.failedCommands),\n renderResumeItems(\"Open Questions\", state.openQuestions),\n renderResumeItems(\"Verification\", state.verification),\n state.nextSafestAction ? `- Next safest action: ${state.nextSafestAction}` : \"- Next safest action: none detected.\",\n \"\"\n ];\n}\n\nfunction renderResumeItems(title: string, items: ResumeItem[]) {\n return [`### ${title}`, listOrNone(items.map((item) => `- ${item.text}`))].join(\"\\n\");\n}\n\nfunction renderVerification(report: HandoffReport) {\n if (!report.verification) {\n return [];\n }\n\n return [\n \"## Verification\",\n report.verification.commands.length > 0\n ? report.verification.commands\n .map((command) =>\n [`- \\`${command.command}\\` exited ${command.exitCode} in ${command.durationMs}ms`, codeBlock(command.output || \"No output.\")]\n .join(\"\\n\")\n )\n .join(\"\\n\\n\")\n : \"No safe verification scripts detected.\",\n \"\"\n ];\n}\n\nfunction renderRisk(report: HandoffReport) {\n if (!report.risk) {\n return [];\n }\n\n return [\n \"## Risk Notes\",\n report.risk.notes.map((note) => `- **${note.severity}**: ${note.title} - ${note.detail}`).join(\"\\n\"),\n \"\"\n ];\n}\n\nfunction renderSecretScanning(report: HandoffReport) {\n if (!report.secretScanning) {\n return [];\n }\n\n return [\n report.secretScanning.scans ? \"## Secret Scan Results\" : \"## Secret Scanner Availability\",\n renderSecretScannerReport(report.secretScanning),\n \"\"\n ];\n}\n\nfunction renderSecretScannerReport(secretScanning: NonNullable<HandoffReport[\"secretScanning\"]>) {\n if (!secretScanning.scans) {\n return secretScanning.scanners.map((scanner) => `- ${scannerStatusLine(scanner)}`).join(\"\\n\");\n }\n\n return secretScanning.scans\n .map((scan) => {\n const status = secretScanning.scanners.find((scanner) => scanner.name === scan.name);\n const lines = [\n `- ${scan.name}: ${scan.ran ? `${scan.findings.length} finding(s), exit ${scan.exitCode}` : scan.error ?? \"not run\"}`\n ];\n\n if (status) {\n lines.push(...scannerGuidanceLines(status));\n }\n\n for (const finding of scan.findings) {\n lines.push(` - ${finding.ruleId ? `${finding.ruleId}: ` : \"\"}${finding.message}${finding.file ? ` (${finding.file}${finding.line ? `:${finding.line}` : \"\"})` : \"\"}`);\n }\n\n if (scan.truncated) {\n lines.push(\" - Additional findings were truncated.\");\n }\n\n return lines.join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nfunction scannerStatusLine(scanner: NonNullable<HandoffReport[\"secretScanning\"]>[\"scanners\"][number]) {\n const config = scanner.configFiles.length > 0 ? `; config: ${scanner.configFiles.join(\", \")}` : scanner.available ? \"\" : `; ${scanner.configHint}`;\n const install = scanner.available ? \"\" : `; ${scanner.installHint}`;\n return `${scanner.name}: ${scanner.available ? \"available\" : \"not found\"}${config}${install}`;\n}\n\nfunction scannerGuidanceLines(scanner: NonNullable<HandoffReport[\"secretScanning\"]>[\"scanners\"][number]) {\n const lines: string[] = [];\n\n if (scanner.configFiles.length > 0) {\n lines.push(` - config: ${scanner.configFiles.join(\", \")}`);\n } else if (!scanner.available) {\n lines.push(` - ${scanner.configHint}`);\n }\n\n if (!scanner.available) {\n lines.push(` - ${scanner.installHint}`);\n }\n\n return lines;\n}\n\nfunction codeBlock(text: string) {\n return [\"```text\", text, \"```\"].join(\"\\n\");\n}\n\nfunction listOrNone(items: string[]) {\n return items.length > 0 ? items.join(\"\\n\") : \"None detected.\";\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { writeCacheArtifact } from \"../../core/cache.js\";\nimport { collectHandoffReport } from \"../../core/collect.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport { createResumeSource } from \"../../core/resume.js\";\nimport { writeRenderedReport } from \"../output.js\";\n\nconst ResumeOptionsSchema = z.object({\n goal: z.string().trim().min(1).default(\"Resume interrupted AI coding session\"),\n output: z.string().optional(),\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\"),\n for: z.enum([\"generic\", \"codex\", \"claude\", \"cursor\"]).default(\"generic\"),\n budget: z.number().int().positive().default(4000),\n cache: z.boolean().default(false)\n});\n\nexport function createResumeCommand() {\n return new Command(\"resume\")\n .description(\"Create a fresh handoff packet using a previous handoff as resume context.\")\n .summary(\"Merge a previous handoff or transcript with fresh repo state.\")\n .argument(\"<path>\", \"previous handoff or transcript file\")\n .option(\"--goal <text>\", \"new handoff goal\", \"Resume interrupted AI coding session\")\n .option(\"--output <path>\", \"write output to a file instead of stdout\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .option(\"--for <agent>\", \"target output: generic, codex, claude, or cursor\", \"generic\")\n .option(\"--budget <tokens>\", \"rough output token budget\", parseBudget, 4000)\n .option(\"--cache\", \"write a local resume artifact under .handoffkit/resume\")\n .action(async (path: string, rawOptions) => {\n const options = ResumeOptionsSchema.parse(rawOptions);\n const source = createResumeSource(path, await readFile(path, \"utf8\"));\n const root = options.cache ? await findGitRoot(process.cwd()) : undefined;\n const report = await collectHandoffReport({\n goal: options.goal,\n cwd: process.cwd(),\n ...(options.output ? { output: options.output } : {}),\n format: options.format,\n target: options.for,\n budget: options.budget,\n includeDiff: false,\n includeDiffSummary: true,\n includeVerification: false,\n scanSecrets: false,\n resumeSource: source\n });\n\n if (options.cache && root) {\n const cache = await writeCacheArtifact(root, \"resume\", {\n goal: report.goal,\n target: report.target,\n source\n });\n process.stderr.write(`Wrote resume cache to ${cache.latestPath}\\n`);\n }\n\n await writeRenderedReport(report, options.format, options.budget, options.output);\n });\n}\n\nfunction parseBudget(value: string) {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\"--budget must be a positive integer.\");\n }\n\n return parsed;\n}\n","import type { ResumeSource, ResumeState } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst RESUME_PREVIEW_LIMIT = 3000;\nconst SECTION_ALIASES = {\n completed: [/^completed$/i, /^completed work$/i, /^done$/i, /^done this session$/i, /^what changed$/i, /^what i changed$/i, /^implemented$/i],\n remaining: [/^remaining$/i, /^remaining work$/i, /^next steps$/i, /^next action$/i, /^next safest action$/i, /^todo$/i, /^to do$/i],\n failedCommands: [/^failed command$/i, /^failed commands$/i, /^command failed$/i, /^commands failed$/i, /^failure$/i, /^failures$/i, /^error$/i, /^errors$/i],\n openQuestions: [\n /^open question$/i,\n /^open questions$/i,\n /^open questions \\/ risks$/i,\n /^open questions and risks$/i,\n /^question$/i,\n /^questions$/i,\n /^blocker$/i,\n /^blockers$/i\n ],\n verification: [/^verification$/i, /^tests$/i, /^tests run$/i, /^validation$/i]\n} as const;\n\ntype ResumeSection = keyof typeof SECTION_ALIASES;\n\nexport function createResumeSource(path: string, content: string): ResumeSource {\n const normalized = content.replace(/\\r\\n/g, \"\\n\").trim();\n const preview =\n normalized.length > RESUME_PREVIEW_LIMIT ? `${normalized.slice(0, RESUME_PREVIEW_LIMIT).trimEnd()}\\n[truncated]` : normalized;\n const state = parseResumeState(normalized);\n\n return {\n path,\n preview: redactText(preview),\n ...(hasResumeState(state) ? { state } : {})\n };\n}\n\nexport function parseResumeState(content: string): ResumeState {\n const state: ResumeState = {\n completed: [],\n remaining: [],\n failedCommands: [],\n openQuestions: [],\n verification: []\n };\n let section: ResumeSection | undefined;\n let heading: string | undefined;\n\n for (const rawLine of content.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")) {\n const line = rawLine.trim();\n const headingMatch = line.match(/^#{1,4}\\s+(.+)$/);\n\n if (headingMatch) {\n const headingText = headingMatch[1];\n if (!headingText) {\n continue;\n }\n\n heading = headingText.trim();\n section = sectionForHeading(heading);\n continue;\n }\n\n const transcriptLine = stripTranscriptPrefix(line);\n const labeled = parseLabeledTranscriptLine(transcriptLine);\n if (labeled) {\n heading = labeled.heading;\n section = labeled.section;\n\n if (labeled.item) {\n appendResumeItem(state, section, labeled.item, heading);\n }\n continue;\n }\n\n if (!section) {\n continue;\n }\n\n const item = normalizeListItem(transcriptLine);\n if (item) {\n appendResumeItem(state, section, item, heading);\n }\n }\n\n const next = state.remaining[0] ?? state.openQuestions[0] ?? state.failedCommands[0];\n if (next) {\n state.nextSafestAction = next.text;\n }\n\n return state;\n}\n\nfunction sectionForHeading(heading: string): ResumeSection | undefined {\n const normalized = normalizeHeading(heading);\n\n for (const [section, patterns] of Object.entries(SECTION_ALIASES)) {\n if (patterns.some((pattern) => pattern.test(normalized))) {\n return section as ResumeSection;\n }\n }\n\n return undefined;\n}\n\nfunction parseLabeledTranscriptLine(line: string): { section: ResumeSection; heading: string; item?: string } | undefined {\n const match = line.match(/^([^:]{1,80}):(?:\\s*(.*))?$/);\n if (!match?.[1]) {\n return undefined;\n }\n\n const heading = match[1].trim();\n const section = sectionForHeading(heading);\n if (!section) {\n return undefined;\n }\n\n const item = match[2]?.trim();\n return {\n section,\n heading,\n ...(item ? { item } : {})\n };\n}\n\nfunction appendResumeItem(state: ResumeState, section: ResumeSection, item: string, heading: string | undefined) {\n state[section].push({ text: redactText(item), ...(heading ? { sourceHeading: redactText(heading) } : {}) });\n}\n\nfunction normalizeListItem(line: string) {\n const match = line.match(/^[-*]\\s+(.+)$/) ?? line.match(/^\\d+\\.\\s+(.+)$/);\n return match?.[1]?.trim();\n}\n\nfunction stripTranscriptPrefix(line: string) {\n let current = line.trim();\n\n for (let i = 0; i < 4; i += 1) {\n const next = current\n .replace(/^\\[[^\\]\\n]{1,60}\\]\\s*/, \"\")\n .replace(/^(?:user|assistant|system|developer|tool|terminal|command|cmd|result|codex|claude|cursor|gemini)(?:\\s*\\([^)]*\\))?\\s*[:>]\\s*/i, \"\")\n .trim();\n\n if (next === current) {\n return current;\n }\n\n current = next;\n }\n\n return current;\n}\n\nfunction normalizeHeading(heading: string) {\n return heading.trim().replace(/:$/, \"\").replace(/\\s*\\/\\s*/g, \" / \").replace(/\\s+/g, \" \");\n}\n\nfunction hasResumeState(state: ResumeState) {\n return (\n state.completed.length > 0 ||\n state.remaining.length > 0 ||\n state.failedCommands.length > 0 ||\n state.openQuestions.length > 0 ||\n state.verification.length > 0\n );\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { collectHandoffReport } from \"../../core/collect.js\";\n\nconst RiskOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\")\n});\n\nexport function createRiskCommand() {\n return new Command(\"risk\")\n .description(\"Show deterministic risk notes for the current handoff.\")\n .summary(\"Show deterministic risk notes from changed files.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .action(async (rawOptions) => {\n const options = RiskOptionsSchema.parse(rawOptions);\n const report = await collectHandoffReport({\n goal: \"Review local risk\",\n cwd: process.cwd(),\n format: options.format,\n target: \"generic\",\n budget: 4000,\n includeDiff: false,\n includeDiffSummary: false,\n includeVerification: false,\n scanSecrets: false\n });\n\n if (options.format === \"json\") {\n process.stdout.write(`${JSON.stringify(report.risk, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`# Risk Notes\\n\\n${report.risk?.notes.map((note) => `- **${note.severity}**: ${note.title} - ${note.detail}`).join(\"\\n\")}\\n`);\n });\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { findGitRoot } from \"../../core/git.js\";\nimport { redactText } from \"../../core/redact.js\";\nimport { runSecretScanners } from \"../../core/scanners.js\";\nimport type { SecretScannerReport, SecretScannerStatus } from \"../../types.js\";\n\nconst ScanSecretsOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\")\n});\n\nexport function createScanSecretsCommand() {\n return new Command(\"scan-secrets\")\n .description(\"Run optional local secret scanners and print bounded redacted results.\")\n .summary(\"Run optional local secret scanners.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .action(async (rawOptions) => {\n const options = ScanSecretsOptionsSchema.parse(rawOptions);\n const root = await findGitRoot(process.cwd());\n const report = await runSecretScanners(root);\n\n if (options.format === \"json\") {\n process.stdout.write(redactText(`${JSON.stringify(report, null, 2)}\\n`));\n return;\n }\n\n process.stdout.write(redactText(renderScanMarkdown(report)));\n });\n}\n\nexport function renderScanMarkdown(report: SecretScannerReport) {\n const lines = [\"# Secret Scan Results\", \"\"];\n\n for (const scan of report.scans ?? []) {\n const status = report.scanners.find((scanner) => scanner.name === scan.name);\n lines.push(`- ${scan.name}: ${scan.ran ? `${scan.findings.length} finding(s), exit ${scan.exitCode}` : scan.error ?? \"not run\"}`);\n\n if (status) {\n lines.push(...scannerGuidanceLines(status));\n }\n\n for (const finding of scan.findings) {\n lines.push(` - ${finding.ruleId ? `${finding.ruleId}: ` : \"\"}${finding.message}${finding.file ? ` (${finding.file}${finding.line ? `:${finding.line}` : \"\"})` : \"\"}`);\n }\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction scannerGuidanceLines(scanner: SecretScannerStatus) {\n const lines: string[] = [];\n\n if (scanner.configFiles.length > 0) {\n lines.push(` - config: ${scanner.configFiles.join(\", \")}`);\n } else if (!scanner.available) {\n lines.push(` - ${scanner.configHint}`);\n }\n\n if (!scanner.available) {\n lines.push(` - ${scanner.installHint}`);\n }\n\n return lines;\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { writeCacheArtifact } from \"../../core/cache.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport { redactText } from \"../../core/redact.js\";\nimport { runVerification } from \"../../core/verify.js\";\nimport type { VerificationResult } from \"../../types.js\";\n\nconst VerifyOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\"),\n cache: z.boolean().default(false)\n});\n\nexport function createVerifyCommand() {\n return new Command(\"verify\")\n .description(\"Run safe local verification scripts.\")\n .summary(\"Run safe detected verification scripts.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .option(\"--cache\", \"write a local verification artifact under .handoffkit/verification\")\n .action(async (rawOptions) => {\n const options = VerifyOptionsSchema.parse(rawOptions);\n const root = await findGitRoot(process.cwd());\n const verification = await runVerification(root);\n\n if (options.cache) {\n const cache = await writeCacheArtifact(root, \"verification\", verification);\n process.stderr.write(`Wrote verification cache to ${cache.latestPath}\\n`);\n }\n\n if (options.format === \"json\") {\n process.stdout.write(redactText(`${JSON.stringify(verification, null, 2)}\\n`));\n return;\n }\n\n process.stdout.write(redactText(renderVerificationMarkdown(verification.commands)));\n });\n}\n\nfunction renderVerificationMarkdown(commands: VerificationResult[]) {\n const lines = [\"# Verification\", \"\"];\n\n if (commands.length === 0) {\n lines.push(\"No safe verification scripts detected.\");\n } else {\n for (const command of commands) {\n lines.push(`- \\`${command.command}\\` exited ${command.exitCode} in ${command.durationMs}ms`);\n }\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n"],"mappings":"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","names":["Command","z","readFile","readFile","readFile","join","readFile","join","execa","fg","execa","join","readFile","fg","performance","execa","performance","execa","mkdir","writeFile","mkdir","writeFile","z","readFile","Command","z","z","Command","parseBudget","readFile","Command","z","z","Command","Command","z","z","Command","scannerGuidanceLines","Command","z","z","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/cache.ts","../src/core/cache.ts","../src/core/redact.ts","../src/core/git.ts","../src/cli/errors.ts","../src/cli/commands/pack.ts","../src/core/instructions.ts","../src/core/package-json.ts","../src/core/risk.ts","../src/core/scanners.ts","../src/core/verify.ts","../src/core/collect.ts","../src/cli/output.ts","../src/core/budget.ts","../src/report/json.ts","../src/report/profiles.ts","../src/report/markdown.ts","../src/cli/commands/resume.ts","../src/core/resume.ts","../src/cli/commands/risk.ts","../src/cli/commands/scan-secrets.ts","../src/cli/commands/verify.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\n\nimport { createCacheCommand } from \"./commands/cache.js\";\nimport { createPackCommand } from \"./commands/pack.js\";\nimport { createResumeCommand } from \"./commands/resume.js\";\nimport { createRiskCommand } from \"./commands/risk.js\";\nimport { createScanSecretsCommand } from \"./commands/scan-secrets.js\";\nimport { createVerifyCommand } from \"./commands/verify.js\";\nimport { formatCliError } from \"./errors.js\";\n\nconst program = new Command()\n .name(\"handoffkit\")\n .description(\"Create safe local handoff packets for AI-assisted coding sessions.\")\n .summary(\"Create local-first AI coding session handoff packets.\")\n .showHelpAfterError(\"(run with --help for usage)\")\n .version(\"0.4.0\");\n\nprogram.addCommand(createPackCommand());\nprogram.addCommand(createVerifyCommand());\nprogram.addCommand(createRiskCommand());\nprogram.addCommand(createScanSecretsCommand());\nprogram.addCommand(createResumeCommand());\nprogram.addCommand(createCacheCommand());\n\ntry {\n await program.parseAsync(process.argv);\n} catch (error) {\n process.stderr.write(`${formatCliError(error)}\\n`);\n process.exitCode = 1;\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { listCacheArtifacts, readCacheArtifact } from \"../../core/cache.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport type { CacheArtifactEnvelope, CacheArtifactKind, CacheArtifactSummary } from \"../../types.js\";\n\nconst CacheFormatOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\")\n});\n\nconst CacheKindSchema = z.enum([\"verification\", \"resume\"]);\n\nexport function createCacheCommand() {\n return new Command(\"cache\")\n .description(\"Inspect local .handoffkit cache artifacts.\")\n .summary(\"List and show explicit local cache artifacts.\")\n .addCommand(createCacheListCommand())\n .addCommand(createCacheShowCommand());\n}\n\nfunction createCacheListCommand() {\n return new Command(\"list\")\n .description(\"List local cache artifacts.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .action(async (rawOptions) => {\n const options = CacheFormatOptionsSchema.parse(rawOptions);\n const root = await findGitRoot(process.cwd());\n const artifacts = await listCacheArtifacts(root);\n\n if (options.format === \"json\") {\n process.stdout.write(`${JSON.stringify({ artifacts }, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(renderCacheListMarkdown(artifacts));\n });\n}\n\nfunction createCacheShowCommand() {\n return new Command(\"show\")\n .description(\"Show one local cache artifact.\")\n .argument(\"<kind>\", \"cache kind: verification or resume\")\n .argument(\"[name]\", \"artifact name, defaults to latest\", \"latest\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .action(async (kindInput: string, name: string, rawOptions) => {\n const options = CacheFormatOptionsSchema.parse(rawOptions);\n const kind = CacheKindSchema.parse(kindInput);\n const root = await findGitRoot(process.cwd());\n const artifact = await readCacheArtifact(root, kind, name);\n\n if (options.format === \"json\") {\n process.stdout.write(`${JSON.stringify(artifact, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(renderCacheArtifactMarkdown(artifact, kind, name));\n });\n}\n\nfunction renderCacheListMarkdown(artifacts: CacheArtifactSummary[]) {\n const lines = [\"# Cache Artifacts\", \"\"];\n\n if (artifacts.length === 0) {\n lines.push(\"No cache artifacts found.\");\n } else {\n for (const artifact of artifacts) {\n lines.push(`- ${artifact.kind}/${artifact.name} (${artifact.createdAt}) - \\`${artifact.path}\\``);\n }\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderCacheArtifactMarkdown(artifact: CacheArtifactEnvelope, kind: CacheArtifactKind, name: string) {\n return [\n \"# Cache Artifact\",\n \"\",\n `- Artifact: ${kind}/${name}`,\n `- Created: ${artifact.createdAt}`,\n \"\",\n \"```json\",\n JSON.stringify(artifact, null, 2),\n \"```\",\n \"\"\n ].join(\"\\n\");\n}\n","import { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\n\nimport type { CacheArtifactEnvelope, CacheArtifactKind, CacheArtifactSummary, ResumeSource } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst CACHE_KINDS: CacheArtifactKind[] = [\"resume\", \"verification\"];\n\ninterface WriteCacheOptions {\n now?: Date;\n}\n\nexport async function writeCacheArtifact<T>(root: string, kind: CacheArtifactKind, data: T, options: WriteCacheOptions = {}) {\n const createdAt = (options.now ?? new Date()).toISOString();\n const envelope: CacheArtifactEnvelope<T> = {\n version: 1,\n kind,\n createdAt,\n data\n };\n const cacheDir = join(root, \".handoffkit\", kind);\n const artifactPath = join(cacheDir, `${cacheTimestamp(createdAt)}.json`);\n const latestPath = join(cacheDir, \"latest.json\");\n const contents = `${redactText(JSON.stringify(envelope, null, 2))}\\n`;\n\n await mkdir(cacheDir, { recursive: true });\n await Promise.all([writeFile(artifactPath, contents, \"utf8\"), writeFile(latestPath, contents, \"utf8\")]);\n\n return { artifactPath, latestPath };\n}\n\nexport async function listCacheArtifacts(root: string): Promise<CacheArtifactSummary[]> {\n const summaries = await Promise.all(CACHE_KINDS.map((kind) => listCacheKind(root, kind)));\n\n return summaries\n .flat()\n .sort((a, b) => b.createdAt.localeCompare(a.createdAt) || a.kind.localeCompare(b.kind) || a.name.localeCompare(b.name));\n}\n\nexport async function readCacheArtifact(root: string, kind: CacheArtifactKind, name = \"latest\"): Promise<CacheArtifactEnvelope> {\n const normalizedName = normalizeArtifactName(name);\n const artifactPath = join(root, \".handoffkit\", kind, `${normalizedName}.json`);\n const envelope = JSON.parse(await readFile(artifactPath, \"utf8\")) as CacheArtifactEnvelope;\n\n if (envelope.version !== 1 || envelope.kind !== kind || typeof envelope.createdAt !== \"string\") {\n throw new Error(`Invalid cache artifact: .handoffkit/${kind}/${normalizedName}.json`);\n }\n\n return envelope;\n}\n\nexport async function readResumeSourceFromCache(root: string, ref: string): Promise<ResumeSource> {\n const { kind, name } = parseCacheRef(ref, \"resume\");\n if (kind !== \"resume\") {\n throw new Error(\"resume --from-cache only supports resume cache artifacts.\");\n }\n\n const artifact = await readCacheArtifact(root, kind, name);\n const source = resumeSourceFromArtifact(artifact);\n if (!source) {\n throw new Error(`Cache artifact does not contain a resume source: .handoffkit/${kind}/${name}.json`);\n }\n\n return source;\n}\n\nexport function parseCacheRef(ref: string, defaultKind?: CacheArtifactKind): { kind: CacheArtifactKind; name: string } {\n const normalized = ref.trim();\n const parts = normalized.split(\"/\");\n\n if (parts.length === 1 && defaultKind) {\n return { kind: defaultKind, name: normalizeArtifactName(parts[0] || \"latest\") };\n }\n\n const [kind, name] = parts;\n if (parts.length === 2 && kind && isCacheArtifactKind(kind)) {\n return { kind, name: normalizeArtifactName(name || \"latest\") };\n }\n\n throw new Error(`Invalid cache ref: ${ref}`);\n}\n\nfunction resumeSourceFromArtifact(artifact: CacheArtifactEnvelope): ResumeSource | undefined {\n const data = artifact.data as { source?: ResumeSource };\n return data.source;\n}\n\nasync function listCacheKind(root: string, kind: CacheArtifactKind): Promise<CacheArtifactSummary[]> {\n const cacheDir = join(root, \".handoffkit\", kind);\n let entries: string[];\n\n try {\n entries = await readdir(cacheDir);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n }\n\n const artifacts = await Promise.all(\n entries\n .filter((entry) => entry.endsWith(\".json\"))\n .map(async (entry): Promise<CacheArtifactSummary | undefined> => {\n const name = basename(entry, \".json\");\n try {\n const artifact = await readCacheArtifact(root, kind, name);\n return {\n kind,\n name,\n createdAt: artifact.createdAt,\n path: `.handoffkit/${kind}/${entry}`\n };\n } catch {\n return undefined;\n }\n })\n );\n\n return artifacts.filter((artifact): artifact is CacheArtifactSummary => Boolean(artifact));\n}\n\nfunction isCacheArtifactKind(value: string): value is CacheArtifactKind {\n return CACHE_KINDS.includes(value as CacheArtifactKind);\n}\n\nfunction normalizeArtifactName(name: string) {\n const withoutExtension = name.replace(/\\.json$/i, \"\");\n\n if (!/^[A-Za-z0-9_.-]+$/.test(withoutExtension)) {\n throw new Error(`Invalid cache artifact name: ${name}`);\n }\n\n return withoutExtension;\n}\n\nfunction cacheTimestamp(timestamp: string) {\n return timestamp.replace(/[:.]/g, \"-\");\n}\n","const REDACTION = \"[REDACTED]\";\n\nconst SECRET_KEY_PATTERN =\n /(\\b(?:[A-Z0-9]+[_.-])*(?:API[_-]?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE[_-]?KEY|CLIENT[_-]?SECRET|ACCESS[_-]?TOKEN|REFRESH[_-]?TOKEN|COOKIE|SESSION|JWT|AUTH_TOKEN)(?:[_.-][A-Z0-9]+)*\\b\\s*(?:=|:)\\s*)([\"']?)([^\\s\"',}]+)/gi;\n\nconst TOKEN_PATTERNS: RegExp[] = [\n /\\bBearer\\s+[A-Za-z0-9._~+/=-]{12,}/gi,\n /\\bsk-[A-Za-z0-9_-]{16,}/g,\n /\\bgh[pousr]_[A-Za-z0-9_]{16,}/g,\n /\\bnpm_[A-Za-z0-9_-]{16,}/g,\n /\\bxox[baprs]-[A-Za-z0-9-]{16,}/g,\n /\\bAIza[0-9A-Za-z_-]{20,}/g,\n /\\bAKIA[0-9A-Z]{16}\\b/g,\n /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/g,\n /\\/\\/([^/\\s:@]+):([^@\\s/]+)@/g\n];\n\nexport function redactText(input: string): string {\n let output = input.replace(\n /-----BEGIN ([A-Z ]*PRIVATE KEY)-----[\\s\\S]*?-----END \\1-----/g,\n (_match, keyType: string) => `-----BEGIN ${keyType}-----\\n${REDACTION}\\n-----END ${keyType}-----`\n );\n\n output = output.replace(SECRET_KEY_PATTERN, (_match, prefix: string, quote: string) => {\n return `${prefix}${quote}${REDACTION}${quote}`;\n });\n\n output = output.replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]{12,}/gi, \"Bearer [REDACTED]\");\n output = output.replace(/\\/\\/([^/\\s:@]+):([^@\\s/]+)@/g, \"//[REDACTED]@\");\n\n for (const pattern of TOKEN_PATTERNS.slice(1, -1)) {\n output = output.replace(pattern, REDACTION);\n }\n\n return output;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { execa } from \"execa\";\n\nimport { HandoffKitCliError } from \"../cli/errors.js\";\nimport type { DiffInfo, RepositoryInfo } from \"../types.js\";\n\nconst UNTRACKED_PATCH_CHAR_LIMIT = 20_000;\nconst IGNORED_CHANGED_PATH_PREFIXES = [\"node_modules/\", \"dist/\", \"coverage/\", \".git/\", \".handoffkit/\"];\n\nexport interface GitCollectOptions {\n includeDiff: boolean;\n includeDiffSummary: boolean;\n since?: string;\n}\n\nexport async function findGitRoot(cwd: string): Promise<string> {\n const result = await execa(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n reject: false\n });\n\n if (result.exitCode !== 0) {\n throw new HandoffKitCliError([\n \"HandoffKit must be run inside a git repository.\",\n \"Run this command from a git checkout, or initialize one with `git init`.\"\n ].join(\"\\n\"));\n }\n\n return result.stdout.trimEnd();\n}\n\nexport async function collectGitInfo(root: string, options: GitCollectOptions): Promise<RepositoryInfo> {\n const [branch, status, porcelainStatus, recentCommits, stagedDiffSummary, trackedUnstagedDiffSummary, baseInfo] =\n await Promise.all([\n currentBranch(root),\n git(root, [\"status\", \"--short\", \"--branch\"]),\n git(root, [\"status\", \"--porcelain=v1\", \"--untracked-files=all\"]),\n recentCommitLines(root, options.since),\n options.includeDiffSummary ? git(root, [\"diff\", \"--cached\", \"--stat\"]) : Promise.resolve(\"\"),\n options.includeDiffSummary ? git(root, [\"diff\", \"--stat\"]) : Promise.resolve(\"\"),\n options.since ? collectBaseInfo(root, options.since, options.includeDiffSummary, options.includeDiff) : Promise.resolve(undefined)\n ]);\n\n const changedFiles = uniqueSorted([...(baseInfo?.changedFiles ?? []), ...parseChangedFiles(porcelainStatus)]);\n const untrackedFiles = parseUntrackedFiles(porcelainStatus);\n const unstagedDiffSummary = options.includeDiffSummary\n ? joinSections([trackedUnstagedDiffSummary, renderUntrackedSummary(untrackedFiles)])\n : \"\";\n const diff = options.includeDiff ? await collectDiff(root, untrackedFiles) : undefined;\n\n return {\n name: basename(root),\n branch,\n ...(options.since ? { baseRef: options.since } : {}),\n status,\n recentCommits,\n changedFiles,\n ...(baseInfo?.summary ? { baseDiffSummary: baseInfo.summary } : {}),\n stagedDiffSummary,\n unstagedDiffSummary,\n includeDiff: options.includeDiff,\n ...(baseInfo?.patch ? { baseDiff: baseInfo.patch } : {}),\n ...(diff ? { diff } : {})\n };\n}\n\nasync function currentBranch(root: string) {\n const branch = await git(root, [\"branch\", \"--show-current\"]);\n\n if (branch) {\n return branch;\n }\n\n const commit = await git(root, [\"rev-parse\", \"--short\", \"HEAD\"], { allowFailure: true });\n return commit ? `detached:${commit}` : \"unknown\";\n}\n\nasync function recentCommitLines(root: string, since?: string) {\n const args = since ? [\"log\", \"--oneline\", \"-n\", \"10\", `${since}..HEAD`] : [\"log\", \"--oneline\", \"-n\", \"10\"];\n const output = await git(root, args, { allowFailure: true });\n return output ? output.split(\"\\n\") : [];\n}\n\nasync function collectBaseInfo(root: string, since: string, includeDiffSummary: boolean, includeDiff: boolean) {\n await ensureRef(root, since);\n const range = `${since}...HEAD`;\n const [changedFiles, summary, patch] = await Promise.all([\n git(root, [\"diff\", \"--name-only\", range], { allowFailure: true }),\n includeDiffSummary ? git(root, [\"diff\", \"--stat\", range], { allowFailure: true }) : Promise.resolve(\"\"),\n includeDiff ? git(root, [\"diff\", \"--patch\", range], { allowFailure: true }) : Promise.resolve(\"\")\n ]);\n\n return {\n changedFiles: changedFiles ? changedFiles.split(\"\\n\").filter(Boolean) : [],\n summary,\n patch\n };\n}\n\nasync function ensureRef(root: string, ref: string) {\n const result = await execa(\"git\", [\"rev-parse\", \"--verify\", `${ref}^{commit}`], {\n cwd: root,\n reject: false\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`Could not resolve --since ref: ${ref}`);\n }\n}\n\nasync function collectDiff(root: string, untrackedFiles: string[]): Promise<DiffInfo> {\n const [staged, unstagedTracked, untracked] = await Promise.all([\n git(root, [\"diff\", \"--cached\", \"--patch\"]),\n git(root, [\"diff\", \"--patch\"]),\n untrackedPatch(root, untrackedFiles)\n ]);\n\n return { staged, unstaged: joinSections([unstagedTracked, untracked]) };\n}\n\nasync function git(root: string, args: string[], options: { allowFailure?: boolean } = {}) {\n const result = await execa(\"git\", args, {\n cwd: root,\n reject: false\n });\n\n if (result.exitCode !== 0 && !options.allowFailure) {\n throw new Error(result.stderr || `git ${args.join(\" \")} failed`);\n }\n\n return result.stdout.trim();\n}\n\nfunction parseChangedFiles(status: string) {\n const files = status\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter(Boolean)\n .map((line) => line.slice(line[2] === \" \" ? 3 : 2).trim())\n .map((path) => (path.includes(\" -> \") ? path.split(\" -> \").at(-1) ?? path : path))\n .map((path) => path.replace(/^\"|\"$/g, \"\"));\n\n return uniqueSorted(files.filter((file) => !isIgnoredChangedPath(file)));\n}\n\nfunction parseUntrackedFiles(status: string) {\n return status\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter((line) => line.startsWith(\"?? \"))\n .map((line) => line.slice(3).trim())\n .map((path) => path.replace(/^\"|\"$/g, \"\"))\n .filter((file) => !isIgnoredChangedPath(file))\n .sort();\n}\n\nfunction renderUntrackedSummary(files: string[]) {\n if (files.length === 0) {\n return \"\";\n }\n\n return files.map((file) => `${file} | untracked`).join(\"\\n\");\n}\n\nasync function untrackedPatch(root: string, files: string[]) {\n const patches = await Promise.all(\n files.map(async (file) => {\n const content = await readFile(`${root}/${file}`, \"utf8\");\n const trimmedContent =\n content.length > UNTRACKED_PATCH_CHAR_LIMIT\n ? `${content.slice(0, UNTRACKED_PATCH_CHAR_LIMIT).trimEnd()}\\n[truncated]`\n : content.trimEnd();\n\n return [`Untracked file: ${file}`, \"```text\", trimmedContent, \"```\"].join(\"\\n\");\n })\n );\n\n return patches.join(\"\\n\\n\");\n}\n\nfunction joinSections(sections: string[]) {\n return sections.filter(Boolean).join(\"\\n\\n\").trim();\n}\n\nfunction uniqueSorted(files: string[]) {\n return [...new Set(files.filter((file) => !isIgnoredChangedPath(file)))].sort();\n}\n\nfunction isIgnoredChangedPath(file: string) {\n return IGNORED_CHANGED_PATH_PREFIXES.some((prefix) => file === prefix.slice(0, -1) || file.startsWith(prefix));\n}\n","export class HandoffKitCliError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"HandoffKitCliError\";\n }\n}\n\nexport function formatCliError(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return message.trim();\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { writeCacheArtifact } from \"../../core/cache.js\";\nimport { collectHandoffReport } from \"../../core/collect.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport { writeRenderedReport } from \"../output.js\";\n\nconst PackCliOptionsSchema = z.object({\n goal: z.string().trim().min(1).default(\"Make your own goal\"),\n output: z.string().optional(),\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\"),\n for: z.enum([\"generic\", \"codex\", \"claude\", \"cursor\"]).default(\"generic\"),\n budget: z.number().int().positive().default(4000),\n includeDiff: z.boolean().default(false),\n diff: z.boolean().default(true),\n since: z.string().trim().min(1).optional(),\n verify: z.boolean().default(false),\n scanSecrets: z.boolean().default(false),\n cache: z.boolean().default(false),\n includeCache: z.boolean().default(false)\n});\n\nexport function createPackCommand() {\n return new Command(\"pack\")\n .description(\"Create a safe local handoff packet for another AI assistant.\")\n .summary(\"Create a Markdown or JSON packet from the current git state.\")\n .option(\"--goal <text>\", \"handoff goal\", \"Make your own goal\")\n .option(\"--output <path>\", \"write output to a file instead of stdout\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .option(\"--for <agent>\", \"target output: generic, codex, claude, or cursor\", \"generic\")\n .option(\"--budget <tokens>\", \"rough output token budget\", parseBudget, 4000)\n .option(\"--since <ref>\", \"focus committed branch delta on a base ref\")\n .option(\"--verify\", \"run safe verification scripts and include results\")\n .option(\"--scan-secrets\", \"run optional local secret scanners and include bounded results\")\n .option(\"--cache\", \"write explicit local cache artifacts under .handoffkit when available\")\n .option(\"--include-cache\", \"include recent .handoffkit artifact summaries\")\n .option(\"--include-diff\", \"include full staged and unstaged patches\", false)\n .option(\"--no-diff\", \"omit diff summaries and full patches\")\n .action(async (rawOptions) => {\n const options = parseOptions(rawOptions);\n const root = options.cache ? await findGitRoot(process.cwd()) : undefined;\n const report = await collectHandoffReport({\n goal: options.goal,\n cwd: process.cwd(),\n ...(options.output ? { output: options.output } : {}),\n format: options.format,\n target: options.for,\n budget: options.budget,\n includeDiff: options.includeDiff,\n includeDiffSummary: options.diff,\n ...(options.since ? { since: options.since } : {}),\n includeVerification: options.verify,\n scanSecrets: options.scanSecrets,\n includeCache: options.includeCache\n });\n\n if (options.cache && root && report.verification) {\n const cache = await writeCacheArtifact(root, \"verification\", {\n goal: report.goal,\n target: report.target,\n verification: report.verification\n });\n process.stderr.write(`Wrote verification cache to ${cache.latestPath}\\n`);\n }\n\n await writeRenderedReport(report, options.format, options.budget, options.output);\n });\n}\n\nfunction parseOptions(rawOptions: unknown) {\n const result = PackCliOptionsSchema.safeParse(rawOptions);\n\n if (!result.success) {\n const message = result.error.issues.map((issue) => issue.message).join(\"\\n\");\n throw new Error(`Invalid pack options:\\n${message}`);\n }\n\n return result.data;\n}\n\nfunction parseBudget(value: string) {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\"--budget must be a positive integer.\");\n }\n\n return parsed;\n}\n","import { readFile, stat } from \"node:fs/promises\";\n\nimport fg from \"fast-glob\";\n\nimport type { InstructionFile } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst INSTRUCTION_PATTERNS = [\n \"**/AGENTS.md\",\n \"**/CLAUDE.md\",\n \"**/GEMINI.md\",\n \".cursor/rules\",\n \".cursor/rules/**/*\",\n \".github/copilot-instructions.md\"\n];\n\nconst PREVIEW_CHAR_LIMIT = 1200;\n\nexport async function detectInstructionFiles(root: string): Promise<InstructionFile[]> {\n const paths = await fg(INSTRUCTION_PATTERNS, {\n cwd: root,\n dot: true,\n onlyFiles: false,\n unique: true,\n ignore: [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/coverage/**\"]\n });\n\n return Promise.all(paths.sort().map((path) => instructionFile(root, path)));\n}\n\nasync function instructionFile(root: string, path: string): Promise<InstructionFile> {\n return {\n path,\n kind: instructionKind(path),\n preview: await readPreview(root, path)\n };\n}\n\nasync function readPreview(root: string, path: string) {\n const fullPath = `${root}/${path}`;\n const metadata = await stat(fullPath);\n\n if (!metadata.isFile()) {\n return \"Directory rule set detected.\";\n }\n\n const content = await readFile(fullPath, \"utf8\");\n const normalized = content.replace(/\\r\\n/g, \"\\n\").trim();\n const preview =\n normalized.length > PREVIEW_CHAR_LIMIT ? `${normalized.slice(0, PREVIEW_CHAR_LIMIT).trimEnd()}\\n[truncated]` : normalized;\n\n return redactText(preview);\n}\n\nfunction instructionKind(path: string): InstructionFile[\"kind\"] {\n if (path.endsWith(\"AGENTS.md\")) {\n return \"agents\";\n }\n\n if (path.endsWith(\"CLAUDE.md\")) {\n return \"claude\";\n }\n\n if (path.endsWith(\"GEMINI.md\")) {\n return \"gemini\";\n }\n\n if (path === \".cursor/rules\" || path.startsWith(\".cursor/rules/\")) {\n return \"cursor\";\n }\n\n if (path === \".github/copilot-instructions.md\") {\n return \"copilot\";\n }\n\n return \"instruction\";\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { PackageInfo, VerificationScript } from \"../types.js\";\n\nconst PackageJsonSchema = z.object({\n name: z.string().optional(),\n packageManager: z.string().optional(),\n scripts: z.record(z.string(), z.string()).optional()\n});\n\nconst VERIFY_SCRIPT_ORDER = [\"build\", \"test\", \"typecheck\", \"lint\", \"check\", \"verify\", \"ci\"];\nconst VERIFY_SCRIPT_PREFIX = /^(build|test|typecheck|lint|check|verify|ci)(:|$)/;\n\nexport async function detectPackageInfo(root: string): Promise<PackageInfo | undefined> {\n const packageJsonPath = join(root, \"package.json\");\n\n if (!(await pathExists(packageJsonPath))) {\n return undefined;\n }\n\n const rawPackageJson = await readFile(packageJsonPath, \"utf8\");\n const packageJson = PackageJsonSchema.parse(JSON.parse(rawPackageJson));\n const packageManager = await detectPackageManager(root, packageJson.packageManager);\n const verificationScripts = detectVerificationScripts(packageJson.scripts ?? {});\n\n return {\n ...(packageJson.name ? { name: packageJson.name } : {}),\n ...(packageManager ? { packageManager } : {}),\n verificationScripts\n };\n}\n\nexport async function detectPackageManager(root: string, packageManagerField?: string) {\n if (packageManagerField) {\n return packageManagerField.split(\"@\")[0] || packageManagerField;\n }\n\n const lockfiles: Array<[string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"]\n ];\n\n for (const [lockfile, manager] of lockfiles) {\n if (await pathExists(join(root, lockfile))) {\n return manager;\n }\n }\n\n return undefined;\n}\n\nexport function detectVerificationScripts(scripts: Record<string, string>): VerificationScript[] {\n return Object.entries(scripts)\n .filter(([name]) => VERIFY_SCRIPT_PREFIX.test(name))\n .sort(([left], [right]) => {\n const leftIndex = orderIndex(left);\n const rightIndex = orderIndex(right);\n\n if (leftIndex !== rightIndex) {\n return leftIndex - rightIndex;\n }\n\n return left.localeCompare(right);\n })\n .map(([name, command]) => ({ name, command }));\n}\n\nasync function pathExists(path: string) {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction orderIndex(name: string) {\n const baseName = name.split(\":\")[0] ?? name;\n const index = VERIFY_SCRIPT_ORDER.indexOf(baseName);\n return index === -1 ? VERIFY_SCRIPT_ORDER.length : index;\n}\n","import type { HandoffReport, RiskReport, RiskNote } from \"../types.js\";\n\ninterface RiskRule {\n severity: RiskNote[\"severity\"];\n title: string;\n detail: string;\n matches: (file: string) => boolean;\n}\n\nconst RISK_RULES: RiskRule[] = [\n {\n severity: \"high\",\n title: \"Security-sensitive code changed\",\n detail: \"Review redaction, auth, token, or secret-handling changes carefully before handoff.\",\n matches: (file) => /(^|\\/)(redact|secret|auth|token|security)/i.test(file)\n },\n {\n severity: \"high\",\n title: \"Release or package publishing path changed\",\n detail: \"Release and package changes can break install, provenance, or publish flow; run pnpm pack:dry-run and pnpm smoke:release before tagging or publishing.\",\n matches: isReleaseOrPackageFile\n },\n {\n severity: \"medium\",\n title: \"CI workflow changed\",\n detail: \"Workflow changes can fail only after push; confirm GitHub Actions still passes on the target branch.\",\n matches: (file) => file.startsWith(\".github/workflows/\")\n },\n {\n severity: \"medium\",\n title: \"Build tooling or TypeScript config changed\",\n detail: \"Tooling changes can break typecheck, lint, build output, or package entrypoints; run the full local check command.\",\n matches: isBuildToolingFile\n },\n {\n severity: \"medium\",\n title: \"CLI behavior changed\",\n detail: \"CLI entrypoint or command changes can break user-facing flags and output contracts; cover the changed command with unit or integration tests.\",\n matches: (file) => file.startsWith(\"src/cli/\")\n },\n {\n severity: \"medium\",\n title: \"Resume parsing changed\",\n detail: \"Resume parser changes can drop handoff context; verify completed work, next steps, failures, and open questions are still extracted.\",\n matches: (file) => file === \"src/core/resume.ts\" || file.includes(\"/resume\")\n },\n {\n severity: \"medium\",\n title: \"Handoff report rendering changed\",\n detail: \"Report rendering changes can hide critical context; verify Markdown and JSON output still include repository, verification, risk, and next-step sections.\",\n matches: (file) => file.startsWith(\"src/report/\")\n },\n {\n severity: \"medium\",\n title: \"Generated artifact or ignore policy changed\",\n detail: \"Ignore/cache policy changes can pollute changedFiles or published packages; verify generated directories remain ignored and excluded from reports.\",\n matches: isGeneratedOrIgnorePolicyFile\n },\n {\n severity: \"low\",\n title: \"Documentation changed\",\n detail: \"Documentation-only changes still need examples, command names, and release instructions checked against the current CLI behavior.\",\n matches: isDocumentationFile\n }\n];\n\nexport function analyzeRisk(report: HandoffReport): RiskReport {\n const files = report.repository.changedFiles;\n const notes: RiskNote[] = [];\n\n for (const rule of RISK_RULES) {\n if (files.some(rule.matches)) {\n notes.push({\n severity: rule.severity,\n title: rule.title,\n detail: rule.detail\n });\n }\n }\n\n const sourceFiles = files.filter((file) => file.startsWith(\"src/\") && file.endsWith(\".ts\"));\n const testFiles = files.filter((file) => file.startsWith(\"tests/\") && file.endsWith(\".test.ts\"));\n\n if (sourceFiles.length > 0 && testFiles.length === 0) {\n notes.push({\n severity: \"medium\",\n title: \"Source changed without matching tests\",\n detail: `Review test coverage for ${sourceFiles.slice(0, 5).join(\", \")}.`\n });\n }\n\n if (notes.length === 0) {\n notes.push({\n severity: \"low\",\n title: \"No obvious local risk signals\",\n detail: \"No deterministic risk rule matched the current changed file set.\"\n });\n }\n\n return { notes };\n}\n\nfunction isReleaseOrPackageFile(file: string) {\n return (\n file === \"package.json\" ||\n file === \"CHANGELOG.md\" ||\n file === \"docs/RELEASE.md\" ||\n file === \"scripts/release-smoke.mjs\" ||\n /^\\.github\\/workflows\\/.*release.*\\.ya?ml$/i.test(file) ||\n /(^|\\/)(pnpm-lock\\.yaml|package-lock\\.json|yarn\\.lock|bun\\.lockb?)$/i.test(file)\n );\n}\n\nfunction isBuildToolingFile(file: string) {\n return (\n /(^|\\/)(tsconfig(?:\\.[^/]*)?\\.json|tsup\\.config\\.ts|vitest\\.config\\.ts|eslint\\.config\\.[cm]?[jt]s|pnpm-workspace\\.yaml)$/i.test(file) ||\n file.startsWith(\"scripts/\")\n );\n}\n\nfunction isGeneratedOrIgnorePolicyFile(file: string) {\n return (\n file === \".gitignore\" ||\n file === \".npmignore\" ||\n file.startsWith(\".handoffkit/\") ||\n file.startsWith(\"docs/checkpoints/\") ||\n /(^|\\/)(dist|coverage|node_modules|\\.tmp-tests)\\//.test(file)\n );\n}\n\nfunction isDocumentationFile(file: string) {\n return file === \"README.md\" || file === \"ROADMAP.md\" || file === \"CONTRIBUTING.md\" || file === \"SECURITY.md\" || file.startsWith(\"docs/\");\n}\n","import { mkdtemp, readFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { relative, join } from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { execa } from \"execa\";\nimport fg from \"fast-glob\";\n\nimport type { SecretFinding, SecretScannerReport, SecretScannerStatus, SecretScanResult } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst MAX_FINDINGS = 20;\nconst ERROR_LIMIT = 2000;\n\nexport async function detectSecretScanners(root = process.cwd()): Promise<SecretScannerReport> {\n const [gitleaks, secretlint] = await Promise.all([scannerStatus(\"gitleaks\", root), scannerStatus(\"secretlint\", root)]);\n return { scanners: [gitleaks, secretlint] };\n}\n\nexport async function runSecretScanners(root: string): Promise<SecretScannerReport> {\n const report = await detectSecretScanners(root);\n const scans = await Promise.all(report.scanners.map((scanner) => runScanner(root, scanner)));\n return { ...report, scans };\n}\n\nexport function formatScannerSummary(report: SecretScannerReport): string {\n const availability = report.scanners.map(formatScannerStatus).join(\"\\n\");\n\n if (!report.scans) {\n return availability;\n }\n\n const scans = report.scans\n .map((scan) => `${scan.name}: ${scan.ran ? `${scan.findings.length} finding(s)` : scan.error ?? \"not run\"}`)\n .join(\"\\n\");\n\n return `${availability}\\n${scans}`;\n}\n\nexport function normalizeGitleaksFindings(rawJson: string, limit = MAX_FINDINGS): SecretFinding[] {\n const parsed = safeJson(rawJson);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n return parsed.slice(0, limit).map((finding) => {\n const ruleId = stringValue(finding.RuleID);\n const file = stringValue(finding.File);\n const line = numberValue(finding.StartLine);\n\n return {\n ...(ruleId ? { ruleId } : {}),\n message: redactText(stringValue(finding.Description) || \"Secret finding\"),\n ...(file ? { file } : {}),\n ...(line ? { line } : {})\n };\n });\n}\n\nexport function normalizeSecretlintFindings(rawJson: string, limit = MAX_FINDINGS, root?: string): SecretFinding[] {\n const parsed = safeJson(rawJson);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n const findings: SecretFinding[] = [];\n\n for (const fileResult of parsed) {\n const messages = Array.isArray(fileResult.messages) ? fileResult.messages : [];\n\n for (const message of messages) {\n if (findings.length >= limit) {\n return findings;\n }\n\n const filePath = stringValue(fileResult.filePath);\n const ruleId = stringValue(message.ruleId);\n const line = numberValue(message.line);\n findings.push({\n ...(ruleId ? { ruleId } : {}),\n message: redactText(stringValue(message.message) || \"Secret finding\"),\n ...(filePath ? { file: root ? relative(root, filePath) || filePath : filePath } : {}),\n ...(line ? { line } : {})\n });\n }\n }\n\n return findings;\n}\n\nasync function scannerStatus(name: \"gitleaks\" | \"secretlint\", root: string): Promise<SecretScannerStatus> {\n const result = await execa(name, [\"--version\"], {\n reject: false\n }).catch(() => undefined);\n const configFiles = await scannerConfigFiles(name, root);\n\n return {\n name,\n available: Boolean(result && result.exitCode === 0),\n ...(result?.stdout ? { version: result.stdout.trim() } : {}),\n configFiles,\n configHint: configHint(name, configFiles),\n installHint: installHint(name)\n };\n}\n\nasync function runScanner(root: string, scanner: SecretScannerStatus): Promise<SecretScanResult> {\n if (!scanner.available) {\n return {\n name: scanner.name,\n available: false,\n ran: false,\n findings: [],\n error: \"Scanner binary not found.\",\n truncated: false\n };\n }\n\n return scanner.name === \"gitleaks\" ? runGitleaks(root) : runSecretlint(root);\n}\n\nasync function runGitleaks(root: string): Promise<SecretScanResult> {\n const started = performance.now();\n const tempDir = await mkdtemp(join(tmpdir(), \"handoffkit-gitleaks-\"));\n const reportPath = join(tempDir, \"report.json\");\n const result = await execa(\n \"gitleaks\",\n [\"dir\", root, \"--no-banner\", \"--no-color\", \"--redact=100\", \"--report-format\", \"json\", \"--report-path\", reportPath, \"--max-target-megabytes\", \"2\"],\n { reject: false, all: true }\n );\n const rawReport = await readFile(reportPath, \"utf8\").catch(() => \"[]\");\n const findings = normalizeGitleaksFindings(rawReport);\n\n return {\n name: \"gitleaks\",\n available: true,\n ran: result.exitCode === 0 || result.exitCode === 1,\n exitCode: result.exitCode ?? 1,\n durationMs: Math.round(performance.now() - started),\n findings,\n ...(result.exitCode && result.exitCode > 1 ? { error: redactText(trimError(result.all ?? result.stderr ?? \"\")) } : {}),\n truncated: countJsonArray(rawReport) > findings.length\n };\n}\n\nasync function runSecretlint(root: string): Promise<SecretScanResult> {\n const started = performance.now();\n const result = await execa(\"secretlint\", [\"**/*\", \"--format\", \"json\", \"--no-color\"], {\n cwd: root,\n reject: false,\n all: true\n });\n const rawOutput = result.stdout || result.all || \"[]\";\n const findings = normalizeSecretlintFindings(rawOutput, MAX_FINDINGS, root);\n\n return {\n name: \"secretlint\",\n available: true,\n ran: result.exitCode === 0 || result.exitCode === 1,\n exitCode: result.exitCode ?? 1,\n durationMs: Math.round(performance.now() - started),\n findings,\n ...(result.exitCode && result.exitCode > 1 ? { error: redactText(trimError(result.all ?? result.stderr ?? \"\")) } : {}),\n truncated: countSecretlintMessages(rawOutput) > findings.length\n };\n}\n\nfunction safeJson(rawJson: string): unknown {\n try {\n return JSON.parse(rawJson || \"[]\");\n } catch {\n return [];\n }\n}\n\nfunction stringValue(value: unknown) {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction countJsonArray(rawJson: string) {\n const parsed = safeJson(rawJson);\n return Array.isArray(parsed) ? parsed.length : 0;\n}\n\nfunction countSecretlintMessages(rawJson: string) {\n const parsed = safeJson(rawJson);\n\n if (!Array.isArray(parsed)) {\n return 0;\n }\n\n return parsed.reduce((count, fileResult) => {\n return count + (Array.isArray(fileResult.messages) ? fileResult.messages.length : 0);\n }, 0);\n}\n\nfunction trimError(output: string) {\n const trimmed = output.trim();\n return trimmed.length > ERROR_LIMIT ? `${trimmed.slice(0, ERROR_LIMIT)}\\n[truncated]` : trimmed;\n}\n\nfunction formatScannerStatus(scanner: SecretScannerStatus) {\n const config = scanner.configFiles.length > 0 ? `; config: ${scanner.configFiles.join(\", \")}` : scanner.available ? \"\" : `; ${scanner.configHint}`;\n const install = scanner.available ? \"\" : `; ${scanner.installHint}`;\n return `${scanner.name}: ${scanner.available ? \"available\" : \"not found\"}${config}${install}`;\n}\n\nasync function scannerConfigFiles(name: \"gitleaks\" | \"secretlint\", root: string) {\n const patterns =\n name === \"gitleaks\"\n ? [\"gitleaks.toml\", \".gitleaks.toml\", \".gitleaksignore\", \".config/gitleaks/*.toml\"]\n : [\".secretlintrc\", \".secretlintrc.*\", \"secretlint.config.*\"];\n\n const matches = await fg(patterns, {\n cwd: root,\n dot: true,\n onlyFiles: true,\n unique: true\n });\n\n return matches.sort();\n}\n\nfunction configHint(name: \"gitleaks\" | \"secretlint\", configFiles: string[]) {\n if (configFiles.length > 0) {\n return `config: ${configFiles.join(\", \")}`;\n }\n\n return name === \"gitleaks\"\n ? \"config: none detected; optional files include .gitleaks.toml, gitleaks.toml, or .config/gitleaks/*.toml\"\n : \"config: none detected; optional files include .secretlintrc.*, .secretlintrc, or secretlint.config.*\";\n}\n\nfunction installHint(name: \"gitleaks\" | \"secretlint\") {\n return name === \"gitleaks\"\n ? \"Install gitleaks from https://github.com/gitleaks/gitleaks, then rerun with --scan-secrets.\"\n : \"Install secretlint from https://github.com/secretlint/secretlint, then rerun with --scan-secrets.\";\n}\n","import { performance } from \"node:perf_hooks\";\n\nimport { execa } from \"execa\";\n\nimport type { PackageInfo, VerificationReport, VerificationResult, VerificationScript } from \"../types.js\";\nimport { detectPackageInfo } from \"./package-json.js\";\n\nconst VERIFY_ORDER = [\"typecheck\", \"lint\", \"test\", \"build\"];\nconst OUTPUT_LIMIT = 4000;\n\nexport function selectVerificationScripts(packageInfo: PackageInfo | undefined): VerificationScript[] {\n if (!packageInfo) {\n return [];\n }\n\n return VERIFY_ORDER.flatMap((name) => packageInfo.verificationScripts.filter((script) => script.name === name));\n}\n\nexport async function runVerification(root: string): Promise<VerificationReport> {\n const packageInfo = await detectPackageInfo(root);\n const scripts = selectVerificationScripts(packageInfo);\n const commands: VerificationResult[] = [];\n\n for (const script of scripts) {\n commands.push(await runScript(root, packageInfo?.packageManager ?? \"npm\", script));\n }\n\n return { commands };\n}\n\nasync function runScript(root: string, packageManager: string, script: VerificationScript): Promise<VerificationResult> {\n const started = performance.now();\n const command = `${packageManager} run ${script.name}`;\n const result = await execa(packageManager, [\"run\", script.name], {\n cwd: root,\n reject: false,\n all: true\n });\n\n return {\n name: script.name,\n command,\n exitCode: result.exitCode ?? 1,\n durationMs: Math.round(performance.now() - started),\n output: trimOutput(result.all ?? result.stdout ?? result.stderr ?? \"\")\n };\n}\n\nfunction trimOutput(output: string) {\n const normalized = output.trim();\n return normalized.length > OUTPUT_LIMIT ? `${normalized.slice(-OUTPUT_LIMIT)}\\n[trimmed]` : normalized;\n}\n","import type { HandoffReport, PackOptions } from \"../types.js\";\nimport { listCacheArtifacts } from \"./cache.js\";\nimport { collectGitInfo, findGitRoot } from \"./git.js\";\nimport { detectInstructionFiles } from \"./instructions.js\";\nimport { detectPackageInfo } from \"./package-json.js\";\nimport { analyzeRisk } from \"./risk.js\";\nimport { detectSecretScanners, runSecretScanners } from \"./scanners.js\";\nimport { runVerification } from \"./verify.js\";\n\nexport async function collectHandoffReport(options: PackOptions): Promise<HandoffReport> {\n const root = await findGitRoot(options.cwd);\n const [repository, instructionFiles, packageInfo, secretScanning] = await Promise.all([\n collectGitInfo(root, {\n includeDiff: options.includeDiff && options.includeDiffSummary,\n includeDiffSummary: options.includeDiffSummary,\n ...(options.since ? { since: options.since } : {})\n }),\n detectInstructionFiles(root),\n detectPackageInfo(root),\n options.scanSecrets ? runSecretScanners(root) : detectSecretScanners(root)\n ]);\n\n const report: HandoffReport = {\n goal: options.goal,\n target: options.target,\n repository,\n instructionFiles,\n ...(packageInfo ? { packageInfo } : {}),\n ...(options.resumeSource ? { resumeSource: options.resumeSource } : {}),\n ...(options.includeVerification ? { verification: await runVerification(root) } : {}),\n ...(options.includeCache ? { cache: { artifacts: await listCacheArtifacts(root) } } : {}),\n secretScanning,\n budget: {\n requestedTokens: options.budget,\n estimatedTokens: 0,\n wasTrimmed: false\n }\n };\n\n report.risk = analyzeRisk(report);\n return report;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { applyMarkdownBudget, estimateTokens } from \"../core/budget.js\";\nimport { redactText } from \"../core/redact.js\";\nimport { renderJsonReport } from \"../report/json.js\";\nimport { renderMarkdownReport } from \"../report/markdown.js\";\nimport type { HandoffReport, OutputFormat } from \"../types.js\";\n\nexport async function writeRenderedReport(report: HandoffReport, format: OutputFormat, budget: number, output?: string) {\n const rendered = redactText(renderOutput(report, format, budget));\n\n if (output) {\n const outputPath = resolve(process.cwd(), output);\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, rendered, \"utf8\");\n process.stderr.write(`Wrote handoff packet to ${outputPath}\\n`);\n return;\n }\n\n process.stdout.write(rendered);\n}\n\nfunction renderOutput(report: HandoffReport, format: OutputFormat, budget: number) {\n if (format === \"json\") {\n const rendered = renderJsonReport(report);\n report.budget.estimatedTokens = estimateTokens(rendered);\n return renderJsonReport(report);\n }\n\n const firstRender = renderMarkdownReport(report);\n const budgeted = applyMarkdownBudget(firstRender, budget);\n report.budget.estimatedTokens = budgeted.estimatedTokens;\n report.budget.wasTrimmed = budgeted.wasTrimmed;\n\n if (budgeted.wasTrimmed) {\n return budgeted.text;\n }\n\n return renderMarkdownReport(report);\n}\n","export function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nexport function applyMarkdownBudget(text: string, budget: number) {\n const estimatedTokens = estimateTokens(text);\n\n if (estimatedTokens <= budget) {\n return { text, estimatedTokens, wasTrimmed: false };\n }\n\n const notice = `\\n\\n> Output trimmed to fit --budget ${budget}. Re-run with a larger budget or --output for the full packet.\\n`;\n const charLimit = Math.max(0, budget * 4 - notice.length);\n const trimmed = `${text.slice(0, charLimit).trimEnd()}${notice}`;\n\n return {\n text: trimmed,\n estimatedTokens: estimateTokens(trimmed),\n wasTrimmed: true\n };\n}\n","import type { HandoffReport } from \"../types.js\";\n\nexport function renderJsonReport(report: HandoffReport): string {\n return `${JSON.stringify(report, null, 2)}\\n`;\n}\n","import type { AgentTarget } from \"../types.js\";\n\nexport type ReportSectionKey =\n | \"goal\"\n | \"repository\"\n | \"gitStatus\"\n | \"recentCommits\"\n | \"changedFiles\"\n | \"branchDelta\"\n | \"diffSummary\"\n | \"includedBranchDelta\"\n | \"includedDiff\"\n | \"instructionFiles\"\n | \"package\"\n | \"resume\"\n | \"verification\"\n | \"cache\"\n | \"risk\"\n | \"secretScanning\";\n\nexport interface ReportProfile {\n title: string;\n sectionOrder: ReportSectionKey[];\n nextAgentNotes: string[];\n}\n\nconst genericOrder: ReportSectionKey[] = [\n \"goal\",\n \"repository\",\n \"gitStatus\",\n \"recentCommits\",\n \"changedFiles\",\n \"branchDelta\",\n \"diffSummary\",\n \"includedBranchDelta\",\n \"includedDiff\",\n \"instructionFiles\",\n \"package\",\n \"resume\",\n \"verification\",\n \"cache\",\n \"risk\",\n \"secretScanning\"\n];\n\nconst profiles: Record<AgentTarget, ReportProfile> = {\n generic: {\n title: \"Handoff Packet\",\n sectionOrder: genericOrder,\n nextAgentNotes: [\n \"Use this packet as the starting context for the next coding session.\",\n \"Verify commands locally before claiming completion.\"\n ]\n },\n codex: {\n title: \"Codex Handoff Packet\",\n sectionOrder: [\n \"goal\",\n \"repository\",\n \"gitStatus\",\n \"changedFiles\",\n \"verification\",\n \"cache\",\n \"risk\",\n \"branchDelta\",\n \"diffSummary\",\n \"includedBranchDelta\",\n \"includedDiff\",\n \"instructionFiles\",\n \"package\",\n \"resume\",\n \"secretScanning\",\n \"recentCommits\"\n ],\n nextAgentNotes: [\n \"Start by reading the goal, repository status, changed files, and verification state.\",\n \"Use local tools to inspect files before editing; do not assume hidden context.\",\n \"Keep edits scoped and rerun the relevant verification before reporting completion.\"\n ]\n },\n claude: {\n title: \"Claude Code Handoff Packet\",\n sectionOrder: [\n \"goal\",\n \"resume\",\n \"repository\",\n \"verification\",\n \"cache\",\n \"risk\",\n \"changedFiles\",\n \"gitStatus\",\n \"branchDelta\",\n \"diffSummary\",\n \"includedBranchDelta\",\n \"includedDiff\",\n \"instructionFiles\",\n \"package\",\n \"secretScanning\",\n \"recentCommits\"\n ],\n nextAgentNotes: [\n \"Treat this as concise project memory plus current branch state.\",\n \"Use the resume state to separate completed work from remaining work.\",\n \"Ask for clarification only when the packet leaves a blocking ambiguity.\"\n ]\n },\n cursor: {\n title: \"Cursor Handoff Packet\",\n sectionOrder: [\n \"goal\",\n \"repository\",\n \"changedFiles\",\n \"gitStatus\",\n \"includedDiff\",\n \"diffSummary\",\n \"branchDelta\",\n \"includedBranchDelta\",\n \"instructionFiles\",\n \"package\",\n \"verification\",\n \"cache\",\n \"risk\",\n \"resume\",\n \"secretScanning\",\n \"recentCommits\"\n ],\n nextAgentNotes: [\n \"Open the changed files first to build editor context.\",\n \"Use instruction files and package scripts to keep edits aligned with the workspace.\",\n \"Prefer small edits and rerun the detected verification scripts.\"\n ]\n }\n};\n\nexport function profileForTarget(target: AgentTarget): ReportProfile {\n return profiles[target] ?? profiles.generic;\n}\n","import type { CacheArtifactSummary, HandoffReport, PackageInfo, ResumeItem, ResumeState } from \"../types.js\";\nimport { profileForTarget, type ReportSectionKey } from \"./profiles.js\";\n\nexport function renderMarkdownReport(report: HandoffReport): string {\n const profile = profileForTarget(report.target);\n const lines: string[] = [\n `# ${profile.title}`,\n \"\",\n ...profile.sectionOrder.flatMap((section) => renderSection(section, report)),\n \"## Next Agent Notes\",\n ...profile.nextAgentNotes.map((note) => `- ${note}`),\n \"- This packet was generated from local git and filesystem state.\",\n \"- Likely secrets were redacted from generated output.\",\n \"- No LLM APIs were called.\"\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderSection(section: ReportSectionKey, report: HandoffReport) {\n switch (section) {\n case \"goal\":\n return [\"## Goal\", report.goal, \"\"];\n case \"repository\":\n return [\n \"## Repository\",\n `- Repository: \\`${report.repository.name}\\``,\n `- Branch: \\`${report.repository.branch}\\``,\n `- Changed files: ${report.repository.changedFiles.length}`,\n \"\"\n ];\n case \"gitStatus\":\n return [\"## Git Status\", codeBlock(report.repository.status || \"Clean working tree.\"), \"\"];\n case \"recentCommits\":\n return [\"## Recent Commits\", listOrNone(report.repository.recentCommits.map((commit) => `- ${commit}`)), \"\"];\n case \"changedFiles\":\n return [\"## Changed Files\", listOrNone(report.repository.changedFiles.map((file) => `- \\`${file}\\``)), \"\"];\n case \"branchDelta\":\n return renderBaseDiffSummary(report);\n case \"diffSummary\":\n return [\n \"## Diff Summary\",\n \"### Staged\",\n codeBlock(report.repository.stagedDiffSummary || \"No staged diff.\"),\n \"\",\n \"### Unstaged\",\n codeBlock(report.repository.unstagedDiffSummary || \"No unstaged diff.\"),\n \"\"\n ];\n case \"includedBranchDelta\":\n return renderIncludedBranchDelta(report);\n case \"includedDiff\":\n return renderIncludedDiff(report);\n case \"instructionFiles\":\n return [\"## Instruction Files\", renderInstructionFiles(report.instructionFiles), \"\"];\n case \"package\":\n return [\"## Package\", renderPackage(report.packageInfo), \"\"];\n case \"resume\":\n return renderResumeSource(report);\n case \"verification\":\n return renderVerification(report);\n case \"cache\":\n return renderCache(report);\n case \"risk\":\n return renderRisk(report);\n case \"secretScanning\":\n return renderSecretScanning(report);\n }\n}\n\nfunction renderBaseDiffSummary(report: HandoffReport) {\n if (!report.repository.baseRef) {\n return [];\n }\n\n return [\n `## Branch Delta Since \\`${report.repository.baseRef}\\``,\n codeBlock(report.repository.baseDiffSummary || \"No committed branch delta detected.\"),\n \"\"\n ];\n}\n\nfunction renderIncludedBranchDelta(report: HandoffReport) {\n if (!report.repository.includeDiff || !report.repository.baseDiff) {\n return [];\n }\n\n return [\n `## Included Branch Delta Since \\`${report.repository.baseRef}\\``,\n codeBlock(report.repository.baseDiff),\n \"\"\n ];\n}\n\nfunction renderIncludedDiff(report: HandoffReport) {\n if (!report.repository.includeDiff || !report.repository.diff) {\n return [];\n }\n\n return [\n \"## Included Diff\",\n \"### Staged Patch\",\n codeBlock(report.repository.diff.staged || \"No staged patch.\"),\n \"\",\n \"### Unstaged Patch\",\n codeBlock(report.repository.diff.unstaged || \"No unstaged patch.\"),\n \"\"\n ];\n}\n\nfunction renderPackage(packageInfo: PackageInfo | undefined) {\n if (!packageInfo) {\n return \"No package.json detected.\";\n }\n\n const lines = [\n packageInfo.name ? `- Package: \\`${packageInfo.name}\\`` : undefined,\n packageInfo.packageManager ? `- Package manager: \\`${packageInfo.packageManager}\\`` : undefined\n ].filter((line): line is string => Boolean(line));\n\n if (packageInfo.verificationScripts.length > 0) {\n const prefix = packageInfo.packageManager ?? \"npm\";\n lines.push(\"- Verification scripts:\");\n lines.push(...packageInfo.verificationScripts.map((script) => ` - \\`${prefix} ${script.name}\\``));\n } else {\n lines.push(\"- Verification scripts: none detected.\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderInstructionFiles(instructionFiles: HandoffReport[\"instructionFiles\"]) {\n if (instructionFiles.length === 0) {\n return \"None detected.\";\n }\n\n return instructionFiles\n .map((file) => [`- \\`${file.path}\\` (${file.kind})`, codeBlock(file.preview || \"No preview available.\")].join(\"\\n\"))\n .join(\"\\n\\n\");\n}\n\nfunction renderResumeSource(report: HandoffReport) {\n if (!report.resumeSource) {\n return [];\n }\n\n return [\n \"## Resume Source\",\n `- Source: \\`${report.resumeSource.path}\\``,\n codeBlock(report.resumeSource.preview),\n \"\",\n ...renderResumeState(report.resumeSource.state)\n ];\n}\n\nfunction renderResumeState(state: ResumeState | undefined) {\n if (!state) {\n return [];\n }\n\n return [\n \"## Resume State\",\n renderResumeItems(\"Completed\", state.completed),\n renderResumeItems(\"Remaining\", state.remaining),\n renderResumeItems(\"Failed Commands\", state.failedCommands),\n renderResumeItems(\"Open Questions\", state.openQuestions),\n renderResumeItems(\"Verification\", state.verification),\n state.nextSafestAction ? `- Next safest action: ${state.nextSafestAction}` : \"- Next safest action: none detected.\",\n \"\"\n ];\n}\n\nfunction renderResumeItems(title: string, items: ResumeItem[]) {\n return [`### ${title}`, listOrNone(items.map((item) => `- ${item.text}`))].join(\"\\n\");\n}\n\nfunction renderVerification(report: HandoffReport) {\n if (!report.verification) {\n return [];\n }\n\n return [\n \"## Verification\",\n report.verification.commands.length > 0\n ? report.verification.commands\n .map((command) =>\n [`- \\`${command.command}\\` exited ${command.exitCode} in ${command.durationMs}ms`, codeBlock(command.output || \"No output.\")]\n .join(\"\\n\")\n )\n .join(\"\\n\\n\")\n : \"No safe verification scripts detected.\",\n \"\"\n ];\n}\n\nfunction renderCache(report: HandoffReport) {\n if (!report.cache) {\n return [];\n }\n\n return [\"## Cache Artifacts\", renderCacheArtifacts(report.cache.artifacts), \"\"];\n}\n\nfunction renderCacheArtifacts(artifacts: CacheArtifactSummary[]) {\n if (artifacts.length === 0) {\n return \"No cache artifacts found.\";\n }\n\n return artifacts.map((artifact) => `- ${artifact.kind}/${artifact.name} (${artifact.createdAt}) - \\`${artifact.path}\\``).join(\"\\n\");\n}\n\nfunction renderRisk(report: HandoffReport) {\n if (!report.risk) {\n return [];\n }\n\n return [\n \"## Risk Notes\",\n report.risk.notes.map((note) => `- **${note.severity}**: ${note.title} - ${note.detail}`).join(\"\\n\"),\n \"\"\n ];\n}\n\nfunction renderSecretScanning(report: HandoffReport) {\n if (!report.secretScanning) {\n return [];\n }\n\n return [\n report.secretScanning.scans ? \"## Secret Scan Results\" : \"## Secret Scanner Availability\",\n renderSecretScannerReport(report.secretScanning),\n \"\"\n ];\n}\n\nfunction renderSecretScannerReport(secretScanning: NonNullable<HandoffReport[\"secretScanning\"]>) {\n if (!secretScanning.scans) {\n return secretScanning.scanners.map((scanner) => `- ${scannerStatusLine(scanner)}`).join(\"\\n\");\n }\n\n return secretScanning.scans\n .map((scan) => {\n const status = secretScanning.scanners.find((scanner) => scanner.name === scan.name);\n const lines = [\n `- ${scan.name}: ${scan.ran ? `${scan.findings.length} finding(s), exit ${scan.exitCode}` : scan.error ?? \"not run\"}`\n ];\n\n if (status) {\n lines.push(...scannerGuidanceLines(status));\n }\n\n for (const finding of scan.findings) {\n lines.push(` - ${finding.ruleId ? `${finding.ruleId}: ` : \"\"}${finding.message}${finding.file ? ` (${finding.file}${finding.line ? `:${finding.line}` : \"\"})` : \"\"}`);\n }\n\n if (scan.truncated) {\n lines.push(\" - Additional findings were truncated.\");\n }\n\n return lines.join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nfunction scannerStatusLine(scanner: NonNullable<HandoffReport[\"secretScanning\"]>[\"scanners\"][number]) {\n const config = scanner.configFiles.length > 0 ? `; config: ${scanner.configFiles.join(\", \")}` : scanner.available ? \"\" : `; ${scanner.configHint}`;\n const install = scanner.available ? \"\" : `; ${scanner.installHint}`;\n return `${scanner.name}: ${scanner.available ? \"available\" : \"not found\"}${config}${install}`;\n}\n\nfunction scannerGuidanceLines(scanner: NonNullable<HandoffReport[\"secretScanning\"]>[\"scanners\"][number]) {\n const lines: string[] = [];\n\n if (scanner.configFiles.length > 0) {\n lines.push(` - config: ${scanner.configFiles.join(\", \")}`);\n } else if (!scanner.available) {\n lines.push(` - ${scanner.configHint}`);\n }\n\n if (!scanner.available) {\n lines.push(` - ${scanner.installHint}`);\n }\n\n return lines;\n}\n\nfunction codeBlock(text: string) {\n return [\"```text\", text, \"```\"].join(\"\\n\");\n}\n\nfunction listOrNone(items: string[]) {\n return items.length > 0 ? items.join(\"\\n\") : \"None detected.\";\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { readResumeSourceFromCache, writeCacheArtifact } from \"../../core/cache.js\";\nimport { collectHandoffReport } from \"../../core/collect.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport { createResumeSource } from \"../../core/resume.js\";\nimport { writeRenderedReport } from \"../output.js\";\n\nconst ResumeOptionsSchema = z.object({\n goal: z.string().trim().min(1).default(\"Resume interrupted AI coding session\"),\n output: z.string().optional(),\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\"),\n for: z.enum([\"generic\", \"codex\", \"claude\", \"cursor\"]).default(\"generic\"),\n budget: z.number().int().positive().default(4000),\n cache: z.boolean().default(false),\n fromCache: z.string().trim().min(1).optional()\n});\n\nexport function createResumeCommand() {\n return new Command(\"resume\")\n .description(\"Create a fresh handoff packet using a previous handoff as resume context.\")\n .summary(\"Merge a previous handoff or transcript with fresh repo state.\")\n .argument(\"[path]\", \"previous handoff or transcript file\")\n .option(\"--goal <text>\", \"new handoff goal\", \"Resume interrupted AI coding session\")\n .option(\"--output <path>\", \"write output to a file instead of stdout\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .option(\"--for <agent>\", \"target output: generic, codex, claude, or cursor\", \"generic\")\n .option(\"--budget <tokens>\", \"rough output token budget\", parseBudget, 4000)\n .option(\"--cache\", \"write a local resume artifact under .handoffkit/resume\")\n .option(\"--from-cache <ref>\", \"load resume source from .handoffkit/resume, for example latest or resume/latest\")\n .action(async (path: string | undefined, rawOptions) => {\n const options = ResumeOptionsSchema.parse(rawOptions);\n const root = options.cache || options.fromCache ? await findGitRoot(process.cwd()) : undefined;\n const source = await resolveResumeSource(path, options.fromCache, root);\n const report = await collectHandoffReport({\n goal: options.goal,\n cwd: process.cwd(),\n ...(options.output ? { output: options.output } : {}),\n format: options.format,\n target: options.for,\n budget: options.budget,\n includeDiff: false,\n includeDiffSummary: true,\n includeVerification: false,\n scanSecrets: false,\n includeCache: false,\n resumeSource: source\n });\n\n if (options.cache && root) {\n const cache = await writeCacheArtifact(root, \"resume\", {\n goal: report.goal,\n target: report.target,\n source\n });\n process.stderr.write(`Wrote resume cache to ${cache.latestPath}\\n`);\n }\n\n await writeRenderedReport(report, options.format, options.budget, options.output);\n });\n}\n\nasync function resolveResumeSource(path: string | undefined, fromCache: string | undefined, root: string | undefined) {\n if (path && fromCache) {\n throw new Error(\"Pass either <path> or --from-cache, not both.\");\n }\n\n if (fromCache) {\n if (!root) {\n throw new Error(\"--from-cache requires a git repository.\");\n }\n\n return readResumeSourceFromCache(root, fromCache);\n }\n\n if (!path) {\n throw new Error(\"resume requires <path> or --from-cache <ref>.\");\n }\n\n return createResumeSource(path, await readFile(path, \"utf8\"));\n}\n\nfunction parseBudget(value: string) {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\"--budget must be a positive integer.\");\n }\n\n return parsed;\n}\n","import type { ResumeSource, ResumeState } from \"../types.js\";\nimport { redactText } from \"./redact.js\";\n\nconst RESUME_PREVIEW_LIMIT = 3000;\nconst SECTION_ALIASES = {\n completed: [/^completed$/i, /^completed work$/i, /^done$/i, /^done this session$/i, /^what changed$/i, /^what i changed$/i, /^implemented$/i],\n remaining: [/^remaining$/i, /^remaining work$/i, /^next steps$/i, /^next action$/i, /^next safest action$/i, /^todo$/i, /^to do$/i],\n failedCommands: [/^failed command$/i, /^failed commands$/i, /^command failed$/i, /^commands failed$/i, /^failure$/i, /^failures$/i, /^error$/i, /^errors$/i],\n openQuestions: [\n /^open question$/i,\n /^open questions$/i,\n /^open questions \\/ risks$/i,\n /^open questions and risks$/i,\n /^question$/i,\n /^questions$/i,\n /^blocker$/i,\n /^blockers$/i\n ],\n verification: [/^verification$/i, /^tests$/i, /^tests run$/i, /^validation$/i]\n} as const;\n\ntype ResumeSection = keyof typeof SECTION_ALIASES;\n\nexport function createResumeSource(path: string, content: string): ResumeSource {\n const normalized = content.replace(/\\r\\n/g, \"\\n\").trim();\n const preview =\n normalized.length > RESUME_PREVIEW_LIMIT ? `${normalized.slice(0, RESUME_PREVIEW_LIMIT).trimEnd()}\\n[truncated]` : normalized;\n const state = parseResumeState(normalized);\n\n return {\n path,\n preview: redactText(preview),\n ...(hasResumeState(state) ? { state } : {})\n };\n}\n\nexport function parseResumeState(content: string): ResumeState {\n const state: ResumeState = {\n completed: [],\n remaining: [],\n failedCommands: [],\n openQuestions: [],\n verification: []\n };\n let section: ResumeSection | undefined;\n let heading: string | undefined;\n\n for (const rawLine of content.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")) {\n const line = rawLine.trim();\n const headingMatch = line.match(/^#{1,4}\\s+(.+)$/);\n\n if (headingMatch) {\n const headingText = headingMatch[1];\n if (!headingText) {\n continue;\n }\n\n heading = headingText.trim();\n section = sectionForHeading(heading);\n continue;\n }\n\n const transcriptLine = stripTranscriptPrefix(line);\n const labeled = parseLabeledTranscriptLine(transcriptLine);\n if (labeled) {\n heading = labeled.heading;\n section = labeled.section;\n\n if (labeled.item) {\n appendResumeItem(state, section, labeled.item, heading);\n }\n continue;\n }\n\n if (!section) {\n continue;\n }\n\n const item = normalizeListItem(transcriptLine);\n if (item) {\n appendResumeItem(state, section, item, heading);\n }\n }\n\n const next = state.remaining[0] ?? state.openQuestions[0] ?? state.failedCommands[0];\n if (next) {\n state.nextSafestAction = next.text;\n }\n\n return state;\n}\n\nfunction sectionForHeading(heading: string): ResumeSection | undefined {\n const normalized = normalizeHeading(heading);\n\n for (const [section, patterns] of Object.entries(SECTION_ALIASES)) {\n if (patterns.some((pattern) => pattern.test(normalized))) {\n return section as ResumeSection;\n }\n }\n\n return undefined;\n}\n\nfunction parseLabeledTranscriptLine(line: string): { section: ResumeSection; heading: string; item?: string } | undefined {\n const match = line.match(/^([^:]{1,80}):(?:\\s*(.*))?$/);\n if (!match?.[1]) {\n return undefined;\n }\n\n const heading = match[1].trim();\n const section = sectionForHeading(heading);\n if (!section) {\n return undefined;\n }\n\n const item = match[2]?.trim();\n return {\n section,\n heading,\n ...(item ? { item } : {})\n };\n}\n\nfunction appendResumeItem(state: ResumeState, section: ResumeSection, item: string, heading: string | undefined) {\n state[section].push({ text: redactText(item), ...(heading ? { sourceHeading: redactText(heading) } : {}) });\n}\n\nfunction normalizeListItem(line: string) {\n const match = line.match(/^[-*]\\s+(.+)$/) ?? line.match(/^\\d+\\.\\s+(.+)$/);\n return match?.[1]?.trim();\n}\n\nfunction stripTranscriptPrefix(line: string) {\n let current = line.trim();\n\n for (let i = 0; i < 4; i += 1) {\n const next = current\n .replace(/^\\[[^\\]\\n]{1,60}\\]\\s*/, \"\")\n .replace(/^(?:user|assistant|system|developer|tool|terminal|command|cmd|result|codex|claude|cursor|gemini)(?:\\s*\\([^)]*\\))?\\s*[:>]\\s*/i, \"\")\n .trim();\n\n if (next === current) {\n return current;\n }\n\n current = next;\n }\n\n return current;\n}\n\nfunction normalizeHeading(heading: string) {\n return heading.trim().replace(/:$/, \"\").replace(/\\s*\\/\\s*/g, \" / \").replace(/\\s+/g, \" \");\n}\n\nfunction hasResumeState(state: ResumeState) {\n return (\n state.completed.length > 0 ||\n state.remaining.length > 0 ||\n state.failedCommands.length > 0 ||\n state.openQuestions.length > 0 ||\n state.verification.length > 0\n );\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { collectHandoffReport } from \"../../core/collect.js\";\n\nconst RiskOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\")\n});\n\nexport function createRiskCommand() {\n return new Command(\"risk\")\n .description(\"Show deterministic risk notes for the current handoff.\")\n .summary(\"Show deterministic risk notes from changed files.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .action(async (rawOptions) => {\n const options = RiskOptionsSchema.parse(rawOptions);\n const report = await collectHandoffReport({\n goal: \"Review local risk\",\n cwd: process.cwd(),\n format: options.format,\n target: \"generic\",\n budget: 4000,\n includeDiff: false,\n includeDiffSummary: false,\n includeVerification: false,\n scanSecrets: false,\n includeCache: false\n });\n\n if (options.format === \"json\") {\n process.stdout.write(`${JSON.stringify(report.risk, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`# Risk Notes\\n\\n${report.risk?.notes.map((note) => `- **${note.severity}**: ${note.title} - ${note.detail}`).join(\"\\n\")}\\n`);\n });\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { findGitRoot } from \"../../core/git.js\";\nimport { redactText } from \"../../core/redact.js\";\nimport { runSecretScanners } from \"../../core/scanners.js\";\nimport type { SecretScannerReport, SecretScannerStatus } from \"../../types.js\";\n\nconst ScanSecretsOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\")\n});\n\nexport function createScanSecretsCommand() {\n return new Command(\"scan-secrets\")\n .description(\"Run optional local secret scanners and print bounded redacted results.\")\n .summary(\"Run optional local secret scanners.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .action(async (rawOptions) => {\n const options = ScanSecretsOptionsSchema.parse(rawOptions);\n const root = await findGitRoot(process.cwd());\n const report = await runSecretScanners(root);\n\n if (options.format === \"json\") {\n process.stdout.write(redactText(`${JSON.stringify(report, null, 2)}\\n`));\n return;\n }\n\n process.stdout.write(redactText(renderScanMarkdown(report)));\n });\n}\n\nexport function renderScanMarkdown(report: SecretScannerReport) {\n const lines = [\"# Secret Scan Results\", \"\"];\n\n for (const scan of report.scans ?? []) {\n const status = report.scanners.find((scanner) => scanner.name === scan.name);\n lines.push(`- ${scan.name}: ${scan.ran ? `${scan.findings.length} finding(s), exit ${scan.exitCode}` : scan.error ?? \"not run\"}`);\n\n if (status) {\n lines.push(...scannerGuidanceLines(status));\n }\n\n for (const finding of scan.findings) {\n lines.push(` - ${finding.ruleId ? `${finding.ruleId}: ` : \"\"}${finding.message}${finding.file ? ` (${finding.file}${finding.line ? `:${finding.line}` : \"\"})` : \"\"}`);\n }\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction scannerGuidanceLines(scanner: SecretScannerStatus) {\n const lines: string[] = [];\n\n if (scanner.configFiles.length > 0) {\n lines.push(` - config: ${scanner.configFiles.join(\", \")}`);\n } else if (!scanner.available) {\n lines.push(` - ${scanner.configHint}`);\n }\n\n if (!scanner.available) {\n lines.push(` - ${scanner.installHint}`);\n }\n\n return lines;\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\n\nimport { writeCacheArtifact } from \"../../core/cache.js\";\nimport { findGitRoot } from \"../../core/git.js\";\nimport { redactText } from \"../../core/redact.js\";\nimport { runVerification } from \"../../core/verify.js\";\nimport type { VerificationResult } from \"../../types.js\";\n\nconst VerifyOptionsSchema = z.object({\n format: z.enum([\"markdown\", \"json\"]).default(\"markdown\"),\n cache: z.boolean().default(false)\n});\n\nexport function createVerifyCommand() {\n return new Command(\"verify\")\n .description(\"Run safe local verification scripts.\")\n .summary(\"Run safe detected verification scripts.\")\n .option(\"--format <format>\", \"output format: markdown or json\", \"markdown\")\n .option(\"--cache\", \"write a local verification artifact under .handoffkit/verification\")\n .action(async (rawOptions) => {\n const options = VerifyOptionsSchema.parse(rawOptions);\n const root = await findGitRoot(process.cwd());\n const verification = await runVerification(root);\n\n if (options.cache) {\n const cache = await writeCacheArtifact(root, \"verification\", verification);\n process.stderr.write(`Wrote verification cache to ${cache.latestPath}\\n`);\n }\n\n if (options.format === \"json\") {\n process.stdout.write(redactText(`${JSON.stringify(verification, null, 2)}\\n`));\n return;\n }\n\n process.stdout.write(redactText(renderVerificationMarkdown(verification.commands)));\n });\n}\n\nfunction renderVerificationMarkdown(commands: VerificationResult[]) {\n const lines = [\"# Verification\", \"\"];\n\n if (commands.length === 0) {\n lines.push(\"No safe verification scripts detected.\");\n } else {\n for (const command of commands) {\n lines.push(`- \\`${command.command}\\` exited ${command.exitCode} in ${command.durationMs}ms`);\n }\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n"],"mappings":"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","names":["Command","readFile","basename","basename","readFile","Command","z","readFile","readFile","readFile","join","z","readFile","join","execa","fg","execa","join","readFile","fg","performance","execa","performance","execa","mkdir","writeFile","mkdir","writeFile","z","Command","readFile","Command","z","z","Command","parseBudget","readFile","Command","z","z","Command","Command","z","z","Command","scannerGuidanceLines","Command","z","z","Command","Command"]}
|
package/docs/CACHE.md
CHANGED
|
@@ -32,3 +32,26 @@ Each artifact is a JSON envelope:
|
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
Artifact contents are redacted with the same best-effort redactor used for CLI output.
|
|
35
|
+
|
|
36
|
+
## Inspect
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
handoffkit cache list
|
|
40
|
+
handoffkit cache list --format json
|
|
41
|
+
handoffkit cache show resume latest
|
|
42
|
+
handoffkit cache show verification latest --format json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`cache list` shows local artifacts with kind, name, creation time, and path.
|
|
46
|
+
`cache show` prints a single cache envelope.
|
|
47
|
+
|
|
48
|
+
## Reuse
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
handoffkit resume --from-cache latest --goal "Continue cached session"
|
|
52
|
+
handoffkit resume --from-cache resume/latest --goal "Continue cached session"
|
|
53
|
+
handoffkit pack --goal "Hand off with cache context" --include-cache
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`resume --from-cache` reads `.handoffkit/resume/<name>.json` and uses the stored `source` as the resume source.
|
|
57
|
+
`pack --include-cache` includes bounded artifact summaries only; it does not embed full cache JSON payloads.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Cache-Backed Handoff Example
|
|
2
|
+
|
|
3
|
+
Use this flow when you want the next agent session to reuse local verification or resume context without manually opening `.handoffkit` JSON files.
|
|
4
|
+
|
|
5
|
+
## Capture
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
handoffkit verify --cache
|
|
9
|
+
handoffkit resume previous-handoff.md --goal "Continue release work" --cache
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Inspect
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
handoffkit cache list
|
|
16
|
+
handoffkit cache show resume latest
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Reuse
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
handoffkit resume --from-cache latest --goal "Continue cached session"
|
|
23
|
+
handoffkit pack --goal "Prepare cache-aware handoff" --include-cache
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The cache remains local and ignored by Git. `pack --include-cache` includes artifact summaries, not full cache payloads.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kingkyylian/handoffkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Clean handoff packets for interrupted AI coding sessions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"SECURITY.md",
|
|
50
50
|
"CONTRIBUTING.md",
|
|
51
51
|
"CODE_OF_CONDUCT.md",
|
|
52
|
+
"examples",
|
|
52
53
|
"docs/CACHE.md",
|
|
53
54
|
"docs/RELEASE.md"
|
|
54
55
|
],
|