@rpamis/comet 0.3.6 → 0.3.7
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/LICENSE +21 -21
- package/README.md +175 -63
- package/assets/manifest.json +11 -1
- package/assets/skills/comet/SKILL.md +44 -16
- package/assets/skills/comet/reference/dirty-worktree.md +1 -0
- package/assets/skills/comet/rules/comet-phase-guard.md +90 -0
- package/assets/skills/comet/scripts/comet-archive.sh +71 -55
- package/assets/skills/comet/scripts/comet-guard.sh +174 -18
- package/assets/skills/comet/scripts/comet-handoff.sh +133 -6
- package/assets/skills/comet/scripts/comet-hook-guard.sh +260 -0
- package/assets/skills/comet/scripts/comet-state.sh +300 -25
- package/assets/skills/comet/scripts/comet-yaml-validate.sh +24 -1
- package/assets/skills/comet-archive/SKILL.md +43 -10
- package/assets/skills/comet-build/SKILL.md +117 -22
- package/assets/skills/comet-design/SKILL.md +119 -13
- package/assets/skills/comet-hotfix/SKILL.md +51 -9
- package/assets/skills/comet-open/SKILL.md +86 -13
- package/assets/skills/comet-tweak/SKILL.md +33 -8
- package/assets/skills/comet-verify/SKILL.md +48 -9
- package/assets/skills-zh/comet/SKILL.md +47 -16
- package/assets/skills-zh/comet/reference/dirty-worktree.md +2 -1
- package/assets/skills-zh/comet-archive/SKILL.md +44 -11
- package/assets/skills-zh/comet-build/SKILL.md +120 -25
- package/assets/skills-zh/comet-design/SKILL.md +123 -16
- package/assets/skills-zh/comet-hotfix/SKILL.md +47 -9
- package/assets/skills-zh/comet-open/SKILL.md +87 -14
- package/assets/skills-zh/comet-tweak/SKILL.md +29 -8
- package/assets/skills-zh/comet-verify/SKILL.md +49 -12
- package/bin/comet.js +3 -3
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +22 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +5 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +64 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +60 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/core/codegraph.d.ts +9 -0
- package/dist/core/codegraph.d.ts.map +1 -0
- package/dist/core/codegraph.js +96 -0
- package/dist/core/codegraph.js.map +1 -0
- package/dist/core/platforms.d.ts +10 -0
- package/dist/core/platforms.d.ts.map +1 -1
- package/dist/core/platforms.js +163 -15
- package/dist/core/platforms.js.map +1 -1
- package/dist/core/skills.d.ts +34 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +360 -1
- package/dist/core/skills.js.map +1 -1
- package/package.json +3 -1
- package/scripts/postinstall.js +44 -44
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# comet-hook-guard.sh — PreToolUse hook for Comet phase enforcement
|
|
3
|
+
#
|
|
4
|
+
# Blocks file writes (Write/Edit) when the active Comet change is in
|
|
5
|
+
# a phase that does not allow source code modifications (open/design/archive).
|
|
6
|
+
#
|
|
7
|
+
# Usage (called by harness, not directly):
|
|
8
|
+
# PreToolUse matcher "Write|Edit" → this script
|
|
9
|
+
# Stdin: JSON {"tool_name":"Write|Edit","tool_input":{"file_path":"..."}}
|
|
10
|
+
# Exit 0 = allow
|
|
11
|
+
# Exit 2 = blocked (stderr message shown to user)
|
|
12
|
+
#
|
|
13
|
+
# Cross-platform: macOS / Linux / Windows Git Bash
|
|
14
|
+
# shellcheck disable=SC2329
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
# ── Extract target file path ──────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
TARGET=""
|
|
21
|
+
|
|
22
|
+
# Method 1: FILE_PATH environment variable (set by some harnesses)
|
|
23
|
+
if [ -n "${FILE_PATH:-}" ]; then
|
|
24
|
+
TARGET="$FILE_PATH"
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Method 2: Parse stdin JSON
|
|
28
|
+
if [ -z "$TARGET" ]; then
|
|
29
|
+
INPUT=""
|
|
30
|
+
if [ ! -t 0 ]; then
|
|
31
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
32
|
+
fi
|
|
33
|
+
if [ -n "$INPUT" ]; then
|
|
34
|
+
# Extract file_path value — works for both Write and Edit tool inputs
|
|
35
|
+
TARGET=$(printf '%s' "$INPUT" \
|
|
36
|
+
| grep -oE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' 2>/dev/null \
|
|
37
|
+
| head -1 \
|
|
38
|
+
| sed 's/^"file_path"[[:space:]]*:[[:space:]]*"//' \
|
|
39
|
+
| sed 's/"$//' \
|
|
40
|
+
|| true)
|
|
41
|
+
fi
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# No target found — allow (not a file-path-bearing operation)
|
|
45
|
+
if [ -z "$TARGET" ]; then
|
|
46
|
+
echo "[COMET-HOOK] allowed: no file path in tool input" >&2
|
|
47
|
+
exit 0
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# Normalize to forward slashes, collapse doubles from JSON escaping (\\ → //)
|
|
51
|
+
TARGET=$(printf '%s' "$TARGET" | sed 's|\\|/|g' | sed 's|///*|/|g')
|
|
52
|
+
|
|
53
|
+
# ── Find active Comet change ─────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
YAML_FILE=""
|
|
56
|
+
if [ -d "openspec/changes" ]; then
|
|
57
|
+
for dir in openspec/changes/*/; do
|
|
58
|
+
[ -d "$dir" ] || continue
|
|
59
|
+
# Skip archived changes
|
|
60
|
+
case "$dir" in
|
|
61
|
+
*/archive/*) continue ;;
|
|
62
|
+
esac
|
|
63
|
+
if [ -f "${dir}.comet.yaml" ]; then
|
|
64
|
+
YAML_FILE="${dir}.comet.yaml"
|
|
65
|
+
break
|
|
66
|
+
fi
|
|
67
|
+
done
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# No active change — allow all writes
|
|
71
|
+
if [ -z "$YAML_FILE" ]; then
|
|
72
|
+
echo "[COMET-HOOK] allowed: no active comet change" >&2
|
|
73
|
+
exit 0
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# ── Read current phase ───────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
PHASE=$(grep "^phase:" "$YAML_FILE" 2>/dev/null \
|
|
79
|
+
| awk '{print $2}' \
|
|
80
|
+
| tr -d '[:space:][:cntrl:]' \
|
|
81
|
+
|| true)
|
|
82
|
+
|
|
83
|
+
if [ -z "$PHASE" ]; then
|
|
84
|
+
echo "[COMET-HOOK] allowed: no phase in .comet.yaml" >&2
|
|
85
|
+
exit 0
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# ── Resolve to project-relative path ─────────────────────────────
|
|
89
|
+
|
|
90
|
+
# Normalize helper: forward slashes only
|
|
91
|
+
norm() { printf '%s' "$1" | sed 's|\\|/|g'; }
|
|
92
|
+
|
|
93
|
+
RELPATH=$(norm "$TARGET")
|
|
94
|
+
|
|
95
|
+
# If already relative, use as-is
|
|
96
|
+
case "$RELPATH" in
|
|
97
|
+
/*|[A-Za-z]:/*)
|
|
98
|
+
# Absolute — try stripping CWD prefixes
|
|
99
|
+
CWD_UNIX=$(norm "$(pwd)")
|
|
100
|
+
CWD_PHYS=$(norm "$(pwd -P 2>/dev/null || pwd)")
|
|
101
|
+
|
|
102
|
+
# Try: TARGET as-is vs CWD logical
|
|
103
|
+
if [ "${RELPATH#"$CWD_UNIX"/}" != "$RELPATH" ]; then
|
|
104
|
+
RELPATH="${RELPATH#"$CWD_UNIX"/}"
|
|
105
|
+
# Try: TARGET as-is vs CWD physical (macOS /var → /private/var)
|
|
106
|
+
elif [ "${RELPATH#"$CWD_PHYS"/}" != "$RELPATH" ]; then
|
|
107
|
+
RELPATH="${RELPATH#"$CWD_PHYS"/}"
|
|
108
|
+
else
|
|
109
|
+
# Resolve TARGET's parent through filesystem (handles symlinked TARGET path)
|
|
110
|
+
_PDIR=$(cd "$(dirname "$TARGET")" 2>/dev/null && pwd -P 2>/dev/null || true)
|
|
111
|
+
if [ -n "$_PDIR" ]; then
|
|
112
|
+
_TRESOLVED=$(norm "${_PDIR}/$(basename "$TARGET")")
|
|
113
|
+
if [ "${_TRESOLVED#"$CWD_UNIX"/}" != "$_TRESOLVED" ]; then
|
|
114
|
+
RELPATH="${_TRESOLVED#"$CWD_UNIX"/}"
|
|
115
|
+
elif [ "${_TRESOLVED#"$CWD_PHYS"/}" != "$_TRESOLVED" ]; then
|
|
116
|
+
RELPATH="${_TRESOLVED#"$CWD_PHYS"/}"
|
|
117
|
+
fi
|
|
118
|
+
fi
|
|
119
|
+
fi
|
|
120
|
+
;;
|
|
121
|
+
esac
|
|
122
|
+
|
|
123
|
+
# ── Whitelist: phase-aware allowed paths ─────────────────────────
|
|
124
|
+
|
|
125
|
+
case "$RELPATH" in
|
|
126
|
+
openspec/*)
|
|
127
|
+
# OpenSpec artifacts — phase-aware sub-check
|
|
128
|
+
case "$PHASE" in
|
|
129
|
+
open)
|
|
130
|
+
# open: allow proposal, design, tasks, yaml, handoff, specs
|
|
131
|
+
case "$RELPATH" in
|
|
132
|
+
*/proposal.md|*/design.md|*/tasks.md|*/.openspec.yaml|*/.comet.yaml|*/.comet/*|*/specs/*)
|
|
133
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: open, openspec artifacts)" >&2
|
|
134
|
+
exit 0
|
|
135
|
+
;;
|
|
136
|
+
esac
|
|
137
|
+
;;
|
|
138
|
+
design)
|
|
139
|
+
# design: allow handoff, delta spec (Spec Patch), proposal/design/tasks (minor refinements), .comet.yaml
|
|
140
|
+
case "$RELPATH" in
|
|
141
|
+
*/proposal.md|*/design.md|*/tasks.md|*/.comet/*|*/specs/*|*/.comet.yaml|*/.openspec.yaml)
|
|
142
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: design, handoff/spec)" >&2
|
|
143
|
+
exit 0
|
|
144
|
+
;;
|
|
145
|
+
esac
|
|
146
|
+
;;
|
|
147
|
+
build)
|
|
148
|
+
# build: allow delta spec (incremental update), tasks, .comet.yaml
|
|
149
|
+
case "$RELPATH" in
|
|
150
|
+
*/specs/*|*/tasks.md|*/.comet.yaml|*/.openspec.yaml)
|
|
151
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: build, spec/tasks)" >&2
|
|
152
|
+
exit 0
|
|
153
|
+
;;
|
|
154
|
+
esac
|
|
155
|
+
;;
|
|
156
|
+
verify)
|
|
157
|
+
# verify: allow tasks (post-check), .comet.yaml
|
|
158
|
+
case "$RELPATH" in
|
|
159
|
+
*/tasks.md|*/.comet.yaml|*/.openspec.yaml)
|
|
160
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: verify, tasks/state)" >&2
|
|
161
|
+
exit 0
|
|
162
|
+
;;
|
|
163
|
+
esac
|
|
164
|
+
;;
|
|
165
|
+
archive)
|
|
166
|
+
# archive: allow .comet.yaml state updates only
|
|
167
|
+
case "$RELPATH" in
|
|
168
|
+
*/.comet.yaml|*/.openspec.yaml)
|
|
169
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: archive, state)" >&2
|
|
170
|
+
exit 0
|
|
171
|
+
;;
|
|
172
|
+
esac
|
|
173
|
+
;;
|
|
174
|
+
esac
|
|
175
|
+
;;
|
|
176
|
+
docs/superpowers/*)
|
|
177
|
+
# Superpowers artifacts — phase-aware sub-check
|
|
178
|
+
case "$PHASE" in
|
|
179
|
+
design)
|
|
180
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: design, superpowers)" >&2
|
|
181
|
+
exit 0
|
|
182
|
+
;;
|
|
183
|
+
build)
|
|
184
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: build, superpowers)" >&2
|
|
185
|
+
exit 0
|
|
186
|
+
;;
|
|
187
|
+
verify)
|
|
188
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: verify, superpowers)" >&2
|
|
189
|
+
exit 0
|
|
190
|
+
;;
|
|
191
|
+
esac
|
|
192
|
+
# open/archive: block docs/superpowers writes
|
|
193
|
+
;;
|
|
194
|
+
.comet/*|*/.comet/*)
|
|
195
|
+
# Comet config
|
|
196
|
+
echo "[COMET-HOOK] allowed: $RELPATH (whitelist: comet config)" >&2
|
|
197
|
+
exit 0
|
|
198
|
+
;;
|
|
199
|
+
.claude/*)
|
|
200
|
+
# Claude settings/rules
|
|
201
|
+
echo "[COMET-HOOK] allowed: $RELPATH (whitelist: claude config)" >&2
|
|
202
|
+
exit 0
|
|
203
|
+
;;
|
|
204
|
+
CLAUDE.md|CHANGELOG.md|README.md|*.md)
|
|
205
|
+
# Root-level markdown files
|
|
206
|
+
case "$RELPATH" in
|
|
207
|
+
*/*) ;; # subdirectory .md — NOT whitelisted, fall through
|
|
208
|
+
*)
|
|
209
|
+
echo "[COMET-HOOK] allowed: $RELPATH (whitelist: root markdown)" >&2
|
|
210
|
+
exit 0
|
|
211
|
+
;;
|
|
212
|
+
esac
|
|
213
|
+
;;
|
|
214
|
+
.comet.yaml|comet.yaml|.comet.yml|comet.yml)
|
|
215
|
+
# Project-level comet config
|
|
216
|
+
echo "[COMET-HOOK] allowed: $RELPATH (whitelist: comet config)" >&2
|
|
217
|
+
exit 0
|
|
218
|
+
;;
|
|
219
|
+
esac
|
|
220
|
+
|
|
221
|
+
# ── Phase-based enforcement ──────────────────────────────────────
|
|
222
|
+
|
|
223
|
+
case "$PHASE" in
|
|
224
|
+
build|verify)
|
|
225
|
+
# Code writes allowed in build and verify
|
|
226
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: $PHASE)" >&2
|
|
227
|
+
exit 0
|
|
228
|
+
;;
|
|
229
|
+
open|design|archive)
|
|
230
|
+
echo "" >&2
|
|
231
|
+
echo "╔══════════════════════════════════════════╗" >&2
|
|
232
|
+
echo "║ COMET PHASE GUARD — WRITE BLOCKED ║" >&2
|
|
233
|
+
echo "╚══════════════════════════════════════════╝" >&2
|
|
234
|
+
echo "" >&2
|
|
235
|
+
echo " 当前阶段: $PHASE" >&2
|
|
236
|
+
echo " 目标文件: $RELPATH" >&2
|
|
237
|
+
echo "" >&2
|
|
238
|
+
case "$PHASE" in
|
|
239
|
+
open)
|
|
240
|
+
echo " ❌ open 阶段不允许写源代码" >&2
|
|
241
|
+
echo " ✅ 允许: 创建 proposal/design/tasks, 运行 guard" >&2
|
|
242
|
+
echo " 💡 完成需求澄清和 artifact 创建后运行 guard --apply" >&2
|
|
243
|
+
;;
|
|
244
|
+
design)
|
|
245
|
+
echo " ❌ design 阶段不允许写源代码" >&2
|
|
246
|
+
echo " ✅ 允许: brainstorming, 创建 Design Doc, 运行 guard" >&2
|
|
247
|
+
echo " 💡 完成 Design Doc 后运行 comet-guard design --apply 进入 build" >&2
|
|
248
|
+
;;
|
|
249
|
+
archive)
|
|
250
|
+
echo " ❌ archive 阶段不允许写源代码" >&2
|
|
251
|
+
echo " ✅ 允许: 确认归档, 运行归档脚本" >&2
|
|
252
|
+
;;
|
|
253
|
+
esac
|
|
254
|
+
echo "" >&2
|
|
255
|
+
exit 2
|
|
256
|
+
;;
|
|
257
|
+
esac
|
|
258
|
+
|
|
259
|
+
echo "[COMET-HOOK] allowed: $RELPATH (phase: $PHASE)" >&2
|
|
260
|
+
exit 0
|