@rpamis/comet 0.2.6 → 0.2.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.
package/README.md CHANGED
@@ -26,6 +26,7 @@
26
26
  ```
27
27
 
28
28
  > 中文版:[README-zh.md](README-zh.md)
29
+ > [B站视频介绍](https://www.bilibili.com/video/BV1y4Gi6CEo1/?spm_id_from=333.1387.homepage.video_card.click&vd_source=d22726fe6b108647dbebf1c5d8817377)
29
30
 
30
31
  **OpenSpec + Superpowers dual-star development workflow** — one command from idea to archive.
31
32
 
@@ -62,12 +63,12 @@ comet init
62
63
  4. Install [OpenSpec](https://github.com/Fission-AI/OpenSpec) skills
63
64
  5. Install [Superpowers](https://github.com/obra/superpowers) skills
64
65
  6. Deploy Comet skills (in your chosen language) to selected platforms
65
- 7. Create `docs/superpowers/specs/` and `docs/superpowers/plans/` working directories
66
+ 7. Create `docs/superpowers/specs/` and `docs/superpowers/plans/` working directories for project-scope installs
66
67
 
67
68
  > [!TIP]
68
69
  > update version
69
70
  >
70
- > comet update or `npm install -g @rpamis/comet@latest` to get the latest features and fixes.
71
+ > `comet update` or `npm install -g @rpamis/comet@latest` to get the latest features and fixes.
71
72
 
72
73
  ## Screenshots
73
74
 
@@ -93,7 +94,8 @@ comet init
93
94
 
94
95
  | Option | Description |
95
96
  |--------|-------------|
96
- | `--yes` | Non-interactive mode, auto-select detected platforms |
97
+ | `--yes` | Non-interactive mode, auto-select detected platforms (or all if none detected) |
98
+ | `--scope <scope>` | Install scope: `project` or `global` |
97
99
  | `--skip-existing` | Skip already installed components |
98
100
  | `--overwrite` | Overwrite already installed components |
99
101
  | `--json` | Output structured JSON |
@@ -164,6 +166,7 @@ After `comet init`, three groups of skills are installed to the selected platfor
164
166
  | Script | Purpose |
165
167
  |--------|---------|
166
168
  | `comet-guard.sh` | Phase transition guard — validates exit conditions, `--apply` auto-updates `.comet.yaml` |
169
+ | `comet-handoff.sh` | Design handoff — generates deterministic context packages from OpenSpec artifacts with SHA256 tracing |
167
170
  | `comet-archive.sh` | One-command archive — validates state, syncs specs, moves to archive, updates status |
168
171
  | `comet-yaml-validate.sh` | Schema validator — validates `.comet.yaml` structure and field values |
169
172
  | `comet-state.sh` | Unified state management — init/set/get/check/scale, agents' exclusive YAML interface |
@@ -223,19 +226,24 @@ Comet uses a decoupled state architecture with separate YAML files:
223
226
  ```yaml
224
227
  workflow: full
225
228
  phase: build
226
- design_doc: docs/superpowers/specs/YYYY-MM-DD-topic-design.md
227
- plan: docs/superpowers/plans/YYYY-MM-DD-feature.md
228
229
  build_mode: subagent-driven-development
229
230
  isolation: branch
230
- verify_mode: light
231
+ verify_mode: null
232
+ design_doc: docs/superpowers/specs/YYYY-MM-DD-topic-design.md
233
+ plan: docs/superpowers/plans/YYYY-MM-DD-feature.md
231
234
  verify_result: pending
232
- verification_report: docs/superpowers/reports/YYYY-MM-DD-change-verify.md
235
+ verification_report: null
233
236
  branch_status: pending
234
237
  verified_at: null
235
238
  archived: false
