Convert forge commands to skills (cross-platform)#10
Merged
Conversation
Skills are the single representation that runs natively on both Claude Code (where skills are a superset of commands) and Pi (where skills are the native unit). Replaces the command-to-skill bridge with a full conversion, no drift.
Task 1 verified against Claude Code docs: a plugin named forge namespaces its skills as /forge:<dir>, so skills/building/ yields /forge:building. The plan's skills/forge-building/ would have produced /forge:forge-building.
The command->skill conversion renamed commands/*.md to skills/*/SKILL.md; the binding docs still pointed at the old command paths. Retarget them at the skills and reword 'command' to 'skill' throughout.
There was a problem hiding this comment.
Pull request overview
This pull request converts forge’s three workflow entrypoints from Claude Code “commands” into cross-platform “skills” so the same source tree can be consumed natively by both Claude Code and Pi, eliminating a command/skill bridging layer.
Changes:
- Migrate the three workflows to
skills/<workflow>/SKILL.mdand add skill frontmatter (name,description,disable-model-invocation: true), plus an$ARGUMENTSfallback instruction. - Add a Pi manifest (
package.json) pointing Pi at./skills. - Update docs/bindings/README wording and fix binding-doc links for the new file depth.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| skills/interview/SKILL.md | Converts interview workflow into a skill; adjusts binding link depth; adds $ARGUMENTS fallback line. |
| skills/planning/SKILL.md | Converts planning workflow into a skill; adjusts binding link depth; adds $ARGUMENTS fallback line. |
| skills/building/SKILL.md | Converts building workflow into a skill; adjusts binding link depth; adds $ARGUMENTS fallback line. |
| README.md | Renames “commands” to “skills” in user-facing docs and usage table. |
| package.json | Adds Pi package manifest declaring pi.skills directory. |
| docs/specs/2026-07-11-forge-skills-conversion-design.md | Captures the design/spec for the conversion. |
| docs/plans/task1-naming-findings.md | Records naming/discovery findings from Claude Code + agentskills.io docs. |
| docs/plans/2026-07-11-forge-skills-conversion.md | Provides an implementation plan for the conversion tasks and verification steps. |
| docs/harness-bindings/README.md | Updates harness-binding overview to reference skills instead of commands. |
| docs/harness-bindings/pi.md | Updates Pi binding doc references from commands to skills. |
| docs/harness-bindings/claude-code.md | Updates Claude Code binding doc references from commands to skills. |
Comments suppressed due to low confidence (3)
skills/planning/SKILL.md:27
- This fallback line changes the documented meaning of an intentionally empty
$ARGUMENTS(the section below defines Empty as “use the current conversation”). On Claude Code, invoking/forge:planningwith no args would make$ARGUMENTSempty and this line would incorrectly instruct treating the user's request text as the arguments instead of honoring the empty-case semantics.
skills/interview/SKILL.md:24 - This fallback line overrides the intended empty-arguments behavior defined immediately below (Empty means “use the current conversation”). If
/forge:interviewis invoked with no args on a harness that does substitute$ARGUMENTSto an empty string, this instruction conflicts with the documented interpretation rules.
skills/building/SKILL.md:26 - This fallback instruction triggers when
$ARGUMENTSis empty, which can happen on harnesses that correctly substitute arguments but are invoked with no args. That can change the skill’s behavior in the empty-args case; the fallback should only apply when$ARGUMENTSwas not substituted (i.e., still appears literally).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| ```yaml | ||
| --- | ||
| name: forge:building |
Comment on lines
+66
to
+68
| - `name` carries the `forge:` namespace so the Claude Code invocation stays | ||
| `/forge:building`. (Exact namespacing for a plugin skill is an open item, see | ||
| below.) |
|
|
||
| ## Global Constraints | ||
|
|
||
| - Never use the em dash symbol (`—`) in any file. Rewrite the sentence. |
| @@ -49,17 +49,17 @@ The other two need: | |||
| - **A way to run your project and observe it from outside.** `/forge:building` resolves an *evaluation surface* up front (`web`, `library`, `cli`, `service`, or `native`) and black-box tests the contract against it. Only `web` needs an extra dependency: a browser automation MCP server, Claude in Chrome or Playwright. | |||
| - **`/code-review`**, invoked by `/forge:building` for the final review of the integrated diff. | |||
| Write the two resolved values to `docs/plans/task1-naming-findings.md`: | ||
| ``` | ||
| SKILL_NAME_PATTERN=<resolved, e.g. building> # yields /forge:building | ||
| SKILL_DIR_PATTERN=forge-<workflow> # or the resolved dir convention |
| SKILL_DIR_PATTERN=forge-<workflow> # or the resolved dir convention | ||
| AUTO_DISCOVERED=<yes|no; if no, note the manifest change needed> | ||
| ``` | ||
| Default to assume if docs are silent: dir `forge-<workflow>`, `name: <workflow>` (plugin namespaces it), auto-discovered. Note explicitly if you had to fall back to the default. |
dasirra
added a commit
that referenced
this pull request
Jul 11, 2026
…eview refs) - Spec: name: building (not the colon-invalid forge:building); correct the namespace explanation (plugin name + dir name supply /forge:, name is metadata matching the dir). - Plan: record the resolved skills/<workflow>/ convention in the Task 1 step (was still showing the pre-Task-1 forge-<workflow> default); reword the em-dash constraint so it does not contain an em dash. - README + pipeline.html: remove the /code-review references; that step was dropped from the pipeline.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Converts forge's three commands into skills so one source tree runs natively on both Claude Code and Pi. A skill is the unit both harnesses understand: on Claude Code a skill is a superset of a command (explicit
/forge:building #3invocation viadisable-model-invocation: true, plus$ARGUMENTS); on Pi, skills are the native unit. This removes the command/skill bridge entirely, no drift.What changed
commands/{interview,planning,building}.md->skills/{interview,planning,building}/SKILL.md. Directory is the bare workflow name so theforgeplugin namespaces invocation to/forge:<name>(verified against Claude Code docs:skills/forge-building/would have wrongly produced/forge:forge-building).name+description+disable-model-invocation: true(explicit-only). Bodies preserved verbatim plus one argument-fallback line for harnesses that do not substitute$ARGUMENTS.package.jsonadded, declaring"pi": { "skills": ["./skills"] }.skills/*/SKILL.md; the depth-relative binding link fixed (../->../../now that files live one level deeper).How it was built
Subagent-driven development: a fresh implementer per task, a spec+quality review after each, and an opus whole-branch review at the end. Two defects the process caught that a straight edit would have shipped:
/forge:forge-buildingdoubling).commands/->skills/move, which the per-task "byte-identical body" gates structurally could not see.Design spec and implementation plan are included under
docs/specs/anddocs/plans/.Not included (deferred, needs live harnesses)
/forge:*invokes explicitly,$ARGUMENTSarrives, no auto-trigger).$ARGUMENTS, and does Pi toleratedisable-model-invocation.Also out of scope: the skill bodies still self-refer as "This command" (byte-identical preserved it), and
README.md/docs/pipeline.htmlstill mention the removed/code-reviewPhase 8.