sequant 2.6.1 → 2.7.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.
Files changed (54) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +4 -0
  4. package/dist/bin/cli.js +28 -4
  5. package/dist/marketplace/external_plugins/sequant/.claude-plugin/plugin.json +1 -1
  6. package/dist/marketplace/external_plugins/sequant/skills/assess/SKILL.md +3 -0
  7. package/dist/marketplace/external_plugins/sequant/skills/clean/SKILL.md +3 -0
  8. package/dist/marketplace/external_plugins/sequant/skills/docs/SKILL.md +3 -0
  9. package/dist/marketplace/external_plugins/sequant/skills/exec/SKILL.md +3 -0
  10. package/dist/marketplace/external_plugins/sequant/skills/fullsolve/SKILL.md +3 -0
  11. package/dist/marketplace/external_plugins/sequant/skills/improve/SKILL.md +4 -1
  12. package/dist/marketplace/external_plugins/sequant/skills/loop/SKILL.md +3 -0
  13. package/dist/marketplace/external_plugins/sequant/skills/merger/SKILL.md +3 -0
  14. package/dist/marketplace/external_plugins/sequant/skills/qa/SKILL.md +3 -0
  15. package/dist/marketplace/external_plugins/sequant/skills/reflect/SKILL.md +3 -0
  16. package/dist/marketplace/external_plugins/sequant/skills/security-review/SKILL.md +3 -0
  17. package/dist/marketplace/external_plugins/sequant/skills/setup/SKILL.md +3 -0
  18. package/dist/marketplace/external_plugins/sequant/skills/solve/SKILL.md +3 -0
  19. package/dist/marketplace/external_plugins/sequant/skills/spec/SKILL.md +3 -0
  20. package/dist/marketplace/external_plugins/sequant/skills/test/SKILL.md +3 -0
  21. package/dist/marketplace/external_plugins/sequant/skills/testgen/SKILL.md +3 -0
  22. package/dist/marketplace/external_plugins/sequant/skills/verify/SKILL.md +3 -0
  23. package/dist/src/commands/ready.js +1 -1
  24. package/dist/src/commands/run.js +1 -1
  25. package/dist/src/commands/sync.d.ts +44 -5
  26. package/dist/src/commands/sync.js +244 -18
  27. package/dist/src/commands/update.d.ts +1 -0
  28. package/dist/src/commands/update.js +80 -68
  29. package/dist/src/lib/templates.d.ts +50 -0
  30. package/dist/src/lib/templates.js +134 -15
  31. package/dist/src/ui/tui/App.js +24 -2
  32. package/dist/src/ui/tui/IssueBox.js +4 -4
  33. package/dist/src/ui/tui/load.d.ts +25 -0
  34. package/dist/src/ui/tui/load.js +41 -0
  35. package/dist/src/ui/tui/theme.d.ts +21 -3
  36. package/dist/src/ui/tui/theme.js +22 -4
  37. package/package.json +1 -1
  38. package/templates/skills/assess/SKILL.md +3 -0
  39. package/templates/skills/clean/SKILL.md +3 -0
  40. package/templates/skills/docs/SKILL.md +3 -0
  41. package/templates/skills/exec/SKILL.md +3 -0
  42. package/templates/skills/fullsolve/SKILL.md +3 -0
  43. package/templates/skills/improve/SKILL.md +4 -1
  44. package/templates/skills/loop/SKILL.md +3 -0
  45. package/templates/skills/merger/SKILL.md +3 -0
  46. package/templates/skills/qa/SKILL.md +3 -0
  47. package/templates/skills/reflect/SKILL.md +3 -0
  48. package/templates/skills/security-review/SKILL.md +3 -0
  49. package/templates/skills/setup/SKILL.md +3 -0
  50. package/templates/skills/solve/SKILL.md +3 -0
  51. package/templates/skills/spec/SKILL.md +3 -0
  52. package/templates/skills/test/SKILL.md +3 -0
  53. package/templates/skills/testgen/SKILL.md +3 -0
  54. package/templates/skills/verify/SKILL.md +3 -0