239
+ direct_override: false
240
+ build_command: null
241
+ verify_command: null
242
+ handoff_context: openspec/changes/<name>/.comet/handoff/design-context.json
243
+ handoff_hash: <sha256>
236
244
  ```
237
245
 
238
- In full workflow, `build_mode` and `isolation` may temporarily be `null` at init time, but they must be resolved before `build → verify`. `direct` is allowed by default only for hotfix/tweak; full workflow requires `direct_override: true`. Projects can configure `build_command` / `verify_command` in the change or repo root, and guard will run those commands first and print failure output.
246
+ In full workflow, `build_mode`, `isolation`, and `verify_mode` may temporarily be `null`; `build_mode` and `isolation` must be resolved before `build → verify`. `verification_report` stays `null` until verification writes a report, and `verify-pass` requires that report to exist plus `branch_status: handled`. Fields after `archived` in the example are optional or script-derived: `direct_override` is only needed for full-workflow direct builds, project commands may be absent unless configured, and `handoff_context` / `handoff_hash` are recorded by `comet-handoff.sh` before leaving design. Projects can configure `build_command` / `verify_command` in the change or repo root, and guard will run those commands first and print failure output.
239
247
 
240
248
  All states and execution phases are updated via scripts, and **each phase verifies that tasks are truly completed before exiting — conditions are met before the phase exits and state is updated**. Compared to recording complex state management mechanisms in Skills, the script approach strongly guarantees the reliability of core state transitions, correctness of YAML files, and convenience of breakpoint recovery — Agents only need to use Comet's built-in commands to read state and know the current Spec's situation.
241
249
 
@@ -248,7 +256,7 @@ Comet ensures agent execution reliability through automated state transitions:
248
256
  - Outputs `[HARD STOP]` with actionable suggestions if validation fails
249
257
 
250
258
  2. **Automated State Transitions** — `comet-guard.sh --apply` updates `.comet.yaml` automatically
251
- - All phase transitions (design → build → verify → archive) use `guard --apply`
259
+ - All phase transitions (opendesign/build → verify → archive) use `guard --apply`
252
260
  - No manual state editing required — eliminates write-verification errors
253
261
  - `comet-state.sh` is the agents' exclusive interface for state operations
254
262
  - Guard and archive scripts use `comet-state.sh` internally for state management
@@ -256,7 +264,7 @@ Comet ensures agent execution reliability through automated state transitions:
256
264
  3. **Schema Validation** — `comet-yaml-validate.sh` ensures data integrity
257
265
  - Validates required and optional fields
258
266
  - Validates enum values, including `direct_override`
259
- - Validates referenced file paths exist
267
+ - Validates `design_doc`, `plan`, and `handoff_context` paths exist, plus `handoff_hash` format
260
268
  - Detects unknown/typos fields
261
269
 
262
270
  4. **Build Decision Enforcement** — Guard and state transitions both block skipped build choices
@@ -286,6 +294,7 @@ your-project/
286
294
  │ ├── comet/SKILL.md
287
295
  │ │ └── scripts/
288
296
  │ │ ├── comet-guard.sh # Phase transition guard (--apply auto-updates state)
297
+ │ │ ├── comet-handoff.sh # Design handoff (OpenSpec → Superpowers context tracing)
289
298
  │ │ ├── comet-archive.sh # One-command archive automation
290
299
  │ │ ├── comet-yaml-validate.sh # Schema validator
291
300
  │ │ └── comet-state.sh # Unified state management (init/set/get/check/scale)
@@ -347,6 +356,10 @@ pnpm format
347
356
 
348
357
  See [CHANGELOG.md](CHANGELOG.md) for version history and updates.
349
358
 
359
+ ## Roadmap
360
+
361
+ Track our development progress and upcoming features on the [Comet Roadmap](https://github.com/orgs/rpamis/projects/1).
362
+
350
363
  ## Security
351
364
 
352
365
  - Pre-publish scan for API keys, secrets, tokens, and private keys
@@ -356,3 +369,6 @@ See [CHANGELOG.md](CHANGELOG.md) for version history and updates.
356
369
  ## License
357
370
 
358
371
  [MIT](LICENSE.md)
372
+
373
+ ## Reference
374
+ [LINUX DO - 新的理想型社区](https://linux.do/)
@@ -4,6 +4,7 @@
4
4
  "comet/SKILL.md",
5
5
  "comet/scripts/comet-guard.sh",
6
6
  "comet/scripts/comet-state.sh",
7
+ "comet/scripts/comet-handoff.sh",
7
8
  "comet/scripts/comet-archive.sh",
8
9
  "comet/scripts/comet-yaml-validate.sh",
9
10
  "comet-open/SKILL.md",
@@ -73,11 +73,49 @@ yaml_field() {
73
73
  bash "$STATE_SH" get "$CHANGE" "$field" 2>/dev/null
74
74
  else
75
75
  if [ -f "$YAML" ]; then
76
- grep "^${field}:" "$YAML" | sed "s/^${field}: *//" | tr -d '"' | tr -d "'"
76
+ local value
77
+ value=$(grep "^${field}:" "$YAML" 2>/dev/null | sed "s/^${field}: *//" || true)
78
+ value=$(strip_inline_comment "$value")
79
+ strip_wrapping_quotes "$value"
77
80
  fi
78
81
  fi
79
82
  }
80
83
 
84
+ strip_inline_comment() {
85
+ local value="$1"
86
+ printf '%s\n' "$value" | awk -v squote="'" '
87
+ {
88
+ out = ""
89
+ quote = ""
90
+ for (i = 1; i <= length($0); i++) {
91
+ c = substr($0, i, 1)
92
+ if (quote == "") {
93
+ if (c == "\"" || c == squote) {
94
+ quote = c
95
+ } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
96
+ sub(/[[:space:]]+$/, "", out)
97
+ print out
98
+ next
99
+ }
100
+ } else if (c == quote) {
101
+ quote = ""
102
+ }
103
+ out = out c
104
+ }
105
+ print out
106
+ }
107
+ '
108
+ }
109
+
110
+ strip_wrapping_quotes() {
111
+ local value="$1"
112
+ case "$value" in
113
+ \"*\") printf '%s\n' "${value:1:${#value}-2}" ;;
114
+ \'*\') printf '%s\n' "${value:1:${#value}-2}" ;;
115
+ *) printf '%s\n' "$value" ;;
116
+ esac
117
+ }
118
+
81
119
  if [ ! -f "$YAML" ]; then
82
120
  red "FATAL: .comet.yaml not found in $CHANGE_DIR/"
83
121
  exit 1
@@ -98,10 +98,37 @@ yaml_field_value() {
98
98
  if [ -f "$yaml" ]; then
99
99
  local value
100
100
  value=$(grep "^${field}:" "$yaml" 2>/dev/null | sed "s/^${field}: *//" || true)
101
+ value=$(strip_inline_comment "$value")
101
102
  strip_wrapping_quotes "$value"
102
103
  fi
103
104
  }
104
105
 
106
+ strip_inline_comment() {
107
+ local value="$1"
108
+ printf '%s\n' "$value" | awk -v squote="'" '
109
+ {
110
+ out = ""
111
+ quote = ""
112
+ for (i = 1; i <= length($0); i++) {
113
+ c = substr($0, i, 1)
114
+ if (quote == "") {
115
+ if (c == "\"" || c == squote) {
116
+ quote = c
117
+ } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
118
+ sub(/[[:space:]]+$/, "", out)
119
+ print out
120
+ next
121
+ }
122
+ } else if (c == quote) {
123
+ quote = ""
124
+ }
125
+ out = out c
126
+ }
127
+ print out
128
+ }
129
+ '
130
+ }
131
+
105
132
  strip_wrapping_quotes() {
106
133
  local value="$1"
107
134
  case "$value" in
@@ -130,6 +157,7 @@ project_config_value() {
130
157
  for config in ".comet.yaml" "comet.yaml" ".comet.yml" "comet.yml"; do
131
158
  if [ -f "$config" ]; then
132
159
  value=$(grep "^${field}:" "$config" 2>/dev/null | sed "s/^${field}: *//" || true)
160
+ value=$(strip_inline_comment "$value")
133
161
  value=$(strip_wrapping_quotes "$value")
134
162
  if [ -n "$value" ] && [ "$value" != "null" ]; then
135
163
  echo "$value"
@@ -156,6 +184,47 @@ run_command_string() {
156
184
  bash -lc "$command"
157
185
  }
158
186
 
187
+ hash_stream() {
188
+ if command -v sha256sum >/dev/null 2>&1; then
189
+ sha256sum | awk '{print $1}'
190
+ elif command -v shasum >/dev/null 2>&1; then
191
+ shasum -a 256 | awk '{print $1}'
192
+ else
193
+ echo "sha256sum or shasum is required" >&2
194
+ return 1
195
+ fi
196
+ }
197
+
198
+ hash_file() {
199
+ local file="$1"
200
+ if command -v sha256sum >/dev/null 2>&1; then
201
+ sha256sum "$file" | awk '{print $1}'
202
+ elif command -v shasum >/dev/null 2>&1; then
203
+ shasum -a 256 "$file" | awk '{print $1}'
204
+ else
205
+ echo "sha256sum or shasum is required" >&2
206
+ return 1
207
+ fi
208
+ }
209
+
210
+ handoff_source_files() {
211
+ printf '%s\n' "$CHANGE_DIR/proposal.md"
212
+ printf '%s\n' "$CHANGE_DIR/design.md"
213
+ printf '%s\n' "$CHANGE_DIR/tasks.md"
214
+ if [ -d "$CHANGE_DIR/specs" ]; then
215
+ find "$CHANGE_DIR/specs" -path '*/spec.md' -type f 2>/dev/null | sort
216
+ fi
217
+ }
218
+
219
+ compute_handoff_hash() {
220
+ handoff_source_files | while IFS= read -r file; do
221
+ if [ -f "$file" ]; then
222
+ printf 'path:%s\n' "$file"
223
+ printf 'sha256:%s\n' "$(hash_file "$file")"
224
+ fi
225
+ done | hash_stream
226
+ }
227
+
159
228
  preflight() {
160
229
 
161
230
  if [ ! -d "$CHANGE_DIR" ]; then
@@ -291,6 +360,118 @@ branch_status_handled() {
291
360
  [ "$status" = "handled" ]
292
361
  }
293
362
 
363
+ design_handoff_context_valid() {
364
+ local context recorded_hash actual_hash markdown
365
+ context=$(yaml_field_value "handoff_context" 2>/dev/null || true)
366
+ recorded_hash=$(yaml_field_value "handoff_hash" 2>/dev/null || true)
367
+
368
+ if [ -z "$context" ] || [ "$context" = "null" ]; then
369
+ echo "handoff_context is missing from .comet.yaml" >&2
370
+ echo "Next: run bash \"\$COMET_HANDOFF\" $CHANGE design --write before invoking Superpowers." >&2
371
+ return 1
372
+ fi
373
+ if [ ! -s "$context" ]; then
374
+ echo "handoff_context does not point to a non-empty file: $context" >&2
375
+ echo "Next: regenerate the design handoff with comet-handoff.sh." >&2
376
+ return 1
377
+ fi
378
+ if [[ ! "$recorded_hash" =~ ^[a-f0-9]{64}$ ]]; then
379
+ echo "handoff_hash is missing or invalid: ${recorded_hash:-null}" >&2
380
+ echo "Next: regenerate the design handoff with comet-handoff.sh." >&2
381
+ return 1
382
+ fi
383
+
384
+ actual_hash=$(compute_handoff_hash)
385
+ if [ "$actual_hash" != "$recorded_hash" ]; then
386
+ echo "OpenSpec artifacts changed after handoff was generated." >&2
387
+ echo "Expected handoff_hash: $recorded_hash" >&2
388
+ echo "Actual handoff_hash: $actual_hash" >&2
389
+ echo "Next: rerun comet-handoff.sh so Superpowers receives the current OpenSpec context." >&2
390
+ return 1
391
+ fi
392
+
393
+ markdown="${context%.json}.md"
394
+ if [ ! -s "$markdown" ]; then
395
+ echo "design handoff markdown is missing or empty: $markdown" >&2
396
+ echo "Next: regenerate the design handoff with comet-handoff.sh." >&2
397
+ return 1
398
+ fi
399
+ }
400
+
401
+ design_handoff_markdown_traceable() {
402
+ local context markdown missing=0
403
+ context=$(yaml_field_value "handoff_context" 2>/dev/null || true)
404
+ if [ -z "$context" ] || [ "$context" = "null" ]; then
405
+ echo "handoff_context is missing from .comet.yaml" >&2
406
+ return 1
407
+ fi
408
+ markdown="${context%.json}.md"
409
+ if [ ! -s "$markdown" ]; then
410
+ echo "design handoff markdown is missing or empty: $markdown" >&2
411
+ return 1
412
+ fi
413
+ grep -q '^Generated-by: comet-handoff\.sh$' "$markdown" || {
414
+ echo "handoff markdown is missing Generated-by marker" >&2
415
+ missing=1
416
+ }
417
+ grep -Eq '^- Mode: (compact|full)$' "$markdown" || {
418
+ echo "handoff markdown is missing Mode marker" >&2
419
+ missing=1
420
+ }
421
+ handoff_source_files | while IFS= read -r file; do
422
+ [ -f "$file" ] || continue
423
+ if ! grep -q "^- Source: $file$" "$markdown"; then
424
+ echo "handoff markdown is missing source reference: $file" >&2
425
+ exit 2
426
+ fi
427
+ if ! grep -q "^- SHA256: $(hash_file "$file")$" "$markdown"; then
428
+ echo "handoff markdown is missing current sha256 for: $file" >&2
429
+ exit 2
430
+ fi
431
+ done || missing=1
432
+
433
+ [ "$missing" -eq 0 ]
434
+ }
435
+
436
+ design_doc_frontmatter_has() {
437
+ local design_doc="$1"
438
+ local field="$2"
439
+ local expected="$3"
440
+ awk '
441
+ {
442
+ line = $0
443
+ sub(/^\357\273\277/, "", line)
444
+ }
445
+ !in_fm && line == "---" { in_fm = 1; next }
446
+ in_fm && line == "---" { exit }
447
+ in_fm { print line }
448
+ ' "$design_doc" | grep -Eq "^${field}: ['\"]?${expected}['\"]?[[:space:]]*$"
449
+ }
450
+
451
+ design_doc_links_current_change() {
452
+ local design_doc
453
+ design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
454
+ if [ -z "$design_doc" ] || [ "$design_doc" = "null" ] || [ ! -s "$design_doc" ]; then
455
+ echo "design_doc must point to an existing Superpowers Design Doc before leaving design." >&2
456
+ return 1
457
+ fi
458
+ design_doc_frontmatter_has "$design_doc" "comet_change" "$CHANGE"
459
+ }
460
+
461
+ design_doc_declares_technical_role() {
462
+ local design_doc
463
+ design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
464
+ [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -s "$design_doc" ] &&
465
+ design_doc_frontmatter_has "$design_doc" "role" "technical-design"
466
+ }
467
+
468
+ design_doc_declares_canonical_spec() {
469
+ local design_doc
470
+ design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
471
+ [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -s "$design_doc" ] &&
472
+ design_doc_frontmatter_has "$design_doc" "canonical_spec" "openspec"
473
+ }
474
+
294
475
  archived_is_true() {
295
476
  local val
296
477
  val=$(yaml_field_value "archived" 2>/dev/null || true)
@@ -315,10 +496,16 @@ guard_design() {
315
496
  design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
316
497
 
317
498
  check "proposal.md exists" file_nonempty "$CHANGE_DIR/proposal.md"
499
+ check "design.md exists" file_nonempty "$CHANGE_DIR/design.md"
318
500
  check "tasks.md exists" file_nonempty "$CHANGE_DIR/tasks.md"
501
+ check "design handoff context exists" design_handoff_context_valid
502
+ check "design handoff markdown is traceable" design_handoff_markdown_traceable
319
503
 
320
504
  if [ -n "$design_doc" ] && [ "$design_doc" != "null" ]; then
321
505
  check "Design Doc ($design_doc) exists" file_nonempty "$design_doc"
506
+ check "Design Doc frontmatter links current change" design_doc_links_current_change
507
+ check "Design Doc declares technical design role" design_doc_declares_technical_role
508
+ check "Design Doc declares OpenSpec as canonical spec" design_doc_declares_canonical_spec
322
509
  else
323
510
  warn " [WARN] No design_doc recorded in .comet.yaml"
324
511
  fi
@@ -395,7 +582,7 @@ else
395
582
  apply_state_update "$PHASE"
396
583
  case "$PHASE" in
397
584
  open)
398
- new_phase=$(grep "^phase:" "$CHANGE_DIR/.comet.yaml" | sed 's/^phase: *//' | tr -d '"' | tr -d "'")
585
+ new_phase=$(yaml_field_value "phase")
399
586
  green " [APPLY] .comet.yaml updated: phase=$new_phase"
400
587
  ;;
401
588
  design) green " [APPLY] .comet.yaml updated: phase=build" ;;
@@ -0,0 +1,261 @@
1
+ #!/bin/bash
2
+ # Comet Handoff — creates machine-owned context packages between phases
3
+ # Usage: comet-handoff.sh <change-name> design --write [--full]
4
+
5
+ set -euo pipefail
6
+
7
+ red() { echo -e "\033[31m$1\033[0m" >&2; }
8
+ green() { echo -e "\033[32m$1\033[0m" >&2; }
9
+
10
+ validate_change_name() {
11
+ local name="$1"
12
+ if [ -z "$name" ]; then
13
+ red "ERROR: Change name cannot be empty"
14
+ exit 1
15
+ fi
16
+ if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
17
+ red "ERROR: Invalid change name: '$name'"
18
+ red "Valid characters: a-z, A-Z, 0-9, -, _"
19
+ exit 1
20
+ fi
21
+ if [[ "$name" =~ \.\. ]]; then
22
+ red "ERROR: Change name cannot contain '..' (path traversal not allowed)"
23
+ exit 1
24
+ fi
25
+ }
26
+
27
+ strip_wrapping_quotes() {
28
+ local value="$1"
29
+ case "$value" in
30
+ \"*\") printf '%s\n' "${value:1:${#value}-2}" ;;
31
+ \'*\') printf '%s\n' "${value:1:${#value}-2}" ;;
32
+ *) printf '%s\n' "$value" ;;
33
+ esac
34
+ }
35
+
36
+ strip_inline_comment() {
37
+ local value="$1"
38
+ printf '%s\n' "$value" | awk -v squote="'" '
39
+ {
40
+ out = ""
41
+ quote = ""
42
+ for (i = 1; i <= length($0); i++) {
43
+ c = substr($0, i, 1)
44
+ if (quote == "") {
45
+ if (c == "\"" || c == squote) {
46
+ quote = c
47
+ } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
48
+ sub(/[[:space:]]+$/, "", out)
49
+ print out
50
+ next
51
+ }
52
+ } else if (c == quote) {
53
+ quote = ""
54
+ }
55
+ out = out c
56
+ }
57
+ print out
58
+ }
59
+ '
60
+ }
61
+
62
+ yaml_field_value() {
63
+ local field="$1"
64
+ local yaml="$CHANGE_DIR/.comet.yaml"
65
+ local value
66
+ value=$(grep "^${field}:" "$yaml" 2>/dev/null | sed "s/^${field}: *//" || true)
67
+ value=$(strip_inline_comment "$value")
68
+ strip_wrapping_quotes "$value"
69
+ }
70
+
71
+ hash_stream() {
72
+ if command -v sha256sum >/dev/null 2>&1; then
73
+ sha256sum | awk '{print $1}'
74
+ elif command -v shasum >/dev/null 2>&1; then
75
+ shasum -a 256 | awk '{print $1}'
76
+ else
77
+ red "ERROR: sha256sum or shasum is required"
78
+ exit 1
79
+ fi
80
+ }
81
+
82
+ hash_file() {
83
+ local file="$1"
84
+ if command -v sha256sum >/dev/null 2>&1; then
85
+ sha256sum "$file" | awk '{print $1}'
86
+ elif command -v shasum >/dev/null 2>&1; then
87
+ shasum -a 256 "$file" | awk '{print $1}'
88
+ else
89
+ red "ERROR: sha256sum or shasum is required"
90
+ exit 1
91
+ fi
92
+ }
93
+
94
+ source_files() {
95
+ printf '%s\n' "$CHANGE_DIR/proposal.md"
96
+ printf '%s\n' "$CHANGE_DIR/design.md"
97
+ printf '%s\n' "$CHANGE_DIR/tasks.md"
98
+ if [ -d "$CHANGE_DIR/specs" ]; then
99
+ find "$CHANGE_DIR/specs" -path '*/spec.md' -type f 2>/dev/null | sort
100
+ fi
101
+ }
102
+
103
+ compute_context_hash() {
104
+ source_files | while IFS= read -r file; do
105
+ if [ -f "$file" ]; then
106
+ printf 'path:%s\n' "$file"
107
+ printf 'sha256:%s\n' "$(hash_file "$file")"
108
+ fi
109
+ done | hash_stream
110
+ }
111
+
112
+ json_escape() {
113
+ printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
114
+ }
115
+
116
+ file_line_count() {
117
+ local file="$1"
118
+ wc -l < "$file" | tr -d ' '
119
+ }
120
+
121
+ write_file_excerpt() {
122
+ local file="$1"
123
+ local max_lines="$2"
124
+ local total_lines
125
+ total_lines=$(file_line_count "$file")
126
+
127
+ echo "## $file"
128
+ echo ""
129
+ echo "- Source: $file"
130
+ echo "- Lines: 1-$total_lines"
131
+ echo "- SHA256: $(hash_file "$file")"
132
+ echo ""
133
+
134
+ if [ "$HANDOFF_MODE" = "full" ] || [ "$total_lines" -le "$max_lines" ]; then
135
+ echo '```md'
136
+ cat "$file"
137
+ echo '```'
138
+ else
139
+ echo "[TRUNCATED]"
140
+ echo ""
141
+ echo '```md'
142
+ sed -n "1,${max_lines}p" "$file"
143
+ echo '```'
144
+ echo ""
145
+ echo "Full source: $file"
146
+ fi
147
+ echo ""
148
+ }
149
+
150
+ write_markdown_context() {
151
+ local output="$1"
152
+ {
153
+ echo "# Comet Design Handoff"
154
+ echo ""
155
+ echo "- Change: $CHANGE"
156
+ echo "- Phase: design"
157
+ echo "- Mode: $HANDOFF_MODE"
158
+ echo "- Context hash: $CONTEXT_HASH"
159
+ echo ""
160
+ echo "Generated-by: comet-handoff.sh"
161
+ echo ""
162
+ echo "OpenSpec remains the canonical capability spec. This handoff is a deterministic, source-traceable context pack, not an agent-authored summary."
163
+ echo ""
164
+ source_files | while IFS= read -r file; do
165
+ [ -f "$file" ] || continue
166
+ write_file_excerpt "$file" 80
167
+ done
168
+ } > "$output"
169
+ }
170
+
171
+ write_json_context() {
172
+ local output="$1"
173
+ {
174
+ echo "{"
175
+ echo " \"change\": \"$(json_escape "$CHANGE")\","
176
+ echo " \"phase\": \"design\","
177
+ echo " \"mode\": \"$HANDOFF_MODE\","
178
+ echo " \"canonical_spec\": \"openspec\","
179
+ echo " \"generated_by\": \"comet-handoff.sh\","
180
+ echo " \"context_hash\": \"$CONTEXT_HASH\","
181
+ echo " \"files\": ["
182
+ local first=1
183
+ while IFS= read -r file; do
184
+ [ -f "$file" ] || continue
185
+ if [ "$first" -eq 0 ]; then
186
+ echo ","
187
+ fi
188
+ first=0
189
+ printf ' { "path": "%s", "sha256": "%s" }' "$(json_escape "$file")" "$(hash_file "$file")"
190
+ done < <(source_files)
191
+ echo ""
192
+ echo " ]"
193
+ echo "}"
194
+ } > "$output"
195
+ }
196
+
197
+ CHANGE="${1:-}"
198
+ PHASE="${2:-}"
199
+ MODE="${3:-}"
200
+ FULL_FLAG="${4:-}"
201
+
202
+ validate_change_name "$CHANGE"
203
+
204
+ if [ "$PHASE" != "design" ] || [ "$MODE" != "--write" ]; then
205
+ red "Usage: comet-handoff.sh <change-name> design --write [--full]"
206
+ exit 1
207
+ fi
208
+ case "$FULL_FLAG" in
209
+ "") HANDOFF_MODE="compact" ;;
210
+ --full) HANDOFF_MODE="full" ;;
211
+ *)
212
+ red "Usage: comet-handoff.sh <change-name> design --write [--full]"
213
+ exit 1
214
+ ;;
215
+ esac
216
+
217
+ CHANGE_DIR="openspec/changes/$CHANGE"
218
+ YAML="$CHANGE_DIR/.comet.yaml"
219
+ SCRIPT_DIR="$(dirname "$(readlink -f "$0" 2>/dev/null || echo "$0")" 2>/dev/null || dirname "$0")"
220
+ STATE_SH="$SCRIPT_DIR/comet-state.sh"
221
+
222
+ if [ ! -d "$CHANGE_DIR" ]; then
223
+ red "ERROR: change directory not found: $CHANGE_DIR"
224
+ exit 1
225
+ fi
226
+ if [ ! -f "$YAML" ]; then
227
+ red "ERROR: .comet.yaml not found at $YAML"
228
+ exit 1
229
+ fi
230
+ if [ "$(yaml_field_value phase)" != "design" ]; then
231
+ red "ERROR: design handoff requires phase: design"
232
+ exit 1
233
+ fi
234
+
235
+ for required in proposal.md design.md tasks.md; do
236
+ if [ ! -s "$CHANGE_DIR/$required" ]; then
237
+ red "ERROR: required OpenSpec artifact missing or empty: $CHANGE_DIR/$required"
238
+ exit 1
239
+ fi
240
+ done
241
+
242
+ HANDOFF_DIR="$CHANGE_DIR/.comet/handoff"
243
+ CONTEXT_JSON="$HANDOFF_DIR/design-context.json"
244
+ CONTEXT_MD="$HANDOFF_DIR/design-context.md"
245
+ mkdir -p "$HANDOFF_DIR"
246
+
247
+ CONTEXT_HASH="$(compute_context_hash)"
248
+ write_markdown_context "$CONTEXT_MD"
249
+ write_json_context "$CONTEXT_JSON"
250
+
251
+ if [ -x "$STATE_SH" ] || [ -f "$STATE_SH" ]; then
252
+ bash "$STATE_SH" set "$CHANGE" handoff_context "$CONTEXT_JSON" >/dev/null
253
+ bash "$STATE_SH" set "$CHANGE" handoff_hash "$CONTEXT_HASH" >/dev/null
254
+ else
255
+ red "ERROR: comet-state.sh not found; cannot record handoff fields"
256
+ exit 1
257
+ fi
258
+
259
+ green "[HANDOFF] wrote $CONTEXT_JSON"
260
+ green "[HANDOFF] wrote $CONTEXT_MD"
261
+ green "[HANDOFF] handoff_hash=$CONTEXT_HASH"
@@ -72,10 +72,37 @@ yaml_field() {
72
72
  if [ -f "$yaml_file" ]; then
73
73
  local value
74
74
  value=$(grep "^${field}:" "$yaml_file" 2>/dev/null | sed "s/^${field}: *//" || true)
75
+ value=$(strip_inline_comment "$value")
75
76
  strip_wrapping_quotes "$value"
76
77
  fi
77
78
  }
