skillwiki 0.8.1-beta.9 → 0.8.2

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 (46) hide show
  1. package/dist/cli.js +34 -18
  2. package/package.json +1 -1
  3. package/skills/.claude-plugin/plugin.json +1 -1
  4. package/skills/.codex-plugin/plugin.json +2 -1
  5. package/skills/README.md +10 -0
  6. package/skills/hooks/hooks-codex.json +16 -0
  7. package/skills/hooks/session-context +112 -0
  8. package/skills/hooks/session-start +6 -20
  9. package/skills/hooks/session-start-codex +15 -0
  10. package/skills/package.json +1 -1
  11. package/skills/proj-decide/SKILL.md +0 -1
  12. package/skills/proj-distill/SKILL.md +0 -1
  13. package/skills/proj-init/SKILL.md +0 -1
  14. package/skills/proj-work/SKILL.md +0 -1
  15. package/skills/skills/proj-decide/SKILL.md +0 -1
  16. package/skills/skills/proj-distill/SKILL.md +0 -1
  17. package/skills/skills/proj-init/SKILL.md +0 -1
  18. package/skills/skills/proj-work/SKILL.md +0 -1
  19. package/skills/skills/using-skillwiki/SKILL.md +6 -6
  20. package/skills/skills/wiki-adapter-prd/SKILL.md +0 -1
  21. package/skills/skills/wiki-add-task/SKILL.md +0 -1
  22. package/skills/skills/wiki-archive/SKILL.md +0 -1
  23. package/skills/skills/wiki-audit/SKILL.md +0 -1
  24. package/skills/skills/wiki-canvas/SKILL.md +0 -1
  25. package/skills/skills/wiki-crystallize/SKILL.md +0 -1
  26. package/skills/skills/wiki-gate-plan-mode/SKILL.md +0 -1
  27. package/skills/skills/wiki-ingest/SKILL.md +0 -1
  28. package/skills/skills/wiki-init/SKILL.md +0 -1
  29. package/skills/skills/wiki-lint/SKILL.md +0 -1
  30. package/skills/skills/wiki-query/SKILL.md +0 -1
  31. package/skills/skills/wiki-reingest/SKILL.md +0 -1
  32. package/skills/skills/wiki-sync/SKILL.md +0 -1
  33. package/skills/using-skillwiki/SKILL.md +6 -6
  34. package/skills/wiki-adapter-prd/SKILL.md +0 -1
  35. package/skills/wiki-add-task/SKILL.md +0 -1
  36. package/skills/wiki-archive/SKILL.md +0 -1
  37. package/skills/wiki-audit/SKILL.md +0 -1
  38. package/skills/wiki-canvas/SKILL.md +0 -1
  39. package/skills/wiki-crystallize/SKILL.md +0 -1
  40. package/skills/wiki-gate-plan-mode/SKILL.md +0 -1
  41. package/skills/wiki-ingest/SKILL.md +0 -1
  42. package/skills/wiki-init/SKILL.md +0 -1
  43. package/skills/wiki-lint/SKILL.md +0 -1
  44. package/skills/wiki-query/SKILL.md +0 -1
  45. package/skills/wiki-reingest/SKILL.md +0 -1
  46. package/skills/wiki-sync/SKILL.md +0 -1
