forgedock 1.8.1 → 1.8.3
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/bin/engine/admission.mjs +57 -1
- package/bin/engine/admission.test.mjs +60 -0
- package/commands/analytics.md +3 -1
- package/commands/audit-agents.md +3 -1
- package/commands/audit.md +10 -8
- package/commands/autopilot.md +16 -14
- package/commands/ci-audit.md +4 -2
- package/commands/cleanup.md +1 -1
- package/commands/deploy-pr.md +31 -11
- package/commands/design-bench.md +1 -0
- package/commands/design-render-critique-loop.md +1 -0
- package/commands/design.md +1 -0
- package/commands/forge-stats.md +1 -0
- package/commands/geo-audit.md +3 -1
- package/commands/incident-response.md +3 -1
- package/commands/issue.md +4 -2
- package/commands/milestone.md +8 -6
- package/commands/orchestrate/config.md +3 -2
- package/commands/orchestrate/phase-1-resolve.md +57 -12
- package/commands/orchestrate/phase-2-triage.md +1 -0
- package/commands/orchestrate/phase-2.5-synthesis.md +1 -0
- package/commands/orchestrate/phase-3-dependency.md +17 -5
- package/commands/orchestrate/phase-4-execution.md +625 -78
- package/commands/orchestrate/phase-5-cleanup.md +5 -2
- package/commands/orchestrate/phase-6-report.md +8 -3
- package/commands/orchestrate/safety.md +1 -0
- package/commands/orchestrate.md +13 -9
- package/commands/pipeline-health/config.md +1 -0
- package/commands/pipeline-health/phase-1-context.md +1 -0
- package/commands/pipeline-health/phase-2-metrics.md +1 -0
- package/commands/pipeline-health/phase-3-analyze.md +1 -0
- package/commands/pipeline-health/phase-4-proposals.md +7 -4
- package/commands/pipeline-health/phase-5-report.md +5 -2
- package/commands/pipeline-health/phase-6-summary.md +1 -0
- package/commands/pipeline-health.md +9 -7
- package/commands/pipeline-resume.md +4 -2
- package/commands/qa-sweep.md +3 -1
- package/commands/quality-gate.md +4 -3
- package/commands/recover-orphans.md +219 -13
- package/commands/review-pr-agents/api.md +1 -0
- package/commands/review-pr-agents/auth.md +1 -0
- package/commands/review-pr-agents/billing.md +1 -0
- package/commands/review-pr-agents/concurrency.md +1 -0
- package/commands/review-pr-agents/database.md +1 -0
- package/commands/review-pr-agents/frontend.md +1 -0
- package/commands/review-pr-agents/infra.md +1 -0
- package/commands/review-pr-agents/protocols.md +1 -0
- package/commands/review-pr-agents/scraper.md +1 -0
- package/commands/review-pr-agents/security.md +1 -0
- package/commands/review-pr-agents/spec-cli.md +1 -0
- package/commands/review-pr-agents.md +10 -4
- package/commands/review-pr-staging.md +14 -5
- package/commands/review-pr.md +187 -19
- package/commands/rollback.md +3 -1
- package/commands/security-audit.md +3 -1
- package/commands/signal-planner.md +6 -4
- package/commands/sync-ecosystem.md +4 -2
- package/commands/test-gate.md +4 -2
- package/commands/upgrade-deps.md +3 -1
- package/commands/validate.md +3 -1
- package/commands/work-on/build/architect.md +82 -19
- package/commands/work-on/build/context.md +62 -18
- package/commands/work-on/build/implement.md +63 -18
- package/commands/work-on/build/validate.md +241 -60
- package/commands/work-on/build.md +345 -146
- package/commands/work-on/close.md +618 -246
- package/commands/work-on/decompose.md +240 -41
- package/commands/work-on/investigate.md +378 -61
- package/commands/work-on/remediate.md +43 -9
- package/commands/work-on/review.md +241 -29
- package/commands/work-on.md +180 -2014
- package/docs/CODEX.md +2 -0
- package/docs/CONFIG.md +11 -0
- package/package.json +1 -1
- package/scripts/build-spec-graph.mjs +11 -4
- package/scripts/check-spec-markers.sh +21 -1
- package/scripts/checkbox-sections.test.sh +8 -23
- package/scripts/extract-affected-files.sh +5 -2
- package/scripts/extract-affected-files.test.sh +27 -0
- package/scripts/forge-root.test.sh +176 -0
- package/scripts/is-docs-only.sh +31 -0
- package/scripts/is-docs-only.test.sh +64 -0
- package/scripts/lint-dispatch-prompt.sh +217 -0
- package/scripts/lint-dispatch-prompt.test.sh +307 -0
- package/scripts/validate-spec-graph.sh +3 -2
- package/scripts/verify-phase-trail.sh +282 -0
- package/scripts/verify-phase-trail.test.sh +298 -0
- package/scripts/wait-ci-green.sh +98 -0
- package/scripts/wait-ci-green.test.sh +99 -0
- package/commands/work-on-monolithic.md +0 -326
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
user-invocable: false
|
|
2
3
|
install: core
|
|
3
4
|
---
|
|
4
5
|
<!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
|
|
@@ -6,6 +7,8 @@ install: core
|
|
|
6
7
|
|
|
7
8
|
# /orchestrate — Phase 5: Post-Batch Cleanup
|
|
8
9
|
|
|
10
|
+
> **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
|
|
11
|
+
|
|
9
12
|
## Phase 5: Post-Batch Cleanup
|
|
10
13
|
|
|
11
14
|
**This phase is MANDATORY after every orchestration batch.** It prevents the rot that accumulates when multiple agents merge PRs in parallel — stale labels, orphaned worktrees, unclosed issues.
|
|
@@ -15,7 +18,7 @@ install: core
|
|
|
15
18
|
Invoke the `/cleanup` skill with `all` to sweep everything:
|
|
16
19
|
|
|
17
20
|
```
|
|
18
|
-
Skill(skill="cleanup", args="all")
|
|
21
|
+
Skill(skill="{FORGE_SKILL_PREFIX}cleanup", args="all")
|
|
19
22
|
```
|
|
20
23
|
|
|
21
24
|
This will:
|
|
@@ -31,7 +34,7 @@ This will:
|
|
|
31
34
|
Invoke `/audit-agents` on this session to measure pipeline efficiency:
|
|
32
35
|
|
|
33
36
|
```
|
|
34
|
-
Skill(skill="audit-agents", args="latest")
|
|
37
|
+
Skill(skill="{FORGE_SKILL_PREFIX}audit-agents", args="latest")
|
|
35
38
|
```
|
|
36
39
|
|
|
37
40
|
Include the audit summary in the final report (Phase 6). Key metrics to surface:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
user-invocable: false
|
|
2
3
|
|
|
3
4
|
install: core
|
|
4
5
|
---
|
|
@@ -39,7 +40,10 @@ for NUM in {all_completed_issue_numbers}; do
|
|
|
39
40
|
if [ -n "$TRAJ_BODY" ]; then
|
|
40
41
|
# Decode via protocol CLI — handles both Base64url form (forge#1727) and gracefully
|
|
41
42
|
# exits 1 (skips) for pre-migration inline-JSON entries.
|
|
42
|
-
|
|
43
|
+
# The codec ships with ForgeDock, not with the consumer repo: resolve it from the install root.
|
|
44
|
+
_l="$(readlink -f "$HOME/.claude/commands/work-on.md" 2>/dev/null || true)"; _l="${_l%/commands/work-on.md}"; CODEC_CLI=""
|
|
45
|
+
for _c in '${CLAUDE_PLUGIN_ROOT}' "${FORGE_ROOT:-}" "${FORGEDOCK_HOME:-}" "${FORGE_HOME:-}" "$_l"; do case "$_c" in /*) [ -z "$CODEC_CLI" ] && [ -f "$_c/packages/protocol/src/cli.js" ] && CODEC_CLI="$_c/packages/protocol/src/cli.js" ;; esac; done
|
|
46
|
+
CARD=$( [ -n "$CODEC_CLI" ] && printf '%s\n' "$TRAJ_BODY" | node "$CODEC_CLI" parse --type CARD 2>/dev/null | jq -c '.payload // .' 2>/dev/null || true)
|
|
43
47
|
[ -n "$CARD" ] && CARDS="${CARDS}${CARD}"$'\n'
|
|
44
48
|
fi
|
|
45
49
|
done
|
|
@@ -163,7 +167,7 @@ ORCHESTRATION_ENDED_IDLE="${BATCH_FULLY_GATED:-false}"
|
|
|
163
167
|
IDLE_POLICY_DEFERRED_COUNT=0
|
|
164
168
|
for FINDING_NUM in "${DEFERRED_FINDINGS[@]:-}"; do
|
|
165
169
|
[ -z "$FINDING_NUM" ] && continue
|
|
166
|
-
echo "${DEFERRED_REASONS[$FINDING_NUM]:-}" | grep -qi "batch fully human-gated" && \
|
|
170
|
+
echo "${DEFERRED_REASONS[$FINDING_NUM]:-}" | grep -qi "batch fully human-gated" && ! echo "${DEFERRED_REASONS[$FINDING_NUM]:-}" | grep -qi "amplification breaker" && \
|
|
167
171
|
IDLE_POLICY_DEFERRED_COUNT=$((IDLE_POLICY_DEFERRED_COUNT + 1))
|
|
168
172
|
done
|
|
169
173
|
```
|
|
@@ -345,6 +349,7 @@ current session's live wake pick them up automatically if it is still running).
|
|
|
345
349
|
| **Cascade amplification** | **{FINDINGS_SPAWNED:-0}/{MERGED_UNITS:-0} = {AMPLIFICATION_RATIO:-0} findings per merged unit** |
|
|
346
350
|
| Amplification composition | {#REFINEMENT_FINDINGS[@]:-0} same-lineage refinements; {#NEW_SURFACE_FINDINGS[@]:-0} new-surface findings |
|
|
347
351
|
| Amplification bound | {CASCADE_MAX_AMPLIFICATION:-off}; {#AMPLIFICATION_DEFERRED[@]:-0} same-lineage refinements deferred to completion sweep |
|
|
352
|
+
| Amplification breaker | {AMPLIFICATION_BREAKER:-on}; {tripped|clear}; {#AMPLIFICATION_BREAKER_DEFERRED[@]:-0} P3 findings paused ({#BREAKER_HELD[@]:-0} still held at sweep) for bounded P3 batches (never dispatched individually) |
|
|
348
353
|
| Competing recommendations reconciled (Phase 2.5) | {RECONCILED_COUNT} (investigation plans arbitrated in place + serialized) |
|
|
349
354
|
| Findings validated | {N} |
|
|
350
355
|
| False positives | {N} ({%}) |
|
|
@@ -363,7 +368,7 @@ current session's live wake pick them up automatically if it is still running).
|
|
|
363
368
|
|
|
364
369
|
`P3 findings clubbed` and `Findings deferred — token budget` are a DIFFERENT mechanism from the `$`-denominated `Budget limit`/`Projected spend`/`Actual spend`/`Issues deferred (budget ceiling)` rows above (forge#1743, opt-in `--budget N` flag, gates the *original* issue dispatch order). The token-budget row reads the always-on, token-denominated ceiling that scopes ONLY to Step 4C's review-finding cascade dispatch (forge#1858); `SURFACE_BATCH_COUNT` and `SURFACE_BATCHED_FINDINGS` are populated by the same Step 4C surface-area-batching block (forge#1818) that clubs P3 findings sharing a file/leaf-directory into one dispatched pipeline. Both degrade gracefully to `0`/`uncapped` when the batch had no review findings or ran with defaults. <!-- Added: forge#1858 -->
|
|
365
370
|
|
|
366
|
-
**Cascade amplification detail**: render one row per `FINDINGS_BY_SOURCE_PR` entry: `| PR #{source} | {finding count} | {refinement count} | {new-surface count} |`. A ratio at or above 1.0 means the batch is not reducing its open-work count through merges alone; it does **not** mean the findings are low-value. Include any convergence warning and state that the default `max_amplification: off` never defers findings. When an opt-in bound deferred a refinement, list it under Completion Sweep as re-evaluable rather than silently omitting it.
|
|
371
|
+
**Cascade amplification detail**: render one row per `FINDINGS_BY_SOURCE_PR` entry: `| PR #{source} | {finding count} | {refinement count} | {new-surface count} |`. A ratio at or above 1.0 means the batch is not reducing its open-work count through merges alone; it does **not** mean the findings are low-value. Include any convergence warning and state that the default `max_amplification: off` never defers findings. State the amplification breaker (on by default, forge#3060) separately: when it tripped, report the ratio, the number of paused P3 findings, and the operator decision (batch or defer); when opted out via `amplification_breaker: off`, say so. When an opt-in bound deferred a refinement, list it under Completion Sweep as re-evaluable rather than silently omitting it.
|
|
367
372
|
|
|
368
373
|
For `policy: all`, include the full-repo intake counts and list each automated duplicate with its canonical issue. A sweep measures all new open issues, including CI alerts without `review-finding`; it must not claim that the cascade ratio alone measures total queue growth.
|
|
369
374
|
|
package/commands/orchestrate.md
CHANGED
|
@@ -51,7 +51,7 @@ dispatch a compact plan.
|
|
|
51
51
|
|
|
52
52
|
## Execution Order
|
|
53
53
|
|
|
54
|
-
Read and execute phases in sequence. Each phase file is self-contained.
|
|
54
|
+
Read and execute phases in sequence. Each phase file is self-contained. Resolve every path from the spec root defined in the Quick Reference below.
|
|
55
55
|
|
|
56
56
|
| Step | File | Description |
|
|
57
57
|
|------|------|-------------|
|
|
@@ -67,15 +67,19 @@ Read and execute phases in sequence. Each phase file is self-contained.
|
|
|
67
67
|
|
|
68
68
|
## Quick Reference
|
|
69
69
|
|
|
70
|
+
**Spec root (MANDATORY)**: read every file below from `${CLAUDE_PLUGIN_ROOT}` — the install root of the ForgeDock plugin that is running this command (Claude Code fills it in when it loads the spec). Only if that path does not start with `/` (not a Claude Code plugin session: install.sh, Codex, OpenCode) use `$FORGE_HOME` instead. Never read sub-files from `$FORGE_HOME` when the plugin root resolved: an exported `FORGE_HOME` can point at a different, older ForgeDock checkout, and mixing roots runs stale phase specs.
|
|
71
|
+
|
|
72
|
+
**Raw reads are not substituted (MANDATORY)**: Claude Code fills in the plugin root only in the spec it loads (this file), never in files you open with Read. The phase files contain the placeholder written as `$` immediately followed by `{CLAUDE_PLUGIN_ROOT}`. Before running any bash block taken from a phase file, replace every occurrence of that placeholder with `${CLAUDE_PLUGIN_ROOT}` (the resolved root shown here), exactly as Claude Code would have. Left unreplaced it is rejected as a non-absolute path and resolution falls back to `$FORGE_HOME`, which may be stale.
|
|
73
|
+
|
|
70
74
|
```
|
|
71
|
-
Read: $
|
|
72
|
-
Read: $
|
|
73
|
-
Read: $
|
|
74
|
-
Read: $
|
|
75
|
-
Read: $
|
|
76
|
-
Read: $
|
|
77
|
-
Read: $
|
|
78
|
-
Read: $
|
|
75
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/config.md # ALWAYS READ FIRST
|
|
76
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-1-resolve.md
|
|
77
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-2-triage.md
|
|
78
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-2.5-synthesis.md
|
|
79
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-3-dependency.md
|
|
80
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-4-execution.md
|
|
81
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-5-cleanup.md
|
|
82
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-6-report.md
|
|
79
83
|
```
|
|
80
84
|
|
|
81
85
|
The orchestrator reads only the phase file(s) relevant to the current step rather than
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
user-invocable: false
|
|
2
3
|
install: extras
|
|
3
4
|
---
|
|
4
5
|
<!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
|
|
@@ -6,6 +7,8 @@ install: extras
|
|
|
6
7
|
|
|
7
8
|
# /pipeline-health — Phase 4: Generate Improvement Proposals
|
|
8
9
|
|
|
10
|
+
> **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
|
|
11
|
+
|
|
9
12
|
## Phase 4: Generate Improvement Proposals
|
|
10
13
|
|
|
11
14
|
### 4A: Pattern recurrence analysis — check-promotion threshold <!-- Added: forge#1331 -->
|
|
@@ -40,7 +43,7 @@ while IFS= read -r line; do
|
|
|
40
43
|
|
|
41
44
|
# SECURITY: $SLUG is sourced from a <!-- FORGE:PATTERN: ([^\s>]+) --> tag inside
|
|
42
45
|
# a review-finding issue body — untrusted, externally-influenced text. It is
|
|
43
|
-
# interpolated below into a Skill(skill="issue", args="...") string, and
|
|
46
|
+
# interpolated below into a Skill(skill="{FORGE_SKILL_PREFIX}issue", args="...") string, and
|
|
44
47
|
# commands/issue.md's Phase 1A resolves that string via `eval "set -- $ARGUMENTS"`.
|
|
45
48
|
# Any shell metacharacter (quote, backtick, $, ;) in $SLUG would break out of the
|
|
46
49
|
# intended --title token and be eval'd as shell. Whitelist-validate at the
|
|
@@ -108,7 +111,7 @@ ${SOURCE_FINDINGS}
|
|
|
108
111
|
<!-- AUTO-CREATED: pipeline-health Phase 4A — pattern recurrence threshold exceeded -->
|
|
109
112
|
CHECK_EOF
|
|
110
113
|
|
|
111
|
-
Skill(skill="issue", args="--title \"feat(quality-gate): promote pattern '$SLUG' to deterministic registry check (recurred ${COUNT}x)\" --body-file $CHECK_BODY_FILE --label check-promotion --label priority:P2")
|
|
114
|
+
Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"feat(quality-gate): promote pattern '$SLUG' to deterministic registry check (recurred ${COUNT}x)\" --body-file $CHECK_BODY_FILE --label check-promotion --label priority:P2")
|
|
112
115
|
rm -f "$CHECK_BODY_FILE"
|
|
113
116
|
echo "Created check-promotion issue for pattern '$SLUG' (recurred ${COUNT}x from: $SOURCE_FINDINGS)"
|
|
114
117
|
done <<< "$PATTERN_LIST"
|
|
@@ -170,7 +173,7 @@ echo "$SPEC_CONCENTRATION" | while IFS=' ' read -r count spec_file finding_nums;
|
|
|
170
173
|
|
|
171
174
|
# SECURITY (defense-in-depth, consistency with $SLUG above): $spec_file is
|
|
172
175
|
# already constrained by the extraction regex (commands/[a-z0-9_/-]+\.md), but
|
|
173
|
-
# it is interpolated below into a Skill(skill="issue", args="...") string that
|
|
176
|
+
# it is interpolated below into a Skill(skill="{FORGE_SKILL_PREFIX}issue", args="...") string that
|
|
174
177
|
# /issue's Phase 1A resolves via eval. Whitelist-validate again at point of use
|
|
175
178
|
# so this call site does not depend solely on the extraction regex staying safe.
|
|
176
179
|
if ! echo "$spec_file" | grep -qE '^commands/[A-Za-z0-9_/-]+\.md$'; then
|
|
@@ -235,7 +238,7 @@ This issue was auto-created by \`pipeline-health\` Phase 4A.5.
|
|
|
235
238
|
<!-- AUTO-CREATED: pipeline-health Phase 4A.5 — spec concentration threshold exceeded -->
|
|
236
239
|
TRIGGER_EOF
|
|
237
240
|
|
|
238
|
-
Skill(skill="issue", args="--title \"feat(spec-doctor): queue spec evolution pass for $(basename $spec_file .md) (${count} concentrated findings)\" --body-file $TRIGGER_BODY_FILE --label spec-doctor-trigger --label priority:P2")
|
|
241
|
+
Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"feat(spec-doctor): queue spec evolution pass for $(basename $spec_file .md) (${count} concentrated findings)\" --body-file $TRIGGER_BODY_FILE --label spec-doctor-trigger --label priority:P2")
|
|
239
242
|
rm -f "$TRIGGER_BODY_FILE"
|
|
240
243
|
echo "Created spec-doctor trigger for '$spec_file' (${count} findings: $finding_nums)"
|
|
241
244
|
done
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
user-invocable: false
|
|
2
3
|
install: extras
|
|
3
4
|
---
|
|
4
5
|
<!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
|
|
@@ -6,6 +7,8 @@ install: extras
|
|
|
6
7
|
|
|
7
8
|
# /pipeline-health — Phase 5: Report & Track
|
|
8
9
|
|
|
10
|
+
> **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
|
|
11
|
+
|
|
9
12
|
## Phase 5: Report & Track
|
|
10
13
|
|
|
11
14
|
### 5A: Post health report
|
|
@@ -279,7 +282,7 @@ restore_forge_yaml() {
|
|
|
279
282
|
trap restore_forge_yaml EXIT
|
|
280
283
|
cp "$FORGE_ISSUE_HOOK_CONFIG" forge.yaml
|
|
281
284
|
|
|
282
|
-
ISSUE_RESULT=$(Skill(skill="issue", args="--title \"Pipeline Health: $REPO — $(date +%Y-%m-%d) — Score: [SCORE]/100\" --body-file $HEALTH_BODY_FILE --label health-report"))
|
|
285
|
+
ISSUE_RESULT=$(Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"Pipeline Health: $REPO — $(date +%Y-%m-%d) — Score: [SCORE]/100\" --body-file $HEALTH_BODY_FILE --label health-report"))
|
|
283
286
|
echo "$ISSUE_RESULT"
|
|
284
287
|
|
|
285
288
|
# Restore the original forge.yaml immediately — so a subsequent Bash call in this same
|
|
@@ -390,7 +393,7 @@ restore_forge_yaml() {
|
|
|
390
393
|
trap restore_forge_yaml EXIT
|
|
391
394
|
cp "$FORGE_ISSUE_HOOK_CONFIG" forge.yaml
|
|
392
395
|
|
|
393
|
-
ISSUE_RESULT=$(Skill(skill="issue", args="--title \"fix([command]): [description]\" --body-file $PROPOSAL_BODY_FILE --label \"[bug|enhancement|feature]\" --label \"[P1|P2|P3]\""))
|
|
396
|
+
ISSUE_RESULT=$(Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"fix([command]): [description]\" --body-file $PROPOSAL_BODY_FILE --label \"[bug|enhancement|feature]\" --label \"[P1|P2|P3]\""))
|
|
394
397
|
echo "$ISSUE_RESULT"
|
|
395
398
|
|
|
396
399
|
# Restore the original forge.yaml immediately — same rationale as 5A. Clears the EXIT trap
|
|
@@ -31,14 +31,16 @@ Read and execute phases in sequence. Each phase file is self-contained.
|
|
|
31
31
|
|
|
32
32
|
## Quick Reference
|
|
33
33
|
|
|
34
|
+
**Spec root (MANDATORY)**: read every file below from `${CLAUDE_PLUGIN_ROOT}` — the install root of the ForgeDock plugin that is running this command (Claude Code fills it in when it loads the spec). Only if that path does not start with `/` (not a Claude Code plugin session: install.sh, Codex, OpenCode) use `$FORGE_HOME` instead. Never read sub-files from `$FORGE_HOME` when the plugin root resolved: an exported `FORGE_HOME` can point at a different, older ForgeDock checkout, and mixing roots runs stale phase specs.
|
|
35
|
+
|
|
34
36
|
```
|
|
35
|
-
Read: $
|
|
36
|
-
Read: $
|
|
37
|
-
Read: $
|
|
38
|
-
Read: $
|
|
39
|
-
Read: $
|
|
40
|
-
Read: $
|
|
41
|
-
Read: $
|
|
37
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/config.md # ALWAYS READ FIRST
|
|
38
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-1-context.md
|
|
39
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-2-metrics.md
|
|
40
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-3-analyze.md
|
|
41
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-4-proposals.md
|
|
42
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-5-report.md
|
|
43
|
+
Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-6-summary.md
|
|
42
44
|
```
|
|
43
45
|
|
|
44
46
|
The command reads only the phase file(s) relevant to the current step rather than loading
|
|
@@ -6,13 +6,15 @@ install: extras
|
|
|
6
6
|
|
|
7
7
|
# /pipeline-resume — Context Recovery After Compaction
|
|
8
8
|
|
|
9
|
+
> **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
|
|
10
|
+
|
|
9
11
|
**Input**: $ARGUMENTS
|
|
10
12
|
|
|
11
13
|
You are the context-recovery agent. When a session ends or context is compressed, all working state is lost. Your job is to restore it instantly — find the most recently active issue, read all FORGE annotations, reconstruct the current pipeline phase, and re-enter the pipeline exactly where it left off.
|
|
12
14
|
|
|
13
15
|
**Agent model policy**: `model: "haiku"`, `effort: low` (mechanical tier — context recovery, annotation reading, state reconstruction). Fallback: `model: "sonnet"` if rate-limited. Feature gate: pass `effort` only on Claude Code >= 2.1.154.
|
|
14
16
|
**NEVER use plan mode (EnterPlanMode).**
|
|
15
|
-
**NEVER use the Agent tool** — pipeline-resume re-enters the pipeline via `Skill(skill="work-on", ...)` only. Using the Agent tool would restart the pipeline in an untracked subprocess rather than resuming the existing tracked session.
|
|
17
|
+
**NEVER use the Agent tool** — pipeline-resume re-enters the pipeline via `Skill(skill="{FORGE_SKILL_PREFIX}work-on", ...)` only. Using the Agent tool would restart the pipeline in an untracked subprocess rather than resuming the existing tracked session.
|
|
16
18
|
|
|
17
19
|
<!-- FORGE:SPEC_LOADED — pipeline-resume.md loaded and active. Agent is bound by this spec. -->
|
|
18
20
|
|
|
@@ -267,7 +269,7 @@ Emit a structured context block before resuming — this is what anchors the age
|
|
|
267
269
|
Invoke `/work-on` to re-enter the pipeline. Work-on reads GitHub state independently and routes to the correct phase automatically.
|
|
268
270
|
|
|
269
271
|
```
|
|
270
|
-
Skill("work-on", args="{TARGET_NUMBER}")
|
|
272
|
+
Skill("{FORGE_SKILL_PREFIX}work-on", args="{TARGET_NUMBER}")
|
|
271
273
|
```
|
|
272
274
|
|
|
273
275
|
**Why delegation works**: `/work-on` Phase 0B already implements "Determine resume point" — it reads issue labels and FORGE annotations to route to the correct phase. `/pipeline-resume` provides the human-readable context summary, then hands off to `/work-on` for execution.
|
package/commands/qa-sweep.md
CHANGED
|
@@ -8,6 +8,8 @@ install: extras
|
|
|
8
8
|
|
|
9
9
|
# /qa-sweep — Platform-Wide QA Testing
|
|
10
10
|
|
|
11
|
+
> **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
|
|
12
|
+
|
|
11
13
|
**Input**: $ARGUMENTS
|
|
12
14
|
|
|
13
15
|
You are the QA orchestrator. Auto-discover every page across the platform (dashboard, marketing, blog, auth, docs, pricing), then systematically test every UI element, interaction, workflow, and state transition using browser automation. Create GitHub issues for every finding.
|
|
@@ -339,7 +341,7 @@ BODY_EOF
|
|
|
339
341
|
```
|
|
340
342
|
|
|
341
343
|
```
|
|
342
|
-
Skill(skill="issue", args="--title \"{fix|feat}: {title} on {page}\" --body-file \"$QA_BODY_FILE\" --label \"qa\" --label \"{bug_or_enhancement}\" --label \"{priority}\"")
|
|
344
|
+
Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"{fix|feat}: {title} on {page}\" --body-file \"$QA_BODY_FILE\" --label \"qa\" --label \"{bug_or_enhancement}\" --label \"{priority}\"")
|
|
343
345
|
```
|
|
344
346
|
|
|
345
347
|
`qa`, `{bug_or_enhancement}`, and `{priority}` are each passed as their own `--label` flag — `/issue`'s programmatic mode does not comma-split a single `--label` value.
|
package/commands/quality-gate.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Pre-commit quality check — catches defects the review would flag, so the builder can fix them before committing
|
|
3
3
|
argument-hint: (invoked by /work-on, not directly)
|
|
4
|
+
context: fork
|
|
4
5
|
---
|
|
5
6
|
<!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
|
|
6
7
|
<!-- SPDX-License-Identifier: AGPL-3.0-or-later -->
|
|
@@ -1712,13 +1713,13 @@ OR:
|
|
|
1712
1713
|
|
|
1713
1714
|
Return the findings list directly. Do NOT post to GitHub. Do NOT create issues. The builder will fix the findings and re-run the gate if needed.
|
|
1714
1715
|
|
|
1715
|
-
**
|
|
1716
|
+
**Result delivery**: This skill runs in an isolated forked context, so your final reply is the only thing the caller sees. The PASS or FINDINGS block below MUST be your final reply, in ALL cases, with nothing after it. The caller (the validate quality-gate loop) decides what happens next.
|
|
1716
1717
|
|
|
1717
1718
|
If 0 findings:
|
|
1718
1719
|
```
|
|
1719
1720
|
QUALITY GATE: PASS — no issues detected.
|
|
1720
1721
|
|
|
1721
|
-
|
|
1722
|
+
Return this result to the caller.
|
|
1722
1723
|
```
|
|
1723
1724
|
|
|
1724
1725
|
If findings exist:
|
|
@@ -1726,5 +1727,5 @@ If findings exist:
|
|
|
1726
1727
|
QUALITY GATE FINDINGS: N issues detected.
|
|
1727
1728
|
{findings list}
|
|
1728
1729
|
|
|
1729
|
-
|
|
1730
|
+
Return this result to the caller; the caller fixes each HIGH and MEDIUM finding and re-runs the gate.
|
|
1730
1731
|
```
|