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.
- package/dist/cli.js +34 -18
- package/package.json +1 -1
- package/skills/.claude-plugin/plugin.json +1 -1
- package/skills/.codex-plugin/plugin.json +2 -1
- package/skills/README.md +10 -0
- package/skills/hooks/hooks-codex.json +16 -0
- package/skills/hooks/session-context +112 -0
- package/skills/hooks/session-start +6 -20
- package/skills/hooks/session-start-codex +15 -0
- package/skills/package.json +1 -1
- package/skills/proj-decide/SKILL.md +0 -1
- package/skills/proj-distill/SKILL.md +0 -1
- package/skills/proj-init/SKILL.md +0 -1
- package/skills/proj-work/SKILL.md +0 -1
- package/skills/skills/proj-decide/SKILL.md +0 -1
- package/skills/skills/proj-distill/SKILL.md +0 -1
- package/skills/skills/proj-init/SKILL.md +0 -1
- package/skills/skills/proj-work/SKILL.md +0 -1
- package/skills/skills/using-skillwiki/SKILL.md +6 -6
- package/skills/skills/wiki-adapter-prd/SKILL.md +0 -1
- package/skills/skills/wiki-add-task/SKILL.md +0 -1
- package/skills/skills/wiki-archive/SKILL.md +0 -1
- package/skills/skills/wiki-audit/SKILL.md +0 -1
- package/skills/skills/wiki-canvas/SKILL.md +0 -1
- package/skills/skills/wiki-crystallize/SKILL.md +0 -1
- package/skills/skills/wiki-gate-plan-mode/SKILL.md +0 -1
- package/skills/skills/wiki-ingest/SKILL.md +0 -1
- package/skills/skills/wiki-init/SKILL.md +0 -1
- package/skills/skills/wiki-lint/SKILL.md +0 -1
- package/skills/skills/wiki-query/SKILL.md +0 -1
- package/skills/skills/wiki-reingest/SKILL.md +0 -1
- package/skills/skills/wiki-sync/SKILL.md +0 -1
- package/skills/using-skillwiki/SKILL.md +6 -6
- package/skills/wiki-adapter-prd/SKILL.md +0 -1
- package/skills/wiki-add-task/SKILL.md +0 -1
- package/skills/wiki-archive/SKILL.md +0 -1
- package/skills/wiki-audit/SKILL.md +0 -1
- package/skills/wiki-canvas/SKILL.md +0 -1
- package/skills/wiki-crystallize/SKILL.md +0 -1
- package/skills/wiki-gate-plan-mode/SKILL.md +0 -1
- package/skills/wiki-ingest/SKILL.md +0 -1
- package/skills/wiki-init/SKILL.md +0 -1
- package/skills/wiki-lint/SKILL.md +0 -1
- package/skills/wiki-query/SKILL.md +0 -1
- package/skills/wiki-reingest/SKILL.md +0 -1
- 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
|
|
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 >
|
|
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 >
|
|
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 >
|
|
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 >
|
|
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 =
|
|
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
|
|
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 =
|
|
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 ===
|
|
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 =
|
|
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.
|
|
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.
|
|
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,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
|
-
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
7
|
+
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
source "${SCRIPT_DIR}/session-context"
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
package/skills/package.json
CHANGED
|
@@ -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
|
|
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
|
-
|
|
|
132
|
-
|
|
133
|
-
**
|
|
134
|
-
**
|
|
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.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
|
|
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
|
-
|
|
|
132
|
-
|
|
133
|
-
**
|
|
134
|
-
**
|
|
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.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
|
---
|