skills/forge-verify/SKILL.md
[read-only] Pre-pipeline checks. --build runs configured build+lint+test. --config validates forge.local.md and forge-config.md against PREFLIGHT constraints. --all runs both. Defaults to --build. Never modifies files. Use when you want a fast sanity check before committing, opening a PR, or kicking off a full pipeline run.
npx skillsauth add quantumbitcz/dev-pipeline forge-verifyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
One skill, two checks. --build runs the configured build/lint/test commands; --config validates configuration files. Both are read-only.
Follow shared/skill-subcommand-pattern.md. This skill uses flags (the two checks are peer checks with a natural combinator).
Dispatch rules:
$ARGUMENTS.--build, --config, --all, --json, --help.--build, --config, --all are mutually exclusive. If more than one is present: Only one of --build, --config, --all may be specified. exit 2.--build.--help: print usage and exit 0.--build → ### Subcommand: build--config → ### Subcommand: config--all → ### Subcommand: all (config first, then build)See shared/skill-contract.md §3.
Before any subcommand:
git rev-parse --show-toplevel 2>/dev/null. If fails: "Not a git repository. Navigate to a project directory." STOP..claude/forge.local.md exists. If not: "No pipeline config found. Run /forge-init first." STOP.Run build, lint, and test commands for the current module without a full pipeline run.
Read-only — does NOT modify any file.
Commands configured: Read .claude/forge.local.md for the commands section. If ALL three commands (build, lint, test) are empty or missing: report UNKNOWN verdict with message "No build, lint, or test commands configured. Run /forge-init or add them to .claude/forge.local.md." and STOP.
Check which commands are configured (non-empty):
Run configured commands sequentially, stop on first failure:
Build (if commands.build is configured):
{commands.build}
Report: PASS or FAIL with error output
Lint (if commands.lint is configured):
{commands.lint}
Report: PASS or FAIL with error output
Test (if commands.test is configured):
{commands.test}
Report: PASS or FAIL with error output and test count
Summary:
## Verify Results
- Build: PASS/FAIL/SKIPPED
- Lint: PASS/FAIL/SKIPPED
- Test: PASS/FAIL/SKIPPED ({N} tests)
- Verdict: PASS/FAIL/UNKNOWN
Verdict logic:
/forge-init to configure commands or add them to .claude/forge.local.md under the commands: section."Validate the project's forge configuration files before a pipeline run. Catches misconfigurations that would fail at PREFLIGHT or cause runtime errors deep in the pipeline.
Delegates schema validation to ${CLAUDE_PLUGIN_ROOT}/shared/validate-config.sh, which is read-only (no writes, no touch/mkdir/tee — only stderr reporting). The script exits 0 (PASS), 1 (ERROR), or 2 (WARNING-only).
Read-only — validates files, never modifies them. Does NOT execute build/test/lint commands (only checks their first-word executables exist).
.claude/forge.local.md.
/forge-init to set up." and stop..claude/forge.local.md — parse the YAML frontmatter (between --- delimiters)..claude/forge-config.md.
/forge-init to generate.".claude/forge-config.md exists: read and parse its markdown tables for parameter values.Check that these required fields exist in the YAML frontmatter. Report PASS or ERROR for each:
components section:
components.language — must be one of: kotlin, java, typescript, python, go, rust, swift, c, csharp, ruby, php, dart, elixir, scala, cpp, or null (for k8s).components.framework — must be one of: spring, react, fastapi, axum, swiftui, vapor, express, sveltekit, k8s, embedded, go-stdlib, aspnet, django, nextjs, gin, jetpack-compose, kotlin-multiplatform, angular, nestjs, vue, svelte, or null.components.testing — must be one of: kotest, junit5, vitest, jest, pytest, go-testing, xctest, rust-test, xunit-nunit, testcontainers, playwright, cypress, cucumber, k6, detox, rspec, phpunit, exunit, scalatest. WARNING if missing (not all frameworks require explicit testing config).components.variant (if present) — must match a file in ${CLAUDE_PLUGIN_ROOT}/modules/frameworks/{framework}/variants/{value}.md. WARNING if file not found.commands section:
commands.build — ERROR if missing or empty.commands.test — ERROR if missing or empty.commands.lint — WARNING if missing (some projects have no linter).conventions_file:
If forge-config.md exists, validate these parameters against PREFLIGHT constraints. Use defaults if a parameter is not set.
Scoring:
critical_weight: must be >= 10. Default: 20.warning_weight: must be >= 1. Default: 5.info_weight: must be >= 0 and < warning_weight. Default: 2.pass_threshold: must be >= 60. Default: 80.concerns_threshold: must be >= 40. Default: 60.pass_threshold - concerns_threshold: must be >= 10.oscillation_tolerance: must be 0-20. Default: 5.total_retries_max: must be 5-30. Default: 10.Convergence:
max_iterations: must be 3-20. Default: 8.plateau_threshold: must be 0-10. Default: 2.plateau_patience: must be 1-5. Default: 2.target_score: must be >= pass_threshold and <= 100. Default: 90.Sprint (if configured):
sprint.poll_interval_seconds: must be 10-120. Default: 30.sprint.dependency_timeout_minutes: must be 5-180. Default: 60.Tracking:
tracking.archive_after_days: must be 30-365 or 0 (disabled). Default: 90.Shipping (if configured):
shipping.min_score: must be >= pass_threshold and <= 100. Default: 90.shipping.evidence_max_age_minutes: must be 5-60. Default: 30.Scope/Routing:
decomposition_threshold: must be 2-10. Default: 3.routing.vague_threshold: must be one of: low, medium, high. Default: medium.For each conventions file reference in forge.local.md, verify the target file exists:
conventions_file — resolve ${CLAUDE_PLUGIN_ROOT} to the plugin root. ERROR if file not found.conventions_variant — resolve variables (${components.variant}). WARNING if file not found (variant may be optional).conventions_testing — resolve variables (${components.testing}). WARNING if file not found.conventions_web — resolve variables. WARNING if file not found (not all frameworks have web variants).conventions_persistence — resolve variables. WARNING if file not found (not all frameworks have persistence variants).language_file — resolve variables. ERROR if file not found.preempt_file — check existence of .claude/forge-log.md. WARNING if not found.config_file — check existence of .claude/forge-config.md. WARNING if not found.Resolution: Replace ${CLAUDE_PLUGIN_ROOT} with the actual plugin root path (look for the forge plugin in .claude/plugins/ or the current directory if running from within the plugin). Replace ${components.X} with the actual value from the components section.
For each command in the commands section, run a quick check (do NOT execute the command itself):
./gradlew build -x test: check that ./gradlew exists and is executable.npm run build: check that npm is on PATH.Report PASS or WARNING for each. Do NOT run the actual commands.
Agent references:
quality_gate section exists, check that each agent: reference matches an existing agent file in the plugin's agents/ directory. WARNING for unknown agents (may be from other plugins).Code quality tools:
code_quality list is non-empty, check that each tool has a corresponding module file at modules/code-quality/{tool}.md. WARNING for unknown tools.Framework-component compatibility:
components.framework is k8s, then components.language should be null. WARNING if not.components.framework is go-stdlib, then components.language should be go. WARNING if not.components.framework is embedded, then components.language should be c or cpp. WARNING if not.Present results in this format:
## Config Validation Report
**forge.local.md:** .claude/forge.local.md
**forge-config.md:** {found/not found}
### Required Fields
| Field | Status | Value |
|-------|--------|-------|
| components.language | PASS/ERROR | {value} |
| components.framework | PASS/ERROR | {value} |
| components.testing | PASS/WARNING | {value} |
| commands.build | PASS/ERROR | {value} |
| commands.test | PASS/ERROR | {value} |
| commands.lint | PASS/WARNING | {value} |
| conventions_file | PASS/ERROR | {value} |
### Value Ranges (forge-config.md)
| Parameter | Value | Range | Status |
|-----------|-------|-------|--------|
| total_retries_max | {n} | 5-30 | PASS/ERROR |
| ... | ... | ... | ... |
### File References
| Reference | Target | Status |
|-----------|--------|--------|
| conventions_file | {resolved_path} | PASS/ERROR |
| ... | ... | ... |
### Command Executability
| Command | Executable | Status |
|---------|-----------|--------|
| build | {cmd} | PASS/WARNING |
| test | {cmd} | PASS/WARNING |
| lint | {cmd} | PASS/WARNING |
### Cross-References
- {check}: {status}
### Summary
- {errors} errors, {warnings} warnings
- {recommendation}
Recommendations:
/forge-run."/forge-init or fix paths manually.".claude/forge-config.md."Delegates to ${CLAUDE_PLUGIN_ROOT}/shared/validate-config.sh for:
The script exits 0 (PASS), 1 (ERROR), or 2 (WARNING only).
Run config first. If config validation reports ERROR (non-zero exit from validate-config.sh or any required-field ERROR): report "Config validation failed — skipping build check. Fix config errors first." and exit 1. Do not run build — running build commands against a broken config produces misleading results.
If config validation passes (or reports only WARNINGs): proceed to run build. Combine both reports into a single output.
| Condition | Action |
|---|---|
| Shared prerequisites fail | Report specific error and STOP |
| Both --build and --config specified | "Only one of --build, --config, --all may be specified." exit 2 |
| Build command fails | Report FAIL with error output. Do not proceed to lint/test |
| Lint command fails | Report FAIL with error output. Do not proceed to test |
| Test command fails | Report FAIL with error output and test failure details |
| Command not found on PATH | "Command not found: {cmd}. Install it or update .claude/forge.local.md." |
| Command times out | "Command timed out after {N} seconds. The build/test may be hanging." |
| forge.local.md YAML parse failure (config) | "Could not parse YAML frontmatter in forge.local.md. Check syntax." STOP |
| validate-config.sh exits 1 (config) | Report ERRORs, exit 1 |
| validate-config.sh exits 2 (config WARN only) | Report WARNINGs, exit 0 |
| Plugin root not found (config) | "Could not locate forge plugin root. File reference checks skipped." |
.forge/ state./forge-review --scope=changed — Review and fix changed files/forge-review --scope=all — Full codebase audit (read-only)/forge-run — Full pipeline including verification/forge-recover diagnose — Diagnose runtime pipeline issues (complementary to config validation)development
[writes] Build, fix, deploy, review, or modify code in this project. Universal entry for the forge pipeline. Auto-bootstraps on first run; brainstorms before planning when given a feature description. Use when you want to take any productive action: implementing features, fixing bugs, reviewing branches, deploying, committing, running migrations.
tools
[writes] Manage forge state and configuration: recovery, abort, config edits, session handoff, automations, playbooks, output compression, knowledge graph maintenance. Use when you need to recover from broken pipeline state, edit settings, or manage long-lived state.
development
[writes] Create, list, show, resume, or search forge session handoffs. Use when context is getting heavy and you want to transfer a forge run or conversation into a fresh Claude Code session, or to resume from a prior handoff artefact. Subcommands - no args (write), list, show, resume, search.
development
[writes] Manage the Neo4j knowledge graph. Subcommands: init, rebuild (writes); status, query <cypher>, debug (read-only). Requires Docker. No default — an explicit subcommand is required. Use when setting up the graph for the first time, rebuilding after major refactors, checking graph health, or running ad-hoc Cypher diagnostics.