@rpamis/comet 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +16 -5
- package/assets/manifest.json +1 -1
- package/assets/skills/comet/SKILL.md +19 -1
- package/assets/skills/comet/scripts/comet-archive.sh +255 -258
- package/assets/skills/comet/scripts/comet-guard.sh +407 -257
- package/assets/skills/comet/scripts/comet-state.sh +680 -616
- package/assets/skills/comet/scripts/comet-yaml-validate.sh +157 -138
- package/assets/skills/comet-archive/SKILL.md +3 -0
- package/assets/skills/comet-build/SKILL.md +27 -1
- package/assets/skills-zh/comet/SKILL.md +15 -1
- package/assets/skills-zh/comet-archive/SKILL.md +3 -0
- package/assets/skills-zh/comet-build/SKILL.md +27 -1
- package/bin/comet.js +3 -3
- package/dist/core/openspec.d.ts +3 -1
- package/dist/core/openspec.d.ts.map +1 -1
- package/dist/core/openspec.js +13 -5
- package/dist/core/openspec.js.map +1 -1
- package/dist/core/superpowers.d.ts +2 -1
- package/dist/core/superpowers.d.ts.map +1 -1
- package/dist/core/superpowers.js +23 -20
- package/dist/core/superpowers.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +44 -44
|
@@ -1,138 +1,157 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Comet YAML Schema Validator — validates .comet.yaml structure
|
|
3
|
-
# Usage: comet-yaml-validate.sh <change-name>
|
|
4
|
-
# Exit 0 = valid, exit 1 = errors found (printed to stderr)
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
red() { echo -e "\033[31m$1\033[0m" >&2; }
|
|
9
|
-
green() { echo -e "\033[32m$1\033[0m" >&2; }
|
|
10
|
-
warn() { echo -e "\033[33m$1\033[0m" >&2; }
|
|
11
|
-
|
|
12
|
-
# Input validation - prevent path traversal
|
|
13
|
-
validate_change_name() {
|
|
14
|
-
local name="$1"
|
|
15
|
-
# Reject empty names
|
|
16
|
-
if [ -z "$name" ]; then
|
|
17
|
-
red "ERROR: Change name cannot be empty" >&2
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
# Only allow alphanumeric, hyphens, and underscores
|
|
21
|
-
if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
22
|
-
red "ERROR: Invalid change name: '$name'" >&2
|
|
23
|
-
red "Valid characters: a-z, A-Z, 0-9, -, _" >&2
|
|
24
|
-
exit 1
|
|
25
|
-
fi
|
|
26
|
-
# Reject path traversal attempts
|
|
27
|
-
if [[ "$name" =~ \.\. ]]; then
|
|
28
|
-
red "ERROR: Change name cannot contain '..' (path traversal not allowed)" >&2
|
|
29
|
-
exit 1
|
|
30
|
-
fi
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
validate_change_name "$1"
|
|
34
|
-
|
|
35
|
-
CHANGE="$1"
|
|
36
|
-
CHANGE_DIR="openspec/changes/$CHANGE"
|
|
37
|
-
if [ ! -d "$CHANGE_DIR" ] && [ -d "openspec/changes/archive/$CHANGE" ]; then
|
|
38
|
-
CHANGE_DIR="openspec/changes/archive/$CHANGE"
|
|
39
|
-
fi
|
|
40
|
-
YAML="$CHANGE_DIR/.comet.yaml"
|
|
41
|
-
|
|
42
|
-
ERRORS=0
|
|
43
|
-
WARNINGS=0
|
|
44
|
-
|
|
45
|
-
# Helper: get value of a top-level field (handles null, empty, quoted)
|
|
46
|
-
field_value() {
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Comet YAML Schema Validator — validates .comet.yaml structure
|
|
3
|
+
# Usage: comet-yaml-validate.sh <change-name>
|
|
4
|
+
# Exit 0 = valid, exit 1 = errors found (printed to stderr)
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
red() { echo -e "\033[31m$1\033[0m" >&2; }
|
|
9
|
+
green() { echo -e "\033[32m$1\033[0m" >&2; }
|
|
10
|
+
warn() { echo -e "\033[33m$1\033[0m" >&2; }
|
|
11
|
+
|
|
12
|
+
# Input validation - prevent path traversal
|
|
13
|
+
validate_change_name() {
|
|
14
|
+
local name="$1"
|
|
15
|
+
# Reject empty names
|
|
16
|
+
if [ -z "$name" ]; then
|
|
17
|
+
red "ERROR: Change name cannot be empty" >&2
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
# Only allow alphanumeric, hyphens, and underscores
|
|
21
|
+
if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
22
|
+
red "ERROR: Invalid change name: '$name'" >&2
|
|
23
|
+
red "Valid characters: a-z, A-Z, 0-9, -, _" >&2
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
# Reject path traversal attempts
|
|
27
|
+
if [[ "$name" =~ \.\. ]]; then
|
|
28
|
+
red "ERROR: Change name cannot contain '..' (path traversal not allowed)" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
validate_change_name "$1"
|
|
34
|
+
|
|
35
|
+
CHANGE="$1"
|
|
36
|
+
CHANGE_DIR="openspec/changes/$CHANGE"
|
|
37
|
+
if [ ! -d "$CHANGE_DIR" ] && [ -d "openspec/changes/archive/$CHANGE" ]; then
|
|
38
|
+
CHANGE_DIR="openspec/changes/archive/$CHANGE"
|
|
39
|
+
fi
|
|
40
|
+
YAML="$CHANGE_DIR/.comet.yaml"
|
|
41
|
+
|
|
42
|
+
ERRORS=0
|
|
43
|
+
WARNINGS=0
|
|
44
|
+
|
|
45
|
+
# Helper: get value of a top-level field (handles null, empty, quoted)
|
|
46
|
+
field_value() {
|
|
47
|
+
local value
|
|
48
|
+
value=$(grep "^${1}:" "$YAML" 2>/dev/null | sed "s/^${1}: *//" || true)
|
|
49
|
+
strip_wrapping_quotes "$value"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
strip_wrapping_quotes() {
|
|
53
|
+
local value="$1"
|
|
54
|
+
case "$value" in
|
|
55
|
+
\"*\")
|
|
56
|
+
printf '%s\n' "${value:1:${#value}-2}"
|
|
57
|
+
;;
|
|
58
|
+
\'*\')
|
|
59
|
+
printf '%s\n' "${value:1:${#value}-2}"
|
|
60
|
+
;;
|
|
61
|
+
*)
|
|
62
|
+
printf '%s\n' "$value"
|
|
63
|
+
;;
|
|
64
|
+
esac
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
fail() { red " FAIL: $1"; ERRORS=$((ERRORS + 1)); }
|
|
68
|
+
warn_msg() { warn " WARN: $1"; WARNINGS=$((WARNINGS + 1)); }
|
|
69
|
+
|
|
70
|
+
echo "[VALIDATE] $YAML" >&2
|
|
71
|
+
|
|
72
|
+
# --- Required fields ---
|
|
73
|
+
REQUIRED_FIELDS="workflow phase design_doc plan build_mode isolation verify_mode verify_result verified_at archived"
|
|
74
|
+
for field in $REQUIRED_FIELDS; do
|
|
75
|
+
if ! grep -q "^${field}:" "$YAML" 2>/dev/null; then
|
|
76
|
+
fail "missing required field '$field'"
|
|
77
|
+
fi
|
|
78
|
+
done
|
|
79
|
+
|
|
80
|
+
# --- Enum validation ---
|
|
81
|
+
validate_enum() {
|
|
82
|
+
local field="$1" value="$2"
|
|
83
|
+
shift 2
|
|
84
|
+
local valid_values="$*"
|
|
85
|
+
|
|
86
|
+
# null or empty is always acceptable
|
|
87
|
+
if [ -z "$value" ] || [ "$value" = "null" ]; then
|
|
88
|
+
return 0
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
for v in $valid_values; do
|
|
92
|
+
if [ "$value" = "$v" ]; then
|
|
93
|
+
return 0
|
|
94
|
+
fi
|
|
95
|
+
done
|
|
96
|
+
fail "$field='$value' is not valid. Expected: $valid_values"
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
workflow=$(field_value "workflow")
|
|
100
|
+
phase=$(field_value "phase")
|
|
101
|
+
build_mode=$(field_value "build_mode")
|
|
102
|
+
isolation=$(field_value "isolation")
|
|
103
|
+
verify_mode=$(field_value "verify_mode")
|
|
104
|
+
verify_result=$(field_value "verify_result")
|
|
105
|
+
branch_status=$(field_value "branch_status")
|
|
106
|
+
archived=$(field_value "archived")
|
|
107
|
+
direct_override=$(field_value "direct_override")
|
|
108
|
+
design_doc=$(field_value "design_doc")
|
|
109
|
+
plan=$(field_value "plan")
|
|
110
|
+
|
|
111
|
+
validate_enum "workflow" "$workflow" "full hotfix tweak"
|
|
112
|
+
validate_enum "phase" "$phase" "open design build verify archive"
|
|
113
|
+
validate_enum "build_mode" "$build_mode" "subagent-driven-development executing-plans direct"
|
|
114
|
+
validate_enum "isolation" "$isolation" "branch worktree"
|
|
115
|
+
validate_enum "verify_mode" "$verify_mode" "light full"
|
|
116
|
+
validate_enum "verify_result" "$verify_result" "pending pass fail"
|
|
117
|
+
validate_enum "branch_status" "$branch_status" "pending handled"
|
|
118
|
+
validate_enum "archived" "$archived" "true false"
|
|
119
|
+
validate_enum "direct_override" "$direct_override" "true false"
|
|
120
|
+
|
|
121
|
+
# --- Path validation ---
|
|
122
|
+
|
|
123
|
+
if [ -n "$design_doc" ] && [ "$design_doc" != "null" ]; then
|
|
124
|
+
if [ ! -f "$design_doc" ]; then
|
|
125
|
+
fail "design_doc='$design_doc' does not exist on disk"
|
|
126
|
+
fi
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
if [ -n "$plan" ] && [ "$plan" != "null" ]; then
|
|
130
|
+
if [ ! -f "$plan" ]; then
|
|
131
|
+
fail "plan='$plan' does not exist on disk"
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# --- 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"
|
|
137
|
+
while IFS=: read -r key _; do
|
|
138
|
+
key="${key// /}"
|
|
139
|
+
[ -z "$key" ] && continue
|
|
140
|
+
found=0
|
|
141
|
+
for known in $KNOWN_KEYS; do
|
|
142
|
+
[ "$key" = "$known" ] && found=1 && break
|
|
143
|
+
done
|
|
144
|
+
if [ "$found" -eq 0 ]; then
|
|
145
|
+
warn_msg "unknown field '$key' found"
|
|
146
|
+
fi
|
|
147
|
+
done < "$YAML"
|
|
148
|
+
|
|
149
|
+
# --- Summary ---
|
|
150
|
+
echo "" >&2
|
|
151
|
+
if [ "$ERRORS" -gt 0 ]; then
|
|
152
|
+
red "$ERRORS error(s), $WARNINGS warning(s) — validation FAILED"
|
|
153
|
+
exit 1
|
|
154
|
+
else
|
|
155
|
+
green "0 errors, $WARNINGS warning(s) — validation PASSED"
|
|
156
|
+
exit 0
|
|
157
|
+
fi
|
|
@@ -43,6 +43,9 @@ The script automatically executes:
|
|
|
43
43
|
|
|
44
44
|
If script returns non-zero exit code, report error and stop.
|
|
45
45
|
If script returns zero exit code, archive is complete.
|
|
46
|
+
The summary `X/Y steps succeeded` counts real executed steps and does not double-count delta spec sync or document annotation.
|
|
47
|
+
|
|
48
|
+
When a delta spec differs from an existing main spec, the script prints a unified diff before overwrite so the archive sync content is visible.
|
|
46
49
|
|
|
47
50
|
Use `--dry-run` flag to preview without executing.
|
|
48
51
|
|
|
@@ -80,6 +80,11 @@ bash "$COMET_STATE" set <name> isolation <value>
|
|
|
80
80
|
- `branch`
|
|
81
81
|
- `worktree`
|
|
82
82
|
|
|
83
|
+
<IMPORTANT>
|
|
84
|
+
This is a script-enforced hard constraint, not a suggestion. Full workflow init may temporarily leave `isolation` as `null`, but only before this step.
|
|
85
|
+
Before implementation starts, stop and ask the user, then write either `branch` or `worktree`. If it remains `null`, both the `build → verify` guard and `comet-state transition build-complete` will fail.
|
|
86
|
+
</IMPORTANT>
|
|
87
|
+
|
|
83
88
|
**Execute isolation**:
|
|
84
89
|
|
|
85
90
|
- **branch**: Run `git checkout -b <change-name>`, subsequent work on the new branch
|
|
@@ -109,7 +114,16 @@ bash "$COMET_STATE" set <name> build_mode <value>
|
|
|
109
114
|
|
|
110
115
|
- `subagent-driven-development`
|
|
111
116
|
- `executing-plans`
|
|
112
|
-
- `direct` (only for hotfix preset use)
|
|
117
|
+
- `direct` (default only for hotfix/tweak preset use)
|
|
118
|
+
|
|
119
|
+
Full workflow must not default to `direct`. Use it only when the user explicitly asks to bypass the plan execution skills and you record an explicit override:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
bash "$COMET_STATE" set <name> direct_override true
|
|
123
|
+
bash "$COMET_STATE" set <name> build_mode direct
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Without `direct_override: true`, `build_mode=direct` in full workflow is blocked by both guard and state transition.
|
|
113
127
|
|
|
114
128
|
Then, **immediately execute:** Use the Skill tool to load the corresponding skill. Skipping this step is prohibited.
|
|
115
129
|
|
|
@@ -151,8 +165,20 @@ Build is the longest phase and may span many tasks. To support resume after cont
|
|
|
151
165
|
- All tasks.md checked
|
|
152
166
|
- Code committed
|
|
153
167
|
- Project-specific build/tests explicitly run and pass; do not rely only on guard auto-detection
|
|
168
|
+
- `isolation` has been written as `branch` or `worktree`
|
|
169
|
+
- `build_mode` has been written as `subagent-driven-development`, `executing-plans`, or `direct` with explicit override
|
|
154
170
|
- **Phase guard**: Run `bash "$COMET_GUARD" <change-name> build --apply`; after all PASS, state advances to `phase: verify`
|
|
155
171
|
|
|
172
|
+
Guard reads project command configuration first:
|
|
173
|
+
|
|
174
|
+
```yaml
|
|
175
|
+
build_command: <build command>
|
|
176
|
+
verify_command: <verify command>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Configuration can live in the change `.comet.yaml`, or in repo-root `.comet.yaml` / `comet.yaml` / `.comet.yml` / `comet.yml`.
|
|
180
|
+
Only when no command is configured does guard fall back to `npm run build`, Maven, or Cargo auto-detection. When a command fails, guard prints the command output as evidence for debugging.
|
|
181
|
+
|
|
156
182
|
Before exit, run guard to auto-transition:
|
|
157
183
|
|
|
158
184
|
```bash
|
|
@@ -171,7 +171,7 @@ archived: false
|
|
|
171
171
|
| `design_doc` | 关联的 Superpowers Design Doc 路径,可为空 |
|
|
172
172
|
| `plan` | 关联的 Superpowers Plan 路径,可为空 |
|
|
173
173
|
| `build_mode` | 已选择的执行方式,可为空 |
|
|
174
|
-
| `isolation` | `branch` 或 `worktree
|
|
174
|
+
| `isolation` | `branch` 或 `worktree`,工作区隔离方式。full 初始化可为 `null`,但只允许持续到 `/comet-build` Step 3 前;hotfix/tweak 默认 `branch` |
|
|
175
175
|
| `verify_mode` | `light` 或 `full`,可为空 |
|
|
176
176
|
| `verify_result` | `pending`、`pass` 或 `fail` |
|
|
177
177
|
| `verification_report` | 验证报告文件路径,verify 通过前必须指向已存在文件 |
|
|
@@ -179,6 +179,20 @@ archived: false
|
|
|
179
179
|
| `verified_at` | 验证通过时间,可为空 |
|
|
180
180
|
| `archived` | change 是否已归档 |
|
|
181
181
|
|
|
182
|
+
可选字段:
|
|
183
|
+
|
|
184
|
+
| 字段 | 含义 |
|
|
185
|
+
|------|------|
|
|
186
|
+
| `direct_override` | `true`/`false`。full workflow 如需使用 `build_mode: direct`,必须显式设为 `true` |
|
|
187
|
+
| `build_command` | 项目构建命令。guard 优先运行该命令,失败时打印命令输出 |
|
|
188
|
+
| `verify_command` | 项目验证命令。verify guard 优先运行该命令,未配置时回退到构建命令 |
|
|
189
|
+
|
|
190
|
+
状态机硬约束:
|
|
191
|
+
- `build → verify` 前,`isolation` 必须是 `branch` 或 `worktree`
|
|
192
|
+
- `build → verify` 前,`build_mode` 必须已选择
|
|
193
|
+
- `build_mode: direct` 默认只允许 `hotfix` / `tweak`;full workflow 需要 `direct_override: true`
|
|
194
|
+
- 这些约束同时存在于 `comet-guard.sh build --apply` 和 `comet-state.sh transition <name> build-complete`
|
|
195
|
+
|
|
182
196
|
### 脚本定位
|
|
183
197
|
|
|
184
198
|
Comet 脚本随 skill 包分发在 `comet/scripts/` 下。**不硬编码路径** — 定位一次,缓存到环境变量:
|
|
@@ -43,6 +43,9 @@ bash "$COMET_ARCHIVE" "<change-name>"
|
|
|
43
43
|
|
|
44
44
|
如脚本返回非零退出码,报告错误并停止。
|
|
45
45
|
如脚本返回零退出码,归档完成。
|
|
46
|
+
脚本摘要中的 `X/Y steps succeeded` 以真实执行步骤计数,不会因 delta spec 同步或文档标注重复累计。
|
|
47
|
+
|
|
48
|
+
当待同步的 delta spec 与已有主 spec 不一致时,脚本会在覆盖前打印 unified diff 预览,帮助确认归档同步内容。
|
|
46
49
|
|
|
47
50
|
如需预览而不实际执行,使用 `--dry-run` 参数。
|
|
48
51
|
|
|
@@ -80,6 +80,11 @@ bash "$COMET_STATE" set <name> isolation <value>
|
|
|
80
80
|
- `branch`
|
|
81
81
|
- `worktree`
|
|
82
82
|
|
|
83
|
+
<IMPORTANT>
|
|
84
|
+
这是脚本级硬约束,不是建议。full workflow 初始化时 `isolation` 可以暂时为 `null`,但只允许存在到本步骤之前。
|
|
85
|
+
进入实现前必须停下来询问用户并写入 `branch` 或 `worktree`。若保持 `null`,`build → verify` 的 guard 和 `comet-state transition build-complete` 都会失败。
|
|
86
|
+
</IMPORTANT>
|
|
87
|
+
|
|
83
88
|
**执行隔离**:
|
|
84
89
|
|
|
85
90
|
- **branch**:执行 `git checkout -b <change-name>`,后续工作在新分支上进行
|
|
@@ -109,7 +114,16 @@ bash "$COMET_STATE" set <name> build_mode <value>
|
|
|
109
114
|
|
|
110
115
|
- `subagent-driven-development`
|
|
111
116
|
- `executing-plans`
|
|
112
|
-
- `direct
|
|
117
|
+
- `direct`(默认仅 hotfix/tweak preset 使用)
|
|
118
|
+
|
|
119
|
+
full workflow 不得默认使用 `direct`。只有用户明确要求跳过计划执行技能,且你已记录显式 override 时,才允许:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
bash "$COMET_STATE" set <name> direct_override true
|
|
123
|
+
bash "$COMET_STATE" set <name> build_mode direct
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
没有 `direct_override: true` 时,full workflow 的 `build_mode=direct` 会被 guard 和状态转换同时拦截。
|
|
113
127
|
|
|
114
128
|
然后,**立即执行:** 使用 Skill 工具加载对应技能。禁止跳过此步骤。
|
|
115
129
|
|
|
@@ -151,8 +165,20 @@ Build 是最长阶段,可能跨越大量任务。为支持上下文压缩后
|
|
|
151
165
|
- tasks.md 全部勾选
|
|
152
166
|
- 代码已提交
|
|
153
167
|
- 已显式运行项目对应的构建/测试命令并通过(不要只依赖 guard 自动猜测)
|
|
168
|
+
- `isolation` 已写为 `branch` 或 `worktree`
|
|
169
|
+
- `build_mode` 已写为 `subagent-driven-development`、`executing-plans` 或带显式 override 的 `direct`
|
|
154
170
|
- **阶段守卫**:运行 `bash "$COMET_GUARD" <change-name> build --apply`,全部 PASS 后自动流转到 `phase: verify`
|
|
155
171
|
|
|
172
|
+
Guard 会优先读取项目配置中的命令:
|
|
173
|
+
|
|
174
|
+
```yaml
|
|
175
|
+
build_command: <build command>
|
|
176
|
+
verify_command: <verify command>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
配置位置可为 change 的 `.comet.yaml`,也可为仓库根目录的 `.comet.yaml` / `comet.yaml` / `.comet.yml` / `comet.yml`。
|
|
180
|
+
未配置时才回退到 `npm run build`、Maven 或 Cargo 的默认探测。构建失败时 guard 会打印失败命令输出,作为排查证据。
|
|
181
|
+
|
|
156
182
|
退出前运行 guard 自动流转:
|
|
157
183
|
|
|
158
184
|
```bash
|
package/bin/comet.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import '../dist/cli/index.js';
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import '../dist/cli/index.js';
|
package/dist/core/openspec.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/core/openspec.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAEvE,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;QACxF,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAmB,EAAE,WAAmB;IACvE,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GACV,KAAK,KAAK,QAAQ;YAChB,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,yCAAyC,CAAC;QAChD,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAwC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,OAAiB,EACjB,KAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACX,8FAA8F,CAC/F,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC;QACH,
|
|
1
|
+
{"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/core/openspec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAEvE,SAAS,aAAa,CAAC,KAAa,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAChF,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,wBAAwB,CAC/B,WAAmB,EACnB,OAAiB,EACjB,KAAmB,EACnB,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,EACtB,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,UAAU,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9D,OAAO,iBAAiB,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;AACtH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;QACxF,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAmB,EAAE,WAAmB;IACvE,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GACV,KAAK,KAAK,QAAQ;YAChB,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,yCAAyC,CAAC;QAChD,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAwC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,OAAiB,EACjB,KAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACX,8FAA8F,CAC/F,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,wBAAwB,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;YAC9D,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,6BAA8B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -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":"
|
|
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"}
|
package/dist/core/superpowers.js
CHANGED
|
@@ -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
|
|
10
|
+
roocode: 'roo',
|
|
10
11
|
continue: 'continue',
|
|
11
12
|
'github-copilot': 'github-copilot',
|
|
12
|
-
gemini: 'gemini',
|
|
13
|
-
'amazon-q': '
|
|
14
|
-
qwen: 'qwen',
|
|
15
|
-
kilocode: 'kilo
|
|
13
|
+
gemini: 'gemini-cli',
|
|
14
|
+
'amazon-q': 'universal',
|
|
15
|
+
qwen: 'qwen-code',
|
|
16
|
+
kilocode: 'kilo',
|
|
16
17
|
auggie: 'augment',
|
|
17
|
-
kiro: 'kiro',
|
|
18
|
-
lingma: '
|
|
18
|
+
kiro: 'kiro-cli',
|
|
19
|
+
lingma: 'universal',
|
|
19
20
|
junie: 'junie',
|
|
20
21
|
codebuddy: 'codebuddy',
|
|
21
|
-
costrict: '
|
|
22
|
+
costrict: 'universal',
|
|
22
23
|
crush: 'crush',
|
|
23
|
-
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: '
|
|
30
|
+
forgecode: 'forgecode',
|
|
30
31
|
trae: 'trae',
|
|
31
32
|
};
|
|
32
33
|
const VALID_PLATFORM_IDS = new Set(Object.keys(SKILLS_AGENT_MAP));
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../../src/core/superpowers.ts"],"names":[],"mappings":"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"}
|