@rpamis/comet 0.3.8 → 0.3.9
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 +16 -18
- package/assets/skills/comet/reference/dirty-worktree.md +59 -59
- package/assets/skills/comet/rules/comet-phase-guard.en.md +29 -5
- package/assets/skills/comet/rules/comet-phase-guard.md +31 -5
- package/assets/skills/comet/scripts/comet-guard.sh +27 -1
- package/assets/skills/comet/scripts/comet-hook-guard.sh +121 -45
- package/assets/skills/comet/scripts/comet-state.sh +100 -7
- package/assets/skills/comet/scripts/comet-yaml-validate.sh +3 -1
- package/assets/skills/comet-open/SKILL.md +18 -1
- package/assets/skills-zh/comet/SKILL.md +1 -1
- package/assets/skills-zh/comet/reference/comet-yaml-fields.md +3 -0
- package/assets/skills-zh/comet/reference/context-recovery.md +1 -1
- package/assets/skills-zh/comet/reference/debug-gate.md +2 -2
- package/assets/skills-zh/comet/reference/dirty-worktree.md +59 -59
- package/assets/skills-zh/comet/reference/subagent-dispatch.md +21 -14
- package/assets/skills-zh/comet-build/SKILL.md +20 -7
- package/assets/skills-zh/comet-design/SKILL.md +2 -2
- package/assets/skills-zh/comet-hotfix/SKILL.md +2 -2
- package/assets/skills-zh/comet-open/SKILL.md +18 -1
- package/assets/skills-zh/comet-verify/SKILL.md +2 -2
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/i18n.d.ts +4 -0
- package/dist/commands/i18n.d.ts.map +1 -0
- package/dist/commands/i18n.js +154 -0
- package/dist/commands/i18n.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +122 -70
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +34 -15
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +2 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +45 -37
- package/dist/commands/update.js.map +1 -1
- package/dist/core/codegraph.d.ts +4 -2
- package/dist/core/codegraph.d.ts.map +1 -1
- package/dist/core/codegraph.js +66 -11
- package/dist/core/codegraph.js.map +1 -1
- package/dist/core/detect.d.ts +6 -1
- package/dist/core/detect.d.ts.map +1 -1
- package/dist/core/detect.js +28 -11
- package/dist/core/detect.js.map +1 -1
- package/dist/core/openspec.d.ts +1 -1
- package/dist/core/openspec.d.ts.map +1 -1
- package/dist/core/openspec.js +13 -7
- package/dist/core/openspec.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +9 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/superpowers.d.ts +1 -1
- package/dist/core/superpowers.d.ts.map +1 -1
- package/dist/core/superpowers.js +4 -1
- package/dist/core/superpowers.js.map +1 -1
- package/package.json +2 -2
|
@@ -235,6 +235,33 @@ project_auto_transition_default() {
|
|
|
235
235
|
esac
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
+
project_review_mode_default() {
|
|
239
|
+
local value="null"
|
|
240
|
+
local source="default"
|
|
241
|
+
if [ -n "${COMET_REVIEW_MODE:-}" ]; then
|
|
242
|
+
value="$COMET_REVIEW_MODE"
|
|
243
|
+
source="COMET_REVIEW_MODE"
|
|
244
|
+
elif [ -f ".comet/config.yaml" ]; then
|
|
245
|
+
local raw
|
|
246
|
+
raw=$(yaml_field "review_mode" ".comet/config.yaml" 2>/dev/null || true)
|
|
247
|
+
if [ -n "$raw" ]; then
|
|
248
|
+
value="$raw"
|
|
249
|
+
source=".comet/config.yaml"
|
|
250
|
+
fi
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
case "$value" in
|
|
254
|
+
null|off|standard|thorough)
|
|
255
|
+
printf '%s\n' "$value"
|
|
256
|
+
;;
|
|
257
|
+
*)
|
|
258
|
+
red "ERROR: Invalid review_mode from ${source}: '$value'" >&2
|
|
259
|
+
red "Valid values: off, standard, thorough" >&2
|
|
260
|
+
exit 1
|
|
261
|
+
;;
|
|
262
|
+
esac
|
|
263
|
+
}
|
|
264
|
+
|
|
238
265
|
# --- Subcommands ---
|
|
239
266
|
|
|
240
267
|
cmd_init() {
|
|
@@ -258,7 +285,7 @@ cmd_init() {
|
|
|
258
285
|
mkdir -p "$change_dir"
|
|
259
286
|
|
|
260
287
|
# Set workflow-appropriate defaults
|
|
261
|
-
local phase build_mode isolation verify_mode context_compression auto_transition
|
|
288
|
+
local phase build_mode isolation verify_mode context_compression auto_transition review_mode
|
|
262
289
|
phase="open"
|
|
263
290
|
context_compression=$(project_context_compression)
|
|
264
291
|
auto_transition="$(project_auto_transition_default)"
|
|
@@ -267,12 +294,14 @@ cmd_init() {
|
|
|
267
294
|
full)
|
|
268
295
|
build_mode="null"
|
|
269
296
|
tdd_mode="null"
|
|
297
|
+
review_mode="$(project_review_mode_default)"
|
|
270
298
|
isolation="null"
|
|
271
299
|
verify_mode="null"
|
|
272
300
|
;;
|
|
273
301
|
hotfix|tweak)
|
|
274
302
|
build_mode="direct"
|
|
275
303
|
tdd_mode="direct"
|
|
304
|
+
review_mode="off"
|
|
276
305
|
isolation="branch"
|
|
277
306
|
verify_mode="light"
|
|
278
307
|
;;
|
|
@@ -293,6 +322,7 @@ build_mode: $build_mode
|
|
|
293
322
|
build_pause: null
|
|
294
323
|
subagent_dispatch: null
|
|
295
324
|
tdd_mode: $tdd_mode
|
|
325
|
+
review_mode: $review_mode
|
|
296
326
|
isolation: $isolation
|
|
297
327
|
verify_mode: $verify_mode
|
|
298
328
|
auto_transition: $auto_transition
|
|
@@ -353,16 +383,25 @@ cmd_set() {
|
|
|
353
383
|
# Validate field name
|
|
354
384
|
case "$field" in
|
|
355
385
|
phase)
|
|
356
|
-
|
|
357
|
-
|
|
386
|
+
# Direct phase writes bypass state-machine evidence checks (open artifacts,
|
|
387
|
+
# design_doc, build decisions, verification evidence). Block them unless the
|
|
388
|
+
# call originates from cmd_transition (dynamic-scope flag) or the operator
|
|
389
|
+
# explicitly opts into the repair escape hatch.
|
|
390
|
+
if [ "${_COMET_IN_TRANSITION:-}" != "1" ] && [ "${COMET_FORCE_PHASE:-}" != "1" ]; then
|
|
391
|
+
red "ERROR: Setting 'phase' directly is not allowed; it bypasses state machine evidence checks." >&2
|
|
392
|
+
red " Use: comet-state.sh transition <change-name> <event>" >&2
|
|
393
|
+
red " Repair-only escape hatch: COMET_FORCE_PHASE=1 comet-state.sh set <change-name> phase <value>" >&2
|
|
394
|
+
exit 1
|
|
395
|
+
fi
|
|
396
|
+
validate_enum "$value" "open" "design" "build" "verify" "archive"
|
|
358
397
|
;;
|
|
359
|
-
workflow|context_compression|build_mode|build_pause|subagent_dispatch|tdd_mode|isolation|verify_mode|auto_transition|verify_result|verification_report|branch_status|archived|design_doc|plan|verified_at|created_at|direct_override|build_command|verify_command|handoff_context|handoff_hash|base_ref)
|
|
398
|
+
workflow|context_compression|build_mode|build_pause|subagent_dispatch|tdd_mode|review_mode|isolation|verify_mode|auto_transition|verify_result|verification_report|branch_status|archived|design_doc|plan|verified_at|created_at|direct_override|build_command|verify_command|handoff_context|handoff_hash|base_ref)
|
|
360
399
|
# Valid field
|
|
361
400
|
;;
|
|
362
401
|
*)
|
|
363
402
|
red "ERROR: Unknown field: '$field'" >&2
|
|
364
403
|
red "Valid fields:" >&2
|
|
365
|
-
red " workflow, phase, context_compression, design_doc, plan, build_mode, build_pause, subagent_dispatch, tdd_mode, isolation," >&2
|
|
404
|
+
red " workflow, phase, context_compression, design_doc, plan, build_mode, build_pause, subagent_dispatch, tdd_mode, review_mode, isolation," >&2
|
|
366
405
|
red " verify_mode, auto_transition, verify_result, verification_report, branch_status," >&2
|
|
367
406
|
red " verified_at, created_at, archived, base_ref, direct_override," >&2
|
|
368
407
|
red " build_command, verify_command, handoff_context, handoff_hash" >&2
|
|
@@ -393,6 +432,9 @@ cmd_set() {
|
|
|
393
432
|
tdd_mode)
|
|
394
433
|
validate_enum "$value" "tdd" "direct"
|
|
395
434
|
;;
|
|
435
|
+
review_mode)
|
|
436
|
+
validate_enum "$value" "off" "standard" "thorough"
|
|
437
|
+
;;
|
|
396
438
|
isolation)
|
|
397
439
|
validate_enum "$value" "branch" "worktree"
|
|
398
440
|
;;
|
|
@@ -444,6 +486,33 @@ require_phase() {
|
|
|
444
486
|
fi
|
|
445
487
|
}
|
|
446
488
|
|
|
489
|
+
require_open_artifacts() {
|
|
490
|
+
local change_name="$1"
|
|
491
|
+
local change_dir workflow f
|
|
492
|
+
change_dir=$(change_dir_for "$change_name")
|
|
493
|
+
workflow=$(cmd_get "$change_name" "workflow")
|
|
494
|
+
for f in proposal.md tasks.md; do
|
|
495
|
+
if [ ! -s "$change_dir/$f" ]; then
|
|
496
|
+
red "ERROR: Cannot transition '$change_name': $f must exist and be non-empty before leaving open" >&2
|
|
497
|
+
exit 1
|
|
498
|
+
fi
|
|
499
|
+
done
|
|
500
|
+
if [ "$workflow" = "full" ] && [ ! -s "$change_dir/design.md" ]; then
|
|
501
|
+
red "ERROR: Cannot transition '$change_name': design.md must exist and be non-empty before leaving open" >&2
|
|
502
|
+
exit 1
|
|
503
|
+
fi
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
require_design_evidence() {
|
|
507
|
+
local change_name="$1"
|
|
508
|
+
local design_doc
|
|
509
|
+
design_doc=$(cmd_get "$change_name" "design_doc")
|
|
510
|
+
if [ -z "$design_doc" ] || [ "$design_doc" = "null" ] || [ ! -s "$design_doc" ]; then
|
|
511
|
+
red "ERROR: Cannot transition '$change_name': design_doc must point to an existing Design Doc before leaving design" >&2
|
|
512
|
+
exit 1
|
|
513
|
+
fi
|
|
514
|
+
}
|
|
515
|
+
|
|
447
516
|
require_verification_evidence() {
|
|
448
517
|
local change_name="$1"
|
|
449
518
|
local report branch_status
|
|
@@ -463,13 +532,14 @@ require_verification_evidence() {
|
|
|
463
532
|
|
|
464
533
|
require_build_decisions() {
|
|
465
534
|
local change_name="$1"
|
|
466
|
-
local workflow build_mode isolation direct_override subagent_dispatch tdd_mode
|
|
535
|
+
local workflow build_mode isolation direct_override subagent_dispatch tdd_mode review_mode
|
|
467
536
|
workflow=$(cmd_get "$change_name" "workflow")
|
|
468
537
|
build_mode=$(cmd_get "$change_name" "build_mode")
|
|
469
538
|
isolation=$(cmd_get "$change_name" "isolation")
|
|
470
539
|
direct_override=$(cmd_get "$change_name" "direct_override" 2>/dev/null || true)
|
|
471
540
|
subagent_dispatch=$(cmd_get "$change_name" "subagent_dispatch" 2>/dev/null || true)
|
|
472
541
|
tdd_mode=$(cmd_get "$change_name" "tdd_mode" 2>/dev/null || true)
|
|
542
|
+
review_mode=$(cmd_get "$change_name" "review_mode" 2>/dev/null || true)
|
|
473
543
|
|
|
474
544
|
case "$isolation" in
|
|
475
545
|
branch|worktree) ;;
|
|
@@ -501,11 +571,24 @@ require_build_decisions() {
|
|
|
501
571
|
red "ERROR: Cannot transition '$change_name': tdd_mode must be selected before leaving build (full workflow)" >&2
|
|
502
572
|
exit 1
|
|
503
573
|
fi
|
|
574
|
+
|
|
575
|
+
if [ "$workflow" = "full" ]; then
|
|
576
|
+
case "$review_mode" in
|
|
577
|
+
off|standard|thorough) ;;
|
|
578
|
+
*)
|
|
579
|
+
red "ERROR: Cannot transition '$change_name': review_mode must be selected before leaving build (full workflow); review_mode must be off, standard, or thorough, got '${review_mode:-null}'" >&2
|
|
580
|
+
exit 1
|
|
581
|
+
;;
|
|
582
|
+
esac
|
|
583
|
+
fi
|
|
504
584
|
}
|
|
505
585
|
|
|
506
586
|
cmd_transition() {
|
|
507
587
|
local change_name="$1"
|
|
508
588
|
local event="$2"
|
|
589
|
+
# Dynamic-scope flag: authorizes the internal cmd_set phase writes below while
|
|
590
|
+
# still blocking direct `set <name> phase` from the CLI.
|
|
591
|
+
local _COMET_IN_TRANSITION=1
|
|
509
592
|
|
|
510
593
|
validate_change_name "$change_name"
|
|
511
594
|
validate_enum "$event" "open-complete" "design-complete" "build-complete" "verify-pass" "verify-fail" "archive-reopen" "archived"
|
|
@@ -513,6 +596,7 @@ cmd_transition() {
|
|
|
513
596
|
case "$event" in
|
|
514
597
|
open-complete)
|
|
515
598
|
require_phase "$change_name" "open"
|
|
599
|
+
require_open_artifacts "$change_name"
|
|
516
600
|
local workflow
|
|
517
601
|
workflow=$(cmd_get "$change_name" "workflow")
|
|
518
602
|
if [ "$workflow" = "full" ]; then
|
|
@@ -523,6 +607,7 @@ cmd_transition() {
|
|
|
523
607
|
;;
|
|
524
608
|
design-complete)
|
|
525
609
|
require_phase "$change_name" "design"
|
|
610
|
+
require_design_evidence "$change_name"
|
|
526
611
|
cmd_set "$change_name" phase build
|
|
527
612
|
;;
|
|
528
613
|
build-complete)
|
|
@@ -566,6 +651,12 @@ cmd_transition() {
|
|
|
566
651
|
;;
|
|
567
652
|
archived)
|
|
568
653
|
require_phase "$change_name" "archive"
|
|
654
|
+
local archived_verify_result
|
|
655
|
+
archived_verify_result=$(cmd_get "$change_name" "verify_result")
|
|
656
|
+
if [ "$archived_verify_result" != "pass" ]; then
|
|
657
|
+
red "ERROR: Cannot transition '$change_name': verify_result must be pass before archiving" >&2
|
|
658
|
+
exit 1
|
|
659
|
+
fi
|
|
569
660
|
cmd_set "$change_name" archived true
|
|
570
661
|
;;
|
|
571
662
|
esac
|
|
@@ -772,7 +863,7 @@ cmd_recover() {
|
|
|
772
863
|
|
|
773
864
|
# Read all relevant fields
|
|
774
865
|
local design_doc plan verify_result verify_mode verification_report
|
|
775
|
-
local branch_status handoff_context handoff_hash isolation build_mode build_pause subagent_dispatch tdd_mode direct_override
|
|
866
|
+
local branch_status handoff_context handoff_hash isolation build_mode build_pause subagent_dispatch tdd_mode review_mode direct_override
|
|
776
867
|
design_doc=$(cmd_get "$change_name" "design_doc")
|
|
777
868
|
plan=$(cmd_get "$change_name" "plan")
|
|
778
869
|
verify_result=$(cmd_get "$change_name" "verify_result")
|
|
@@ -786,6 +877,7 @@ cmd_recover() {
|
|
|
786
877
|
build_pause=$(cmd_get "$change_name" "build_pause" 2>/dev/null || true)
|
|
787
878
|
subagent_dispatch=$(cmd_get "$change_name" "subagent_dispatch" 2>/dev/null || true)
|
|
788
879
|
tdd_mode=$(cmd_get "$change_name" "tdd_mode" 2>/dev/null || true)
|
|
880
|
+
review_mode=$(cmd_get "$change_name" "review_mode" 2>/dev/null || true)
|
|
789
881
|
direct_override=$(cmd_get "$change_name" "direct_override" 2>/dev/null || true)
|
|
790
882
|
|
|
791
883
|
echo "State fields:"
|
|
@@ -841,6 +933,7 @@ cmd_recover() {
|
|
|
841
933
|
field_status "build_mode" "$build_mode"
|
|
842
934
|
field_status "build_pause" "$build_pause"
|
|
843
935
|
field_status "tdd_mode" "$tdd_mode"
|
|
936
|
+
field_status "review_mode" "$review_mode"
|
|
844
937
|
if [ "$build_mode" = "subagent-driven-development" ] || { [ -n "$subagent_dispatch" ] && [ "$subagent_dispatch" != "null" ]; }; then
|
|
845
938
|
field_status "subagent_dispatch" "$subagent_dispatch"
|
|
846
939
|
fi
|
|
@@ -143,6 +143,7 @@ build_mode=$(field_value "build_mode")
|
|
|
143
143
|
build_pause=$(field_value "build_pause")
|
|
144
144
|
subagent_dispatch=$(field_value "subagent_dispatch")
|
|
145
145
|
tdd_mode=$(field_value "tdd_mode")
|
|
146
|
+
review_mode=$(field_value "review_mode")
|
|
146
147
|
isolation=$(field_value "isolation")
|
|
147
148
|
verify_mode=$(field_value "verify_mode")
|
|
148
149
|
auto_transition=$(field_value "auto_transition")
|
|
@@ -162,6 +163,7 @@ validate_enum "build_mode" "$build_mode" "subagent-driven-development exe
|
|
|
162
163
|
validate_enum "build_pause" "$build_pause" "null plan-ready"
|
|
163
164
|
validate_enum "subagent_dispatch" "$subagent_dispatch" "null confirmed"
|
|
164
165
|
validate_enum "tdd_mode" "$tdd_mode" "tdd direct null"
|
|
166
|
+
validate_enum "review_mode" "$review_mode" "off standard thorough"
|
|
165
167
|
validate_enum "isolation" "$isolation" "branch worktree"
|
|
166
168
|
validate_enum "verify_mode" "$verify_mode" "light full"
|
|
167
169
|
if grep -q "^auto_transition:" "$YAML" 2>/dev/null; then
|
|
@@ -199,7 +201,7 @@ if [ -n "$handoff_hash" ] && [ "$handoff_hash" != "null" ]; then
|
|
|
199
201
|
fi
|
|
200
202
|
|
|
201
203
|
# --- Unknown keys check ---
|
|
202
|
-
KNOWN_KEYS="workflow phase context_compression design_doc plan build_mode build_pause subagent_dispatch tdd_mode isolation verify_mode auto_transition verify_result verification_report branch_status verified_at created_at archived direct_override build_command verify_command handoff_context handoff_hash base_ref"
|
|
204
|
+
KNOWN_KEYS="workflow phase context_compression design_doc plan build_mode build_pause subagent_dispatch tdd_mode review_mode isolation verify_mode auto_transition verify_result verification_report branch_status verified_at created_at archived direct_override build_command verify_command handoff_context handoff_hash base_ref"
|
|
203
205
|
while IFS=: read -r key _; do
|
|
204
206
|
key="${key// /}"
|
|
205
207
|
[ -z "$key" ] && continue
|
|
@@ -71,6 +71,23 @@ When pausing, present the clarification summary: goals, non-goals, scope boundar
|
|
|
71
71
|
|
|
72
72
|
Must not create proposal.md, design.md, or tasks.md before the user confirms requirements clarification is complete, and must not use the Skill tool to load the `openspec-propose` skill to generate all artifacts in one pass.
|
|
73
73
|
|
|
74
|
+
### 1c. Change Name Confirmation (Blocking Point)
|
|
75
|
+
|
|
76
|
+
Before creating the change directory (`openspec new change`), must follow the `comet/reference/decision-point.md` protocol to pause and let the user decide the change name. Must not auto-generate or silently infer the change name.
|
|
77
|
+
|
|
78
|
+
OpenSpec change names must be **kebab-case English** (lowercase letters, digits, hyphens; e.g. `refine-requirements-doc`). Chinese or other non-conforming names are invalid.
|
|
79
|
+
|
|
80
|
+
When pausing, present:
|
|
81
|
+
- **2-3 recommended kebab-case English names** derived from the confirmed clarification summary, each with a one-line description of the scope it implies
|
|
82
|
+
- An explicit option for the user to **enter their own name**
|
|
83
|
+
- A note that **if the user enters Chinese (or any non-kebab-case text), it will be converted into a compliant kebab-case English name**, and the converted result must be shown back to the user for confirmation before use
|
|
84
|
+
|
|
85
|
+
The decision options must include:
|
|
86
|
+
- Pick one of the recommended names
|
|
87
|
+
- "Enter a custom name" — accept the user's input; if it is already valid kebab-case English, use it directly; if it is Chinese or otherwise non-conforming, convert it to compliant kebab-case English and show the converted name for confirmation before continuing
|
|
88
|
+
|
|
89
|
+
Must not run `openspec new change` or create `.comet.yaml` before the user confirms the final change name. If the chosen/converted name collides with an existing change, report the collision and ask the user to choose another name.
|
|
90
|
+
|
|
74
91
|
### 2. Create Change Structure + Initialize State
|
|
75
92
|
|
|
76
93
|
**Immediately execute:** Use the Skill tool to load the `openspec-new-change` skill. Skipping this step is prohibited.
|
|
@@ -105,7 +122,7 @@ After the change skeleton is created, generate `proposal`, `design`, and `tasks`
|
|
|
105
122
|
|
|
106
123
|
**Failure handling**: If `openspec instructions` fails, returns invalid JSON, reports unmet `dependencies`, or does not provide a usable `resolvedOutputPath`, must immediately stop artifact creation and report the OpenSpec error. Must not fall back to hard-coded artifact prose because that would silently bypass project rules.
|
|
107
124
|
|
|
108
|
-
**Naming and scope guard**: Change name must
|
|
125
|
+
**Naming and scope guard**: Change name must be the kebab-case English name confirmed by the user in Step 1c — must not auto-generate, infer, or use a non-kebab-case (e.g. Chinese) name. Change scope must match the user's description — must not expand or narrow it independently.
|
|
109
126
|
|
|
110
127
|
Confirm the following artifacts have been created:
|
|
111
128
|
|
|
@@ -185,7 +185,7 @@ agent 不应跳过这些决策点;其他明确无歧义的阶段衔接必须
|
|
|
185
185
|
> - **自动衔接协议**:按 `comet/reference/auto-transition.md` 查阅
|
|
186
186
|
> - **上下文压缩恢复**:按 `comet/reference/context-recovery.md` 查阅
|
|
187
187
|
> - **用户决策点协议**:按 `comet/reference/decision-point.md` 查阅
|
|
188
|
-
> -
|
|
188
|
+
> - **异常调试协议**:按 `comet/reference/debug-gate.md` 查阅
|
|
189
189
|
|
|
190
190
|
### 状态机硬约束
|
|
191
191
|
|
|
@@ -16,6 +16,7 @@ build_mode: subagent-driven-development
|
|
|
16
16
|
build_pause: null
|
|
17
17
|
subagent_dispatch: confirmed
|
|
18
18
|
tdd_mode: tdd
|
|
19
|
+
review_mode: standard
|
|
19
20
|
isolation: branch
|
|
20
21
|
verify_mode: light
|
|
21
22
|
verify_result: pending
|
|
@@ -39,6 +40,7 @@ archived: false
|
|
|
39
40
|
| `build_pause` | build 阶段内部暂停点。`null` 表示无暂停,`plan-ready` 表示 plan 已生成,用户选择切换模型后暂停 |
|
|
40
41
|
| `subagent_dispatch` | `null` 或 `confirmed`。仅当已确认当前平台存在真实后台 subagent / Task / multi-agent 调度能力时,`build_mode: subagent-driven-development` 才能写入并用于离开 build 阶段 |
|
|
41
42
|
| `tdd_mode` | `tdd` 或 `direct`。full workflow 离开 build 阶段前必须已选择。`tdd` 强制每个任务先写失败测试再实现;`direct` 不强制 TDD。hotfix/tweak 默认 `direct` |
|
|
43
|
+
| `review_mode` | `off`、`standard` 或 `thorough`。full workflow 离开 build 阶段前必须已选择;hotfix/tweak 默认 `off` |
|
|
42
44
|
| `isolation` | `branch` 或 `worktree`,工作区隔离方式。full 初始化可为 `null`,但只允许持续到 `/comet-build` Step 3 前;hotfix/tweak 默认 `branch` |
|
|
43
45
|
| `verify_mode` | `light` 或 `full`,可为空 |
|
|
44
46
|
| `auto_transition` | `true` 或 `false`。只控制阶段守卫推进 phase 后是否自动调用下一个 skill;`false` 时由 `comet-state next` 输出 `manual`,暂停下一 skill 调用,但不阻止 phase 字段更新 |
|
|
@@ -63,6 +65,7 @@ archived: false
|
|
|
63
65
|
- `build → verify` 前,`build_mode` 必须已选择
|
|
64
66
|
- `build_mode: subagent-driven-development` 必须同时有 `subagent_dispatch: confirmed`
|
|
65
67
|
- full workflow 离开 build 阶段前 `tdd_mode` 必须已选择为 `tdd` 或 `direct`
|
|
68
|
+
- full workflow 离开 build 阶段前 `review_mode` 必须已选择为 `off`、`standard` 或 `thorough`
|
|
66
69
|
- `build_mode: direct` 默认只允许 `hotfix` / `tweak`;full workflow 需要 `direct_override: true`
|
|
67
70
|
- `build_pause` 不是执行方式,不得写入 `build_mode`
|
|
68
71
|
- 这些约束同时存在于 `comet-guard.sh build --apply` 和 `comet-state.sh transition <name> build-complete`
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
3. 读取 `openspec/changes/<name>/.comet/subagent-progress.md`,恢复当前 task 或 final review、实现提交、RED/GREEN 证据、已通过审查、未解决反馈和审查-修复轮次
|
|
22
22
|
4. 禁止在主会话中直接执行 task
|
|
23
23
|
5. 按检查点记录的精确阶段恢复;检查点缺失或不匹配时才从第一个未勾选 task 的 implementer 派发开始
|
|
24
|
-
6. task
|
|
24
|
+
6. task 按 `review_mode` 完成验收并完成定向勾选验证后,立即继续下一个 task,不得总结或询问是否继续
|
|
25
25
|
|
|
26
26
|
## design 阶段特殊恢复
|
|
27
27
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 异常调试协议
|
|
2
2
|
|
|
3
3
|
规范路径:`comet/reference/debug-gate.md`
|
|
4
4
|
|
|
5
|
-
本协议由 build、hotfix、tweak 等会直接修改代码的 comet 子 skill
|
|
5
|
+
本协议由 build、hotfix、tweak 等会直接修改代码的 comet 子 skill 共享。当运行程序、测试、构建或手动验证时出现崩溃、异常行为、测试失败或构建失败,必须进入异常调试协议。
|
|
6
6
|
|
|
7
7
|
## 核心规则
|
|
8
8
|
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
# Dirty Worktree 协议
|
|
2
|
-
|
|
3
|
-
规范路径:`comet/reference/dirty-worktree.md`
|
|
4
|
-
|
|
5
|
-
本协议由所有涉及代码修改的 comet 子 skill 共享。当 agent 恢复上下文或继续执行时,必须按本协议处理未提交的工作区改动。各子 skill 可在本协议基础上定义阶段特例(如 verify 阶段对实现改动的特殊处理),详见对应子 skill 文件。本文件不重复阶段特例。
|
|
6
|
-
|
|
7
|
-
## 1. 检查步骤
|
|
8
|
-
|
|
9
|
-
继续或开始修改前,必须先运行以下命令:
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
git status --short
|
|
13
|
-
git diff --stat
|
|
14
|
-
git diff --cached --stat
|
|
15
|
-
git ls-files --others --exclude-standard
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
必要时再查看 `git diff` / `git diff --cached` / 新建文件内容。
|
|
19
|
-
|
|
20
|
-
## 2. 核心规则
|
|
21
|
-
|
|
22
|
-
- 用户可能不会说明自己改了哪里。只要存在 dirty worktree(包括 Git 状态里显示为 `??` 的新建文件),就先假设改动可能来自用户或混合来源
|
|
23
|
-
- **构建产物排除**:`??` 文件若匹配 `.gitignore` 中的模式(如 `node_modules/`、`dist/`、`__pycache__/`、`*.o`、`target/`、`build/` 等),自动跳过归因,不视为用户改动
|
|
24
|
-
- dirty worktree 只代表代码事实,不会自动推进 `.comet.yaml` 的 `phase` 或勾选 `tasks.md`;只有完成归因、验证、同步必要文档,并通过对应阶段 guard 后,才允许推进 Comet 状态
|
|
25
|
-
|
|
26
|
-
## 3. 归因分类
|
|
27
|
-
|
|
28
|
-
将 dirty diff 分为三类:
|
|
29
|
-
|
|
30
|
-
1. **属于当前 change**:文件和内容能对应当前 change 的目标、tasks.md、plan 或 delta spec。将其纳入当前任务继续,不重复改同一处
|
|
31
|
-
2. **不属于当前 change**:文件或内容与当前目标无关。暂停并询问用户:并入当前 change、拆成新 change、保留不处理,或明确授权丢弃
|
|
32
|
-
3. **来源不确定**:无法从 diff 和文档判断归属。暂停并向用户汇报文件列表和判断依据,不继续推进阶段
|
|
33
|
-
|
|
34
|
-
## 4. 常见处理模式
|
|
35
|
-
|
|
36
|
-
### 已实现但 tasks.md 未勾选
|
|
37
|
-
|
|
38
|
-
先验证实现(运行构建和测试),通过后补勾任务。不要因为任务未勾选就重做一遍,也不要因为状态文件滞后而忽略代码事实。若当前子 skill 定义了阶段特例,以子 skill 为准。
|
|
39
|
-
|
|
40
|
-
### 暗示计划或范围已变化
|
|
41
|
-
|
|
42
|
-
按当前子 skill 的升级、增量更新或回退规则处理,本协议不重复阶段特例。
|
|
43
|
-
|
|
44
|
-
### 模糊恢复意图
|
|
45
|
-
|
|
46
|
-
用户说"继续""接着跑""我改了一点""刚才不满意""重新弄""代码动过""先按现在的来"等模糊恢复意图时,按本协议处理。不要要求用户先回忆具体改了哪里。
|
|
47
|
-
|
|
48
|
-
### open/design 阶段出现代码改动
|
|
49
|
-
|
|
50
|
-
若当前仍处于 `open` 或 `design`,但 dirty worktree 已经包含代码改动,先按本协议归因,不要直接推进阶段:
|
|
51
|
-
|
|
52
|
-
- 属于当前 change 的改动:作为需求或设计输入记录到 proposal/design/spec/design doc/tasks 中;进入 build 前仍需完成对应阶段 guard
|
|
53
|
-
- 不属于当前 change 或来源不确定:暂停询问用户是并入当前 change、拆成新 change、保留不处理,还是明确授权丢弃
|
|
54
|
-
- 禁止在 open/design 阶段直接把代码改动当作已完成实现并推进到 verify
|
|
55
|
-
|
|
56
|
-
## 5. 禁令
|
|
57
|
-
|
|
58
|
-
- 禁止在未理解 dirty diff 来源时覆盖、回滚、格式化重写或忽略用户改动
|
|
59
|
-
- 禁止在 dirty diff 未解释清楚时判定验证通过
|
|
1
|
+
# Dirty Worktree 协议
|
|
2
|
+
|
|
3
|
+
规范路径:`comet/reference/dirty-worktree.md`
|
|
4
|
+
|
|
5
|
+
本协议由所有涉及代码修改的 comet 子 skill 共享。当 agent 恢复上下文或继续执行时,必须按本协议处理未提交的工作区改动。各子 skill 可在本协议基础上定义阶段特例(如 verify 阶段对实现改动的特殊处理),详见对应子 skill 文件。本文件不重复阶段特例。
|
|
6
|
+
|
|
7
|
+
## 1. 检查步骤
|
|
8
|
+
|
|
9
|
+
继续或开始修改前,必须先运行以下命令:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
git status --short
|
|
13
|
+
git diff --stat
|
|
14
|
+
git diff --cached --stat
|
|
15
|
+
git ls-files --others --exclude-standard
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
必要时再查看 `git diff` / `git diff --cached` / 新建文件内容。
|
|
19
|
+
|
|
20
|
+
## 2. 核心规则
|
|
21
|
+
|
|
22
|
+
- 用户可能不会说明自己改了哪里。只要存在 dirty worktree(包括 Git 状态里显示为 `??` 的新建文件),就先假设改动可能来自用户或混合来源
|
|
23
|
+
- **构建产物排除**:`??` 文件若匹配 `.gitignore` 中的模式(如 `node_modules/`、`dist/`、`__pycache__/`、`*.o`、`target/`、`build/` 等),自动跳过归因,不视为用户改动
|
|
24
|
+
- dirty worktree 只代表代码事实,不会自动推进 `.comet.yaml` 的 `phase` 或勾选 `tasks.md`;只有完成归因、验证、同步必要文档,并通过对应阶段 guard 后,才允许推进 Comet 状态
|
|
25
|
+
|
|
26
|
+
## 3. 归因分类
|
|
27
|
+
|
|
28
|
+
将 dirty diff 分为三类:
|
|
29
|
+
|
|
30
|
+
1. **属于当前 change**:文件和内容能对应当前 change 的目标、tasks.md、plan 或 delta spec。将其纳入当前任务继续,不重复改同一处
|
|
31
|
+
2. **不属于当前 change**:文件或内容与当前目标无关。暂停并询问用户:并入当前 change、拆成新 change、保留不处理,或明确授权丢弃
|
|
32
|
+
3. **来源不确定**:无法从 diff 和文档判断归属。暂停并向用户汇报文件列表和判断依据,不继续推进阶段
|
|
33
|
+
|
|
34
|
+
## 4. 常见处理模式
|
|
35
|
+
|
|
36
|
+
### 已实现但 tasks.md 未勾选
|
|
37
|
+
|
|
38
|
+
先验证实现(运行构建和测试),通过后补勾任务。不要因为任务未勾选就重做一遍,也不要因为状态文件滞后而忽略代码事实。若当前子 skill 定义了阶段特例,以子 skill 为准。
|
|
39
|
+
|
|
40
|
+
### 暗示计划或范围已变化
|
|
41
|
+
|
|
42
|
+
按当前子 skill 的升级、增量更新或回退规则处理,本协议不重复阶段特例。
|
|
43
|
+
|
|
44
|
+
### 模糊恢复意图
|
|
45
|
+
|
|
46
|
+
用户说"继续""接着跑""我改了一点""刚才不满意""重新弄""代码动过""先按现在的来"等模糊恢复意图时,按本协议处理。不要要求用户先回忆具体改了哪里。
|
|
47
|
+
|
|
48
|
+
### open/design 阶段出现代码改动
|
|
49
|
+
|
|
50
|
+
若当前仍处于 `open` 或 `design`,但 dirty worktree 已经包含代码改动,先按本协议归因,不要直接推进阶段:
|
|
51
|
+
|
|
52
|
+
- 属于当前 change 的改动:作为需求或设计输入记录到 proposal/design/spec/design doc/tasks 中;进入 build 前仍需完成对应阶段 guard
|
|
53
|
+
- 不属于当前 change 或来源不确定:暂停询问用户是并入当前 change、拆成新 change、保留不处理,还是明确授权丢弃
|
|
54
|
+
- 禁止在 open/design 阶段直接把代码改动当作已完成实现并推进到 verify
|
|
55
|
+
|
|
56
|
+
## 5. 禁令
|
|
57
|
+
|
|
58
|
+
- 禁止在未理解 dirty diff 来源时覆盖、回滚、格式化重写或忽略用户改动
|
|
59
|
+
- 禁止在 dirty diff 未解释清楚时判定验证通过
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
规范路径:`comet/reference/subagent-dispatch.md`
|
|
4
4
|
|
|
5
|
-
本文档提供在 Superpowers `subagent-driven-development` 技能**之上**应用的 Comet 专属扩展。该技能负责核心派发循环(每个 task 派发全新 implementer → spec compliance review → code quality review → 下一个 task)并强制连续执行。本文档添加 Comet
|
|
5
|
+
本文档提供在 Superpowers `subagent-driven-development` 技能**之上**应用的 Comet 专属扩展。该技能负责核心派发循环(每个 task 派发全新 implementer → spec compliance review → code quality review → 下一个 task)并强制连续执行。本文档添加 Comet 特有的真实后台调度、任务追踪、状态验证、代码审查模式和上下文恢复。若 Superpowers 技能与本文档发生冲突时,以本文档中更具体的 Comet 约束为准。
|
|
6
6
|
|
|
7
7
|
> **⚠️ 关键约束 — 任务之间禁止暂停**
|
|
8
8
|
>
|
|
9
|
-
> 当一个 task
|
|
9
|
+
> 当一个 task 按 `review_mode` 完成验收并被勾选后,**立即派发下一个 task**,不得停止、总结或询问用户是否继续。用户期望所有 task 按顺序自动执行,无需手动干预。任务之间暂停会中断工作流,导致用户每次都需要手动恢复。
|
|
10
10
|
>
|
|
11
11
|
> 仅在以下情况才停止并等待用户输入:
|
|
12
|
-
> - 任务处于 **BLOCKED**
|
|
12
|
+
> - 任务处于 **BLOCKED** 状态(`review_mode: standard` 下一轮轻量复查仍未通过,或 `review_mode: thorough` 下批次/最终审查 2 轮审查-修复仍未通过)
|
|
13
13
|
> - 存在无法从仓库、计划或既有上下文消除的真实歧义
|
|
14
14
|
> - 平台没有真实后台 agent 调度能力,需要用户改选 `executing-plans`
|
|
15
15
|
> - 用户**明确**要求暂停
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
|
|
29
29
|
### 0. 派发强制约束(关键)
|
|
30
30
|
|
|
31
|
-
主会话**仅负责协调**,禁止直接执行 task。主会话禁止修改源代码。协调者唯一允许的文件修改是 plan、OpenSpec task 和 subagent 进度检查点的持久化更新。不得把多个 task 打包给同一个 agent。每个 task 派发一个全新的后台 implementer agent
|
|
31
|
+
主会话**仅负责协调**,禁止直接执行 task。主会话禁止修改源代码。协调者唯一允许的文件修改是 plan、OpenSpec task 和 subagent 进度检查点的持久化更新。不得把多个 task 打包给同一个 agent。每个 task 派发一个全新的后台 implementer agent;当 `review_mode` 需要审查或修复时,spec reviewer、code quality reviewer、修复 agent 和 final reviewer 也必须分别使用全新的后台 agent:
|
|
32
32
|
|
|
33
|
-
- **Claude Code**:对每个 implementer
|
|
33
|
+
- **Claude Code**:对每个 implementer,以及 `review_mode` 要求的 spec reviewer、code quality reviewer、修复 agent 和 final reviewer 使用 `Agent` 工具并设置 `run_in_background: true`。禁止内联执行 task,禁止错误进入需要预先创建 team 的团队模式。
|
|
34
34
|
- **其他平台**:使用平台等效的后台 agent / Task / 多 agent 派发机制。
|
|
35
35
|
- **禁止**跨 task 或角色复用 implementer、reviewer 或修复 agent。每个 agent 拥有全新的隔离上下文,并且只接收当前角色所需的单个 task 上下文。
|
|
36
36
|
- 若平台无真实后台派发能力,不得继续;暂停并等待用户改选 `build_mode: executing-plans`。
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
|
|
48
48
|
agent 回报状态必须为 `DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT`,并包含实现内容、测试结果、提交哈希、变更文件和顾虑。进入审查前,主会话必须确认提交和文件在当前工作树可见;若平台使用隔离副本,先拉取或合并变更。
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
当 `review_mode` 需要 reviewer 时,每个 reviewer prompt 必须包含完整 task、实现提交或差异以及 RED/GREEN 证据(`tdd_mode: tdd` 时)。reviewer 不得只依据 implementer 的总结进行审查。
|
|
51
51
|
|
|
52
52
|
### 2. Implementer 范围限制
|
|
53
53
|
|
|
@@ -70,18 +70,23 @@ implementer 或修复 agent 回报必须提供 **RED 失败命令与失败摘要
|
|
|
70
70
|
- 当前 plan task 唯一文本及映射的 OpenSpec task 文本
|
|
71
71
|
- 当前阶段:`implementing | spec-review | quality-review | checkoff | done | blocked | final-review | final-fix`
|
|
72
72
|
- 实现提交哈希、变更文件和 RED/GREEN 证据
|
|
73
|
+
- 已选择的 `review_mode`
|
|
73
74
|
- 已通过的审查阶段及尚未解决的 reviewer 反馈
|
|
74
|
-
- 当前 task
|
|
75
|
+
- 当前 task、批次或 final review 的审查-修复轮次(`standard` 最多 1 轮,`thorough` 最多 2 轮,`off` 为 0 轮)
|
|
75
76
|
|
|
76
77
|
该文件只保存恢复所需的协调状态,不替代 plan 或 OpenSpec checkbox。当前 task 完成后保留其最终记录,开始下一个 task 时用下一 task 的记录替换。
|
|
77
78
|
|
|
78
|
-
### 5.
|
|
79
|
+
### 5. 代码审查模式与轮次限制
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
当 `review_mode: standard` 时,每个 task 不自动派发 per-task reviewer;implementer 必须自测、提交并回报证据,协调者完成定向勾选验证。所有 task 完成后只派发一次最终轻量 code reviewer,审查范围限定为正确性、安全和边界条件。若最终轻量审查发现 CRITICAL 或 IMPORTANT 问题,最多自动派发一轮修复 agent 并复查一次;复查仍未通过时标记 **BLOCKED**,暂停并把反馈交给用户。非 CRITICAL 发现可记录接受理由后继续。
|
|
82
|
+
|
|
83
|
+
当 `review_mode: thorough` 时,不执行每 task 双审查。协调者按批次或风险边界运行合并审查:每完成最多 3 个 task、或完成一个跨模块/高风险边界时,派发一个 reviewer 同时检查 spec compliance 与 code quality。若总 task 数不超过 3 且没有高风险边界,可跳过中途批次审查,只做最终完整审查。所有 task 完成后再派发一次最终完整 reviewer。批次和最终审查各最多 2 轮审查-修复;仍未通过则标记 **BLOCKED**,暂停并把累计反馈交给用户。
|
|
84
|
+
|
|
85
|
+
当 `review_mode: off` 时,不自动派发 spec reviewer、code quality reviewer、final reviewer 或审查修复 agent。任务完成依据 implementer 的测试/构建证据、当前工作树确认、任务唯一文本勾选验证和用户显式要求。若执行过程中出现测试失败、构建失败或异常行为,仍必须按异常调试协议处理,不得用 `off` 跳过真实问题。
|
|
81
86
|
|
|
82
87
|
### 6. Task 勾选与验证
|
|
83
88
|
|
|
84
|
-
|
|
89
|
+
**按 `review_mode` 完成验收后**,主会话:
|
|
85
90
|
|
|
86
91
|
1. 将 plan 中保存的唯一 task 文本从 `- [ ]` 改为 `- [x]`
|
|
87
92
|
2. 若存在映射,再同步勾选 OpenSpec task
|
|
@@ -97,17 +102,19 @@ implementer 或修复 agent 回报必须提供 **RED 失败命令与失败摘要
|
|
|
97
102
|
|
|
98
103
|
## 收尾
|
|
99
104
|
|
|
100
|
-
-
|
|
101
|
-
- 所有 task
|
|
105
|
+
- **自动继续**:按 `review_mode` 完成验收并勾选 task 后,立即派发下一个未勾选的 task。禁止总结、禁止询问用户是否继续、禁止在任务之间等待用户输入。这是不可协商的 —— Superpowers 技能强制连续执行,文档顶部的关键约束进一步强化此规则。
|
|
106
|
+
- 所有 task 完成后,若 `review_mode: standard`,将检查点切换为 `final-review`,只派发一次最终轻量 code reviewer。CRITICAL 或 IMPORTANT 问题最多自动修复和复查一轮;仍未通过则暂停交给用户。通过或接受非 CRITICAL 发现后继续返回 `comet-build`。
|
|
107
|
+
- 所有 task 完成后,若 `review_mode: thorough`,将检查点切换为 `final-review`,派发一次最终完整 reviewer。CRITICAL 或 IMPORTANT 问题最多自动修复和复查两轮;仍未通过则暂停交给用户。通过或接受非 CRITICAL 发现后继续返回 `comet-build`。
|
|
108
|
+
- 所有 task 完成后,若 `review_mode: off`,不进入 `final-review` 或 `final-fix`,但必须在持久产物中记录跳过自动代码审查的原因,然后返回 `comet-build`。
|
|
102
109
|
- final review 通过后,结束的只是 subagent 派发循环,不是 Comet workflow。不得加载 `finishing-a-development-branch`,不得停下来询问用户下一步;必须返回 `comet-build` 继续执行退出条件、阶段守卫和后续阶段衔接。
|
|
103
110
|
|
|
104
111
|
## 上下文恢复
|
|
105
112
|
|
|
106
113
|
重新加载 Superpowers `subagent-driven-development` 技能并重新阅读本文档。先读取 `openspec/changes/<name>/.comet/subagent-progress.md`,再与第一个未勾选 task 和当前工作树核对:
|
|
107
114
|
|
|
108
|
-
- 检查点与未勾选 task 匹配时,从记录的精确阶段恢复,保留实现提交、RED/GREEN
|
|
115
|
+
- 检查点与未勾选 task 匹配时,从记录的精确阶段恢复,保留实现提交、RED/GREEN 证据、`review_mode`、已通过的审查阶段、未解决反馈和当前审查-修复轮次;不得重置轮次或重复已经通过的阶段。
|
|
109
116
|
- 检查点缺失或与未勾选 task 不匹配时,为第一个未勾选 task 创建新检查点并从 implementer 派发开始。
|
|
110
117
|
- 检查点中的提交或文件在当前工作树不可见时,先拉取、合并或恢复对应变更;不得假定实现已存在。
|
|
111
118
|
- 所有 task 已勾选且检查点处于 `final-review` 或 `final-fix` 时,从最终审查的精确阶段恢复,并保留最终反馈和审查-修复轮次;不得重新进入已完成的 task。
|
|
112
119
|
|
|
113
|
-
|
|
120
|
+
已提交但未按 `review_mode` 完成验收的 task 保持未勾选,并按检查点重新进入对应的验证、审查或修复流程。
|