Capture converge finish (currentStep=converge, status unchanged) into .spec-context.json for the Companion GUI
php artisan boost:add-skill monicahq/laravel-cloudflare
Save this content to: .claude/skills/speckit-companion-after-converge/SKILL.md
# Capture Converge Finish
Record the finish of the active feature's converge run into `.spec-context.json` so the SpecKit Companion GUI shows how long converge took. This command runs as the `after_converge` lifecycle hook and only writes state; the convergence check itself is the core `speckit.converge` workflow.
## Prerequisites
- Verify Python is available by running `python3 --version`.
- If `python3` is not available, warn the user and skip the capture: `[companion] Warning: python3 not detected; skipped .spec-context.json capture`. Do not fail the host command.
## Execution
Run the writer script from the repository root:
```bash
python3 .specify/extensions/companion/scripts/write-context.py --step converge --kind complete --by extension
```
There is no `--status`: converge owns no status and never moves the spec's status. When converge appends convergence tasks to `tasks.md`, the spec stays `implemented` while you work them, and the status command points at the next one. The finish is idempotent, so a re-fired hook never records a second one.
The script resolves the active feature directory on its own, in this order: `--feature-dir`, `SPECIFY_FEATURE_DIRECTORY` env, `SPECIFY_FEATURE` env, `.specify/feature.json`, current git branch prefix.
If you already know the feature directory, pass it explicitly so resolution is unambiguous:
```bash
python3 .specify/extensions/companion/scripts/write-context.py --feature-dir specs/<NNN>-<slug> --step converge --kind complete --by extension
```
## Graceful Degradation
The script is best-effort and never fails the host command:
- If `python3` is missing, skip with the warning above.
- If the active feature directory cannot be resolved, the script prints a warning to stderr and exits 0 without writing.
- If the spec is already `completed` or `archived`, nothing is written.
## Output
On success the script prints the path it updated and the values written, e.g. `[companion] Updated specs/<NNN>-<slug>/.spec-context.json (currentStep=converge, status=unchanged, kind=complete, by=extension)`. The write is atomic and appends to `history[]` without rewriting existing entries.
Record the finish of the active feature's converge run into .spec-context.json so the SpecKit Companion GUI shows how long converge took. This command runs as the after_converge lifecycle hook and only writes state; the convergence check itself is the core speckit.converge workflow.
python3 --version.python3 is not available, warn the user and skip the capture: [companion] Warning: python3 not detected; skipped .spec-context.json capture. Do not fail the host command.Run the writer script from the repository root:
python3 .specify/extensions/companion/scripts/write-context.py --step converge --kind complete --by extension
There is no --status: converge owns no status and never moves the spec's status. When converge appends convergence tasks to tasks.md, the spec stays implemented while you work them, and the status command points at the next one. The finish is idempotent, so a re-fired hook never records a second one.
The script resolves the active feature directory on its own, in this order: --feature-dir, SPECIFY_FEATURE_DIRECTORY env, SPECIFY_FEATURE env, .specify/feature.json, current git branch prefix.
If you already know the feature directory, pass it explicitly so resolution is unambiguous:
python3 .specify/extensions/companion/scripts/write-context.py --feature-dir specs/<NNN>-<slug> --step converge --kind complete --by extension
The script is best-effort and never fails the host command:
python3 is missing, skip with the warning above.completed or archived, nothing is written.On success the script prints the path it updated and the values written, e.g. [companion] Updated specs/<NNN>-<slug>/.spec-context.json (currentStep=converge, status=unchanged, kind=complete, by=extension). The write is atomic and appends to history[] without rewriting existing entries.
How can I help you explore Laravel packages today?