@neikyun/ciel 6.9.0 → 6.9.1
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/assets/.claude/hooks/pre-agent-gate.sh +55 -0
- package/assets/.claude/hooks/pre-tool-write.sh +83 -0
- package/assets/.claude/hooks/session-start.sh +34 -1
- package/assets/.claude/hooks/session-version-check.sh +14 -0
- package/assets/.claude/settings.json +4 -4
- package/assets/commands/ciel-audit.md +3 -2
- package/assets/commands/ciel-status.md +1 -1
- package/dist/cli/claude.d.ts.map +1 -1
- package/dist/cli/claude.js +28 -13
- package/dist/cli/claude.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.cjs +7 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Ciel — PreToolUse hook for Agent (subagent type gate)
|
|
3
|
+
# Trigger: PreToolUse on Agent
|
|
4
|
+
# Purpose: block Agent dispatches that don't use a ciel-* subagent_type.
|
|
5
|
+
# Generic agents bypass Haiku model, call caps, and researcher waterfall
|
|
6
|
+
# → cost 20K-160K tokens vs ~5K for a constrained Ciel agent.
|
|
7
|
+
#
|
|
8
|
+
# Escape hatch: include [CIEL_GATE_BYPASS] anywhere in the prompt to allow
|
|
9
|
+
# a non-ciel agent through (e.g. legitimate one-off native dispatch).
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
input_json=""
|
|
14
|
+
if [ ! -t 0 ]; then
|
|
15
|
+
input_json=$(cat)
|
|
16
|
+
fi
|
|
17
|
+
[ -z "$input_json" ] && exit 0
|
|
18
|
+
|
|
19
|
+
parsed=$(echo "$input_json" | python3 -c "
|
|
20
|
+
import json, sys
|
|
21
|
+
try:
|
|
22
|
+
d = json.load(sys.stdin)
|
|
23
|
+
tool_input = d.get('tool_input', {})
|
|
24
|
+
subagent_type = tool_input.get('subagent_type', '')
|
|
25
|
+
prompt = tool_input.get('prompt', '')
|
|
26
|
+
print(subagent_type + '\t' + prompt[:200])
|
|
27
|
+
except Exception:
|
|
28
|
+
print('\t')
|
|
29
|
+
" 2>/dev/null)
|
|
30
|
+
|
|
31
|
+
subagent_type="${parsed%%$'\t'*}"
|
|
32
|
+
prompt_head="${parsed#*$'\t'}"
|
|
33
|
+
|
|
34
|
+
# Allow explicit bypass
|
|
35
|
+
if echo "$prompt_head" | grep -q "\[CIEL_GATE_BYPASS\]"; then
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Allow ciel-* subagent types
|
|
40
|
+
if [[ "$subagent_type" == ciel-* ]]; then
|
|
41
|
+
exit 0
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# Block everything else — generic or non-ciel subagent_type
|
|
45
|
+
label="${subagent_type:-<missing>}"
|
|
46
|
+
python3 -c "
|
|
47
|
+
import json
|
|
48
|
+
print(json.dumps({
|
|
49
|
+
'hookSpecificOutput': {
|
|
50
|
+
'hookEventName': 'PreToolUse',
|
|
51
|
+
'permissionDecision': 'deny',
|
|
52
|
+
'permissionDecisionReason': '[CIEL AGENT GATE] Blocked: subagent_type=\"${label}\" is not a Ciel agent. Re-dispatch with subagent_type=\"ciel-researcher\" | \"ciel-explorer\" | \"ciel-critic\" | \"ciel-improver\". Generic agents bypass Haiku model, call caps, and researcher waterfall early-exit. Add [CIEL_GATE_BYPASS] to prompt to force-allow a non-Ciel dispatch.'
|
|
53
|
+
}
|
|
54
|
+
}))"
|
|
55
|
+
exit 0
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Ciel — PreToolUse hook for Write/Edit
|
|
3
|
+
# Trigger: PreToolUse on Write|Edit
|
|
4
|
+
# Purpose: inject faire-gatekeeper + dispatch gate + pipeline reminders before code write
|
|
5
|
+
# Critical files get additional stride-analyzer hint
|
|
6
|
+
# Always exits 0 (never blocks), outputs reminders via stderr (reliable channel)
|
|
7
|
+
# Dispatch counter: /tmp/ciel_dispatched set by SubagentStart hooks (ciel-researcher/explorer)
|
|
8
|
+
|
|
9
|
+
INPUT=$(cat)
|
|
10
|
+
|
|
11
|
+
FILE_PATH=$(echo "$INPUT" | python3 -c "
|
|
12
|
+
import sys, json
|
|
13
|
+
try:
|
|
14
|
+
d = json.load(sys.stdin)
|
|
15
|
+
tip = d.get('tool_input', {})
|
|
16
|
+
print(tip.get('file_path', tip.get('path', '')))
|
|
17
|
+
except:
|
|
18
|
+
print('')
|
|
19
|
+
" 2>/dev/null || echo "")
|
|
20
|
+
|
|
21
|
+
[ -z "$FILE_PATH" ] && exit 0
|
|
22
|
+
|
|
23
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-}"
|
|
24
|
+
|
|
25
|
+
# === DISPATCH GATE CHECK ===
|
|
26
|
+
# /tmp/ciel_dispatched is created by SubagentStart hooks when ciel-researcher/explorer dispatch
|
|
27
|
+
DISPATCHED=0
|
|
28
|
+
DISPATCH_FLAG="/tmp/ciel_dispatched"
|
|
29
|
+
if [ -f "$DISPATCH_FLAG" ]; then
|
|
30
|
+
DISPATCHED=1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# === FILE TRACK COUNT (RELIRE GATE) ===
|
|
34
|
+
COUNT=0
|
|
35
|
+
if [ -n "$PROJECT_DIR" ] && [ -f "$PROJECT_DIR/.ciel/tracked-files.json" ]; then
|
|
36
|
+
COUNT=$(CIEL_PATH="$PROJECT_DIR/.ciel/tracked-files.json" python3 -c "
|
|
37
|
+
import json, os
|
|
38
|
+
try: print(len(json.load(open(os.environ['CIEL_PATH']))))
|
|
39
|
+
except: print(0)
|
|
40
|
+
" 2>/dev/null || echo "0")
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Build warnings
|
|
44
|
+
WARNINGS=""
|
|
45
|
+
|
|
46
|
+
# Dispatch gate warning (no dispatched agents on non-trivial write)
|
|
47
|
+
if [ "$DISPATCHED" -eq 0 ] && [ "$COUNT" -ge 1 ]; then
|
|
48
|
+
WARNINGS="${WARNINGS}[DISPATCH GATE] WARNING: Writing file ${FILE_PATH} without prior Task() dispatch (ciel-researcher + ciel-explorer). Was this classified as Trivial? If Standard+, dispatch subagents BEFORE writing code."
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# RELIRE gate warning
|
|
52
|
+
if [ "${COUNT:-0}" -ge 2 ] 2>/dev/null; then
|
|
53
|
+
PIPELINE_WARN=" | CIEL PIPELINE: ${COUNT} file(s) edited. Have researcher+explorer been dispatched? If 3+ files: ciel-critic MODE=RELIRE required before merge."
|
|
54
|
+
WARNINGS="${WARNINGS}${PIPELINE_WARN}"
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# If only dispatch gate fires, prefix to std err
|
|
58
|
+
if [ -n "$WARNINGS" ]; then
|
|
59
|
+
echo "[CIEL PRE-WRITE]" >&2
|
|
60
|
+
echo "$WARNINGS" | while IFS= read -r line; do
|
|
61
|
+
echo " $line" >&2
|
|
62
|
+
done
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# === FAIRE GATE REMINDER ===
|
|
66
|
+
# Skip non-code files
|
|
67
|
+
if ! echo "$FILE_PATH" | grep -qE '\.(kt|java|ts|tsx|js|jsx|py|go|rs|rb|php|cs|cpp|c|swift|scala|vue|svelte|sql|sh|json|yaml|yml|toml)$'; then
|
|
68
|
+
exit 0
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Check if file is critical path
|
|
72
|
+
CRITICAL=false
|
|
73
|
+
if echo "$FILE_PATH" | grep -qiE '(auth|Auth|security|Security|Token|Session|Password|Secret)'; then
|
|
74
|
+
CRITICAL=true
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
if $CRITICAL; then
|
|
78
|
+
echo " [CIEL] Critical path: invoke faire-gatekeeper, stride-analyzer must have run, test-first (RED)." >&2
|
|
79
|
+
else
|
|
80
|
+
echo " [CIEL] Standard path: invoke faire-gatekeeper (alternatives, idiomatic, quality, removal, test-first)." >&2
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
exit 0
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
INPUT=$(cat 2>/dev/null || echo "{}")
|
|
8
8
|
CWD=$(echo "$INPUT" | python3 -c "import sys, json; print(json.load(sys.stdin).get('cwd', ''))" 2>/dev/null || pwd)
|
|
9
|
+
# python3 succeeds with an empty string when stdin JSON lacks a 'cwd' key — fall through to pwd.
|
|
10
|
+
[ -z "$CWD" ] && CWD="$(pwd)"
|
|
9
11
|
|
|
10
12
|
# Detect overlay presence
|
|
11
13
|
OVERLAY=""
|
|
@@ -25,7 +27,38 @@ fi
|
|
|
25
27
|
TRACE_ID=$(date -u +%Y%m%dT%H%M%SZ)-$$
|
|
26
28
|
export CIEL_TRACE_ID="$TRACE_ID"
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
# Resolve Ciel version at runtime (single source of truth, no hardcoded drift).
|
|
31
|
+
# Fallback chain: project sentinel → user sentinel → npm package → marketplace plugin → repo VERSION → unknown.
|
|
32
|
+
# Note: $HOME/.ciel/version is "last writer wins" across npm installs from different projects —
|
|
33
|
+
# project sentinel ($CWD/.ciel/version) is authoritative when present.
|
|
34
|
+
_resolve_ciel_version() {
|
|
35
|
+
local v=""
|
|
36
|
+
for f in \
|
|
37
|
+
"$CWD/.ciel/version" \
|
|
38
|
+
"$HOME/.ciel/version" \
|
|
39
|
+
"$HOME/.claude/plugins/ciel/package.json" \
|
|
40
|
+
"$HOME/.claude/plugins/ciel/.claude-plugin/plugin.json" \
|
|
41
|
+
"$(dirname "$0")/../../VERSION" \
|
|
42
|
+
"$(dirname "$0")/../VERSION"; do
|
|
43
|
+
# Skip entries that resolved against an empty $CWD/$HOME (e.g., "/.ciel/version").
|
|
44
|
+
case "$f" in /.ciel/*|/.claude/*) continue ;; esac
|
|
45
|
+
[ -r "$f" ] || continue
|
|
46
|
+
case "$f" in
|
|
47
|
+
*.json)
|
|
48
|
+
# Anchor to line-start whitespace so we only match top-level "version",
|
|
49
|
+
# not nested keys like "schema_version" or `"version"` deeper in the doc.
|
|
50
|
+
v=$(sed -n 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$f" 2>/dev/null | head -1)
|
|
51
|
+
;;
|
|
52
|
+
*)
|
|
53
|
+
v=$(tr -d '[:space:]' <"$f" 2>/dev/null)
|
|
54
|
+
;;
|
|
55
|
+
esac
|
|
56
|
+
[ -n "$v" ] && { echo "$v"; return; }
|
|
57
|
+
done
|
|
58
|
+
echo "unknown"
|
|
59
|
+
}
|
|
60
|
+
CIEL_VERSION="$(_resolve_ciel_version)"
|
|
61
|
+
MSG="CIEL v${CIEL_VERSION} — Skills-first deep-reasoning active. "
|
|
29
62
|
if [[ -n "$OVERLAY" ]]; then
|
|
30
63
|
MSG+="Overlay loaded: $OVERLAY. "
|
|
31
64
|
else
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Ciel — Session-start version check
|
|
3
|
+
# Outputs to stderr so the user sees the notification.
|
|
4
|
+
# Non-blocking: silent on fetch failure (offline/proxy).
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "$0")/.." && pwd)}"
|
|
8
|
+
LOCAL_VERSION=$(cat "$PROJECT_DIR/VERSION" 2>/dev/null || echo "0.0.0")
|
|
9
|
+
|
|
10
|
+
REMOTE_VERSION=$(curl -fsSL --connect-timeout 3 "https://raw.githubusercontent.com/KaosKyun/Ciel/main/VERSION" 2>/dev/null || true)
|
|
11
|
+
|
|
12
|
+
if [ -n "$REMOTE_VERSION" ] && [ "$REMOTE_VERSION" != "$LOCAL_VERSION" ]; then
|
|
13
|
+
echo "[CIEL] Update available: v${LOCAL_VERSION} → v${REMOTE_VERSION}. Run /ciel-update to upgrade." >&2
|
|
14
|
+
fi
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"hooks": [
|
|
21
21
|
{
|
|
22
22
|
"type": "command",
|
|
23
|
-
"command": "echo \"[CIEL v6] Session started — Pipeline: DOCS → QUOI → ASK → AVEC QUOI → DIVERGE → RECHERCHE → CODEBASE → EVALUER → ASK2 → FAIRE → RELIRE → PROUVER → MEMOIRE → META\" && \"$CLAUDE_PROJECT_DIR\"/hooks/session-version-check.sh"
|
|
23
|
+
"command": "echo \"[CIEL v6] Session started — Pipeline: DOCS → QUOI → ASK → AVEC QUOI → DIVERGE → RECHERCHE → CODEBASE → EVALUER → ASK2 → FAIRE → RELIRE → PROUVER → MEMOIRE → META\" && \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-version-check.sh"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
}
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"type": "command",
|
|
38
|
-
"command": "\"$CLAUDE_PROJECT_DIR\"/hooks/pre-tool-write.sh"
|
|
38
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-tool-write.sh"
|
|
39
39
|
}
|
|
40
40
|
]
|
|
41
41
|
},
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"hooks": [
|
|
55
55
|
{
|
|
56
56
|
"type": "command",
|
|
57
|
-
"command": "\"$CLAUDE_PROJECT_DIR\"/hooks/pre-agent-gate.sh"
|
|
57
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-agent-gate.sh"
|
|
58
58
|
}
|
|
59
59
|
]
|
|
60
60
|
}
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
"type": "command",
|
|
72
|
-
"command": "COUNT=$(cat \"$CLAUDE_PROJECT_DIR/.ciel/tracked-files.json\" 2>/dev/null | python3 -c \"import sys,json; d=json.load(sys.stdin); print(len(d))\" 2>/dev/null || echo \"?\"); echo \"[CIEL] Tracked files: $COUNT — RELIRE recommended at 5+ files or on Critical paths\" >&2"
|
|
72
|
+
"command": "COUNT=$(cat \"${CLAUDE_PROJECT_DIR:-$PWD}/.ciel/tracked-files.json\" 2>/dev/null | python3 -c \"import sys,json; d=json.load(sys.stdin); print(len(d))\" 2>/dev/null || echo \"?\"); echo \"[CIEL] Tracked files: $COUNT — RELIRE recommended at 5+ files or on Critical paths\" >&2"
|
|
73
73
|
}
|
|
74
74
|
]
|
|
75
75
|
}
|
|
@@ -103,7 +103,8 @@ Expected: at least 3 agent files + session-start.sh + settings.json
|
|
|
103
103
|
|
|
104
104
|
**OpenCode** — check for expected plugin, agent, and command files:
|
|
105
105
|
```bash
|
|
106
|
-
|
|
106
|
+
# Plugin file may be ciel.ts (legacy) or ciel.js (v6+ runtime); accept either.
|
|
107
|
+
OPENCODE_PLUGIN=$( ( test -f .opencode/plugins/ciel.ts || test -f .opencode/plugins/ciel.js ) && echo "1" || echo "0")
|
|
107
108
|
OPENCODE_AGENTS=$(ls .opencode/agents/ciel-*.md 2>/dev/null | wc -l | tr -d ' ')
|
|
108
109
|
OPENCODE_COMMANDS=$(ls .opencode/commands/ciel*.md 2>/dev/null | wc -l | tr -d ' ')
|
|
109
110
|
echo "OpenCode: plugin=$OPENCODE_PLUGIN agents=$OPENCODE_AGENTS commands=$OPENCODE_COMMANDS"
|
|
@@ -113,7 +114,7 @@ else
|
|
|
113
114
|
echo "OpenCode platform: INCOMPLETE"
|
|
114
115
|
fi
|
|
115
116
|
```
|
|
116
|
-
Expected: ciel.ts
|
|
117
|
+
Expected: ciel plugin (ciel.ts or ciel.js) + at least 3 agent files + at least 5 command files
|
|
117
118
|
|
|
118
119
|
Scoring:
|
|
119
120
|
- Both platforms fully present and valid: **0**
|
package/dist/cli/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/cli/claude.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/cli/claude.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAgBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAuIhE"}
|
package/dist/cli/claude.js
CHANGED
|
@@ -7,6 +7,19 @@ exports.installClaude = installClaude;
|
|
|
7
7
|
const fs_1 = require("fs");
|
|
8
8
|
const path_1 = require("path");
|
|
9
9
|
const utils_1 = require("./utils");
|
|
10
|
+
// Hook scripts shipped by Ciel. Used both to copy assets on install
|
|
11
|
+
// and to detect Ciel-managed wrappers in mergeSettings — so legacy paths
|
|
12
|
+
// (e.g. $CLAUDE_PROJECT_DIR/hooks/x.sh) get migrated on --force upgrade
|
|
13
|
+
// rather than preserved alongside the new $CLAUDE_PROJECT_DIR/.claude/hooks/x.sh.
|
|
14
|
+
const CIEL_HOOK_FILES = [
|
|
15
|
+
"check-test-first.sh",
|
|
16
|
+
"block-destructive.sh",
|
|
17
|
+
"track-file.sh",
|
|
18
|
+
"meta-critiquer.sh",
|
|
19
|
+
"session-version-check.sh",
|
|
20
|
+
"pre-tool-write.sh",
|
|
21
|
+
"pre-agent-gate.sh",
|
|
22
|
+
];
|
|
10
23
|
/**
|
|
11
24
|
* Detect if the project has Claude Code configuration.
|
|
12
25
|
*/
|
|
@@ -50,13 +63,7 @@ function installClaude(opts) {
|
|
|
50
63
|
}
|
|
51
64
|
}
|
|
52
65
|
// Hook files
|
|
53
|
-
const
|
|
54
|
-
"check-test-first.sh",
|
|
55
|
-
"block-destructive.sh",
|
|
56
|
-
"track-file.sh",
|
|
57
|
-
"meta-critiquer.sh",
|
|
58
|
-
];
|
|
59
|
-
for (const hook of hookFiles) {
|
|
66
|
+
for (const hook of CIEL_HOOK_FILES) {
|
|
60
67
|
const src = (0, path_1.join)(srcDir, ".claude/hooks", hook);
|
|
61
68
|
const dest = (0, path_1.join)(hooksDest, hook);
|
|
62
69
|
if ((0, fs_1.existsSync)(src)) {
|
|
@@ -80,6 +87,9 @@ function installClaude(opts) {
|
|
|
80
87
|
"ciel-eval.md",
|
|
81
88
|
"ciel-create-skill.md",
|
|
82
89
|
"ciel-audit.md",
|
|
90
|
+
"ciel-memory-bootstrap.md",
|
|
91
|
+
"ciel-migrate.md",
|
|
92
|
+
"ciel-status.md",
|
|
83
93
|
];
|
|
84
94
|
for (const cmd of commandFiles) {
|
|
85
95
|
const src = (0, path_1.join)(srcDir, "commands", cmd);
|
|
@@ -197,10 +207,10 @@ function mkdirSafe(dir, fence) {
|
|
|
197
207
|
/**
|
|
198
208
|
* Merge the hooks section of a Ciel settings.json template into an existing
|
|
199
209
|
* settings file. Replaces Ciel-managed hook entries (those whose inner
|
|
200
|
-
* hooks[].command references
|
|
201
|
-
* user-added wrappers are preserved.
|
|
202
|
-
* permissions, etc.) are kept from
|
|
203
|
-
* Returns null if either file cannot be read or parsed.
|
|
210
|
+
* hooks[].command references a known Ciel hook script basename, regardless
|
|
211
|
+
* of path) with the template entries; user-added wrappers are preserved.
|
|
212
|
+
* All other top-level keys (mcpServers, permissions, etc.) are kept from
|
|
213
|
+
* the existing file. Returns null if either file cannot be read or parsed.
|
|
204
214
|
*/
|
|
205
215
|
function mergeSettings(existingPath, templatePath) {
|
|
206
216
|
let existing;
|
|
@@ -235,13 +245,18 @@ function mergeSettings(existingPath, templatePath) {
|
|
|
235
245
|
for (const event of allEvents) {
|
|
236
246
|
const templateEntries = templateHooks[event] ?? [];
|
|
237
247
|
const existingEntries = existingHooks[event] ?? [];
|
|
238
|
-
// A wrapper is Ciel-managed if any
|
|
248
|
+
// A wrapper is Ciel-managed if any inner hook command references a
|
|
249
|
+
// known Ciel hook script basename — matches both new `.claude/hooks/x.sh`
|
|
250
|
+
// and legacy `hooks/x.sh` paths so upgrades migrate cleanly.
|
|
239
251
|
const userEntries = existingEntries.filter((e) => {
|
|
240
252
|
const wrapper = e;
|
|
241
253
|
const inner = Array.isArray(wrapper.hooks)
|
|
242
254
|
? wrapper.hooks
|
|
243
255
|
: [];
|
|
244
|
-
return !inner.some((h) =>
|
|
256
|
+
return !inner.some((h) => {
|
|
257
|
+
const cmd = String(h.command ?? "");
|
|
258
|
+
return CIEL_HOOK_FILES.some((name) => cmd.includes(name));
|
|
259
|
+
});
|
|
245
260
|
});
|
|
246
261
|
const entries = [...templateEntries, ...userEntries];
|
|
247
262
|
// Omit event key if empty (avoids clobbering user events dropped from template)
|
package/dist/cli/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/cli/claude.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,+EAA+E;;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/cli/claude.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neikyun/ciel",
|
|
3
|
-
"version": "6.9.
|
|
3
|
+
"version": "6.9.1",
|
|
4
4
|
"description": "Ciel — Deep-reasoning pipeline for LLM-assisted development. OpenCode plugin + multi-platform CLI (OpenCode, Claude Code, more).",
|
|
5
5
|
"main": "./dist/plugin/index.js",
|
|
6
6
|
"types": "./dist/plugin/index.d.ts",
|
package/scripts/postinstall.cjs
CHANGED
|
@@ -225,6 +225,13 @@ async function main() {
|
|
|
225
225
|
|
|
226
226
|
// Sauvegarder version
|
|
227
227
|
writeFileSync(join(targetDir, ".ciel/memory.json"), JSON.stringify({ cielVersion: CIEL_VERSION, lastUpdated: new Date().toISOString() }, null, 2), "utf-8");
|
|
228
|
+
// Version sentinel — read by hooks/session-start.sh at runtime (no hardcoded MSG to drift).
|
|
229
|
+
writeFileSync(join(targetDir, ".ciel/version"), CIEL_VERSION + "\n", "utf-8");
|
|
230
|
+
try {
|
|
231
|
+
const userCielDir = join(require("os").homedir(), ".ciel");
|
|
232
|
+
mkdirSync(userCielDir, { recursive: true });
|
|
233
|
+
writeFileSync(join(userCielDir, "version"), CIEL_VERSION + "\n", "utf-8");
|
|
234
|
+
} catch {}
|
|
228
235
|
|
|
229
236
|
console.error(`\n ${green("✓")} Ciel v${CIEL_VERSION} installé !`);
|
|
230
237
|
if (platforms.includes("OpenCode")) console.error(` → plugin ${cyan("@neikyun/ciel")} ajouté à opencode.json`);
|