package/dist/cli.js CHANGED
@@ -2843,12 +2843,13 @@ async function runRawBodyDedup(vault) {
2843
2843
  // src/commands/path-too-long.ts
2844
2844
  import { existsSync as existsSync4 } from "fs";
2845
2845
  import { mkdir as mkdir8, readFile as readFile16, rename as rename6, unlink as unlink3 } from "fs/promises";
2846
- import { dirname as dirname8, join as join21, posix } from "path";
2846
+ import { dirname as dirname8, join as join21, posix, resolve as resolve4 } from "path";
2847
2847
  var MAX_PATH_LENGTH = 240;
2848
+ var WINDOWS_ABSOLUTE_PATH_LIMIT = 259;
2848
2849
  async function runPathTooLong(input) {
2849
2850
  const scan = await scanVault(input.vault);
2850
2851
  if (!scan.ok) return { exitCode: ExitCode.VAULT_PATH_INVALID, result: scan };
2851
- const violations = findPathTooLongViolations(scan.data.allMarkdown);
2852
+ const violations = findPathTooLongViolations(scan.data.allMarkdown, MAX_PATH_LENGTH);
2852
2853
  if (violations.length > 0) {
2853
2854
  return {
2854
2855
  exitCode: ExitCode.LINT_HAS_ERRORS,
@@ -2863,12 +2864,13 @@ async function runPathTooLong(input) {
2863
2864
  async function fixPathTooLong(input) {
2864
2865
  const scan = await scanVault(input.vault);
2865
2866
  if (!scan.ok) return { exitCode: ExitCode.VAULT_PATH_INVALID, result: scan };
2866
- const violations = findPathTooLongViolations(scan.data.allMarkdown);
2867
+ const maxFixLength = maxFixPathLength(input.vault);
2868
+ const violations = findPathTooLongViolations(scan.data.allMarkdown, maxFixLength);
2867
2869
  const fixed = [];
2868
2870
  const unresolved = [];
2869
2871
  for (const violation of violations) {
2870
- const target = await resolveFixTarget(input.vault, violation.relPath, violation.suggestedRelPath);
2871
- if (!target || target.relPath === violation.relPath || target.relPath.length > MAX_PATH_LENGTH) {
2872
+ const target = await resolveFixTarget(input.vault, violation.relPath, violation.suggestedRelPath, maxFixLength);
2873
+ if (!target || target.relPath === violation.relPath || target.relPath.length > maxFixLength) {
2872
2874
  unresolved.push(violation.relPath);
2873
2875
  continue;
2874
2876
  }
@@ -2919,13 +2921,20 @@ async function fixPathTooLong(input) {
2919
2921
  result: ok({ fixed, unresolved, rewired, humanHint: hintLines.join("\n") })
2920
2922
  };
2921
2923
  }
2922
- function findPathTooLongViolations(pages) {
2923
- return pages.filter((page) => page.relPath.length > MAX_PATH_LENGTH).map((page) => ({
2924
+ function findPathTooLongViolations(pages, maxLength) {
2925
+ return pages.filter((page) => page.relPath.length > maxLength).map((page) => ({
2924
2926
  relPath: page.relPath,
2925
2927
  length: page.relPath.length,
2926
- suggestedRelPath: truncateFilename(page.relPath)
2928
+ suggestedRelPath: truncateFilename(page.relPath, maxLength)
2927
2929
  }));
2928
2930
  }
2931
+ function maxFixPathLength(vault) {
2932
+ if (process.platform !== "win32") return MAX_PATH_LENGTH;
2933
+ const root = resolve4(vault);
2934
+ const separatorBudget = root.endsWith("\\") || root.endsWith("/") ? 0 : 1;
2935
+ const absoluteSafeRelLength = WINDOWS_ABSOLUTE_PATH_LIMIT - root.length - separatorBudget;
2936
+ return Math.max(1, Math.min(MAX_PATH_LENGTH, absoluteSafeRelLength));
2937
+ }
2929
2938
  function truncateFilename(relPath, maxLength = MAX_PATH_LENGTH) {
2930
2939
  if (relPath.length <= maxLength) return relPath;
2931
2940
  const lastSlash = relPath.lastIndexOf("/");
@@ -2944,9 +2953,9 @@ function truncateFilename(relPath, maxLength = MAX_PATH_LENGTH) {
2944
2953
  const prefix = base.slice(0, maxPrefixLen).replace(/[-_\s]+$/, "");
2945
2954
  return dirPrefix + prefix + suffix;
2946
2955
  }
2947
- async function resolveFixTarget(vault, original, preferred) {
2948
- for (const candidate of candidateRelPaths(preferred)) {
2949
- if (candidate === original || candidate.length > MAX_PATH_LENGTH) continue;
2956
+ async function resolveFixTarget(vault, original, preferred, maxLength) {
2957
+ for (const candidate of candidateRelPaths(preferred, maxLength)) {
2958
+ if (candidate === original || candidate.length > maxLength) continue;
2950
2959
  const candidatePath = join21(vault, candidate);
2951
2960
  if (!existsSync4(candidatePath)) return { relPath: candidate, mode: "rename" };
2952
2961
  if (await hasSameContent(join21(vault, original), candidatePath)) {
@@ -2955,9 +2964,9 @@ async function resolveFixTarget(vault, original, preferred) {
2955
2964
  }
2956
2965
  return null;
2957
2966
  }
2958
- function candidateRelPaths(preferred) {
2967
+ function candidateRelPaths(preferred, maxLength) {
2959
2968
  const candidates = [preferred];
2960
- if (preferred.length > MAX_PATH_LENGTH) return candidates;
2969
+ if (preferred.length > maxLength) return candidates;
2961
2970
  const dir = posix.dirname(preferred) === "." ? "" : posix.dirname(preferred);
2962
2971
  const filename = posix.basename(preferred);
2963
2972
  const ext = filename.endsWith(".md") ? ".md" : "";
@@ -2965,7 +2974,7 @@ function candidateRelPaths(preferred) {
2965
2974
  const dirPrefix = dir ? `${dir}/` : "";
2966
2975
  for (let i = 2; i < 100; i++) {
2967
2976
  const suffix = `-${i}${ext}`;
2968
- const prefixBudget = MAX_PATH_LENGTH - dirPrefix.length - suffix.length;
2977
+ const prefixBudget = maxLength - dirPrefix.length - suffix.length;
2969
2978
  if (prefixBudget <= 0) break;
2970
2979
  candidates.push(`${dirPrefix}${base.slice(0, prefixBudget).replace(/[-_\s]+$/, "")}${suffix}`);
2971
2980
  }
@@ -3912,7 +3921,7 @@ async function runConfigPath(input) {
3912
3921
 
3913
3922
  // src/commands/doctor.ts
3914
3923
  import { existsSync as existsSync9, lstatSync, readlinkSync, readdirSync, statSync as statSync3, readFileSync as readFileSync7 } from "fs";
3915
- import { join as join27, resolve as resolve4 } from "path";
3924
+ import { join as join27, resolve as resolve5 } from "path";
3916
3925
  import { execSync as execSync2 } from "child_process";
3917
3926
  import { platform as platform2 } from "os";
3918
3927
 
@@ -4245,14 +4254,14 @@ function checkNodeVersion() {
4245
4254
  function detectCliChannels(argv, home) {
4246
4255
  const channels = [];
4247
4256
  if (argv.length >= 2 && argv[1].endsWith("cli.js")) {
4248
- const devPath = resolve4(argv[1]);
4257
+ const devPath = resolve5(argv[1]);
4249
4258
  channels.push({ name: "dev", path: devPath, isDevLink: true });
4250
4259
  }
4251
4260
  try {
4252
4261
  const whichOut = execSync2("which skillwiki 2>/dev/null", { encoding: "utf8" }).trim();
4253
4262
  if (whichOut) {
4254
4263
  const isDev = isDevSymlink(whichOut);
4255
- if (!channels.some((c) => c.path === resolve4(whichOut))) {
4264
+ if (!channels.some((c) => c.path === resolve5(whichOut))) {
4256
4265
  channels.push({ name: "npm", path: whichOut, isDevLink: isDev });
4257
4266
  }
4258
4267
  }
@@ -4275,7 +4284,7 @@ function isDevSymlink(binPath) {
4275
4284
  try {
4276
4285
  const st = lstatSync(binPath);
4277
4286
  if (st.isSymbolicLink()) {
4278
- const target = resolve4(binPath, "..", readlinkSync(binPath));
4287
+ const target = resolve5(binPath, "..", readlinkSync(binPath));
4279
4288
  return target.includes("packages/cli") || target.includes("packages\\cli");
4280
4289
  }
4281
4290
  } catch {
@@ -7118,6 +7127,7 @@ function runSyncStatus(input) {
7118
7127
  })
7119
7128
  };
7120
7129
  }
7130
+ enableGitLongPathsOnWindows(vault);
7121
7131
  const porcelain = git(vault, ["status", "--porcelain"]);
7122
7132
  const dirty = porcelain ? porcelain.split("\n").filter((l) => l.trim().length > 0).length : 0;
7123
7133
  const revOutput = git(vault, ["rev-list", "--left-right", "--count", "origin/HEAD...HEAD"]);
@@ -7187,6 +7197,7 @@ async function runSyncPush(input) {
7187
7197
  result: err("NOT_A_GIT_REPO", { path: vault })
7188
7198
  };
7189
7199
  }
7200
+ enableGitLongPathsOnWindows(vault);
7190
7201
  let pathFixes = 0;
7191
7202
  const pathFix = await fixPathTooLong({ vault });
7192
7203
  if (pathFix.result.ok && pathFix.result.data.fixed.length > 0) {
@@ -7297,6 +7308,10 @@ function enumerateStashes(vault) {
7297
7308
  }
7298
7309
  return stashes;
7299
7310
  }
7311
+ function enableGitLongPathsOnWindows(vault) {
7312
+ if (process.platform !== "win32") return;
7313
+ git(vault, ["config", "core.longpaths", "true"]);
7314
+ }
7300
7315
  async function runSyncPull(input) {
7301
7316
  const vault = input.vault;
7302
7317
  if (!existsSync14(join37(vault, ".git"))) {
@@ -7305,6 +7320,7 @@ async function runSyncPull(input) {
7305
7320
  result: err("NOT_A_GIT_REPO", { path: vault })
7306
7321
  };
7307
7322
  }
7323
+ enableGitLongPathsOnWindows(vault);
7308
7324
  let fetched = false;
7309
7325
  try {
7310
7326
  gitStrict(vault, ["fetch", "origin"]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.8.1-beta.9",
3
+ "version": "0.8.2",
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.8.1-beta.9",
3
+ "version": "0.8.2",
4
4
  "skills": "./",
5
5
  "description": "Project-aware Karpathy-style knowledge base for Claude Code: 18 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.8.1-beta.9",
3
+ "version": "0.8.2",
4
4
  "description": "Project-aware Karpathy-style knowledge base for Codex with 18 prompt-only skills backed by the deterministic skillwiki CLI.",
5
5
  "author": {
6
6
  "name": "karlorz",
@@ -18,6 +18,7 @@
18
18
  "karpathy"
19
19
  ],
20
20
  "skills": "./skills/",
21
+ "hooks": "./hooks/hooks-codex.json",
21
22
  "interface": {
22
23
  "displayName": "SkillWiki",
23
24
  "shortDescription": "Project-aware wiki skills for Codex agents",
package/skills/README.md CHANGED
@@ -10,3 +10,13 @@ Prompt-only Markdown skills for Claude Code. Installed via `skillwiki install`.
10
10
  Each top-level skill subdirectory holds one canonical `SKILL.md`. The nested
11
11
  `skills/<skill>/SKILL.md` tree mirrors those files for Codex plugin discovery;
12
12
  keep it byte-for-byte in sync with the canonical top-level files.
13
+
14
+ Codex installs through `packages/codex-skills`, a materialized plugin root that
15
+ copies this package's `.codex-plugin/` manifest, `skills/` mirror, and
16
+ Codex-specific hook files. That root exposes `hooks/hooks-codex.json` and
17
+ `hooks/session-start-codex` without exposing the Claude default
18
+ `hooks/hooks.json`.
19
+
20
+ Run `npm run materialize:plugins` from the repository root after changing
21
+ canonical skill, agent, or hook assets. Run
22
+ `npm run materialize:plugins:check` for read-only drift detection.
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup|resume|clear",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "\"${PLUGIN_ROOT}/hooks/run-hook.cmd\" session-start-codex",
10
+ "async": false
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env bash
2
+ # Shared SessionStart context helpers for skillwiki hook entrypoints.
3
+
4
+ read_config_value() {
5
+ local file="$1"
6
+ local key="$2"
7
+ local line
8
+
9
+ line=$(grep -E "^[[:space:]]*${key}:" "$file" 2>/dev/null | head -n 1 || true)
10
+ [[ -n "$line" ]] || return 0
11
+
12
+ printf '%s' "$line" \
13
+ | sed -E "s/^[[:space:]]*${key}:[[:space:]]*//; s/[[:space:]]+#.*$//; s/[[:space:]]+$//; s/^['\"]//; s/['\"]$//"
14
+ }
15
+
16
+ find_dev_loop_config() {
17
+ local dir="${PWD}"
18
+
19
+ while [[ -n "$dir" && "$dir" != "/" ]]; do
20
+ if [[ -f "${dir}/.claude/dev-loop.config.md" ]]; then
21
+ printf '%s' "${dir}/.claude/dev-loop.config.md"
22
+ return 0
23
+ fi
24
+ dir=$(dirname "$dir")
25
+ done
26
+
27
+ return 0
28
+ }
29
+
30
+ build_project_prd_context() {
31
+ local config_path
32
+ config_path=$(find_dev_loop_config)
33
+ [[ -n "$config_path" ]] || return 0
34
+
35
+ local prd_layer
36
+ local prd_pipeline
37
+ prd_layer=$(read_config_value "$config_path" "prd_layer")
38
+ prd_pipeline=$(read_config_value "$config_path" "prd_pipeline")
39
+
40
+ [[ -n "$prd_layer" || -n "$prd_pipeline" ]] || return 0
41
+
42
+ prd_layer="${prd_layer:-unspecified}"
43
+ prd_pipeline="${prd_pipeline:-unspecified}"
44
+
45
+ cat <<EOF
46
+ ## Project PRD Mode
47
+
48
+ Detected \`.claude/dev-loop.config.md\` for this workspace:
49
+ - \`prd_layer\`: \`${prd_layer}\`
50
+ - \`prd_pipeline\`: \`${prd_pipeline}\`
51
+
52
+ Use this detected PRD mode as the source of truth. Route generated spec/plan artifacts through \`proj-work\`, and do not write them under \`docs/superpowers/\`. If \`prd_layer\` is \`superpowers\` or \`tdd\`, ensure \`EnterPlanMode\` is gated with \`wiki-gate-plan-mode\`. Do not assume \`superpowers/full\` unless the config says so.
53
+ EOF
54
+ }
55
+
56
+ escape_for_json() {
57
+ local s="$1"
58
+ s="${s//\\/\\\\}"
59
+ s="${s//\"/\\\"}"
60
+ s="${s//$'\n'/\\n}"
61
+ s="${s//$'\r'/\\r}"
62
+ s="${s//$'\t'/\\t}"
63
+ printf '%s' "$s"
64
+ }
65
+
66
+ read_skill_content() {
67
+ local skill_path="$1"
68
+ cat "$skill_path" 2>/dev/null || echo "Error reading using-skillwiki skill"
69
+ }
70
+
71
+ resolve_skill_path() {
72
+ local plugin_root="$1"
73
+ local skill_name="$2"
74
+ local candidate
75
+
76
+ for candidate in \
77
+ "${plugin_root}/${skill_name}/SKILL.md" \
78
+ "${plugin_root}/skills/${skill_name}/SKILL.md"; do
79
+ if [[ -f "$candidate" ]]; then
80
+ printf '%s' "$candidate"
81
+ return 0
82
+ fi
83
+ done
84
+
85
+ printf '%s' "${plugin_root}/${skill_name}/SKILL.md"
86
+ }
87
+
88
+ build_skillwiki_session_context() {
89
+ local skill_content="$1"
90
+ local project_prd_context
91
+ local session_context
92
+
93
+ project_prd_context=$(build_project_prd_context)
94
+
95
+ session_context=$'### Skillwiki Activation\n\nSkillwiki is active for this workspace. Below are the capability guidelines for local reference:'
96
+ if [[ -n "$project_prd_context" ]]; then
97
+ session_context+=$'\n\n'
98
+ session_context+="$project_prd_context"
99
+ fi
100
+ session_context+=$'\n\n'
101
+ session_context+="$skill_content"
102
+
103
+ printf '%s' "$session_context"
104
+ }
105
+
106
+ print_session_start_json() {
107
+ local session_context
108
+ session_context=$(escape_for_json "$1")
109
+
110
+ # Uses printf instead of heredoc to work around bash 5.3+ heredoc hang.
111
+ printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": "%s"\n }\n}\n' "$session_context"
112
+ }
@@ -1,29 +1,15 @@
1
1
  #!/usr/bin/env bash
2
2
  # SessionStart hook for skillwiki plugin
3
- # Injects using-skillwiki SKILL.md content into every conversation.
4
3
 
5
4
  set -euo pipefail
6
5
 
7
- PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
6
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
7
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
8
8
 
9
- skill_content=$(cat "${PLUGIN_ROOT}/using-skillwiki/SKILL.md" 2>/dev/null || echo "Error reading using-skillwiki skill")
9
+ source "${SCRIPT_DIR}/session-context"
10
10
 
11
- # Escape string for JSON embedding using bash parameter substitution.
12
- # Each ${s//old/new} is a single C-level pass.
13
- escape_for_json() {
14
- local s="$1"
15
- s="${s//\\/\\\\}"
16
- s="${s//\"/\\\"}"
17
- s="${s//$'\n'/\\n}"
18
- s="${s//$'\r'/\\r}"
19
- s="${s//$'\t'/\\t}"
20
- printf '%s' "$s"
21
- }
22
-
23
- skill_escaped=$(escape_for_json "$skill_content")
24
- session_context="### Skillwiki Activation\n\nSkillwiki is active for this workspace. Below are the capability guidelines for local reference:\n\n${skill_escaped}"
25
-
26
- # Uses printf instead of heredoc to work around bash 5.3+ heredoc hang.
27
- printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": "%s"\n }\n}\n' "$session_context"
11
+ skill_content=$(read_skill_content "$(resolve_skill_path "$PLUGIN_ROOT" "using-skillwiki")")
12
+ session_context=$(build_skillwiki_session_context "$skill_content")
13
+ print_session_start_json "$session_context"
28
14
 
29
15
  exit 0
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ # Codex SessionStart hook for skillwiki plugin.
3
+
4
+ set -euo pipefail
5
+
6
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
7
+ PLUGIN_ROOT="${PLUGIN_ROOT:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
8
+
9
+ source "${SCRIPT_DIR}/session-context"
10
+
11
+ skill_content=$(read_skill_content "$(resolve_skill_path "$PLUGIN_ROOT" "using-skillwiki")")
12
+ session_context=$(build_skillwiki_session_context "$skill_content")
13
+ print_session_start_json "$session_context"
14
+
15
+ exit 0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillwiki/skills",
3
- "version": "0.8.1-beta.9",
3
+ "version": "0.8.2",
4
4
  "private": true,
5
5
  "files": [
6
6
  "wiki-*",
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: proj-decide
4
3
  description: Write an Architectural Decision Record (ADR). If the decision generalizes, also create a concepts/ page.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: proj-distill
4
3
  description: 2-step distillation (E4) — analyze project compound entry, then generate a vault concept page with provenance.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: proj-init
4
3
  description: Bootstrap a project workspace at projects/{slug}/ with README, requirements/, architecture/, work/, compound/.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: proj-work
4
3
  description: Open or run a work item under projects/{slug}/work/YYYY-MM-DD-{slug}/. Redirects brainstorming/writing-plans output paths.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: proj-decide
4
3
  description: Write an Architectural Decision Record (ADR). If the decision generalizes, also create a concepts/ page.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: proj-distill
4
3
  description: 2-step distillation (E4) — analyze project compound entry, then generate a vault concept page with provenance.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: proj-init
4
3
  description: Bootstrap a project workspace at projects/{slug}/ with README, requirements/, architecture/, work/, compound/.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: proj-work
4
3
  description: Open or run a work item under projects/{slug}/work/YYYY-MM-DD-{slug}/. Redirects brainstorming/writing-plans output paths.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: using-skillwiki
4
3
  description: Invoke at session start or when knowledge-base tasks arise — maps skillwiki skills, dev-loop alignment, and PRD/TDD routing with plan-mode gate checks
5
4
  ---
@@ -122,16 +121,17 @@ For longer-running project work, use `proj-init` → `proj-work` → `proj-disti
122
121
  Maintenance: **Archive** (`wiki-archive`) superseded pages, **Drift** (`wiki-reingest`) to detect stale sources, **Adapter** (`wiki-adapter-prd`) for foreign PRD format ingestion.
123
122
 
124
123
  ## Troubleshooting Version Drift
125
- skillwiki has three distribution channels that can drift:
124
+ skillwiki has multiple distribution channels that can drift:
126
125
  | Channel | Location | Update Command |
127
126
  |---------|----------|----------------|
128
127
  | npm CLI | `/usr/local/bin/skillwiki` | `npm install -g skillwiki@latest` |
129
128
  | npm skills | `/usr/local/lib/node_modules/skillwiki/skills/` | `skillwiki install` (copies to `~/.claude/skills/`) |
130
129
  | Claude plugin | `~/.claude/plugins/cache/llm-wiki/` | `claude plugin update skillwiki@llm-wiki` |
131
- | Local git dev | `~/.hermes/skills/llm-wiki/` | `npm link ./packages/cli` (from repo root) |
132
- **Check versions:** `skillwiki doctor` reports "Plugin/CLI version" mismatch warnings.
133
- **Common issue:** npm package ships SKILL.md files with older `version:` frontmatter than CLI code. This creates false-positive "version warnings" in `skillwiki doctor` the CLI is newer but skills report older version.
134
- **Fix:** If developing locally, use `npm link` from the git repo. If using released versions, wait for maintainer to bump SKILL.md versions in source and republish.
130
+ | Codex plugin | `~/.codex/plugins/cache/llm-wiki/` | `codex plugin marketplace upgrade llm-wiki`, then reinstall or restart Codex as needed |
131
+ | Local git dev | source repo checkout | `npm link ./packages/cli` (from repo root) |
132
+ **Check versions:** `skillwiki doctor` reports Plugin/CLI version mismatch warnings when installed channels disagree.
133
+ **Authoring rule:** `SKILL.md` frontmatter follows the Agent Skills schema: top-level `name` and `description` plus optional schema fields such as `metadata`. Do not put release version fields at the top level of `SKILL.md`; plugin and package release versions live in `plugin.json` and `package.json`.
134
+ **Fix:** If developing locally, use the repo source plus `npm link`. If using released versions, update the relevant plugin or npm channel; do not infer release freshness from `SKILL.md` frontmatter.
135
135
 
136
136
  ## Multi-Wiki Profiles
137
137
  skillwiki supports named wiki profiles for working with multiple vaults. Set `WIKI_DEFAULT` to control which wiki all skills target by default.
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-adapter-prd
4
3
  description: Map foreign PRD formats (CodeStable, RFCs, structured markdown) into skillwiki raw + typed-knowledge pages.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: wiki-add-task
4
3
  description: Capture ad-hoc ideas, bugs, tasks, or notes into the vault with ad-hoc capture frontmatter and descriptive filenames.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-archive
4
3
  description: Archive a superseded typed-knowledge page. Moves page to _archive/, removes from index.md, logs the action.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-audit
4
3
  description: Verify per-page that every ^[raw/...] resolves and sources frontmatter matches the body.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-canvas
4
3
  description: Generate an Obsidian Canvas visualization of the vault graph. Runs skillwiki graph build then skillwiki canvas generate.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-crystallize
4
3
  description: Distill the current working session into a typed-knowledge page with provenance.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-gate-plan-mode
4
3
  description: Toggle EnterPlanMode gating — force superpowers planning skills instead of built-in plan mode
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-ingest
4
3
  description: Convert URLs, files, or pasted text into typed-knowledge pages with raw provenance. Supports single and batch mode.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-init
4
3
  description: Bootstrap a CodeWiki vault — domain-aware SCHEMA.md, index.md, log.md, and ~/.skillwiki/.env binding. Use when starting a fresh vault.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: wiki-lint
4
3
  description: Vault health check via the umbrella `skillwiki lint` subcommand. Read-only by default; rotation requires explicit user consent.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: wiki-query
4
3
  description: Search the vault and synthesize an answer with E2 4-signal ranking. Optional file to queries/ or comparisons/.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-reingest
4
3
  description: Detect and act on source drift. Runs skillwiki drift, reviews changes, archives old raw + ingests new content.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.6.1
3
2
  name: wiki-sync
4
3
  description: Safely sync the vault git repository — multi-session safe via advisory lockfile. Handles rebase conflict storms from archive-commit × snapshot-stream patterns. Runs skillwiki sync status, then guides push or pull with lint guards and conflict resolution.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: using-skillwiki
4
3
  description: Invoke at session start or when knowledge-base tasks arise — maps skillwiki skills, dev-loop alignment, and PRD/TDD routing with plan-mode gate checks
5
4
  ---
@@ -122,16 +121,17 @@ For longer-running project work, use `proj-init` → `proj-work` → `proj-disti
122
121
  Maintenance: **Archive** (`wiki-archive`) superseded pages, **Drift** (`wiki-reingest`) to detect stale sources, **Adapter** (`wiki-adapter-prd`) for foreign PRD format ingestion.
123
122
 
124
123
  ## Troubleshooting Version Drift
125
- skillwiki has three distribution channels that can drift:
124
+ skillwiki has multiple distribution channels that can drift:
126
125
  | Channel | Location | Update Command |
127
126
  |---------|----------|----------------|
128
127
  | npm CLI | `/usr/local/bin/skillwiki` | `npm install -g skillwiki@latest` |
129
128
  | npm skills | `/usr/local/lib/node_modules/skillwiki/skills/` | `skillwiki install` (copies to `~/.claude/skills/`) |
130
129
  | Claude plugin | `~/.claude/plugins/cache/llm-wiki/` | `claude plugin update skillwiki@llm-wiki` |
131
- | Local git dev | `~/.hermes/skills/llm-wiki/` | `npm link ./packages/cli` (from repo root) |
132
- **Check versions:** `skillwiki doctor` reports "Plugin/CLI version" mismatch warnings.
133
- **Common issue:** npm package ships SKILL.md files with older `version:` frontmatter than CLI code. This creates false-positive "version warnings" in `skillwiki doctor` the CLI is newer but skills report older version.
134
- **Fix:** If developing locally, use `npm link` from the git repo. If using released versions, wait for maintainer to bump SKILL.md versions in source and republish.
130
+ | Codex plugin | `~/.codex/plugins/cache/llm-wiki/` | `codex plugin marketplace upgrade llm-wiki`, then reinstall or restart Codex as needed |
131
+ | Local git dev | source repo checkout | `npm link ./packages/cli` (from repo root) |
132
+ **Check versions:** `skillwiki doctor` reports Plugin/CLI version mismatch warnings when installed channels disagree.
133
+ **Authoring rule:** `SKILL.md` frontmatter follows the Agent Skills schema: top-level `name` and `description` plus optional schema fields such as `metadata`. Do not put release version fields at the top level of `SKILL.md`; plugin and package release versions live in `plugin.json` and `package.json`.
134
+ **Fix:** If developing locally, use the repo source plus `npm link`. If using released versions, update the relevant plugin or npm channel; do not infer release freshness from `SKILL.md` frontmatter.
135
135
 
136
136
  ## Multi-Wiki Profiles
137
137
  skillwiki supports named wiki profiles for working with multiple vaults. Set `WIKI_DEFAULT` to control which wiki all skills target by default.
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-adapter-prd
4
3
  description: Map foreign PRD formats (CodeStable, RFCs, structured markdown) into skillwiki raw + typed-knowledge pages.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: wiki-add-task
4
3
  description: Capture ad-hoc ideas, bugs, tasks, or notes into the vault with ad-hoc capture frontmatter and descriptive filenames.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-archive
4
3
  description: Archive a superseded typed-knowledge page. Moves page to _archive/, removes from index.md, logs the action.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-audit
4
3
  description: Verify per-page that every ^[raw/...] resolves and sources frontmatter matches the body.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-canvas
4
3
  description: Generate an Obsidian Canvas visualization of the vault graph. Runs skillwiki graph build then skillwiki canvas generate.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-crystallize
4
3
  description: Distill the current working session into a typed-knowledge page with provenance.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-gate-plan-mode
4
3
  description: Toggle EnterPlanMode gating — force superpowers planning skills instead of built-in plan mode
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-ingest
4
3
  description: Convert URLs, files, or pasted text into typed-knowledge pages with raw provenance. Supports single and batch mode.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-init
4
3
  description: Bootstrap a CodeWiki vault — domain-aware SCHEMA.md, index.md, log.md, and ~/.skillwiki/.env binding. Use when starting a fresh vault.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: wiki-lint
4
3
  description: Vault health check via the umbrella `skillwiki lint` subcommand. Read-only by default; rotation requires explicit user consent.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.2
3
2
  name: wiki-query
4
3
  description: Search the vault and synthesize an answer with E2 4-signal ranking. Optional file to queries/ or comparisons/.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.2.1
3
2
  name: wiki-reingest
4
3
  description: Detect and act on source drift. Runs skillwiki drift, reviews changes, archives old raw + ingests new content.
5
4
  ---
@@ -1,5 +1,4 @@
1
1
  ---
2
- version: 0.6.1
3
2
  name: wiki-sync
4
3
  description: Safely sync the vault git repository — multi-session safe via advisory lockfile. Handles rebase conflict storms from archive-commit × snapshot-stream patterns. Runs skillwiki sync status, then guides push or pull with lint guards and conflict resolution.
5
4
  ---