@rpamis/comet 0.2.7 → 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 +21 -9
- package/assets/manifest.json +1 -0
- package/assets/skills/comet/scripts/comet-archive.sh +39 -1
- package/assets/skills/comet/scripts/comet-guard.sh +188 -1
- package/assets/skills/comet/scripts/comet-handoff.sh +261 -0
- package/assets/skills/comet/scripts/comet-state.sh +34 -3
- package/assets/skills/comet/scripts/comet-yaml-validate.sh +42 -1
- package/assets/skills-zh/comet/SKILL.md +13 -10
- package/assets/skills-zh/comet-design/SKILL.md +59 -9
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -0
- package/dist/commands/init.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ comet init
|
|
|
63
63
|
4. Install [OpenSpec](https://github.com/Fission-AI/OpenSpec) skills
|
|
64
64
|
5. Install [Superpowers](https://github.com/obra/superpowers) skills
|
|
65
65
|
6. Deploy Comet skills (in your chosen language) to selected platforms
|
|
66
|
-
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
|
|
67
67
|
|
|
68
68
|
> [!TIP]
|
|
69
69
|
> update version
|
|
@@ -94,7 +94,8 @@ comet init
|
|
|
94
94
|
|
|
95
95
|
| Option | Description |
|
|
96
96
|
|--------|-------------|
|
|
97
|
-
| `--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` |
|
|
98
99
|
| `--skip-existing` | Skip already installed components |
|
|
99
100
|
| `--overwrite` | Overwrite already installed components |
|
|
100
101
|
| `--json` | Output structured JSON |
|
|
@@ -165,6 +166,7 @@ After `comet init`, three groups of skills are installed to the selected platfor
|
|
|
165
166
|
| Script | Purpose |
|
|
166
167
|
|--------|---------|
|
|
167
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 |
|
|
168
170
|
| `comet-archive.sh` | One-command archive — validates state, syncs specs, moves to archive, updates status |
|
|
169
171
|
| `comet-yaml-validate.sh` | Schema validator — validates `.comet.yaml` structure and field values |
|
|
170
172
|
| `comet-state.sh` | Unified state management — init/set/get/check/scale, agents' exclusive YAML interface |
|
|
@@ -224,19 +226,24 @@ Comet uses a decoupled state architecture with separate YAML files:
|
|
|
224
226
|
```yaml
|
|
225
227
|
workflow: full
|
|
226
228
|
phase: build
|
|
227
|
-
design_doc: docs/superpowers/specs/YYYY-MM-DD-topic-design.md
|
|
228
|
-
plan: docs/superpowers/plans/YYYY-MM-DD-feature.md
|
|
229
229
|
build_mode: subagent-driven-development
|
|
230
230
|
isolation: branch
|
|
231
|
-
verify_mode:
|
|
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
|
|
232
234
|
verify_result: pending
|
|
233
|
-
verification_report:
|
|
235
|
+
verification_report: null
|
|
234
236
|
branch_status: pending
|
|
235
237
|
verified_at: null
|
|
236
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>
|
|
237
244
|
```
|
|
238
245
|
|
|
239
|
-
In full workflow, `build_mode` and `
|
|
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.
|
|
240
247
|
|
|
241
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.
|
|
242
249
|
|
|
@@ -249,7 +256,7 @@ Comet ensures agent execution reliability through automated state transitions:
|
|
|
249
256
|
- Outputs `[HARD STOP]` with actionable suggestions if validation fails
|
|
250
257
|
|
|
251
258
|
2. **Automated State Transitions** — `comet-guard.sh --apply` updates `.comet.yaml` automatically
|
|
252
|
-
- All phase transitions (
|
|
259
|
+
- All phase transitions (open → design/build → verify → archive) use `guard --apply`
|
|
253
260
|
- No manual state editing required — eliminates write-verification errors
|
|
254
261
|
- `comet-state.sh` is the agents' exclusive interface for state operations
|
|
255
262
|
- Guard and archive scripts use `comet-state.sh` internally for state management
|
|
@@ -257,7 +264,7 @@ Comet ensures agent execution reliability through automated state transitions:
|
|
|
257
264
|
3. **Schema Validation** — `comet-yaml-validate.sh` ensures data integrity
|
|
258
265
|
- Validates required and optional fields
|
|
259
266
|
- Validates enum values, including `direct_override`
|
|
260
|
-
- Validates
|
|
267
|
+
- Validates `design_doc`, `plan`, and `handoff_context` paths exist, plus `handoff_hash` format
|
|
261
268
|
- Detects unknown/typos fields
|
|
262
269
|
|
|
263
270
|
4. **Build Decision Enforcement** — Guard and state transitions both block skipped build choices
|
|
@@ -287,6 +294,7 @@ your-project/
|
|
|
287
294
|
│ ├── comet/SKILL.md
|
|
288
295
|
│ │ └── scripts/
|
|
289
296
|
│ │ ├── comet-guard.sh # Phase transition guard (--apply auto-updates state)
|
|
297
|
+
│ │ ├── comet-handoff.sh # Design handoff (OpenSpec → Superpowers context tracing)
|
|
290
298
|
│ │ ├── comet-archive.sh # One-command archive automation
|
|
291
299
|
│ │ ├── comet-yaml-validate.sh # Schema validator
|
|
292
300
|
│ │ └── comet-state.sh # Unified state management (init/set/get/check/scale)
|
|
@@ -348,6 +356,10 @@ pnpm format
|
|
|
348
356
|
|
|
349
357
|
See [CHANGELOG.md](CHANGELOG.md) for version history and updates.
|
|
350
358
|
|
|
359
|
+
## Roadmap
|
|
360
|
+
|
|
361
|
+
Track our development progress and upcoming features on the [Comet Roadmap](https://github.com/orgs/rpamis/projects/1).
|
|
362
|
+
|
|
351
363
|
## Security
|
|
352
364
|
|
|
353
365
|
- Pre-publish scan for API keys, secrets, tokens, and private keys
|
package/assets/manifest.json
CHANGED
|
@@ -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
|
-
|
|
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=$(
|
|
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:
|
|
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
|
|
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.
|
|
265
|
-
4.
|
|
266
|
-
5.
|
|
267
|
-
6.
|
|
268
|
-
7.
|
|
269
|
-
8.
|
|
270
|
-
9.
|
|
271
|
-
10.
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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` —
|
|
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
|
-
-
|
|
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);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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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"}
|