78
79
 
80
+ strip_inline_comment() {
81
+ local value="$1"
82
+ printf '%s\n' "$value" | awk -v squote="'" '
83
+ {
84
+ out = ""
85
+ quote = ""
86
+ for (i = 1; i <= length($0); i++) {
87
+ c = substr($0, i, 1)
88
+ if (quote == "") {
89
+ if (c == "\"" || c == squote) {
90
+ quote = c
91
+ } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
92
+ sub(/[[:space:]]+$/, "", out)
93
+ print out
94
+ next
95
+ }
96
+ } else if (c == quote) {
97
+ quote = ""
98
+ }
99
+ out = out c
100
+ }
101
+ print out
102
+ }
103
+ '
104
+ }
105
+
79
106
  strip_wrapping_quotes() {
80
107
  local value="$1"
81
108
  case "$value" in
@@ -224,12 +251,16 @@ cmd_set() {
224
251
 
225
252
  # Validate field name
226
253
  case "$field" in
227
- workflow|phase|build_mode|isolation|verify_mode|verify_result|verification_report|branch_status|archived|design_doc|plan|verified_at|direct_override|build_command|verify_command)
254
+ workflow|phase|build_mode|isolation|verify_mode|verify_result|verification_report|branch_status|archived|design_doc|plan|verified_at|direct_override|build_command|verify_command|handoff_context|handoff_hash)
228
255
  # Valid field
