@cairnkeep/cli 2.6.0 → 2.8.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.
- package/CHANGELOG.md +35 -1
- package/README.md +45 -8
- package/bin/cairn +21 -3
- package/claude/commands/graphify.md +46 -55
- package/docs/design/meta-agent.md +39 -35
- package/docs/harness-compatibility.md +13 -5
- package/docs/learning/CURRICULUM-MAP.md +10 -3
- package/docs/learning/FEATURE-GUIDE.md +8 -5
- package/docs/learning/README.md +16 -14
- package/docs/learning/lessons/L00-why-cairnkeep.md +1 -5
- package/docs/learning/lessons/L01-safe-trial.md +3 -7
- package/docs/learning/lessons/L02-installation.md +6 -8
- package/docs/learning/lessons/L03-first-project.md +1 -5
- package/docs/learning/lessons/L04-memory-fundamentals.md +0 -6
- package/docs/learning/lessons/L05-daily-workflow.md +0 -5
- package/docs/learning/lessons/L06-repository-quality.md +0 -6
- package/docs/learning/lessons/L07-privacy-and-storage.md +0 -5
- package/docs/learning/lessons/L08-multiple-machines.md +0 -5
- package/docs/learning/lessons/L09-domain-knowledge.md +0 -5
- package/docs/learning/lessons/L10-context-exploration.md +0 -5
- package/docs/learning/lessons/L11-containers.md +0 -5
- package/docs/learning/lessons/L12-managed-overlays.md +0 -6
- package/docs/learning/lessons/L13-session-evidence.md +0 -6
- package/docs/learning/lessons/L14-typed-memory.md +0 -6
- package/docs/learning/lessons/L15-capability-governance.md +0 -6
- package/docs/learning/lessons/L16-evaluation.md +0 -7
- package/docs/learning/lessons/L17-agent-boundary.md +12 -14
- package/docs/learning/lessons/L18-local-code-graph.md +97 -0
- package/docs/learning/lessons/L19-validated-skill-improvement.md +87 -0
- package/docs/learning/templates/lesson-template.md +0 -4
- package/docs/learning/tracks/evidence-and-evaluation.md +5 -3
- package/docs/learning/tracks/practitioner.md +5 -4
- package/docs/operating.md +102 -9
- package/docs/privacy-and-data-flow.md +42 -0
- package/docs/skill-improvement.md +124 -0
- package/docs/storage.md +25 -0
- package/examples/eval/bundled-fake.json +1 -1
- package/kimi/skills/graphify/SKILL.md +33 -0
- package/mcp-memory-server/dist/capability-registry.js +2 -2
- package/mcp-memory-server/dist/eval-plan.js +22 -5
- package/mcp-memory-server/dist/eval-process.js +31 -0
- package/mcp-memory-server/dist/eval-runner.js +10 -4
- package/mcp-memory-server/dist/eval-schema.js +1 -1
- package/mcp-memory-server/dist/eval-workspace.js +50 -1
- package/mcp-memory-server/dist/graph-cli.js +386 -0
- package/mcp-memory-server/dist/skill-cli.js +236 -0
- package/mcp-memory-server/dist/skill-evaluation.js +244 -0
- package/mcp-memory-server/dist/skill-schema.js +164 -0
- package/mcp-memory-server/dist/skill-store.js +583 -0
- package/mcp-memory-server/package.json +3 -1
- package/opencode/command/graphify.md +48 -58
- package/package.json +2 -1
- package/pi/prompts/graphify.md +32 -0
- package/schemas/eval-report.schema.json +1 -1
- package/schemas/skill-adapter.schema.json +39 -0
- package/schemas/skill-proposal-protocol.schema.json +97 -0
- package/scripts/bootstrap.sh +2 -1
- package/scripts/completion.sh +55 -6
- package/scripts/smoke-bash32.sh +1 -0
- package/scripts/sync-kimi-assets.sh +77 -0
- package/scripts/sync-pi-assets.sh +52 -31
- package/scripts/test-bootstrap-untracked.sh +21 -0
- package/scripts/test-cli-dispatch.sh +4 -0
- package/scripts/test-completion.sh +16 -0
- package/scripts/test-graph-harness-adapters.sh +46 -0
- package/scripts/test-launcher-hooks.sh +4 -2
- package/scripts/test-learning-docs.sh +13 -11
- package/scripts/test-package-install.sh +24 -0
- package/scripts/test-skill-cli.sh +30 -0
- package/scripts/test-trajectory-hooks.sh +5 -1
- package/scripts/test-uninstall.sh +12 -2
- package/scripts/uninstall.sh +11 -4
- package/templates/graph-policy.md.template +26 -5
- package/docs/learning/PRODUCTION-PLAN.md +0 -153
- package/docs/learning/instructor-guide.md +0 -66
- package/docs/learning/templates/video-script-template.md +0 -50
- package/docs/learning/video-scripts/L00-why-cairnkeep.md +0 -80
- package/docs/learning/video-scripts/L01-safe-trial.md +0 -78
- package/docs/learning/video-scripts/L02-installation.md +0 -97
- package/docs/learning/video-scripts/L03-first-project.md +0 -99
|
@@ -5,8 +5,8 @@ usage() {
|
|
|
5
5
|
cat <<'EOF'
|
|
6
6
|
Usage: sync-pi-assets.sh [--check|--apply] [--live-root PATH]
|
|
7
7
|
|
|
8
|
-
Compare or sync the repo-managed Pi extension assets against the
|
|
9
|
-
configuration tree.
|
|
8
|
+
Compare or sync the repo-managed Pi extension and prompt assets against the
|
|
9
|
+
live Pi agent configuration tree.
|
|
10
10
|
|
|
11
11
|
Options:
|
|
12
12
|
--check Verify managed live assets match the rendered repo copies (default)
|
|
@@ -20,7 +20,10 @@ ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
|
20
20
|
SOURCE_ROOT="$ROOT_DIR/pi"
|
|
21
21
|
LIVE_ROOT="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
|
|
22
22
|
MODE="check"
|
|
23
|
-
|
|
23
|
+
ASSETS=(
|
|
24
|
+
"extensions/cairnkeep-trajectory.ts"
|
|
25
|
+
"prompts/graphify.md"
|
|
26
|
+
)
|
|
24
27
|
|
|
25
28
|
while [[ $# -gt 0 ]]; do
|
|
26
29
|
case "$1" in
|
|
@@ -33,40 +36,58 @@ while [[ $# -gt 0 ]]; do
|
|
|
33
36
|
done
|
|
34
37
|
|
|
35
38
|
render_asset() {
|
|
36
|
-
|
|
39
|
+
local rel="$1"
|
|
40
|
+
if [[ "$rel" == "extensions/cairnkeep-trajectory.ts" ]]; then
|
|
41
|
+
sed "s|@@INFRA_ROOT@@|$ROOT_DIR|g" "$SOURCE_ROOT/$rel"
|
|
42
|
+
else
|
|
43
|
+
cat "$SOURCE_ROOT/$rel"
|
|
44
|
+
fi
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
ensure_sources() {
|
|
48
|
+
local rel
|
|
49
|
+
for rel in "${ASSETS[@]}"; do
|
|
50
|
+
[[ -f "$SOURCE_ROOT/$rel" ]] || {
|
|
51
|
+
echo "Missing repo-managed source asset: $SOURCE_ROOT/$rel" >&2
|
|
52
|
+
return 2
|
|
53
|
+
}
|
|
54
|
+
done
|
|
37
55
|
}
|
|
38
56
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
check_assets() {
|
|
58
|
+
local rel
|
|
59
|
+
local failed=0
|
|
60
|
+
for rel in "${ASSETS[@]}"; do
|
|
61
|
+
if [[ ! -f "$LIVE_ROOT/$rel" ]]; then
|
|
62
|
+
echo "Missing live Pi asset under $LIVE_ROOT: $rel" >&2
|
|
63
|
+
failed=1
|
|
64
|
+
elif ! cmp -s <(render_asset "$rel") "$LIVE_ROOT/$rel"; then
|
|
65
|
+
echo "Out-of-sync live Pi asset under $LIVE_ROOT: $rel" >&2
|
|
66
|
+
failed=1
|
|
67
|
+
fi
|
|
68
|
+
done
|
|
69
|
+
return "$failed"
|
|
52
70
|
}
|
|
53
71
|
|
|
72
|
+
ensure_sources
|
|
73
|
+
|
|
54
74
|
if [[ "$MODE" == "apply" ]]; then
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
75
|
+
updated=0
|
|
76
|
+
unchanged=0
|
|
77
|
+
for rel in "${ASSETS[@]}"; do
|
|
78
|
+
mkdir -p "$(dirname "$LIVE_ROOT/$rel")"
|
|
79
|
+
if [[ -f "$LIVE_ROOT/$rel" ]] && cmp -s <(render_asset "$rel") "$LIVE_ROOT/$rel"; then
|
|
80
|
+
unchanged=$((unchanged + 1))
|
|
81
|
+
continue
|
|
82
|
+
fi
|
|
63
83
|
rendered_tmp=$(mktemp)
|
|
64
|
-
render_asset > "$rendered_tmp"
|
|
65
|
-
install -m 0644 "$rendered_tmp" "$LIVE_ROOT/$
|
|
84
|
+
render_asset "$rel" > "$rendered_tmp"
|
|
85
|
+
install -m 0644 "$rendered_tmp" "$LIVE_ROOT/$rel"
|
|
66
86
|
rm -f "$rendered_tmp"
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
updated=$((updated + 1))
|
|
88
|
+
done
|
|
89
|
+
printf 'Applied %s Pi asset(s); %s already matched.\n' "$updated" "$unchanged"
|
|
69
90
|
fi
|
|
70
91
|
|
|
71
|
-
|
|
72
|
-
printf 'Pi extension
|
|
92
|
+
check_assets
|
|
93
|
+
printf 'Pi extension and graph prompt are in sync under %s\n' "$LIVE_ROOT"
|
|
@@ -56,6 +56,27 @@ git -C "$tmp/repo" init -q
|
|
|
56
56
|
[[ -x "$tmp/repo/.ai/start-kimi.sh" ]] || fail "Kimi launcher missing"
|
|
57
57
|
[[ -x "$tmp/repo/.ai/start-qwen.sh" ]] || fail "Qwen launcher missing"
|
|
58
58
|
[[ -f "$tmp/repo/.planning/config.json" ]] || fail "planning layer missing"
|
|
59
|
+
graph_policy="$tmp/repo/.planning/graphs/policy.md"
|
|
60
|
+
grep -qF '`uv tool install graphifyy`' "$graph_policy" ||
|
|
61
|
+
fail "Graphify policy must install the CLI in an isolated uv tool environment"
|
|
62
|
+
if grep -qF '`uv pip install graphifyy && graphify install`' "$graph_policy"; then
|
|
63
|
+
fail "Graphify policy must not install Graphify-owned skills or hooks"
|
|
64
|
+
fi
|
|
65
|
+
if ! grep -qF 'Do not run' "$graph_policy" ||
|
|
66
|
+
! grep -qF '`graphify install`: Cairnkeep owns' "$graph_policy"; then
|
|
67
|
+
fail "Graphify policy must explain that Cairnkeep owns the harness wiring"
|
|
68
|
+
fi
|
|
69
|
+
grep -qF '`/graphify build`' "$graph_policy" ||
|
|
70
|
+
fail "Graphify policy must name Cairnkeep's installed build command"
|
|
71
|
+
grep -qF '`cairn sync-kimi' "$graph_policy" ||
|
|
72
|
+
fail "Graphify policy must identify the Kimi thin adapter"
|
|
73
|
+
grep -qF '`cairn sync-pi' "$graph_policy" ||
|
|
74
|
+
fail "Graphify policy must identify the Pi thin adapter"
|
|
75
|
+
grep -qF '`cairn graph build`' "$graph_policy" ||
|
|
76
|
+
fail "Graphify policy must provide the portable CLI equivalent"
|
|
77
|
+
if grep -qF '/gsd-graphify' "$graph_policy"; then
|
|
78
|
+
fail "Graphify policy must not name the GSD-internal command"
|
|
79
|
+
fi
|
|
59
80
|
[[ -f "$tmp/repo/.agentfs/.gitignore" ]] || fail "project-memory ignore guard missing"
|
|
60
81
|
[[ -z "$(git -C "$tmp/repo" status --porcelain)" ]] || fail "scaffold visible to git"
|
|
61
82
|
grep -qxF "/.ai/" "$tmp/repo/.git/info/exclude" || fail "missing /.ai/ exclude entry"
|
|
@@ -11,15 +11,19 @@ tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT
|
|
|
11
11
|
"$cairn" help | grep -q "cairn audit-timer" || fail "help missing audit-timer"
|
|
12
12
|
"$cairn" help | grep -q "cairn sync" || fail "help missing sync"
|
|
13
13
|
"$cairn" help | grep -q "cairn sync-pi" || fail "help missing sync-pi"
|
|
14
|
+
"$cairn" help | grep -q "cairn sync-kimi" || fail "help missing sync-kimi"
|
|
14
15
|
"$cairn" help | grep -q "cairn memory-server" || fail "help missing memory-server"
|
|
15
16
|
"$cairn" help | grep -q "cairn notes" || fail "help missing notes"
|
|
16
17
|
"$cairn" help | grep -q "cairn artifact <list|show|delete|prune>" || fail "help missing artifact"
|
|
17
18
|
"$cairn" help | grep -q "cairn capabilities <list|status|enable|disable|reset|logging>" || fail "help missing capabilities"
|
|
19
|
+
"$cairn" help | grep -q "cairn graph <build|query|status|diff|explain|path>" || fail "help missing graph"
|
|
18
20
|
"$cairn" sync --help >/dev/null 2>&1 || fail "cairn sync dispatch"
|
|
19
21
|
"$cairn" sync-pi --help >/dev/null 2>&1 || fail "cairn sync-pi dispatch"
|
|
22
|
+
"$cairn" sync-kimi --help >/dev/null 2>&1 || fail "cairn sync-kimi dispatch"
|
|
20
23
|
env -u CAIRN_NOTE_DISTILLATION "$cairn" notes --help >/dev/null 2>&1 || fail "cairn notes dispatch"
|
|
21
24
|
"$cairn" artifact --help | grep -q "cairn artifact list" || fail "cairn artifact dispatch"
|
|
22
25
|
"$cairn" capabilities --help >"$tmp/capabilities-help" 2>/dev/null || fail "cairn capabilities dispatch"
|
|
26
|
+
"$cairn" graph --help | grep -q "cairn graph explain <symbol>" || fail "cairn graph dispatch"
|
|
23
27
|
grep -qxF 'MCP capability changes require a memory-server restart. Operating capability' "$tmp/capabilities-help" || fail "capability help missing exact restart wording"
|
|
24
28
|
grep -qxF 'changes apply on the next invocation.' "$tmp/capabilities-help" || fail "capability help missing exact invocation wording"
|
|
25
29
|
if grep -Eq '^ cairn capabilities (guard|start|finish|doctor)' "$tmp/capabilities-help"; then
|
|
@@ -14,6 +14,7 @@ done
|
|
|
14
14
|
capability_ids='memory.write memory.search notes.distill wiki graph security.audit route.check context.explore'
|
|
15
15
|
eval_commands='validate run ablate report prune delete'
|
|
16
16
|
eval_flags='--task-set --adapter --output --repetitions --seed --json --yes --disable --experiment --older-than-days --dry-run'
|
|
17
|
+
skill_commands='harvest list show review propose evaluate apply rollback'
|
|
17
18
|
for shell in bash zsh fish; do
|
|
18
19
|
grep -q 'capabilities' "$tmp/$shell"
|
|
19
20
|
grep -q 'list.*status.*enable.*disable.*reset.*logging\|list status enable disable reset logging' "$tmp/$shell"
|
|
@@ -37,6 +38,11 @@ for shell in bash zsh fish; do
|
|
|
37
38
|
echo "completion exposed a private eval lifecycle operation for $shell" >&2
|
|
38
39
|
exit 1
|
|
39
40
|
fi
|
|
41
|
+
grep -q 'skill' "$tmp/$shell"
|
|
42
|
+
grep -q 'harvest.*list.*show.*review.*propose.*evaluate.*apply.*rollback\|harvest list show review propose evaluate apply rollback' "$tmp/$shell"
|
|
43
|
+
for skill_flag in --candidate --exploration-task-set --confirmation-task-set --evaluation --application --confirm; do
|
|
44
|
+
grep -q -- "$skill_flag\|-l ${skill_flag#--}" "$tmp/$shell"
|
|
45
|
+
done
|
|
40
46
|
done
|
|
41
47
|
|
|
42
48
|
"$ROOT/bin/cairn" help >"$tmp/root-help"
|
|
@@ -52,6 +58,11 @@ if grep -q 'doctor-diagnosis' "$tmp/eval-help"; then
|
|
|
52
58
|
echo 'eval help exposed a private lifecycle operation' >&2
|
|
53
59
|
exit 1
|
|
54
60
|
fi
|
|
61
|
+
grep -qF 'cairn skill <harvest|list|show|review|propose|evaluate|apply|rollback>' "$tmp/root-help"
|
|
62
|
+
node "$ROOT/mcp-memory-server/dist/skill-cli.js" --help >"$tmp/skill-help"
|
|
63
|
+
for command in $skill_commands; do
|
|
64
|
+
grep -q "cairn skill $command" "$tmp/skill-help"
|
|
65
|
+
done
|
|
55
66
|
|
|
56
67
|
node - "$ROOT/mcp-memory-server/src/capability-registry.ts" "$tmp/bash" "$tmp/zsh" "$tmp/fish" <<'NODE'
|
|
57
68
|
const fs = require("fs");
|
|
@@ -71,14 +82,19 @@ grep -q '#compdef cairn' "$tmp/zsh"
|
|
|
71
82
|
grep -q 'complete -c cairn' "$tmp/fish"
|
|
72
83
|
for shell in bash zsh; do
|
|
73
84
|
grep -q 'sync-pi' "$tmp/$shell"
|
|
85
|
+
grep -q 'sync-kimi' "$tmp/$shell"
|
|
74
86
|
grep -q -- '--live-root' "$tmp/$shell"
|
|
75
87
|
done
|
|
76
88
|
grep -q 'sync-pi' "$tmp/fish"
|
|
89
|
+
grep -q 'sync-kimi' "$tmp/fish"
|
|
90
|
+
grep -q 'not __fish_seen_subcommand_from .*sync-pi sync-kimi' "$tmp/fish"
|
|
77
91
|
grep -q -- '-l live-root' "$tmp/fish"
|
|
78
92
|
for shell in bash zsh fish; do
|
|
79
93
|
grep -q 'notes' "$tmp/$shell"
|
|
80
94
|
grep -q 'distill.*search-error.*promote.*doctor\|distill search-error promote doctor' "$tmp/$shell"
|
|
81
95
|
grep -q 'artifact' "$tmp/$shell"
|
|
96
|
+
grep -q 'graph' "$tmp/$shell"
|
|
97
|
+
grep -q 'build.*query.*status.*diff.*explain.*path\|build query status diff explain path' "$tmp/$shell"
|
|
82
98
|
grep -q 'list.*show.*delete.*prune' "$tmp/$shell"
|
|
83
99
|
grep -q -- '--json\|-l json' "$tmp/$shell"
|
|
84
100
|
grep -q -- '--dry-run\|-l dry-run' "$tmp/$shell"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Contract test: Pi and Kimi expose thin graph adapters owned by `cairn graph`.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
6
|
+
tmp=$(mktemp -d)
|
|
7
|
+
trap 'rm -rf "$tmp"' EXIT
|
|
8
|
+
fail() { echo "FAIL: $1" >&2; exit 1; }
|
|
9
|
+
|
|
10
|
+
PI_SOURCE="$ROOT/pi/prompts/graphify.md"
|
|
11
|
+
KIMI_SOURCE="$ROOT/kimi/skills/graphify/SKILL.md"
|
|
12
|
+
|
|
13
|
+
[[ -f "$PI_SOURCE" ]] || fail "Pi /graphify prompt source is missing"
|
|
14
|
+
[[ -f "$KIMI_SOURCE" ]] || fail "Kimi graphify skill source is missing"
|
|
15
|
+
|
|
16
|
+
for adapter in "$PI_SOURCE" "$KIMI_SOURCE"; do
|
|
17
|
+
grep -qF 'cairn graph' "$adapter" || fail "adapter does not delegate to cairn graph: $adapter"
|
|
18
|
+
if grep -Ei '(^|[^/[:alnum:]_-])graphify[[:space:]]+(build|update|query|status|diff|explain|path)' "$adapter" >/dev/null; then
|
|
19
|
+
fail "adapter invokes Graphify directly: $adapter"
|
|
20
|
+
fi
|
|
21
|
+
if grep -Ei '(^|[[:space:]`])(curl|git|node|npm|npx|python|python3)[[:space:]]' "$adapter" >/dev/null; then
|
|
22
|
+
fail "adapter introduces a second executable delegate: $adapter"
|
|
23
|
+
fi
|
|
24
|
+
done
|
|
25
|
+
|
|
26
|
+
grep -qF '$ARGUMENTS' "$PI_SOURCE" || fail "Pi prompt does not forward command arguments"
|
|
27
|
+
grep -qF 'name: graphify' "$KIMI_SOURCE" || fail "Kimi skill does not register as graphify"
|
|
28
|
+
grep -qF '$ARGUMENTS' "$KIMI_SOURCE" || fail "Kimi skill does not forward command arguments"
|
|
29
|
+
|
|
30
|
+
PI_LIVE="$tmp/pi"
|
|
31
|
+
"$ROOT/scripts/sync-pi-assets.sh" --apply --live-root "$PI_LIVE" >"$tmp/pi-first"
|
|
32
|
+
[[ -f "$PI_LIVE/extensions/cairnkeep-trajectory.ts" ]] || fail "Pi sync omitted trajectory extension"
|
|
33
|
+
cmp -s "$PI_SOURCE" "$PI_LIVE/prompts/graphify.md" || fail "Pi sync changed graphify prompt bytes"
|
|
34
|
+
"$ROOT/scripts/sync-pi-assets.sh" --apply --live-root "$PI_LIVE" >"$tmp/pi-second"
|
|
35
|
+
grep -qF 'Applied 0 Pi asset(s); 2 already matched.' "$tmp/pi-second" || fail "Pi sync is not idempotent"
|
|
36
|
+
|
|
37
|
+
KIMI_LIVE="$tmp/kimi"
|
|
38
|
+
"$ROOT/scripts/sync-kimi-assets.sh" --apply --live-root "$KIMI_LIVE" >"$tmp/kimi-first"
|
|
39
|
+
cmp -s "$KIMI_SOURCE" "$KIMI_LIVE/skills/graphify/SKILL.md" || fail "Kimi sync changed graphify skill bytes"
|
|
40
|
+
"$ROOT/scripts/sync-kimi-assets.sh" --apply --live-root "$KIMI_LIVE" >"$tmp/kimi-second"
|
|
41
|
+
grep -qF 'Applied 0 Kimi asset(s); 1 already matched.' "$tmp/kimi-second" || fail "Kimi sync is not idempotent"
|
|
42
|
+
|
|
43
|
+
"$ROOT/bin/cairn" help | grep -qF 'cairn sync-kimi' || fail "CLI help omits sync-kimi"
|
|
44
|
+
"$ROOT/bin/cairn" sync-kimi --help >/dev/null || fail "CLI does not dispatch sync-kimi"
|
|
45
|
+
|
|
46
|
+
echo "PASS: thin Pi and Kimi graph adapters delegate only to cairn graph"
|
|
@@ -433,8 +433,10 @@ qwen_launcher="$repo/.ai/start-qwen.sh"
|
|
|
433
433
|
# than requiring a standalone banner before the config gate.
|
|
434
434
|
! grep -qF '**Before ANY tool calls**, display this banner:' "$ROOT/opencode/command/graphify.md" \
|
|
435
435
|
|| fail "OpenCode graphify can stop after its pre-tool banner"
|
|
436
|
-
grep -qF '**First action:** invoke the Read tool' "$ROOT/opencode/command/graphify.md" \
|
|
437
|
-
|| fail "OpenCode graphify
|
|
436
|
+
! grep -qF '**First action:** invoke the Read tool' "$ROOT/opencode/command/graphify.md" \
|
|
437
|
+
|| fail "OpenCode graphify still duplicates the Cairnkeep-owned capability gate"
|
|
438
|
+
grep -qF '`cairn graph` operation enforces the typed `graph` capability' "$ROOT/opencode/command/graphify.md" \
|
|
439
|
+
|| fail "OpenCode graphify does not delegate its capability gate to the owner"
|
|
438
440
|
grep -qF '**Invoke the shell tool** with this exact command' "$ROOT/opencode/command/graphify.md" \
|
|
439
441
|
|| fail "OpenCode graphify does not require real shell delegation"
|
|
440
442
|
grep -qF '<argument>$ARGUMENTS</argument>' "$ROOT/opencode/command/graphify.md" \
|
|
@@ -6,11 +6,10 @@ cd "$ROOT"
|
|
|
6
6
|
|
|
7
7
|
version=$(node -p "require('./package.json').version")
|
|
8
8
|
landing=docs/learning/README.md
|
|
9
|
-
production=docs/learning/PRODUCTION-PLAN.md
|
|
10
9
|
coverage=docs/learning/CURRICULUM-MAP.md
|
|
11
10
|
feature_guide=docs/learning/FEATURE-GUIDE.md
|
|
12
11
|
|
|
13
|
-
[[ -f "$landing" && -f "$
|
|
12
|
+
[[ -f "$landing" && -f "$coverage" && -f "$feature_guide" ]]
|
|
14
13
|
grep -qF 'docs/learning/README.md' README.md
|
|
15
14
|
grep -qF "**Baseline:** Cairnkeep $version" "$coverage"
|
|
16
15
|
grep -qF "**Baseline:** Cairnkeep $version" "$feature_guide"
|
|
@@ -22,7 +21,7 @@ done
|
|
|
22
21
|
|
|
23
22
|
ready=0
|
|
24
23
|
brief=0
|
|
25
|
-
for number in $(seq -w 0
|
|
24
|
+
for number in $(seq -w 0 19); do
|
|
26
25
|
matches=(docs/learning/lessons/L"$number"-*.md)
|
|
27
26
|
[[ ${#matches[@]} -eq 1 && -f ${matches[0]} ]] || {
|
|
28
27
|
echo "learning path must contain exactly one L$number lesson" >&2
|
|
@@ -33,24 +32,27 @@ for number in $(seq -w 0 17); do
|
|
|
33
32
|
if grep -q '^\*\*Status:\*\* Ready' "$lesson"; then
|
|
34
33
|
ready=$((ready + 1))
|
|
35
34
|
grep -qF "Tested with:** Cairnkeep $version" "$lesson"
|
|
36
|
-
script=$(sed -n 's|.*(\.\./video-scripts/\([^)]*\)).*|docs/learning/video-scripts/\1|p' "$lesson")
|
|
37
|
-
[[ -n "$script" && -f "$script" ]] || {
|
|
38
|
-
echo "ready lesson has no presenter script: $lesson" >&2
|
|
39
|
-
exit 1
|
|
40
|
-
}
|
|
41
35
|
grep -q '^## Common failures$' "$lesson"
|
|
42
36
|
grep -q '^## Privacy and trust boundary$' "$lesson"
|
|
43
37
|
elif grep -q '^\*\*Status:\*\* Brief' "$lesson"; then
|
|
44
38
|
brief=$((brief + 1))
|
|
45
39
|
grep -q '^## Acceptance criteria$' "$lesson"
|
|
46
|
-
grep -q '^## Planned video$' "$lesson"
|
|
47
40
|
else
|
|
48
41
|
echo "lesson has an unsupported status: $lesson" >&2
|
|
49
42
|
exit 1
|
|
50
43
|
fi
|
|
51
44
|
done
|
|
52
45
|
|
|
53
|
-
|
|
46
|
+
graph_lesson=docs/learning/lessons/L18-local-code-graph.md
|
|
47
|
+
for mode in build query status diff explain path; do
|
|
48
|
+
grep -qF "cairn graph $mode" "$graph_lesson"
|
|
49
|
+
done
|
|
50
|
+
grep -qF 'Do not run `graphify install`' "$graph_lesson"
|
|
51
|
+
grep -qF '`cairn sync-kimi --apply`' "$graph_lesson"
|
|
52
|
+
grep -qF '`cairn sync-pi --apply`' "$graph_lesson"
|
|
53
|
+
grep -qF '`graphify-out/`' "$graph_lesson"
|
|
54
|
+
|
|
55
|
+
[[ $ready -eq 4 && $brief -eq 16 ]] || {
|
|
54
56
|
echo "unexpected learning status totals: ready=$ready brief=$brief" >&2
|
|
55
57
|
exit 1
|
|
56
58
|
}
|
|
@@ -91,4 +93,4 @@ for (const file of markdownFiles("docs/learning")) {
|
|
|
91
93
|
}
|
|
92
94
|
NODE
|
|
93
95
|
|
|
94
|
-
echo "PASS: learning path structure, readiness,
|
|
96
|
+
echo "PASS: public learning path structure, readiness, links, and version alignment"
|
|
@@ -19,6 +19,7 @@ server_dev_dependencies_before=$(manifest_field "$ROOT/mcp-memory-server/package
|
|
|
19
19
|
root_lock_before=$(sha256sum "$ROOT/package-lock.json" | cut -d' ' -f1)
|
|
20
20
|
server_lock_before=$(sha256sum "$ROOT/mcp-memory-server/package-lock.json" | cut -d' ' -f1)
|
|
21
21
|
node "$ROOT/mcp-memory-server/dist/eval-cli.js" --help >"$tmp/source-eval-help"
|
|
22
|
+
node "$ROOT/mcp-memory-server/dist/skill-cli.js" --help >"$tmp/source-skill-help"
|
|
22
23
|
env -u CAIRN_EVAL "$ROOT/bin/cairn" eval validate \
|
|
23
24
|
--task-set "$tmp/source-unread-task-set" \
|
|
24
25
|
--adapter "$tmp/source-unread-adapter" \
|
|
@@ -52,6 +53,11 @@ env -u CAIRN_NOTE_DISTILLATION cairn notes --help >/dev/null \
|
|
|
52
53
|
|| fail "installed package omitted the notes command"
|
|
53
54
|
|
|
54
55
|
installed_root="$tmp/prefix/lib/node_modules/@cairnkeep/cli"
|
|
56
|
+
cairn skill --help >"$tmp/installed-skill-help"
|
|
57
|
+
cmp -s "$tmp/source-skill-help" "$tmp/installed-skill-help" || \
|
|
58
|
+
fail "source and installed skill help differ"
|
|
59
|
+
cairn skill list --project "$tmp/project" --json >"$tmp/installed-skill-list.json" || \
|
|
60
|
+
fail "installed package skill list failed"
|
|
55
61
|
cairn eval --help >"$tmp/installed-eval-help"
|
|
56
62
|
cmp -s "$tmp/source-eval-help" "$tmp/installed-eval-help" || \
|
|
57
63
|
fail "source and installed eval help differ"
|
|
@@ -80,6 +86,18 @@ do
|
|
|
80
86
|
[[ -f "$installed_root/$required" ]] || fail "npm tarball omitted $required"
|
|
81
87
|
done
|
|
82
88
|
|
|
89
|
+
for required in \
|
|
90
|
+
schemas/skill-adapter.schema.json \
|
|
91
|
+
schemas/skill-proposal-protocol.schema.json \
|
|
92
|
+
mcp-memory-server/dist/skill-schema.js \
|
|
93
|
+
mcp-memory-server/dist/skill-store.js \
|
|
94
|
+
mcp-memory-server/dist/skill-evaluation.js \
|
|
95
|
+
mcp-memory-server/dist/skill-cli.js \
|
|
96
|
+
docs/skill-improvement.md
|
|
97
|
+
do
|
|
98
|
+
[[ -f "$installed_root/$required" ]] || fail "npm tarball omitted $required"
|
|
99
|
+
done
|
|
100
|
+
|
|
83
101
|
for required in \
|
|
84
102
|
schemas/eval-task-set.schema.json \
|
|
85
103
|
schemas/eval-adapter.schema.json \
|
|
@@ -218,8 +236,14 @@ NODE
|
|
|
218
236
|
fail "npm tarball omitted the default AnythingLLM sync script"
|
|
219
237
|
[[ -f "$installed_root/pi/extensions/cairnkeep-trajectory.ts" ]] || \
|
|
220
238
|
fail "npm tarball omitted the Pi trajectory extension"
|
|
239
|
+
[[ -f "$installed_root/pi/prompts/graphify.md" ]] || \
|
|
240
|
+
fail "npm tarball omitted the Pi graph prompt"
|
|
241
|
+
[[ -f "$installed_root/kimi/skills/graphify/SKILL.md" ]] || \
|
|
242
|
+
fail "npm tarball omitted the Kimi graph Skill"
|
|
221
243
|
[[ -x "$installed_root/scripts/sync-pi-assets.sh" ]] || \
|
|
222
244
|
fail "npm tarball omitted the Pi sync command"
|
|
245
|
+
[[ -x "$installed_root/scripts/sync-kimi-assets.sh" ]] || \
|
|
246
|
+
fail "npm tarball omitted the Kimi sync command"
|
|
223
247
|
[[ -f "$installed_root/templates/start-pi.sh.template" ]] || \
|
|
224
248
|
fail "npm tarball omitted the Pi launcher template"
|
|
225
249
|
[[ -f "$installed_root/templates/start-kimi.sh.template" ]] || \
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
5
|
+
tmp=$(mktemp -d)
|
|
6
|
+
trap 'rm -rf "$tmp"' EXIT
|
|
7
|
+
|
|
8
|
+
node "$ROOT/mcp-memory-server/dist/skill-cli.js" --help >"$tmp/help"
|
|
9
|
+
for operation in harvest list show review propose evaluate apply rollback; do
|
|
10
|
+
grep -q "$operation" "$tmp/help" || { echo "FAIL: skill help omitted $operation" >&2; exit 1; }
|
|
11
|
+
done
|
|
12
|
+
|
|
13
|
+
mkdir -p "$tmp/project"
|
|
14
|
+
node "$ROOT/mcp-memory-server/dist/skill-cli.js" list --project "$tmp/project" --json >"$tmp/list.json"
|
|
15
|
+
node -e '
|
|
16
|
+
const value = require(process.argv[1]);
|
|
17
|
+
for (const key of ["candidates", "proposals", "evaluations", "applications"]) {
|
|
18
|
+
if (!Array.isArray(value[key]) || value[key].length !== 0) process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
' "$tmp/list.json"
|
|
21
|
+
|
|
22
|
+
if env -u CAIRN_EVAL node "$ROOT/mcp-memory-server/dist/skill-cli.js" evaluate \
|
|
23
|
+
--project "$tmp/project" --proposal missing --exploration-task-set missing \
|
|
24
|
+
--confirmation-task-set missing --adapter missing --yes >"$tmp/out" 2>"$tmp/err"; then
|
|
25
|
+
echo "FAIL: disabled skill evaluation succeeded" >&2
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
grep -q 'disabled' "$tmp/err" || { echo "FAIL: disabled skill evaluation did not fail closed" >&2; exit 1; }
|
|
29
|
+
|
|
30
|
+
echo "PASS: installed-style skill CLI discovery and default-off gate"
|
|
@@ -127,6 +127,8 @@ pi_live="$tmp/pi-live"
|
|
|
127
127
|
render "$ROOT/pi/extensions/cairnkeep-trajectory.ts" "$tmp/expected-pi-capture.ts"
|
|
128
128
|
cmp -s "$tmp/expected-pi-capture.ts" "$pi_live/extensions/cairnkeep-trajectory.ts" \
|
|
129
129
|
|| fail "installed Pi trajectory extension differs from rendered source"
|
|
130
|
+
cmp -s "$ROOT/pi/prompts/graphify.md" "$pi_live/prompts/graphify.md" \
|
|
131
|
+
|| fail "installed Pi graph prompt differs from source"
|
|
130
132
|
[[ $(find "$pi_live" -type f -name 'cairnkeep-trajectory.ts' | wc -l) -eq 1 ]] \
|
|
131
133
|
|| fail "Pi trajectory extension is duplicated"
|
|
132
134
|
|
|
@@ -136,7 +138,9 @@ cmp -s "$tmp/expected-pi-capture.ts" "$pi_live/extensions/cairnkeep-trajectory.t
|
|
|
136
138
|
|| fail "Claude memory-capture hook registration is missing or duplicated"
|
|
137
139
|
[[ $(grep -c 'plugins/memory-capture.ts' "$ROOT/scripts/sync-opencode-plugin-assets.sh") -eq 1 ]] \
|
|
138
140
|
|| fail "OpenCode memory-capture plugin asset is missing or duplicated"
|
|
139
|
-
[[ $(grep -c 'extensions/cairnkeep-trajectory.ts' "$ROOT/scripts/sync-pi-assets.sh") -eq 1 ]] \
|
|
141
|
+
[[ $(grep -c '^ "extensions/cairnkeep-trajectory.ts"' "$ROOT/scripts/sync-pi-assets.sh") -eq 1 ]] \
|
|
140
142
|
|| fail "Pi trajectory extension asset is missing or duplicated"
|
|
143
|
+
[[ $(grep -c '^ "prompts/graphify.md"' "$ROOT/scripts/sync-pi-assets.sh") -eq 1 ]] \
|
|
144
|
+
|| fail "Pi graph prompt asset is missing or duplicated"
|
|
141
145
|
|
|
142
146
|
echo "PASS: Claude/OpenCode/Pi trajectory hooks and flag-off regression"
|
|
@@ -82,12 +82,14 @@ chmod +x "$SB/bin/"*
|
|
|
82
82
|
export HOME="$SB/home" XDG_CONFIG_HOME="$SB/home/.config" PATH="$SB/bin:$PATH"
|
|
83
83
|
LIVE="$SB/live"
|
|
84
84
|
PI_LIVE="$SB/pi-live"
|
|
85
|
+
KIMI_LIVE="$SB/kimi-live"
|
|
85
86
|
|
|
86
87
|
echo "test-uninstall"
|
|
87
88
|
|
|
88
89
|
# --- install the operating layer -------------------------------------------
|
|
89
90
|
"$ROOT_DIR/scripts/sync-claude-assets.sh" --apply --live-root "$LIVE" >/dev/null 2>&1
|
|
90
91
|
"$ROOT_DIR/scripts/sync-pi-assets.sh" --apply --live-root "$PI_LIVE" >/dev/null 2>&1
|
|
92
|
+
"$ROOT_DIR/scripts/sync-kimi-assets.sh" --apply --live-root "$KIMI_LIVE" >/dev/null 2>&1
|
|
91
93
|
md_installed=$(find "$LIVE" -type f -name '*.md' | wc -l | tr -d ' ')
|
|
92
94
|
check "assets installed" "$([[ $md_installed -gt 0 ]] && echo yes || echo no)" "yes"
|
|
93
95
|
check "managed hooks registered" "$(managed_hook_count "$LIVE/settings.json")" "5"
|
|
@@ -105,6 +107,8 @@ fs.writeFileSync(path, JSON.stringify(settings, null, 2) + "\n")
|
|
|
105
107
|
NODE
|
|
106
108
|
cp "$LIVE/settings.json" "$SB/settings.before.json"
|
|
107
109
|
cp "$PI_LIVE/extensions/cairnkeep-trajectory.ts" "$SB/pi.before.ts"
|
|
110
|
+
cp "$PI_LIVE/prompts/graphify.md" "$SB/pi-graph.before.md"
|
|
111
|
+
cp "$KIMI_LIVE/skills/graphify/SKILL.md" "$SB/kimi-graph.before.md"
|
|
108
112
|
mkdir -p "$SB/home/.cairnkeep/notes/projects/example/hindsight"
|
|
109
113
|
printf 'durable note bytes\n' >"$SB/home/.cairnkeep/notes/projects/example/hindsight/failure.md"
|
|
110
114
|
mkdir -p "$SB/home/.cairnkeep/notes/.cairnkeep/history/project-notes/knowledge/example" \
|
|
@@ -204,10 +208,12 @@ overlay_before=$(tree_hash "$PROJECT_DATA/.ai/capability-contract")
|
|
|
204
208
|
project_before=$(tree_hash "$PROJECT_DATA")
|
|
205
209
|
|
|
206
210
|
# --- dry-run must change nothing -------------------------------------------
|
|
207
|
-
"$ROOT_DIR/scripts/uninstall.sh" --dry-run --live-root "$LIVE" --pi-live-root "$PI_LIVE" "$PROJECT_DATA" >/dev/null 2>&1
|
|
211
|
+
"$ROOT_DIR/scripts/uninstall.sh" --dry-run --live-root "$LIVE" --pi-live-root "$PI_LIVE" --kimi-live-root "$KIMI_LIVE" "$PROJECT_DATA" >/dev/null 2>&1
|
|
208
212
|
check "dry-run leaves assets" "$(find "$LIVE" -type f -name '*.md' | wc -l | tr -d ' ')" "$md_installed"
|
|
209
213
|
check "dry-run makes no bundle" "$(ls -d "$SB/home/.cairnkeep-uninstall-"* 2>/dev/null | wc -l | tr -d ' ')" "0"
|
|
210
214
|
check "dry-run leaves Pi extension" "$([[ -f "$PI_LIVE/extensions/cairnkeep-trajectory.ts" ]] && echo yes || echo no)" "yes"
|
|
215
|
+
check "dry-run leaves Pi graph prompt" "$([[ -f "$PI_LIVE/prompts/graphify.md" ]] && echo yes || echo no)" "yes"
|
|
216
|
+
check "dry-run leaves Kimi graph Skill" "$([[ -f "$KIMI_LIVE/skills/graphify/SKILL.md" ]] && echo yes || echo no)" "yes"
|
|
211
217
|
check "dry-run leaves settings identical" "$(cmp -s "$SB/settings.before.json" "$LIVE/settings.json" && echo yes || echo no)" "yes"
|
|
212
218
|
check "dry-run leaves artifact bytes exact" "$(cmp -s "$SB/artifacts.before.db" "$PROJECT_DATA/.agentfs/artifacts.db" && echo yes || echo no)" "yes"
|
|
213
219
|
check "dry-run leaves eval tree, bytes, and modes exact" "$(tree_identity "$PROJECT_DATA/.agentfs/eval")" "$eval_before"
|
|
@@ -216,11 +222,13 @@ check "dry-run leaves adjacent project exact" "$(tree_identity "$ADJACENT_PROJEC
|
|
|
216
222
|
check "dry-run leaves project state byte-identical" "$(tree_hash "$PROJECT_DATA")" "$project_before"
|
|
217
223
|
|
|
218
224
|
# --- real uninstall ---------------------------------------------------------
|
|
219
|
-
"$ROOT_DIR/scripts/uninstall.sh" --yes --live-root "$LIVE" --pi-live-root "$PI_LIVE" "$PROJECT_DATA" >/dev/null 2>&1
|
|
225
|
+
"$ROOT_DIR/scripts/uninstall.sh" --yes --live-root "$LIVE" --pi-live-root "$PI_LIVE" --kimi-live-root "$KIMI_LIVE" "$PROJECT_DATA" >/dev/null 2>&1
|
|
220
226
|
check "assets removed" "$(find "$LIVE" -type f -name '*.md' | wc -l | tr -d ' ')" "0"
|
|
221
227
|
check "managed hooks de-registered" "$(managed_hook_count "$LIVE/settings.json")" "0"
|
|
222
228
|
check "unrelated hook preserved" "$(grep -cF 'keep-me.sh' "$LIVE/settings.json" 2>/dev/null || true)" "1"
|
|
223
229
|
check "Pi extension removed" "$([[ -e "$PI_LIVE/extensions/cairnkeep-trajectory.ts" ]] && echo no || echo yes)" "yes"
|
|
230
|
+
check "Pi graph prompt removed" "$([[ -e "$PI_LIVE/prompts/graphify.md" ]] && echo no || echo yes)" "yes"
|
|
231
|
+
check "Kimi graph Skill removed" "$([[ -e "$KIMI_LIVE/skills/graphify/SKILL.md" ]] && echo no || echo yes)" "yes"
|
|
224
232
|
check "default uninstall keeps notes" "$(sha256sum "$SB/home/.cairnkeep/notes/projects/example/hindsight/failure.md" | cut -d' ' -f1)" "$note_before"
|
|
225
233
|
check "default uninstall keeps all typed and journal bytes" "$(tree_hash "$SB/home/.cairnkeep")" "$store_before"
|
|
226
234
|
check "default uninstall keeps artifact bytes exact" "$(cmp -s "$SB/artifacts.before.db" "$PROJECT_DATA/.agentfs/artifacts.db" && echo yes || echo no)" "yes"
|
|
@@ -243,6 +251,8 @@ bash "$BK/revert.sh" >/dev/null 2>&1
|
|
|
243
251
|
check "assets restored" "$(find "$LIVE" -type f -name '*.md' | wc -l | tr -d ' ')" "$md_installed"
|
|
244
252
|
check "settings.json identical" "$(cmp -s "$SB/settings.before.json" "$LIVE/settings.json" && echo yes || echo no)" "yes"
|
|
245
253
|
check "Pi extension restored" "$(cmp -s "$SB/pi.before.ts" "$PI_LIVE/extensions/cairnkeep-trajectory.ts" && echo yes || echo no)" "yes"
|
|
254
|
+
check "Pi graph prompt restored" "$(cmp -s "$SB/pi-graph.before.md" "$PI_LIVE/prompts/graphify.md" && echo yes || echo no)" "yes"
|
|
255
|
+
check "Kimi graph Skill restored" "$(cmp -s "$SB/kimi-graph.before.md" "$KIMI_LIVE/skills/graphify/SKILL.md" && echo yes || echo no)" "yes"
|
|
246
256
|
check "capability config bytes restored" "$(cmp -s "$SB/capabilities.before.json" "$PROJECT_DATA/.ai/capabilities.json" && echo yes || echo no)" "yes"
|
|
247
257
|
check "capability overlay bytes restored" "$(tree_hash "$PROJECT_DATA/.ai/capability-contract")" "$overlay_before"
|
|
248
258
|
check "capability hook registrations restored" "$(capability_hook_count "$CLAUDE_OVERLAY/settings.json")" "5"
|
package/scripts/uninstall.sh
CHANGED
|
@@ -22,6 +22,7 @@ TPL="$CAIRN_ROOT/templates"
|
|
|
22
22
|
|
|
23
23
|
LIVE_ROOT="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"
|
|
24
24
|
PI_LIVE_ROOT="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
|
|
25
|
+
KIMI_LIVE_ROOT="${KIMI_CODE_HOME:-$HOME/.kimi-code}"
|
|
25
26
|
STORE_DIR="${CAIRN_AGENTFS_BASE_DIR:-$HOME/.cairnkeep}"
|
|
26
27
|
STORE_DIR="${STORE_DIR/#\~/$HOME}"
|
|
27
28
|
DRY_RUN=0
|
|
@@ -49,7 +50,7 @@ PROJECT_AI_FILES=(
|
|
|
49
50
|
usage() {
|
|
50
51
|
cat <<'EOF'
|
|
51
52
|
Usage: uninstall.sh [--dry-run] [--yes] [--purge-memory] [--live-root PATH]
|
|
52
|
-
[--pi-live-root PATH] [PROJECT ...]
|
|
53
|
+
[--pi-live-root PATH] [--kimi-live-root PATH] [PROJECT ...]
|
|
53
54
|
|
|
54
55
|
Reverse cairnkeep's install. Everything removed/edited is backed up into
|
|
55
56
|
$HOME/.cairnkeep-uninstall-<ts>/ with a revert.sh before any change.
|
|
@@ -60,6 +61,7 @@ $HOME/.cairnkeep-uninstall-<ts>/ with a revert.sh before any change.
|
|
|
60
61
|
trajectories in each PROJECT. Backed up first; off by default.
|
|
61
62
|
--live-root PATH Claude root to clean (default: $CLAUDE_CONFIG_DIR or ~/.claude).
|
|
62
63
|
--pi-live-root PATH Pi agent root to clean (default: $PI_CODING_AGENT_DIR or ~/.pi/agent).
|
|
64
|
+
--kimi-live-root PATH Kimi Code root to clean (default: $KIMI_CODE_HOME or ~/.kimi-code).
|
|
63
65
|
PROJECT ... Also revert `cairn bootstrap` in these project dirs
|
|
64
66
|
(.ai/, .planning/, and any .git/info/exclude entries).
|
|
65
67
|
-h, --help Show this help.
|
|
@@ -73,6 +75,7 @@ while [[ $# -gt 0 ]]; do
|
|
|
73
75
|
--purge-memory) PURGE_MEMORY=1; shift ;;
|
|
74
76
|
--live-root) LIVE_ROOT="$2"; shift 2 ;;
|
|
75
77
|
--pi-live-root) PI_LIVE_ROOT="$2"; shift 2 ;;
|
|
78
|
+
--kimi-live-root) KIMI_LIVE_ROOT="$2"; shift 2 ;;
|
|
76
79
|
-h|--help) usage; exit 0 ;;
|
|
77
80
|
-*) echo "Unknown option: $1" >&2; usage >&2; exit 2 ;;
|
|
78
81
|
*) PROJECTS+=("$1"); shift ;;
|
|
@@ -137,6 +140,7 @@ echo "cairn uninstall"
|
|
|
137
140
|
[[ $DRY_RUN -eq 1 ]] && echo "(dry run — nothing will change)"
|
|
138
141
|
echo " live root: $LIVE_ROOT"
|
|
139
142
|
echo " Pi live root: $PI_LIVE_ROOT"
|
|
143
|
+
echo " Kimi root: $KIMI_LIVE_ROOT"
|
|
140
144
|
echo " memory store: $STORE_DIR ($([[ $PURGE_MEMORY -eq 1 ]] && echo 'WILL be purged' || echo 'kept'))"
|
|
141
145
|
[[ ${#PROJECTS[@]} -gt 0 ]] && echo " projects: ${PROJECTS[*]}"
|
|
142
146
|
|
|
@@ -150,10 +154,13 @@ fi
|
|
|
150
154
|
echo "Operating layer (assets):"
|
|
151
155
|
while IFS= read -r dst; do remove_path "$dst"; done < <(asset_dests)
|
|
152
156
|
|
|
153
|
-
#
|
|
154
|
-
# configuration
|
|
155
|
-
echo "Pi
|
|
157
|
+
# These are precisely owned adapter paths; do not touch neighboring harness
|
|
158
|
+
# configuration in either user root.
|
|
159
|
+
echo "Pi adapters:"
|
|
156
160
|
remove_path "$PI_LIVE_ROOT/extensions/cairnkeep-trajectory.ts"
|
|
161
|
+
remove_path "$PI_LIVE_ROOT/prompts/graphify.md"
|
|
162
|
+
echo "Kimi adapter:"
|
|
163
|
+
remove_path "$KIMI_LIVE_ROOT/skills/graphify/SKILL.md"
|
|
157
164
|
|
|
158
165
|
# 2. settings.json hook registrations (back up whole file, then de-register).
|
|
159
166
|
SETTINGS="$LIVE_ROOT/settings.json"
|
|
@@ -26,12 +26,33 @@ This repository uses `.planning/graphs/` as an optional, local, machine-facing d
|
|
|
26
26
|
|
|
27
27
|
- Use the graph to compress dependency context for planning, exploration, and impact analysis.
|
|
28
28
|
- Do not use graph outputs as a human-facing substitute for the repo wiki.
|
|
29
|
-
- Do not commit graph build outputs by default
|
|
29
|
+
- Do not commit graph build outputs by default. `.planning/graphs/.gitignore`
|
|
30
|
+
covers the published view; also ignore Graphify's root `graphify-out/` work
|
|
31
|
+
directory through repository policy or the clone-local Git exclude file.
|
|
30
32
|
|
|
31
33
|
## Maintenance
|
|
32
34
|
|
|
33
35
|
- Enable Graphify explicitly in `.planning/config.json`.
|
|
34
|
-
- Install
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
36
|
+
- Install only the isolated Graphify CLI with `uv tool install graphifyy` before
|
|
37
|
+
first use (`pipx install graphifyy` is an equivalent fallback). Do not run
|
|
38
|
+
`graphify install`: Cairnkeep owns the installed commands and harness wiring,
|
|
39
|
+
so Graphify-owned skills, instructions, and hooks would duplicate them.
|
|
40
|
+
- Claude Code and OpenCode receive the `/graphify` command with their operating
|
|
41
|
+
layers. Kimi Code receives the equivalent thin Skill after `cairn sync-kimi
|
|
42
|
+
--apply`, and Pi receives the equivalent thin prompt after `cairn sync-pi
|
|
43
|
+
--apply`. Both delegate exclusively to portable forms such as
|
|
44
|
+
`cairn graph build`, `cairn graph explain <symbol>`, and
|
|
45
|
+
`cairn graph path <from> <to>`.
|
|
46
|
+
- Use `/graphify build` to create or refresh the graph after meaningful
|
|
47
|
+
code-topology changes. The managed build is local code-only extraction; it
|
|
48
|
+
does not send documents to a semantic extraction backend.
|
|
49
|
+
- Use `/graphify status`, `/graphify query <term>`, and `/graphify diff` to
|
|
50
|
+
inspect freshness and focused subgraphs.
|
|
51
|
+
- Use `/graphify explain <symbol>` for one exact function, class, or file, and
|
|
52
|
+
`/graphify path <from> <to>` for the shortest structural route between two
|
|
53
|
+
exact symbols.
|
|
54
|
+
- Prefer exact symbol names or narrowly scoped terms when querying. Treat broad
|
|
55
|
+
prose-query results as discovery hints and verify them against canonical
|
|
56
|
+
source files.
|
|
57
|
+
- Planner and query consumers should treat stale graphs as approximate context,
|
|
58
|
+
not proof.
|