skillwiki 0.10.88 → 0.10.89

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.
@@ -7828,6 +7828,7 @@ export {
7828
7828
  DEFAULT_CAPTURE_BUDGET,
7829
7829
  DEFAULT_NO_DECISION_STREAK,
7830
7830
  GateError,
7831
+ measureDirtyVolume,
7831
7832
  evaluateDirtyVolumeGate,
7832
7833
  CAPTURE_HYGIENE_CONTRACT,
7833
7834
  runWritePreflight,
package/dist/cli.js CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  findPlugin,
16
16
  guardProtectedVaultWrite,
17
17
  isFailedRunStatus,
18
+ measureDirtyVolume,
18
19
  memoryAuthorityTiersRank,
19
20
  pruneVectorIndex,
20
21
  readCliPackageJson,
@@ -52,7 +53,7 @@ import {
52
53
  snapshotterHealthChecks,
53
54
  upsertIndexEntry,
54
55
  vectorIndexStatus
55
- } from "./chunk-5QFHISNH.js";
56
+ } from "./chunk-IZ6I7GSG.js";
56
57
  import {
57
58
  normalizeDistTag,
58
59
  readCache,
@@ -9348,57 +9349,79 @@ function githubRecord(p) {
9348
9349
  if (p.ageHours !== void 0) rec.age_hours = p.ageHours;
9349
9350
  return rec;
9350
9351
  }
9352
+ function withDirty(rec, p) {
9353
+ if (p.dirty !== void 0) rec.dirty = p.dirty;
9354
+ if (p.untracked !== void 0) rec.untracked = p.untracked;
9355
+ return rec;
9356
+ }
9351
9357
  function localRecord(p, githubOid) {
9352
9358
  if (p.blockedReason) {
9353
- return {
9354
- state: "blocked",
9355
- oid: p.head,
9356
- behind: p.behind,
9357
- blocked_reason: p.blockedReason,
9358
- detail: p.detail ?? p.blockedReason
9359
- };
9359
+ return withDirty(
9360
+ {
9361
+ state: "blocked",
9362
+ oid: p.head,
9363
+ behind: p.behind,
9364
+ blocked_reason: p.blockedReason,
9365
+ detail: p.detail ?? p.blockedReason
9366
+ },
9367
+ p
9368
+ );
9360
9369
  }
9361
9370
  if (p.head && githubOid && p.head === githubOid && (p.behind === void 0 || p.behind === 0)) {
9362
- return {
9363
- state: "ok",
9364
- oid: p.head,
9365
- behind: p.behind,
9366
- detail: p.detail ?? "HEAD matches GitHub"
9367
- };
9371
+ return withDirty(
9372
+ {
9373
+ state: "ok",
9374
+ oid: p.head,
9375
+ behind: p.behind,
9376
+ detail: p.detail ?? "HEAD matches GitHub"
9377
+ },
9378
+ p
9379
+ );
9368
9380
  }
9369
9381
  if (p.behind !== void 0 && p.behind > 0) {
9370
- return {
9371
- state: "stale",
9372
- oid: p.head,
9373
- behind: p.behind,
9374
- detail: p.detail ?? `behind origin/main by ${p.behind}`
9375
- };
9382
+ return withDirty(
9383
+ {
9384
+ state: "stale",
9385
+ oid: p.head,
9386
+ behind: p.behind,
9387
+ detail: p.detail ?? `behind origin/main by ${p.behind}`
9388
+ },
9389
+ p
9390
+ );
9376
9391
  }
9377
9392
  if (p.head && githubOid && p.head !== githubOid) {
9378
- return {
9379
- state: "stale",
9380
- oid: p.head,
9381
- behind: p.behind,
9382
- detail: p.detail ?? "HEAD differs from GitHub"
9383
- };
9393
+ return withDirty(
9394
+ {
9395
+ state: "stale",
9396
+ oid: p.head,
9397
+ behind: p.behind,
9398
+ detail: p.detail ?? "HEAD differs from GitHub"
9399
+ },
9400
+ p
9401
+ );
9384
9402
  }
9385
9403
  if (p.head) {
9386
- return {
9387
- state: "ok",
9388
- oid: p.head,
9389
- behind: p.behind,
9390
- detail: p.detail ?? "HEAD present"
9391
- };
9404
+ return withDirty(
9405
+ {
9406
+ state: "ok",
9407
+ oid: p.head,
9408
+ behind: p.behind,
9409
+ detail: p.detail ?? "HEAD present"
9410
+ },
9411
+ p
9412
+ );
9392
9413
  }
9393
- return { state: "unknown", detail: p.detail ?? "leaf clone unmeasured" };
9414
+ return withDirty({ state: "unknown", detail: p.detail ?? "leaf clone unmeasured" }, p);
9394
9415
  }
9395
9416
  function formatPlane(name, rec) {
9396
9417
  const parts = [`${name}: ${rec.state}`];
9397
9418
  if (rec.oid) parts.push(`oid=${rec.oid.slice(0, 12)}`);
9398
9419
  if (rec.behind !== void 0) parts.push(`behind=${rec.behind}`);
9399
9420
  if (rec.age_hours !== void 0) parts.push(`age_hours=${rec.age_hours}`);
9421
+ if (rec.dirty !== void 0) parts.push(`dirty=${rec.dirty}`);
9422
+ if (rec.untracked !== void 0) parts.push(`untracked=${rec.untracked}`);
9400
9423
  if (rec.blocked_reason) parts.push(rec.blocked_reason);
9401
- if (rec.detail) parts.push(rec.detail);
9424
+ if (rec.detail && rec.detail !== rec.blocked_reason) parts.push(rec.detail);
9402
9425
  return parts.join(" ");
9403
9426
  }
9404
9427
  function composeCopyStatus(input) {
@@ -9466,11 +9489,17 @@ function defaultCopyStatusDeps(input) {
9466
9489
  const behind = behindRaw === "" ? void 0 : Number.parseInt(behindRaw, 10);
9467
9490
  const review = listReviewRequiredOps(input.vault)[0];
9468
9491
  const blockedReason = review ? `review-required:${review.opId}` : void 0;
9492
+ const dirty = measureDirtyVolume(input.vault);
9493
+ const dirtyCount = dirty.is_git_repo ? dirty.expanded_files : void 0;
9494
+ const untrackedCount = dirty.is_git_repo ? dirty.untracked : void 0;
9495
+ const dirtyHint = dirtyCount && dirtyCount > 0 ? `dirty=${dirtyCount} untracked=${untrackedCount ?? 0} live-ahead of GitHub; do not git add` : void 0;
9469
9496
  return {
9470
9497
  head,
9471
9498
  behind: Number.isFinite(behind) ? behind : void 0,
9472
9499
  blockedReason,
9473
- detail: blockedReason
9500
+ dirty: dirtyCount,
9501
+ untracked: untrackedCount,
9502
+ detail: dirtyHint ?? blockedReason
9474
9503
  };
9475
9504
  }
9476
9505
  };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runSkillwikiMcpStdio
4
- } from "./chunk-5QFHISNH.js";
4
+ } from "./chunk-IZ6I7GSG.js";
5
5
  import "./chunk-7I2TPIV5.js";