229
256
  ;;
230
257
  *)
231
258
  red "ERROR: Unknown field: '$field'" >&2
232
- red "Valid fields: workflow, phase, design_doc, plan, build_mode, isolation, verify_mode, verify_result, verification_report, branch_status, verified_at, archived, direct_override, build_command, verify_command" >&2
259
+ red "Valid fields:" >&2
260
+ red " workflow, phase, design_doc, plan, build_mode, isolation," >&2
261
+ red " verify_mode, verify_result, verification_report, branch_status," >&2
262
+ red " verified_at, archived, direct_override, build_command," >&2
263
+ red " verify_command, handoff_context, handoff_hash" >&2
233
264
  exit 1
234
265
  ;;
235
266
  esac
@@ -263,7 +294,7 @@ cmd_set() {
263
294
  direct_override)
264
295
  validate_enum "$value" "true" "false"
265
296
  ;;
266
- design_doc|plan|verification_report|verified_at|build_command|verify_command)
297
+ design_doc|plan|verification_report|verified_at|build_command|verify_command|handoff_context|handoff_hash)
267
298
  # No validation for path fields, date fields, or project command strings
268
299
  ;;
269
300
  esac
@@ -46,9 +46,36 @@ WARNINGS=0
46
46
  field_value() {
47
47
  local value
48
48
  value=$(grep "^${1}:" "$YAML" 2>/dev/null | sed "s/^${1}: *//" || true)
49
+ value=$(strip_inline_comment "$value")
49
50
  strip_wrapping_quotes "$value"
50
51
  }
