@rpamis/comet 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +575 -443
  2. package/assets/manifest.json +41 -24
  3. package/assets/skills/comet/SKILL.md +282 -301
  4. package/assets/skills/comet/reference/auto-transition.md +27 -0
  5. package/assets/skills/comet/reference/comet-yaml-fields.md +68 -0
  6. package/assets/skills/comet/reference/context-recovery.md +35 -0
  7. package/assets/skills/comet/reference/debug-gate.md +17 -0
  8. package/assets/skills/comet/reference/decision-point.md +20 -0
  9. package/assets/skills/comet/reference/dirty-worktree.md +1 -0
  10. package/assets/skills/comet/reference/file-structure.md +28 -0
  11. package/assets/skills/comet/reference/subagent-dispatch.md +113 -0
  12. package/assets/skills/comet/rules/comet-phase-guard.en.md +99 -0
  13. package/assets/skills/comet/rules/comet-phase-guard.md +99 -0
  14. package/assets/skills/comet/scripts/comet-archive.sh +71 -55
  15. package/assets/skills/comet/scripts/comet-guard.sh +174 -18
  16. package/assets/skills/comet/scripts/comet-handoff.sh +133 -6
  17. package/assets/skills/comet/scripts/comet-hook-guard.sh +260 -0
  18. package/assets/skills/comet/scripts/comet-state.sh +362 -25
  19. package/assets/skills/comet/scripts/comet-yaml-validate.sh +24 -1
  20. package/assets/skills/comet-archive/SKILL.md +100 -73
  21. package/assets/skills/comet-build/SKILL.md +304 -221
  22. package/assets/skills/comet-design/SKILL.md +263 -166
  23. package/assets/skills/comet-hotfix/SKILL.md +204 -169
  24. package/assets/skills/comet-open/SKILL.md +203 -113
  25. package/assets/skills/comet-tweak/SKILL.md +180 -154
  26. package/assets/skills/comet-verify/SKILL.md +234 -201
  27. package/assets/skills-zh/comet/SKILL.md +269 -301
  28. package/assets/skills-zh/comet/reference/auto-transition.md +27 -0
  29. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +68 -0
  30. package/assets/skills-zh/comet/reference/context-recovery.md +35 -0
  31. package/assets/skills-zh/comet/reference/debug-gate.md +17 -0
  32. package/assets/skills-zh/comet/reference/decision-point.md +20 -0
  33. package/assets/skills-zh/comet/reference/dirty-worktree.md +2 -1
  34. package/assets/skills-zh/comet/reference/file-structure.md +28 -0
  35. package/assets/skills-zh/comet/reference/subagent-dispatch.md +113 -0
  36. package/assets/skills-zh/comet-archive/SKILL.md +100 -73
  37. package/assets/skills-zh/comet-build/SKILL.md +304 -221
  38. package/assets/skills-zh/comet-design/SKILL.md +264 -166
  39. package/assets/skills-zh/comet-hotfix/SKILL.md +200 -169
  40. package/assets/skills-zh/comet-open/SKILL.md +203 -113
  41. package/assets/skills-zh/comet-tweak/SKILL.md +176 -154
  42. package/assets/skills-zh/comet-verify/SKILL.md +232 -201
  43. package/dist/cli/index.js +19 -0
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/commands/doctor.d.ts.map +1 -1
  46. package/dist/commands/doctor.js +22 -0
  47. package/dist/commands/doctor.js.map +1 -1
  48. package/dist/commands/init.d.ts +5 -1
  49. package/dist/commands/init.d.ts.map +1 -1
  50. package/dist/commands/init.js +64 -9
  51. package/dist/commands/init.js.map +1 -1
  52. package/dist/commands/uninstall.d.ts +9 -0
  53. package/dist/commands/uninstall.d.ts.map +1 -0
  54. package/dist/commands/uninstall.js +113 -0
  55. package/dist/commands/uninstall.js.map +1 -0
  56. package/dist/commands/update.d.ts +1 -1
  57. package/dist/commands/update.d.ts.map +1 -1
  58. package/dist/commands/update.js +120 -32
  59. package/dist/commands/update.js.map +1 -1
  60. package/dist/core/codegraph.d.ts +4 -0
  61. package/dist/core/codegraph.d.ts.map +1 -0
  62. package/dist/core/codegraph.js +63 -0
  63. package/dist/core/codegraph.js.map +1 -0
  64. package/dist/core/detect.d.ts +8 -1
  65. package/dist/core/detect.d.ts.map +1 -1
  66. package/dist/core/detect.js +41 -2
  67. package/dist/core/detect.js.map +1 -1
  68. package/dist/core/openspec.d.ts +1 -1
  69. package/dist/core/openspec.d.ts.map +1 -1
  70. package/dist/core/openspec.js +40 -17
  71. package/dist/core/openspec.js.map +1 -1
  72. package/dist/core/platforms.d.ts +10 -0
  73. package/dist/core/platforms.d.ts.map +1 -1
  74. package/dist/core/platforms.js +177 -16
  75. package/dist/core/platforms.js.map +1 -1
  76. package/dist/core/skills.d.ts +36 -1
  77. package/dist/core/skills.d.ts.map +1 -1
  78. package/dist/core/skills.js +451 -15
  79. package/dist/core/skills.js.map +1 -1
  80. package/dist/core/superpowers.d.ts.map +1 -1
  81. package/dist/core/superpowers.js +1 -0
  82. package/dist/core/superpowers.js.map +1 -1
  83. package/dist/core/uninstall.d.ts +28 -0
  84. package/dist/core/uninstall.d.ts.map +1 -0
  85. package/dist/core/uninstall.js +421 -0
  86. package/dist/core/uninstall.js.map +1 -0
  87. package/dist/core/version.d.ts +31 -0
  88. package/dist/core/version.d.ts.map +1 -0
  89. package/dist/core/version.js +111 -0
  90. package/dist/core/version.js.map +1 -0
  91. package/dist/utils/file-system.d.ts +23 -0
  92. package/dist/utils/file-system.d.ts.map +1 -1
  93. package/dist/utils/file-system.js +100 -5
  94. package/dist/utils/file-system.js.map +1 -1
  95. package/package.json +69 -62
@@ -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