6
6
  import "./chunk-ZUHA2EXE.js";
7
7
  import "./chunk-6WE7E6VB.js";
@@ -72,7 +72,17 @@ log() {
72
72
  }
73
73
 
74
74
  handle_existing_handoff() {
75
- local blocker reason op identity previous_identity notified_at now
75
+ local blocker reason op identity previous_identity notified_at now before after
76
+ # Same altitude as managed-write preflight: a review-required whose target_oid
77
+ # is already in HEAD is obsolete. Preserve dirty live-ahead WIP; only real
78
+ # unresolved handoffs (target still ahead / sequencer / unmerged) skip pull.
79
+ before="$(vault_sync_op_find_review_required "$WIKI_DIR" 2>/dev/null || true)"
80
+ if vault_sync_op_supersede_stale_review_required "$WIKI_DIR" "wiki-fetch-notify" 2>/dev/null; then
81
+ after="$(vault_sync_op_find_review_required "$WIKI_DIR" 2>/dev/null || true)"
82
+ if [ -n "$before" ] && [ -z "$after" ]; then
83
+ log "OK superseded stale review-required handoff(s); fetch pull may proceed"
84
+ fi
85
+ fi
76
86
  blocker="$(vault_sync_op_preflight_blocker "$WIKI_DIR" 2>/dev/null || true)"
77
87
  [ -n "$blocker" ] || { rm -f "$HANDOFF_STATE_FILE" "$FETCH_HARD_PAUSE_COUNTER_FILE" 2>/dev/null || true; return 1; }
78
88
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.88",
3
+ "version": "0.10.89",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "skillwiki": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.88",
3
+ "version": "0.10.89",
4
4
  "skills": "./",
5
5
  "description": "Project-aware Karpathy-style knowledge base for Claude Code: 21 prompt-only skills (wiki-*, proj-*, using-skillwiki, skillwiki-mcp) backed by the deterministic `skillwiki` CLI.",
6
6
  "author": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.88",
3
+ "version": "0.10.89",
4
4
  "description": "Project-aware Karpathy-style knowledge base for Codex with 21 prompt-only skills backed by the deterministic skillwiki CLI.",
5
5
  "author": {
6
6
  "name": "karlorz",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.88",
3
+ "version": "0.10.89",
4
4
  "description": "Project-aware Karpathy-style knowledge base: 21 prompt-only skills (wiki-*, proj-*, using-skillwiki, skillwiki-mcp) backed by HTTP MCP wiki_capture.",
5
5
  "author": {
6
6
  "name": "karlorz"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillwiki/skills",
3
- "version": "0.10.88",
3
+ "version": "0.10.89",
4
4
  "private": true,
5
5
  "files": [
6
6
  "wiki-*",