@@ -8,7 +8,7 @@
8
8
  {
9
9
  "name": "sequant",
10
10
  "description": "AI coding agent orchestrator for Claude Code — resolve GitHub issues end-to-end with isolated git worktrees, quality gates, and an MCP server. Includes 17 skills, workflow MCP tools, and pre/post-tool hooks.",
11
- "version": "2.6.1",
11
+ "version": "2.7.0",
12
12
  "author": {
13
13
  "name": "sequant-io",
14
14
  "email": "hello@sequant.io"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sequant",
3
3
  "description": "AI coding agent orchestrator for Claude Code — resolve GitHub issues end-to-end with isolated git worktrees and quality gates, through spec → exec → qa phases.",
4
- "version": "2.6.1",
4
+ "version": "2.7.0",
5
5
  "author": {
6
6
  "name": "sequant-io",
7
7
  "email": "hello@sequant.io"
package/README.md CHANGED
@@ -16,6 +16,10 @@ AI coding agents write code well, but leave you to run the workflow around it
16
16
 
17
17
  See the [CHANGELOG](CHANGELOG.md) for release notes, or the [migration guide](CHANGELOG.md#migration-from-v1x) if upgrading from v1.x.
18
18
 
19
+ ### What's new in 2.7
20
+
21
+ - **Trustworthy `--dry-run` previews for `sync` and `update`** — `sequant sync --dry-run` (`-d`) previews the exact set the apply would write (`new` + `modified` + `local-override`) and mutates nothing. Both `sync --dry-run` and `update --dry-run` now exit non-zero when work is pending, so a CI/automation job can gate on the exit code instead of parsing stdout. (`update` is the interactive command; `sync` is the documented non-interactive/CI surface.)
22
+
19
23
  ### What's new in 2.6
20
24
 
21
25
  - **Boxed Ink TUI is the default for `sequant run`** — on a TTY, `run` now renders the boxed dashboard by default (matching `sequant ready`). Opt out with `--no-tui` (line renderer) or `-s`/`--quiet` (heartbeat-only); non-TTY output auto-degrades.
package/dist/bin/cli.js CHANGED
@@ -44,7 +44,7 @@ import { logsCommand } from "../src/commands/logs.js";
44
44
  import { statsCommand } from "../src/commands/stats.js";
45
45
  import { dashboardCommand } from "../src/commands/dashboard.js";
46
46
  import { stateInitCommand, stateRebuildCommand, stateCleanCommand, } from "../src/commands/state.js";
47
- import { syncCommand, areSkillsOutdated } from "../src/commands/sync.js";
47
+ import { syncCommand, areSkillsOutdated, checkAndWarnSkillsOutdated, } from "../src/commands/sync.js";
48
48
  import { mergeCommand } from "../src/commands/merge.js";
49
49
  import { readyCommand, } from "../src/commands/ready.js";
50
50
  import { conventionsCommand } from "../src/commands/conventions.js";
@@ -128,12 +128,14 @@ program
128
128
  .description("Update templates from the Sequant package")
129
129
  .option("-d, --dry-run", "Show what would be updated without making changes")
130
130
  .option("-f, --force", "Overwrite local modifications")
131
+ .option("-y, --yes", "Apply updates without prompting (for CI/non-interactive shells)")
131
132
  .action(updateCommand);
132
133
  program
133
134
  .command("sync")
134
135
  .description("Sync skills and templates from the Sequant package (non-interactive)")
135
136
  .option("-f, --force", "Sync even if versions match")
136
137
  .option("-q, --quiet", "Suppress output")
138
+ .option("-d, --dry-run", "Show what sync would write without making changes (exits non-zero if work is pending)")
137
139
  .action(syncCommand);
138
140
  program
139
141
  .command("doctor")
@@ -399,14 +401,36 @@ locksCmd
399
401
  // Projects that manage skills manually (no marker) are not affected.
400
402
  program.hook("preAction", async (thisCommand) => {
401
403
  const cmd = thisCommand.name();
402
- if (cmd === "init" || cmd === "sync")
404
+ // `update` is excluded alongside `init`/`sync`: it is itself the command that
405
+ // resolves drift, so the warn-only "run sync/update" pre-flight would be a
406
+ // circular nag right before it does exactly that.
407
+ if (cmd === "init" || cmd === "sync" || cmd === "update")
403
408
  return;
404
409
  const manifest = await getManifest();
405
410
  if (!manifest)
406
411
  return;
407
- const { outdated, currentVersion } = await areSkillsOutdated();
408
- if (outdated && currentVersion !== null) {
412
+ // `cache: true` opts the per-command pre-flight into the stat-only drift
413
+ // fingerprint cache: the full template scan runs only when something that
414
+ // affects drift changed, keeping latency off the hot path (AC-5).
415
+ const status = await areSkillsOutdated({ cache: true });
416
+ const { outdated, currentVersion, contentDrift } = status;
417
+ // No version marker → the project manages skills manually; stay silent and
418
+ // do nothing (unchanged behavior — see the header comment above the hook).
419
+ if (currentVersion === null)
420
+ return;
421
+ if (outdated) {
422
+ // Version-marker mismatch → stale install: auto-sync (copy) as before.
409
423
  await syncCommand({ quiet: true });
424
+ return;
425
+ }
426
+ // Version-current but bundled content drifted in place (#708/#713). AC-3
427
+ // decision: auto-sync (copy) stays gated on version bumps ONLY — we do NOT
428
+ // copy here, because that would clobber in-place customizations (#711).
429
+ // Content-only drift is surfaced as a non-destructive, warn-only signal,
430
+ // leaving the fix to the user (`sequant sync`/`update`). The helper never
431
+ // touches process.exitCode, so the command still exits normally.
432
+ if (contentDrift > 0) {
433
+ await checkAndWarnSkillsOutdated(status);
410
434
  }
411
435
  });
412
436
  // Parse and execute
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sequant",
3
3
  "description": "AI coding agent orchestrator for Claude Code — resolve GitHub issues end-to-end with isolated git worktrees and quality gates, through spec → exec → qa phases.",
4
- "version": "2.6.1",
4
+ "version": "2.7.0",
5
5
  "author": {
6
6
  "name": "sequant-io",
7
7
  "email": "hello@sequant.io"
@@ -13,6 +13,9 @@ allowed-tools:
13
13
  - Bash(gh *)
14
14
  ---
15
15
 
16
+ <!-- sequant:local-override -->
17
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/assess/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/assess` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
18
+
16
19
  # Unified Issue Assessment & Triage
17
20
 
18
21
  You are the "Assessment Agent" for the current repository.
@@ -27,6 +27,9 @@ allowed-tools:
27
27
  - Grep
28
28
  ---
29
29
 
30
+ <!-- sequant:local-override -->
31
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/clean/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/clean` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
32
+
30
33
  # Repository Cleanup Command
31
34
 
32
35
  Comprehensive, safe repository cleanup that archives stale files, removes artifacts, and commits changes.
@@ -18,6 +18,9 @@ allowed-tools:
18
18
  - Bash(gh pr diff:*)
19
19
  ---
20
20
 
21
+ <!-- sequant:local-override -->
22
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/docs/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/docs` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
23
+
21
24
  # Documentation Generator
22
25
 
23
26
  You are the Phase 4 "Documentation Agent" for the current repository.
@@ -43,6 +43,9 @@ allowed-tools:
43
43
  - TodoWrite
44
44
  ---
45
45
 
46
+ <!-- sequant:local-override -->
47
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/exec/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/exec` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
48
+
46
49
  # Implementation Command
47
50
 
48
51
  You are the Phase 2 "Implementation Agent" for the current repository.
@@ -39,6 +39,9 @@ allowed-tools:
39
39
  - Bash(./scripts/list-worktrees.sh:*)
40
40
  ---
41
41
 
42
+ <!-- sequant:local-override -->
43
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/fullsolve/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/fullsolve` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
44
+
42
45
  # Full Solve Command
43
46
 
44
47
  You are the "Full Solve Agent" for the current repository.
@@ -16,6 +16,9 @@ allowed-tools:
16
16
  - AskUserQuestion
17
17
  ---
18
18
 
19
+ <!-- sequant:local-override -->
20
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/improve/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/improve` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
21
+
19
22
  # Improve Command
20
23
 
21
24
  You are the "Improvement Agent" for the current repository.
@@ -665,4 +668,4 @@ Error: Path `src/nonexistent/` not found.
665
668
  - [ ] **Recommendations** - Tips for running quick wins vs larger refactors
666
669
 
667
670
  **DO NOT proceed to issue creation without user selection.**
668
- **DO NOT respond until all items are verified.**
671
+ **DO NOT respond until all items are verified.**
@@ -25,6 +25,9 @@ allowed-tools:
25
25
  - Bash(git status:*)
26
26
  ---
27
27
 
28
+ <!-- sequant:local-override -->
29
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/loop/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/loop` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
30
+
28
31
  # Quality Loop Command
29
32
 
30
33
  You are the "Quality Loop Agent" for the current repository.
@@ -16,6 +16,9 @@ allowed-tools:
16
16
  - Glob
17
17
  ---
18
18
 
19
+ <!-- sequant:local-override -->
20
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/merger/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/merger` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
21
+
19
22
  # Merger Skill
20
23
 
21
24
  You are the "Merger Agent" for handling post-QA integration of completed worktrees.
@@ -24,6 +24,9 @@ allowed-tools:
24
24
  - AgentOutputTool
25
25
  ---
26
26
 
27
+ <!-- sequant:local-override -->
28
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/qa/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/qa` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
29
+
27
30
  # QA & Code Review
28
31
 
29
32
  You are the Phase 3 "QA & Code Review Agent" for the current repository.
@@ -12,6 +12,9 @@ allowed-tools:
12
12
  - Grep
13
13
  ---
14
14
 
15
+ <!-- sequant:local-override -->
16
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/reflect/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/reflect` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
17
+
15
18
  # Reflection Agent
16
19
 
17
20
  You are the "Reflection Agent" for the current repository.
@@ -17,6 +17,9 @@ allowed-tools:
17
17
  - Bash(gh issue comment:*)
18
18
  ---
19
19
 
20
+ <!-- sequant:local-override -->
21
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/security-review/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/security-review` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
22
+
20
23
  # Security Review Command
21
24
 
22
25
  You are the Security Review Agent for the current repository.
@@ -30,6 +30,9 @@ allowed-tools:
30
30
  - Bash(curl:*)
31
31
  ---
32
32
 
33
+ <!-- sequant:local-override -->
34
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/setup/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/setup` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
35
+
33
36
  # Sequant Setup
34
37
 
35
38
  Initialize Sequant workflow system in your current project.
@@ -13,6 +13,9 @@ allowed-tools:
13
13
  - Bash(gh *)
14
14
  ---
15
15
 
16
+ <!-- sequant:local-override -->
17
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/solve/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/solve` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
18
+
16
19
  # /solve — Deprecated Alias for /assess
17
20
 
18
21
  **This command has been merged into `/assess`.** Use `/assess` instead.
@@ -17,6 +17,9 @@ allowed-tools:
17
17
  - AgentOutputTool
18
18
  ---
19
19
 
20
+ <!-- sequant:local-override -->
21
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/spec/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/spec` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
22
+
20
23
  # Planning Agent
21
24
 
22
25
  Phase 1 "Planning Agent." Understands the issue and AC, reviews or synthesizes a plan, identifies gaps and risks, and drafts a GitHub issue comment.
@@ -19,6 +19,9 @@ allowed-tools:
19
19
  - Bash(npx tsx:*)
20
20
  ---
21
21
 
22
+ <!-- sequant:local-override -->
23
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/test/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/test` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
24
+
22
25
  # Browser Testing Command
23
26
 
24
27
  You are the "Testing Agent" for the current repository.
@@ -20,6 +20,9 @@ allowed-tools:
20
20
  - Agent(sequant-testgen)
21
21
  ---
22
22
 
23
+ <!-- sequant:local-override -->
24
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/testgen/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/testgen` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
25
+
23
26
  # Test Generation Command
24
27
 
25
28
  You are the "Test Generation Agent" for the current repository.
@@ -15,6 +15,9 @@ allowed-tools:
15
15
  - Bash(gh issue comment:*)
16
16
  ---
17
17
 
18
+ <!-- sequant:local-override -->
19
+ > **Local overrides (read this first).** Before following any instruction below, check whether `.claude/.local/skills/verify/overrides.md` exists. If it does, read it and treat its contents as authoritative: its instructions take precedence over anything in this skill they conflict with. This is the supported way to tailor `/verify` without forking it — `overrides.md` lives under `.claude/.local/`, which `sequant update` and `sync` never overwrite.
20
+
18
21
  # Execution Verification
19
22
 
20
23
  You are the "Execution Verification Agent" for the current repository.
@@ -130,7 +130,7 @@ export async function readyCommand(issueArg, options) {
130
130
  const branch = listWorktrees().find((w) => w.issue === issueNumber)?.branch ?? "";
131
131
  adapter = new ReadySnapshotAdapter({ issueNumber, title, branch });
132
132
  onProgress = adapter.onProgress;
133
- const { renderTui } = await import("../ui/tui/index.js");
133
+ const { renderTui } = await (await import("../ui/tui/load.js")).loadTui();
134
134
  tuiHandle = renderTui(adapter);
135
135
  }
136
136
  else if (!options.json) {
@@ -92,7 +92,7 @@ export async function runCommand(issues, options) {
92
92
  maxLoopIterations: resolved.config.maxIterations,
93
93
  });
94
94
  if (tuiEnabled) {
95
- const { renderTui } = await import("../ui/tui/index.js");
95
+ const { renderTui } = await (await import("../ui/tui/load.js")).loadTui();
96
96
  let tuiHandle = null;
97
97
  // Unmount the TUI before ShutdownManager writes its shutdown banner so
98
98
  // the two don't race on stdout / leave the terminal in alt-screen buffer.
@@ -7,22 +7,61 @@
7
7
  interface SyncOptions {
8
8
  force?: boolean;
9
9
  quiet?: boolean;
10
+ dryRun?: boolean;
10
11
  }
11
12
  /**
12
13
  * Get the version of skills currently installed
13
14
  */
14
15
  export declare function getSkillsVersion(): Promise<string | null>;
15
16
  /**
16
- * Check if skills are outdated compared to package version
17
+ * Skills status relative to the bundled package, as seen by the pre-flight path.
17
18
  */
18
- export declare function areSkillsOutdated(): Promise<{
19
+ export interface SkillsOutdatedStatus {
20
+ /** Version-marker mismatch (`.sequant-version` ≠ package). Cheap fast-path. */
19
21
  outdated: boolean;
20
22
  currentVersion: string | null;
21
23
  packageVersion: string;
22
- }>;
24
+ /**
25
+ * Count of bundled files that are `new` or `modified` in place at a *matching*
26
+ * version (the #708 blind spot the version marker can't see). Only computed
27
+ * when versions match; `0` otherwise (a mismatch already means stale). Excludes
28
+ * `local-override`/`unchanged` so customized files (e.g. constitution, #711)
29
+ * don't register as drift.
30
+ */
31
+ contentDrift: number;
32
+ }
33
+ /**
34
+ * Check if skills are outdated compared to package version.
35
+ *
36
+ * The version marker is only a cheap hint: a tree at the matching version can
37
+ * still have drifted bundled content in place (the #708 root cause). So when the
38
+ * marker matches we run the same content diff `sync` uses (`computeTemplateChanges`,
39
+ * the single source of truth from #708/#710) and surface a `contentDrift` count.
40
+ * On a version *mismatch* we skip the diff entirely — the install is already stale
41
+ * and the copy path handles it — keeping the per-command pre-flight cheap (AC-5).
42
+ *
43
+ * `options.cache` opts into a stat-only fingerprint cache for the content scan,
44
+ * so the hot pre-flight path (which runs before most commands, including batched
45
+ * `/assess` dashboard calls) pays the full ~15ms scan only when something that
46
+ * affects drift actually changed. Off by default so diagnostic callers (`doctor`)
47
+ * always see fresh truth.
48
+ */
49
+ export declare function areSkillsOutdated(options?: {
50
+ cache?: boolean;
51
+ }): Promise<SkillsOutdatedStatus>;
23
52
  export declare function syncCommand(options?: SyncOptions): Promise<void>;
24
53
  /**
25
- * Check and warn if skills are outdated (for use by other commands)
54
+ * Check and warn if skills are outdated (for use by other commands).
55
+ *
56
+ * Warns on either signal: a version-marker mismatch, or in-place content drift at
57
+ * a matching version (#708/#713). The content-drift path is warn-only by design —
58
+ * it never mutates files and never sets `process.exitCode` (this is a pre-flight,
59
+ * not the command itself), so customized installs (#711) are left intact.
60
+ *
61
+ * Callers that have already computed the status (e.g. the `preAction` hook) can
62
+ * pass it in to avoid a second template scan on the hot path (AC-5).
63
+ *
64
+ * @returns `true` if a warning was emitted, `false` if up to date.
26
65
  */
27
- export declare function checkAndWarnSkillsOutdated(): Promise<boolean>;
66
+ export declare function checkAndWarnSkillsOutdated(status?: SkillsOutdatedStatus): Promise<boolean>;
28
67
  export {};