@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 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 Command6 } from "commander";
4
+ import { Command as Command7 } from "commander";
5
5
 
6
- // src/cli/commands/pack.ts
6
+ // src/cli/commands/cache.ts
7
7
  import { Command } from "commander";
8
- import { z as z2 } from "zod";
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: basename(root),
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 readFile(`${root}/${file}`, "utf8");
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 readFile2, stat } from "fs/promises";
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 readFile2(fullPath, "utf8");
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 readFile3 } from "fs/promises";
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 = z.object({
283
- name: z.string().optional(),
284
- packageManager: z.string().optional(),
285
- scripts: z.record(z.string(), z.string()).optional()
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 readFile3(packageJsonPath, "utf8");
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 readFile4 } from "fs/promises";
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 readFile4(reportPath, "utf8").catch(() => "[]");
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 = z2.object({
1098
- goal: z2.string().trim().min(1).default("Make your own goal"),
1099
- output: z2.string().optional(),
1100
- format: z2.enum(["markdown", "json"]).default("markdown"),
1101
- for: z2.enum(["generic", "codex", "claude", "cursor"]).default("generic"),
1102
- budget: z2.number().int().positive().default(4e3),
1103
- includeDiff: z2.boolean().default(false),
1104
- diff: z2.boolean().default(true),
1105
- since: z2.string().trim().min(1).optional(),
1106
- verify: z2.boolean().default(false),
1107
- scanSecrets: z2.boolean().default(false),
1108
- cache: z2.boolean().default(false)
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 Command("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-diff", "include full staged and unstaged patches", false).option("--no-diff", "omit diff summaries and full patches").action(async (rawOptions) => {
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 readFile5 } from "fs/promises";
1158
- import { Command as Command2 } from "commander";
1159
- import { z as z3 } from "zod";
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 = z3.object({
1289
- goal: z3.string().trim().min(1).default("Resume interrupted AI coding session"),
1290
- output: z3.string().optional(),
1291
- format: z3.enum(["markdown", "json"]).default("markdown"),
1292
- for: z3.enum(["generic", "codex", "claude", "cursor"]).default("generic"),
1293
- budget: z3.number().int().positive().default(4e3),
1294
- cache: z3.boolean().default(false)
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 Command2("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").action(async (path, rawOptions) => {
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 source = createResumeSource(path, await readFile5(path, "utf8"));
1300
- const root = options.cache ? await findGitRoot(process.cwd()) : void 0;
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 Command3 } from "commander";
1336
- import { z as z4 } from "zod";
1337
- var RiskOptionsSchema = z4.object({
1338
- format: z4.enum(["markdown", "json"]).default("markdown")
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 Command3("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) => {
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 Command4 } from "commander";
1368
- import { z as z5 } from "zod";
1369
- var ScanSecretsOptionsSchema = z5.object({
1370
- format: z5.enum(["markdown", "json"]).default("markdown")
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 Command4("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) => {
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 Command5 } from "commander";
1415
- import { z as z6 } from "zod";
1416
- var VerifyOptionsSchema = z6.object({
1417
- format: z6.enum(["markdown", "json"]).default("markdown"),
1418
- cache: z6.boolean().default(false)
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 Command5("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) => {
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 Command6().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.3.0");
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.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
  ],