51
52
 
53
+ strip_inline_comment() {
54
+ local value="$1"
55
+ printf '%s\n' "$value" | awk -v squote="'" '
56
+ {
57
+ out = ""
58
+ quote = ""
59
+ for (i = 1; i <= length($0); i++) {
60
+ c = substr($0, i, 1)
61
+ if (quote == "") {
62
+ if (c == "\"" || c == squote) {
63
+ quote = c
64
+ } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
65
+ sub(/[[:space:]]+$/, "", out)
66
+ print out
67
+ next
68
+ }
69
+ } else if (c == quote) {
70
+ quote = ""
71
+ }
72
+ out = out c
73
+ }
74
+ print out
75
+ }
76
+ '
77
+ }
78
+
52
79
  strip_wrapping_quotes() {
53
80
  local value="$1"
54
81
  case "$value" in
@@ -107,6 +134,8 @@ archived=$(field_value "archived")
107
134
  direct_override=$(field_value "direct_override")
108
135
  design_doc=$(field_value "design_doc")
109
136
  plan=$(field_value "plan")
137
+ handoff_context=$(field_value "handoff_context")
138
+ handoff_hash=$(field_value "handoff_hash")
110
139
 
111
140
  validate_enum "workflow" "$workflow" "full hotfix tweak"
112
141
  validate_enum "phase" "$phase" "open design build verify archive"
@@ -132,8 +161,20 @@ if [ -n "$plan" ] && [ "$plan" != "null" ]; then
132
161
  fi
133
162
  fi
134
163
 
164
+ if [ -n "$handoff_context" ] && [ "$handoff_context" != "null" ]; then
165
+ if [ ! -f "$handoff_context" ]; then
166
+ fail "handoff_context='$handoff_context' does not exist on disk"
167
+ fi
168
+ fi
169
+
170
+ if [ -n "$handoff_hash" ] && [ "$handoff_hash" != "null" ]; then
171
+ if [[ ! "$handoff_hash" =~ ^[a-f0-9]{64}$ ]]; then
172
+ fail "handoff_hash='$handoff_hash' is not a sha256 hex digest"
173
+ fi
174
+ fi
175
+
135
176
  # --- Unknown keys check ---
136
- KNOWN_KEYS="workflow phase design_doc plan build_mode isolation verify_mode verify_result verification_report branch_status verified_at archived direct_override build_command verify_command"
177
+ KNOWN_KEYS="workflow phase design_doc plan build_mode isolation verify_mode verify_result verification_report branch_status verified_at archived direct_override build_command verify_command handoff_context handoff_hash"
137
178
  while IFS=: read -r key _; do
138
179
  key="${key// /}"
139
180
  [ -z "$key" ] && continue
@@ -201,10 +201,11 @@ Comet 脚本随 skill 包分发在 `comet/scripts/` 下。**不硬编码路径**
201
201
  COMET_SEARCH_ROOTS=("." "$HOME/.claude/skills" "$HOME/.codex/skills" "$HOME/.cursor/skills")
202
202
  COMET_GUARD="${COMET_GUARD:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-guard.sh' -type f -print -quit 2>/dev/null)}"
203
203
  COMET_STATE="${COMET_STATE:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-state.sh' -type f -print -quit 2>/dev/null)}"
204
+ COMET_HANDOFF="${COMET_HANDOFF:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-handoff.sh' -type f -print -quit 2>/dev/null)}"
204
205
  COMET_ARCHIVE="${COMET_ARCHIVE:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-archive.sh' -type f -print -quit 2>/dev/null)}"
205
206
 
206
207
  # 脚本定位失败时停止流程
207
- if [ -z "$COMET_GUARD" ] || [ -z "$COMET_STATE" ] || [ -z "$COMET_ARCHIVE" ]; then
208
+ if [ -z "$COMET_GUARD" ] || [ -z "$COMET_STATE" ] || [ -z "$COMET_HANDOFF" ] || [ -z "$COMET_ARCHIVE" ]; then
208
209
  echo "ERROR: Comet scripts not found. Ensure the comet skill is installed." >&2
209
210
  echo "Expected path pattern: */comet/scripts/comet-*.sh under project or platform skill directories" >&2
210
211
  return 1
@@ -234,7 +235,7 @@ bash "$COMET_STATE" transition <archive-name> archived
234
235
  bash "$COMET_ARCHIVE" <change-name>
235
236
  ```
236
237
 
237
- 加载 comet 后,agent 应执行以上三条变量赋值一次,后续全程复用 `$COMET_GUARD`、`$COMET_STATE`、`$COMET_ARCHIVE`。
238
+ 加载 comet 后,agent 应执行以上变量赋值一次,后续全程复用 `$COMET_GUARD`、`$COMET_STATE`、`$COMET_HANDOFF`、`$COMET_ARCHIVE`。
238
239
 
239
240
  ### 文件结构
240
241
 
@@ -248,6 +249,7 @@ openspec/ # OpenSpec — WHAT
248
249
  │ │ ├── proposal.md # Why + What
249
250
  │ │ ├── design.md # 高层架构决策
250
251
  │ │ ├── specs/<capability>/spec.md # Delta 能力规格
252
+ │ │ ├── .comet/handoff/ # 脚本生成的阶段交接包
251
253
  │ │ └── tasks.md # 任务清单
252
254
  │ └── archive/YYYY-MM-DD-<name>/ # 已归档
253
255
  └── specs/<capability>/spec.md # 主 specs(归档时从 delta 覆盖)
@@ -261,11 +263,12 @@ docs/superpowers/ # Superpowers — HOW
261
263
 
262
264
  1. **brainstorming 不可跳过** — 每次变更必须经过深度设计(hotfix 和 tweak 除外)
263
265
  2. **delta spec 是活文档** — 阶段 3 期间可自由修改,归档时同步
264
- 3. **保持 tasks.md 同步** 完成一个勾一个
265
- 4. **频繁提交**每个任务一次提交,message 体现设计意图
266
- 5. **先验证再归档**`/comet-verify` 通过后才执行 `/comet-archive`
267
- 6. **增量更新分级**小编辑、中重 brainstorming、大新 change
268
- 7. **Plan 必须关联 change** 文件头包含 `change:` 和 `design-doc:` 元数据
269
- 8. **归档闭环**design docplan 必须标注 `archived-with` 状态
270
- 9. **修改已有功能**直接 open change 即可
271
- 10. **Preset 有上限** hotfix/tweak 满足升级条件时及时切换到完整流程
266
+ 3. **交接包由脚本生成** — OpenSpec → Superpowers 的上下文必须通过 `comet-handoff.sh` 生成 compact 可追溯摘录(必要时 `--full`),并由 guard 校验 source/hash/mode
267
+ 4. **保持 tasks.md 同步** 完成一个勾一个
268
+ 5. **频繁提交**每个任务一次提交,message 体现设计意图
269
+ 6. **先验证再归档**`/comet-verify` 通过后才执行 `/comet-archive`
270
+ 7. **增量更新分级** 小编辑、中重 brainstorming、大新 change
271
+ 8. **Plan 必须关联 change** 文件头包含 `change:` 和 `design-doc:` 元数据
272
+ 9. **归档闭环**design doc plan 必须标注 `archived-with` 状态
273
+ 10. **修改已有功能**直接 open 新 change 即可
274
+ 11. **Preset 有上限** — hotfix/tweak 满足升级条件时及时切换到完整流程
@@ -20,16 +20,50 @@ description: "Comet 阶段 2:深度设计。用 /comet-design 调用。通过
20
20
  COMET_SEARCH_ROOTS=("." "$HOME/.claude/skills" "$HOME/.codex/skills" "$HOME/.cursor/skills")
21
21
  COMET_STATE="${COMET_STATE:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-state.sh' -type f -print -quit 2>/dev/null)}"
22
22
  COMET_GUARD="${COMET_GUARD:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-guard.sh' -type f -print -quit 2>/dev/null)}"
23
+ COMET_HANDOFF="${COMET_HANDOFF:-$(find "${COMET_SEARCH_ROOTS[@]}" -path '*/comet/scripts/comet-handoff.sh' -type f -print -quit 2>/dev/null)}"
23
24
  bash "$COMET_STATE" check <name> design
24
25
  ```
25
26
 
26
27
  验证通过后继续 Step 1。验证失败时脚本会输出具体失败原因。
27
28
 
28
- ### 1a. 读取已有上下文
29
+ ### 1a. 生成 OpenSpec → Superpowers 交接包
29
30
 
30
- 读取活跃 change 下的 `proposal.md` 和 `design.md`,将核心内容整理为摘要:
31
- - **proposal 摘要**:目标、动机、范围
32
- - **design 摘要**:架构决策、高层设计
31
+ **必须由脚本生成,不允许 agent 临场手写 summary 代替。**
32
+
33
+ ```bash
34
+ bash "$COMET_HANDOFF" <change-name> design --write
35
+ ```
36
+
37
+ 脚本会生成并记录:
38
+
39
+ ```
40
+ openspec/changes/<name>/.comet/handoff/design-context.json
41
+ openspec/changes/<name>/.comet/handoff/design-context.md
42
+ ```
43
+
44
+ 并在 `.comet.yaml` 写入:
45
+
46
+ ```yaml
47
+ handoff_context: openspec/changes/<name>/.comet/handoff/design-context.json
48
+ handoff_hash: <sha256>
49
+ ```
50
+
51
+ 默认交接包是 **compact 可追溯摘录**,不是 agent summary:
52
+ - `design-context.json`:机器索引,包含 change、phase、canonical spec、source paths、hash
53
+ - `design-context.md`:供 Superpowers 阅读的上下文,包含脚本标记、source path、line range、sha256、确定性摘录
54
+ - 超出摘录预算时标记 `[TRUNCATED]`,并保留 Full source 路径
55
+
56
+ 如确实需要全文上下文,可显式运行:
57
+
58
+ ```bash
59
+ bash "$COMET_HANDOFF" <change-name> design --write --full
60
+ ```
61
+
62
+ 交接包来源来自 OpenSpec open 阶段产物:
63
+ - `proposal.md`:目标、动机、范围、非目标
64
+ - `design.md`:高层架构决策、方案约束
65
+ - `tasks.md`:初始任务边界
66
+ - `specs/*/spec.md`:delta 能力规格
33
67
 
34
68
  ### 1b. 执行 Brainstorming(带上下文)
35
69
 
@@ -37,9 +71,21 @@ bash "$COMET_STATE" check <name> design
37
71
 
38
72
  ```
39
73
  Change: <change-name>
40
- Proposal 摘要: <proposal 核心内容>
41
- Design 摘要: <design.md 架构决策>
42
- 跳过上下文探索,直接进入设计提问。
74
+ OpenSpec Context Pack: openspec/changes/<name>/.comet/handoff/design-context.md
75
+ Machine handoff: openspec/changes/<name>/.comet/handoff/design-context.json
76
+
77
+ OpenSpec 产物是上游事实源,不要重新定义需求,不要重写 proposal/spec。
78
+ 你的任务是基于交接包做深度技术设计:实现方案、技术风险、测试策略、边界条件。
79
+ 如发现 OpenSpec delta spec 缺少验收场景,只能提出 Spec Patch,并回写 OpenSpec delta spec;不要在 Design Doc 中创建第二份需求 spec。
80
+
81
+ Design Doc frontmatter 必须最小化,只包含:
82
+ ---
83
+ comet_change: <change-name>
84
+ role: technical-design
85
+ canonical_spec: openspec
86
+ ---
87
+
88
+ 跳过重复上下文探索,直接进入设计提问。
43
89
  ```
44
90
 
45
91
  禁止跳过此步骤,禁止在未加载该技能的情况下继续。
@@ -48,7 +94,7 @@ Design 摘要: <design.md 架构决策>
48
94
 
49
95
  技能加载后,按其指引产出:
50
96
  - `docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md` — 设计文档(技术 RFC)
51
- - `openspec/changes/<name>/specs/<capability>/spec.md` — 能力规格(delta
97
+ - 如需补充验收场景,回写 `openspec/changes/<name>/specs/<capability>/spec.md` — OpenSpec delta 能力规格
52
98
 
53
99
  ### 2. 更新 Comet 状态
54
100
 
@@ -67,7 +113,11 @@ bash "$COMET_GUARD" <change-name> design --apply
67
113
  ## 退出条件
68
114
 
69
115
  - Design Doc 已创建并保存
70
- - 如有新能力则 delta spec 已创建
116
+ - Design Doc frontmatter 包含 `comet_change`、`role: technical-design`、`canonical_spec: openspec`
117
+ - `handoff_context` 和 `handoff_hash` 已写入 `.comet.yaml`(由 guard 强制校验)
118
+ - `handoff_hash` 与当前 OpenSpec open 阶段产物一致(由 guard 强制校验)
119
+ - `design-context.md` 必须是脚本生成,且包含 source path、mode、sha256 等可追溯标记(由 guard 强制校验)
120
+ - 如有新能力或补充验收场景,OpenSpec delta spec 已创建/更新
71
121
  - `design_doc` 已写入 `.comet.yaml`
72
122
  - **阶段守卫**:运行 `bash "$COMET_GUARD" <change-name> design --apply`,全部 PASS 后自动流转到 `phase: build`
73
123
 
package/dist/cli/index.js CHANGED
@@ -18,6 +18,7 @@ program
18
18
  .option('--skip-existing', 'Never overwrite existing components')
19
19
  .option('--overwrite', 'Overwrite manifest-managed files')
20
20
  .option('--json', 'Output as JSON')
21
+ .addOption(new Option('--scope <scope>', 'Install scope').choices(['global', 'project']))
21
22
  .action(async (targetPath = '.', options) => {
22
23
  try {
23
24
  await initCommand(targetPath, options);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
+ import { type InstallScope } from '../core/detect.js';
1
2
  type InitOptions = {
2
3
  yes?: boolean;
3
4
  skipExisting?: boolean;
4
5
  overwrite?: boolean;
5
6
  json?: boolean;
7
+ scope?: InstallScope;
6
8
  };
7
9
  type ComponentAction = 'overwrite' | 'skip' | 'install';
8
10
  type BulkOverwriteChoice = 'overwrite-all' | 'skip-all' | 'choose';
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAaA,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAGF,KAAK,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACxD,KAAK,mBAAmB,GAAG,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AASnE,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAkFF,iBAAS,wBAAwB,CAAC,CAAC,SAAS,aAAa,EACvD,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAC7C,CAAC,CAQH;AAmDD,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuK9F;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAS9F,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAGF,KAAK,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACxD,KAAK,mBAAmB,GAAG,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AASnE,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAmFF,iBAAS,wBAAwB,CAAC,CAAC,SAAS,aAAa,EACvD,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAC7C,CAAC,CAQH;AAmDD,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuK9F;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -20,6 +20,8 @@ const COMET_BANNER = [
20
20
  ` OpenSpec + Superpowers Workflow `,
21
21
  ].join('\n');
22
22
  async function selectScope(options) {
23
+ if (options.scope)
24
+ return options.scope;
23
25
  if (options.yes)
24
26
  return 'project';
25
27
  return select({
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { InstallScope } from './types.js';
2
+ declare function quoteShellArg(value: string, platform?: NodeJS.Platform): string;
3
+ declare function buildOpenSpecInitCommand(projectPath: string, toolIds: string[], scope: InstallScope, homeDir?: string, platform?: NodeJS.Platform): string;
2
4
  declare function isCommandAvailable(command: string): boolean;
3
5
  declare function installOpenSpec(projectPath: string, toolIds: string[], scope: InstallScope): Promise<'installed' | 'failed' | 'skipped'>;
4
- export { installOpenSpec, isCommandAvailable };
6
+ export { installOpenSpec, isCommandAvailable, buildOpenSpecInitCommand, quoteShellArg };
5
7
  //# sourceMappingURL=openspec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openspec.d.ts","sourceRoot":"","sources":["../../src/core/openspec.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,iBAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQpD;AAqBD,iBAAe,eAAe,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CA6B7C;AAED,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"openspec.d.ts","sourceRoot":"","sources":["../../src/core/openspec.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,iBAAS,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAK1F;AAED,iBAAS,wBAAwB,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,YAAY,EACnB,OAAO,SAAe,EACtB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAGR;AAED,iBAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQpD;AAqBD,iBAAe,eAAe,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CAyB7C;AAED,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,aAAa,EAAE,CAAC"}
@@ -1,6 +1,17 @@
1
1
  import { execSync } from 'child_process';
2
+ import os from 'os';
2
3
  import { PLATFORMS } from './platforms.js';
3
4
  const VALID_TOOL_IDS = new Set(PLATFORMS.map((p) => p.openspecToolId));
5
+ function quoteShellArg(value, platform = process.platform) {
6
+ if (platform === 'win32') {
7
+ return `"${value.replace(/"/g, '\\"').replace(/\\+$/, (match) => match + match)}"`;
8
+ }
9
+ return `'${value.replace(/'/g, `'\\''`)}'`;
10
+ }
11
+ function buildOpenSpecInitCommand(projectPath, toolIds, scope, homeDir = os.homedir(), platform = process.platform) {
12
+ const targetPath = scope === 'global' ? homeDir : projectPath;
13
+ return `openspec init ${quoteShellArg(targetPath, platform)} --tools ${quoteShellArg(toolIds.join(','), platform)}`;
14
+ }
4
15
  function isCommandAvailable(command) {
5
16
  try {
6
17
  const checkCmd = process.platform === 'win32' ? `where ${command}` : `which ${command}`;
@@ -39,10 +50,7 @@ async function installOpenSpec(projectPath, toolIds, scope) {
39
50
  throw new Error(`Unknown tool IDs: ${unknownIds.join(', ')}`);
40
51
  }
41
52
  try {
42
- const flags = ['--tools', toolIds.join(','), scope === 'global' ? '--global' : '']
43
- .filter(Boolean)
44
- .join(' ');
45
- execSync(`openspec init ${flags}`, {
53
+ execSync(buildOpenSpecInitCommand(projectPath, toolIds, scope), {
46
54
  cwd: projectPath,
47
55
  stdio: 'pipe',
48
56
  timeout: 120_000,
@@ -54,5 +62,5 @@ async function installOpenSpec(projectPath, toolIds, scope) {
54
62
  return 'failed';
55
63
  }
56
64
  }
57
- export { installOpenSpec, isCommandAvailable };
65
+ export { installOpenSpec, isCommandAvailable, buildOpenSpecInitCommand, quoteShellArg };
58
66
  //# sourceMappingURL=openspec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/core/openspec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/core/openspec.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { InstallScope } from './types.js';
2
2
  declare const SKILLS_AGENT_MAP: Record<string, string>;
3
+ declare function buildSuperpowersInstallCommand(_projectPath: string, scope: InstallScope, platformIds: string[], platform?: NodeJS.Platform): string;
3
4
  declare function installSuperpowersForPlatforms(projectPath: string, scope: InstallScope, platformIds: string[]): Promise<'installed' | 'failed' | 'skipped'>;
4
- export { installSuperpowersForPlatforms, SKILLS_AGENT_MAP };
5
+ export { installSuperpowersForPlatforms, buildSuperpowersInstallCommand, SKILLS_AGENT_MAP };
5
6
  //# sourceMappingURL=superpowers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,QAAA,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6B5C,CAAC;AAIF,iBAAe,8BAA8B,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CA4B7C;AAED,OAAO,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,QAAA,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6B5C,CAAC;AAIF,iBAAS,8BAA8B,CACrC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAeR;AAED,iBAAe,8BAA8B,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CAc7C;AAED,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { execSync } from 'child_process';
2
+ import { quoteShellArg } from './openspec.js';
2
3
  const SKILLS_AGENT_MAP = {
3
4
  claude: 'claude-code',
4
5
  cursor: 'cursor',
@@ -6,45 +7,47 @@ const SKILLS_AGENT_MAP = {
6
7
  opencode: 'opencode',
7
8
  windsurf: 'windsurf',
8
9
  cline: 'cline',
9
- roocode: 'roo-code',
10
+ roocode: 'roo',
10
11
  continue: 'continue',
11
12
  'github-copilot': 'github-copilot',
12
- gemini: 'gemini',
13
- 'amazon-q': 'amazon-q',
14
- qwen: 'qwen',
15
- kilocode: 'kilo-code',
13
+ gemini: 'gemini-cli',
14
+ 'amazon-q': 'universal',
15
+ qwen: 'qwen-code',
16
+ kilocode: 'kilo',
16
17
  auggie: 'augment',
17
- kiro: 'kiro',
18
- lingma: 'lingma',
18
+ kiro: 'kiro-cli',
19
+ lingma: 'universal',
19
20
  junie: 'junie',
20
21
  codebuddy: 'codebuddy',
21
- costrict: 'costrict',
22
+ costrict: 'universal',
22
23
  crush: 'crush',
23
- factory: 'factory',
24
- iflow: 'iflow',
24
+ factory: 'droid',
25
+ iflow: 'iflow-cli',
25
26
  pi: 'pi',
26
27
  qoder: 'qoder',
27
28
  antigravity: 'antigravity',
28
29
  bob: 'bob',
29
- forgecode: 'forge',
30
+ forgecode: 'forgecode',
30
31
  trae: 'trae',
31
32
  };
32
33
  const VALID_PLATFORM_IDS = new Set(Object.keys(SKILLS_AGENT_MAP));
33
- async function installSuperpowersForPlatforms(projectPath, scope, platformIds) {
34
+ function buildSuperpowersInstallCommand(_projectPath, scope, platformIds, platform = process.platform) {
34
35
  const unknownIds = platformIds.filter((id) => !VALID_PLATFORM_IDS.has(id));
35
36
  if (unknownIds.length > 0) {
36
37
  throw new Error(`Unknown platform IDs: ${unknownIds.join(', ')}`);
37
38
  }
38
- const agentNames = platformIds.map((id) => SKILLS_AGENT_MAP[id]).filter(Boolean);
39
+ const agentNames = [...new Set(platformIds.map((id) => SKILLS_AGENT_MAP[id]).filter(Boolean))];
39
40
  if (agentNames.length === 0) {
40
- console.error(` No valid agent names resolved for platforms: ${platformIds.join(', ')}`);
41
- return 'failed';
41
+ throw new Error(`No valid agent names resolved for platforms: ${platformIds.join(', ')}`);
42
42
  }
43
+ const agentFlags = agentNames.map((name) => `--agent ${quoteShellArg(name, platform)}`).join(' ');
44
+ const flags = ['-y', scope === 'global' ? '-g' : '', agentFlags].filter(Boolean).join(' ');
45
+ return `npx skills add obra/superpowers ${flags}`;
46
+ }
47
+ async function installSuperpowersForPlatforms(projectPath, scope, platformIds) {
48
+ const command = buildSuperpowersInstallCommand(projectPath, scope, platformIds);
43
49
  try {
44
- const flags = ['-y', scope === 'global' ? '-g' : '', `--agent ${agentNames.join(',')}`]
45
- .filter(Boolean)
46
- .join(' ');
47
- execSync(`npx skills add obra/superpowers ${flags}`, {
50
+ execSync(command, {
48
51
  cwd: projectPath,
49
52
  stdio: 'pipe',
50
53
  timeout: 120_000,
@@ -56,5 +59,5 @@ async function installSuperpowersForPlatforms(projectPath, scope, platformIds) {
56
59
  return 'failed';
57
60
  }
58
61
  }
59
- export { installSuperpowersForPlatforms, SKILLS_AGENT_MAP };
62
+ export { installSuperpowersForPlatforms, buildSuperpowersInstallCommand, SKILLS_AGENT_MAP };
60
63
  //# sourceMappingURL=superpowers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,MAAM,gBAAgB,GAA2B;IAC/C,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,UAAU;IACpB,gBAAgB,EAAE,gBAAgB;IAClC,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,UAAU;IACtB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,aAAa;IAC1B,GAAG,EAAE,KAAK;IACV,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAElE,KAAK,UAAU,8BAA8B,CAC3C,WAAmB,EACnB,KAAmB,EACnB,WAAqB;IAErB,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,oDAAoD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;aACpF,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,QAAQ,CAAC,mCAAmC,KAAK,EAAE,EAAE;YACnD,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpamis/comet",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "OpenSpec + Superpowers dual-star development workflow",
5
5
  "keywords": [
6
6
  "comet",