Skip to content

Convert forge commands to skills (cross-platform)#10

Merged
dasirra merged 12 commits into
building/issue-3from
feature/skills-conversion
Jul 11, 2026
Merged

Convert forge commands to skills (cross-platform)#10
dasirra merged 12 commits into
building/issue-3from
feature/skills-conversion

Conversation

@dasirra

@dasirra dasirra commented Jul 11, 2026

Copy link
Copy Markdown
Owner

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 #3 invocation via disable-model-invocation: true, plus $ARGUMENTS); on Pi, skills are the native unit. This removes the command/skill bridge entirely, no drift.

Stacked on #8. Base branch is building/issue-3, so this diff is only the conversion. Merge #8 first, then retarget this to main (or rebase). This branch's binding-doc versions supersede #8's, which still say "commands."

What changed

  • commands/{interview,planning,building}.md -> skills/{interview,planning,building}/SKILL.md. Directory is the bare workflow name so the forge plugin namespaces invocation to /forge:<name> (verified against Claude Code docs: skills/forge-building/ would have wrongly produced /forge:forge-building).
  • Frontmatter is now name + description + disable-model-invocation: true (explicit-only). Bodies preserved verbatim plus one argument-fallback line for harnesses that do not substitute $ARGUMENTS.
  • package.json added, declaring "pi": { "skills": ["./skills"] }.
  • README/manifest wording: "commands" -> "skills".
  • Binding docs retargeted at 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:

  1. Task 1 (naming verification) caught the wrong directory pattern before any conversion ran (/forge:forge-building doubling).
  2. The final whole-branch review caught the depth-relative binding link breaking on the 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/ and docs/plans/.

Not included (deferred, needs live harnesses)

  • Task 8: Claude Code invocation parity check (/forge:* invokes explicitly, $ARGUMENTS arrives, no auto-trigger).
  • Task 9: Pi validation (install, invoke, confirm binding resolution) which also resolves the last two open items: does Pi pass $ARGUMENTS, and does Pi tolerate disable-model-invocation.

Also out of scope: the skill bodies still self-refer as "This command" (byte-identical preserved it), and README.md/docs/pipeline.html still mention the removed /code-review Phase 8.

dasirra added 12 commits July 11, 2026 14:03
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.
Copilot AI review requested due to automatic review settings July 11, 2026 15:41
@dasirra
dasirra merged commit ccd801d into building/issue-3 Jul 11, 2026
1 check passed
@dasirra
dasirra deleted the feature/skills-conversion branch July 11, 2026 15:45

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.md and add skill frontmatter (name, description, disable-model-invocation: true), plus an $ARGUMENTS fallback 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:planning with no args would make $ARGUMENTS empty 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:interview is invoked with no args on a harness that does substitute $ARGUMENTS to an empty string, this instruction conflicts with the documented interpretation rules.
    skills/building/SKILL.md:26
  • This fallback instruction triggers when $ARGUMENTS is 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 $ARGUMENTS was 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.
Comment thread README.md
@@ -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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants