skillwiki 0.10.62 → 0.10.64

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.
@@ -8,7 +8,7 @@ import {
8
8
  ok,
9
9
  scanSensitiveContent,
10
10
  scanVault
11
- } from "./chunk-MHGUYPGE.js";
11
+ } from "./chunk-HJ4ALQG6.js";
12
12
 
13
13
  // src/utils/atomic-write.ts
14
14
  import { randomBytes } from "crypto";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  atomicWriteText,
4
4
  buildRootIndexUniverse
5
- } from "./chunk-NG72ZD4C.js";
5
+ } from "./chunk-BPJ5KWIT.js";
6
6
  import {
7
7
  authorizeRawOperation,
8
8
  buildSourceReferenceIndex,
@@ -22,12 +22,13 @@ import {
22
22
  resolveExistingRegularFileInsideVault,
23
23
  stripFencedBlocks,
24
24
  writeLogEvent
25
- } from "./chunk-6AMXNODT.js";
25
+ } from "./chunk-OMO45AHI.js";
26
26
  import {
27
27
  ExitCode,
28
28
  FleetManifestSchema,
29
29
  err,
30
30
  extractFrontmatter,
31
+ filterGitIgnoredRelativePaths,
31
32
  getErrorMessage,
32
33
  isVaultSyncKey,
33
34
  mapWithConcurrency,
@@ -40,7 +41,7 @@ import {
40
41
  scanVault,
41
42
  splitFrontmatter,
42
43
  vaultIoConcurrency
43
- } from "./chunk-MHGUYPGE.js";
44
+ } from "./chunk-HJ4ALQG6.js";
44
45
 
45
46
  // src/utils/managed-write-preflight.ts
46
47
  import { existsSync as existsSync11 } from "fs";
@@ -874,20 +875,26 @@ function outputForOnlyBucket(input, match, fixed, unresolved, readVault = lintRe
874
875
  result: ok(input.summary ? summarizeLintOutput(output, input.examplesLimit) : output)
875
876
  };
876
877
  }
877
- async function walkMarkdownFiles(absDir, vaultRoot) {
878
+ async function walkMarkdownFilesInternal(absDir, vaultRoot) {
878
879
  const entries = await readdir(absDir, { withFileTypes: true });
879
880
  const pages = [];
880
881
  for (const entry of entries) {
881
882
  const absPath = join3(absDir, entry.name);
882
883
  if (entry.isDirectory()) {
883
884
  if (entry.name === ".git" || entry.name === "node_modules") continue;
884
- pages.push(...await walkMarkdownFiles(absPath, vaultRoot));
885
+ pages.push(...await walkMarkdownFilesInternal(absPath, vaultRoot));
885
886
  } else if (entry.isFile() && entry.name.endsWith(".md")) {
886
887
  pages.push({ absPath, relPath: relative(vaultRoot, absPath).split(sep).join("/") });
887
888
  }
888
889
  }
889
890
  return pages;
890
891
  }
892
+ async function walkMarkdownFiles(absDir, vaultRoot) {
893
+ const rawPages = await walkMarkdownFilesInternal(absDir, vaultRoot);
894
+ const ignored = filterGitIgnoredRelativePaths(vaultRoot, rawPages.map((p) => p.relPath));
895
+ if (ignored.size === 0) return rawPages;
896
+ return rawPages.filter((p) => !ignored.has(p.relPath));
897
+ }
891
898
 
892
899
  // src/lint/fingerprints.ts
893
900
  function lintIssueFingerprint(bucket, item) {
@@ -176,6 +176,16 @@ var RawSourceSchema = z.object({
176
176
  ctx.addIssue({ code: z.ZodIssueCode.custom, message: "project and kind are required when work_item is set" });
177
177
  }
178
178
  });
179
+ var PostReleaseVerificationSchema = z.object({
180
+ posture: z.literal("opt-in"),
181
+ triggers: z.array(z.enum([
182
+ "matching-regression-report",
183
+ "explicit-user-request",
184
+ "relevant-code-or-release-change"
185
+ ])).min(1),
186
+ last_proven: isoDate.optional(),
187
+ evidence: z.array(z.string().min(1)).optional()
188
+ }).strict();
179
189
  var WorkItemSchema = z.object({
180
190
  title: z.string().min(1),
181
191
  aliases: z.array(z.string()).optional(),
@@ -190,11 +200,19 @@ var WorkItemSchema = z.object({
190
200
  owner: wikilink.optional(),
191
201
  parent: wikilink.optional(),
192
202
  related: z.array(wikilink).optional(),
193
- sources: z.array(z.string()).optional()
203
+ sources: z.array(z.string()).optional(),
204
+ post_release_verification: PostReleaseVerificationSchema.optional()
194
205
  }).superRefine((v, ctx) => {
195
206
  if (v.status === "completed" && !v.completed) {
196
207
  ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["completed"], message: "required when status is completed" });
197
208
  }
209
+ if (v.post_release_verification && v.status !== "completed") {
210
+ ctx.addIssue({
211
+ code: z.ZodIssueCode.custom,
212
+ path: ["post_release_verification"],
213
+ message: "post-release verification requires status completed"
214
+ });
215
+ }
198
216
  });
199
217
  var CompoundSchema = z.object({
200
218
  title: z.string().min(1),
@@ -649,6 +667,7 @@ function redactSensitiveContent(text, opts = {}) {
649
667
  import { existsSync, readFileSync } from "fs";
650
668
  import { readFile, readdir, stat } from "fs/promises";
651
669
  import { join, relative, sep } from "path";
670
+ import { execFileSync } from "child_process";
652
671
  var TYPED_DIRS = ["entities", "concepts", "comparisons", "queries", "meta"];
653
672
  var SKIP_DIRS = /* @__PURE__ */ new Set([".git", "node_modules"]);
654
673
  var DEFAULT_IO_CONCURRENCY = 1;
@@ -703,6 +722,27 @@ async function mapWithConcurrency(items, limit, mapper) {
703
722
  await Promise.all(workers);
704
723
  return out;
705
724
  }
725
+ function filterGitIgnoredRelativePaths(root, relPaths) {
726
+ if (relPaths.length === 0 || !existsSync(join(root, ".git"))) {
727
+ return /* @__PURE__ */ new Set();
728
+ }
729
+ try {
730
+ const input = relPaths.join("\0") + "\0";
731
+ const stdout = execFileSync("git", ["check-ignore", "-z", "--stdin"], {
732
+ cwd: root,
733
+ input,
734
+ encoding: "utf8",
735
+ stdio: ["pipe", "pipe", "pipe"]
736
+ });
737
+ const ignored = stdout.split("\0").filter(Boolean);
738
+ return new Set(ignored);
739
+ } catch (error) {
740
+ if (error && typeof error === "object" && error.status === 1) {
741
+ return /* @__PURE__ */ new Set();
742
+ }
743
+ return /* @__PURE__ */ new Set();
744
+ }
745
+ }
706
746
  async function scanVault(root) {
707
747
  try {
708
748
  await stat(join(root, "SCHEMA.md"));
@@ -710,7 +750,9 @@ async function scanVault(root) {
710
750
  return err("VAULT_PATH_INVALID", { root, reason: "SCHEMA.md missing" });
711
751
  }
712
752
  const all = await walk(root);
713
- const rels = all.map((p) => ({ absPath: p, relPath: relative(root, p).split(sep).join("/") }));
753
+ const rawRels = all.map((p) => ({ absPath: p, relPath: relative(root, p).split(sep).join("/") }));
754
+ const ignored = filterGitIgnoredRelativePaths(root, rawRels.map((p) => p.relPath));
755
+ const rels = ignored.size > 0 ? rawRels.filter((p) => !ignored.has(p.relPath)) : rawRels;
714
756
  return ok({
715
757
  root,
716
758
  allMarkdown: rels,
@@ -771,6 +813,7 @@ export {
771
813
  vaultIoConcurrency,
772
814
  resolveReadOnlyVaultRoot,
773
815
  mapWithConcurrency,
816
+ filterGitIgnoredRelativePaths,
774
817
  scanVault,
775
818
  readPage,
776
819
  readPageCached
@@ -3,11 +3,11 @@ import {
3
3
  ROOT_INDEX_SECTION_ORDER,
4
4
  atomicWriteText,
5
5
  buildRootIndexUniverse
6
- } from "./chunk-NG72ZD4C.js";
6
+ } from "./chunk-BPJ5KWIT.js";
7
7
  import {
8
8
  err,
9
9
  ok
10
- } from "./chunk-MHGUYPGE.js";
10
+ } from "./chunk-HJ4ALQG6.js";
11
11
 
12
12
  // src/utils/index-projection.ts
13
13
  import { readFile } from "fs/promises";
@@ -8,7 +8,7 @@ import {
8
8
  readLogEvents,
9
9
  resolveExistingRegularFileInsideVault,
10
10
  writeLogEvent
11
- } from "./chunk-6AMXNODT.js";
11
+ } from "./chunk-OMO45AHI.js";
12
12
  import {
13
13
  ExitCode,
14
14
  RawSourceSchema,
@@ -19,7 +19,7 @@ import {
19
19
  scanSensitiveContent,
20
20
  scanVault,
21
21
  splitFrontmatter
22
- } from "./chunk-MHGUYPGE.js";
22
+ } from "./chunk-HJ4ALQG6.js";
23
23
 
24
24
  // src/commands/sources.ts
25
25
  import { readFile as readFile4 } from "fs/promises";
@@ -6,7 +6,7 @@ import {
6
6
  readPage,
7
7
  scanSensitiveContent,
8
8
  splitFrontmatter
9
- } from "./chunk-MHGUYPGE.js";
9
+ } from "./chunk-HJ4ALQG6.js";
10
10
 
11
11
  // src/utils/vault-path-safety.ts
12
12
  import { lstatSync, realpathSync } from "fs";
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  renderRootIndex,
8
8
  writeRootIndexProjection
9
- } from "./chunk-NHRRYAXT.js";
9
+ } from "./chunk-KFEOMMWK.js";
10
10
  import {
11
11
  CONFIG_KEYS,
12
12
  VAULT_HYGIENE_GENERATED_COMMIT_PATHS,
@@ -40,11 +40,11 @@ import {
40
40
  snapshotterAliasForLocalHost,
41
41
  toUndirectedWeighted,
42
42
  writeDotenv
43
- } from "./chunk-KZZUTQEA.js";
43
+ } from "./chunk-CKDF4DWU.js";
44
44
  import {
45
45
  atomicWriteText,
46
46
  prepareTypedPage
47
- } from "./chunk-NG72ZD4C.js";
47
+ } from "./chunk-BPJ5KWIT.js";
48
48
  import {
49
49
  applySourceCompileClaim,
50
50
  applySourceCompilePublished,
@@ -57,11 +57,11 @@ import {
57
57
  planSourceCompileRelease,
58
58
  planSourceReview,
59
59
  runSourcesPending
60
- } from "./chunk-JMV7YBQN.js";
60
+ } from "./chunk-NPTIYO2S.js";
61
61
  import {
62
62
  eventPathFor,
63
63
  writeLogEvent
64
- } from "./chunk-6AMXNODT.js";
64
+ } from "./chunk-OMO45AHI.js";
65
65
  import {
66
66
  CompoundSchema,
67
67
  ExitCode,
@@ -82,7 +82,7 @@ import {
82
82
  scanVault,
83
83
  splitFrontmatter,
84
84
  systemdPropertyFor
85
- } from "./chunk-MHGUYPGE.js";
85
+ } from "./chunk-HJ4ALQG6.js";
86
86
 
87
87
  // src/commands/log-append.ts
88
88
  import { readFile, stat } from "fs/promises";
@@ -6096,7 +6096,7 @@ async function runQuery(input) {
6096
6096
  }
6097
6097
  let pendingSources;
6098
6098
  if (input.includePending) {
6099
- const { runSourcesPending: runSourcesPending2 } = await import("./sources-JABI35OW.js");
6099
+ const { runSourcesPending: runSourcesPending2 } = await import("./sources-C4LUWNET.js");
6100
6100
  const pending = await runSourcesPending2({
6101
6101
  vault: input.vault,
6102
6102
  match: input.text,
package/dist/cli.js CHANGED
@@ -50,7 +50,7 @@ import {
50
50
  snapshotterHealthChecks,
51
51
  upsertIndexEntry,
52
52
  vectorIndexStatus
53
- } from "./chunk-EK7SNIU3.js";
53
+ } from "./chunk-SNHTWLGF.js";
54
54
  import {
55
55
  normalizeDistTag,
56
56
  readCache,
@@ -63,7 +63,7 @@ import {
63
63
  UNMANAGED_START,
64
64
  renderRootIndex,
65
65
  writeRootIndexProjection
66
- } from "./chunk-NHRRYAXT.js";
66
+ } from "./chunk-KFEOMMWK.js";
67
67
  import {
68
68
  FLEET_REL_PATH,
69
69
  REDACTED_MALFORMED_REFERENCE,
@@ -151,12 +151,12 @@ import {
151
151
  supersedeStaleReviewRequiredJournals,
152
152
  taxonomyCommentForPage,
153
153
  writeDotenv
154
- } from "./chunk-KZZUTQEA.js";
154
+ } from "./chunk-CKDF4DWU.js";
155
155
  import {
156
156
  assertTargetInsideVault,
157
157
  atomicWriteText,
158
158
  prepareTypedPage
159
- } from "./chunk-NG72ZD4C.js";
159
+ } from "./chunk-BPJ5KWIT.js";
160
160
  import {
161
161
  applySourceDisposition,
162
162
  decodeSourceActionApproval,
@@ -164,7 +164,7 @@ import {
164
164
  inventorySources,
165
165
  planSourceDisposition,
166
166
  runSourcesPending
167
- } from "./chunk-JMV7YBQN.js";
167
+ } from "./chunk-NPTIYO2S.js";
168
168
  import {
169
169
  authorizeRawOperation,
170
170
  buildSourceReferenceIndex,
@@ -181,7 +181,7 @@ import {
181
181
  resolveExistingRegularFileInsideVault,
182
182
  validateLogEvent,
183
183
  writeLogEvent
184
- } from "./chunk-6AMXNODT.js";
184
+ } from "./chunk-OMO45AHI.js";
185
185
  import {
186
186
  ExitCode,
187
187
  MetaSchema,
@@ -202,7 +202,7 @@ import {
202
202
  scanVault,
203
203
  splitFrontmatter,
204
204
  vaultIoConcurrency
205
- } from "./chunk-MHGUYPGE.js";
205
+ } from "./chunk-HJ4ALQG6.js";
206
206
 
207
207
  // src/cli.ts
208
208
  import { join as join42 } from "path";
@@ -3767,7 +3767,7 @@ ${fmRewritten}
3767
3767
  }
3768
3768
  let indexUpdated = false;
3769
3769
  if (!isRaw) {
3770
- const { renderRootIndex: renderRootIndex2, writeRootIndexProjection: writeRootIndexProjection2 } = await import("./index-projection-IICN2TUG.js");
3770
+ const { renderRootIndex: renderRootIndex2, writeRootIndexProjection: writeRootIndexProjection2 } = await import("./index-projection-J5IV7NH3.js");
3771
3771
  const before = await readFile7(join19(input.vault, "index.md"), "utf8").catch(() => "");
3772
3772
  const fullTarget = relPath.replace(/\.md$/, "");
3773
3773
  const bare = fullTarget.split("/").pop() ?? fullTarget;
@@ -3890,7 +3890,7 @@ async function runRemove(input) {
3890
3890
  if (relPath.endsWith(".md") && !relPath.startsWith("raw/")) {
3891
3891
  const { readFile: readFile22 } = await import("fs/promises");
3892
3892
  const { join: pathJoin } = await import("path");
3893
- const { renderRootIndex: renderRootIndex2, writeRootIndexProjection: writeRootIndexProjection2 } = await import("./index-projection-IICN2TUG.js");
3893
+ const { renderRootIndex: renderRootIndex2, writeRootIndexProjection: writeRootIndexProjection2 } = await import("./index-projection-J5IV7NH3.js");
3894
3894
  const before = await readFile22(pathJoin(input.vault, "index.md"), "utf8").catch(() => "");
3895
3895
  const fullTarget = relPath.replace(/\.md$/, "");
3896
3896
  const bare = fullTarget.split("/").pop() ?? fullTarget;
@@ -10410,7 +10410,7 @@ async function emitManagedVaultWrite(vault, command, mutate, opts) {
10410
10410
  if (dirty) {
10411
10411
  return emit(dirty, void 0, { postCommit: false });
10412
10412
  }
10413
- const { runManagedWriteTransaction: runManagedWriteTransaction2 } = await import("./managed-write-preflight-GJP4RN26.js");
10413
+ const { runManagedWriteTransaction: runManagedWriteTransaction2 } = await import("./managed-write-preflight-2MMVUXD3.js");
10414
10414
  const run = await runManagedWriteTransaction2({
10415
10415
  vault,
10416
10416
  command,
@@ -4,9 +4,9 @@ import {
4
4
  UNMANAGED_START,
5
5
  renderRootIndex,
6
6
  writeRootIndexProjection
7
- } from "./chunk-NHRRYAXT.js";
8
- import "./chunk-NG72ZD4C.js";
9
- import "./chunk-MHGUYPGE.js";
7
+ } from "./chunk-KFEOMMWK.js";
8
+ import "./chunk-BPJ5KWIT.js";
9
+ import "./chunk-HJ4ALQG6.js";
10
10
  export {
11
11
  UNMANAGED_END,
12
12
  UNMANAGED_START,
@@ -6,10 +6,10 @@ import {
6
6
  runManagedWritePeerGate,
7
7
  runManagedWritePreflight,
8
8
  runManagedWriteTransaction
9
- } from "./chunk-KZZUTQEA.js";
10
- import "./chunk-NG72ZD4C.js";
11
- import "./chunk-6AMXNODT.js";
12
- import "./chunk-MHGUYPGE.js";
9
+ } from "./chunk-CKDF4DWU.js";
10
+ import "./chunk-BPJ5KWIT.js";
11
+ import "./chunk-OMO45AHI.js";
12
+ import "./chunk-HJ4ALQG6.js";
13
13
  export {
14
14
  DEFAULT_MANAGED_WRITE_WAIT_MS,
15
15
  MANAGED_WRITE_POLL_INTERVAL_MS,
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runSkillwikiMcpStdio
4
- } from "./chunk-EK7SNIU3.js";
4
+ } from "./chunk-SNHTWLGF.js";
5
5
  import "./chunk-7I2TPIV5.js";
6
- import "./chunk-NHRRYAXT.js";
7
- import "./chunk-KZZUTQEA.js";
8
- import "./chunk-NG72ZD4C.js";
9
- import "./chunk-JMV7YBQN.js";
10
- import "./chunk-6AMXNODT.js";
11
- import "./chunk-MHGUYPGE.js";
6
+ import "./chunk-KFEOMMWK.js";
7
+ import "./chunk-CKDF4DWU.js";
8
+ import "./chunk-BPJ5KWIT.js";
9
+ import "./chunk-NPTIYO2S.js";
10
+ import "./chunk-OMO45AHI.js";
11
+ import "./chunk-HJ4ALQG6.js";
12
12
 
13
13
  // src/mcp-entry.ts
14
14
  runSkillwikiMcpStdio().catch((error) => {
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runSourcesPending
4
+ } from "./chunk-NPTIYO2S.js";
5
+ import "./chunk-OMO45AHI.js";
6
+ import "./chunk-HJ4ALQG6.js";
7
+ export {
8
+ runSourcesPending
9
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.62",
3
+ "version": "0.10.64",
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.62",
3
+ "version": "0.10.64",
4
4
  "skills": "./",
5
5
  "description": "Project-aware Karpathy-style knowledge base for Claude Code: 20 prompt-only skills (wiki-*, proj-*, using-skillwiki) backed by the deterministic `skillwiki` CLI.",
6
6
  "author": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.62",
3
+ "version": "0.10.64",
4
4
  "description": "Project-aware Karpathy-style knowledge base for Codex with 20 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/skills",
3
- "version": "0.10.62",
3
+ "version": "0.10.64",
4
4
  "private": true,
5
5
  "files": [
6
6
  "wiki-*",
@@ -49,6 +49,22 @@ When the user asks to "get work of X" or "run work item Y" for review, you are i
49
49
  5. Manage status transitions: `planned` → `in-progress` → `completed` (set `completed:` date) or `abandoned`.
50
50
  6. Append vault `log.md` entry on creation and on each status transition.
51
51
 
52
+ ### Completion and post-release verification
53
+
54
+ - Work-item status represents delivery lifecycle. Mark delivery complete when
55
+ the approved code, required acceptance checks, release/deployment scope, and
56
+ completion evidence are finished.
57
+ - Required acceptance verification remains part of the completion checklist and
58
+ must pass before `status: completed`.
59
+ - Optional verification after delivery uses typed frontmatter:
60
+ `post_release_verification.posture: opt-in`, plus one or more approved
61
+ `triggers` (`matching-regression-report`, `explicit-user-request`, or
62
+ `relevant-code-or-release-change`).
63
+ - Record opt-in post-release checks as prose evidence, not as unchecked completion tasks.
64
+ Completed opt-in work stays out of ordinary active rankings until a trigger
65
+ occurs; a trigger creates new evidence or a follow-up decision rather than
66
+ silently keeping delivered work `in-progress`.
67
+
52
68
  ## Redirect Output
53
69
 
54
70
  After step 3 (output path override), emit redirect paths for the active PRD skill:
@@ -49,6 +49,22 @@ When the user asks to "get work of X" or "run work item Y" for review, you are i
49
49
  5. Manage status transitions: `planned` → `in-progress` → `completed` (set `completed:` date) or `abandoned`.
50
50
  6. Append vault `log.md` entry on creation and on each status transition.
51
51
 
52
+ ### Completion and post-release verification
53
+
54
+ - Work-item status represents delivery lifecycle. Mark delivery complete when
55
+ the approved code, required acceptance checks, release/deployment scope, and
56
+ completion evidence are finished.
57
+ - Required acceptance verification remains part of the completion checklist and
58
+ must pass before `status: completed`.
59
+ - Optional verification after delivery uses typed frontmatter:
60
+ `post_release_verification.posture: opt-in`, plus one or more approved
61
+ `triggers` (`matching-regression-report`, `explicit-user-request`, or
62
+ `relevant-code-or-release-change`).
63
+ - Record opt-in post-release checks as prose evidence, not as unchecked completion tasks.
64
+ Completed opt-in work stays out of ordinary active rankings until a trigger
65
+ occurs; a trigger creates new evidence or a follow-up decision rather than
66
+ silently keeping delivered work `in-progress`.
67
+
52
68
  ## Redirect Output
53
69
 
54
70
  After step 3 (output path override), emit redirect paths for the active PRD skill:
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- runSourcesPending
4
- } from "./chunk-JMV7YBQN.js";
5
- import "./chunk-6AMXNODT.js";
6
- import "./chunk-MHGUYPGE.js";
7
- export {
8
- runSourcesPending
9
- };