Skip to content

feat(#1113): skills overhaul + .agents/ namespace adoption#1136

Merged
nextlevelshit merged 8 commits intomainfrom
feat/1113-skills-and-agents-folder
Apr 18, 2026
Merged

feat(#1113): skills overhaul + .agents/ namespace adoption#1136
nextlevelshit merged 8 commits intomainfrom
feat/1113-skills-and-agents-folder

Conversation

@nextlevelshit
Copy link
Copy Markdown
Collaborator

Summary

Two coupled moves per specs/1113-skills-agents-folder/plan.md:

  1. Drop tessl-coupled skills system. Delete classifier, lockfile, publisher, and the tessl/bmad/openspec/speckit/github/url source adapters. Rebuild wave skills as four minimal subcommands (list/check/add/doctor) that scan the cross-tool detection paths and let each adapter lazy-load via its native skill tool.
  2. Rename .wave/.agents/. Stake the orchestrator subfolder namespace (pipelines/personas/contracts/workspaces/output/artifacts/skills) under the .agents/ standard already used natively by opencode/gemini/codex.

Net delta: ~−7000 LoC (8 internal/skill files + 1000-LoC skills.go + 2 docs guides + 14 tessl test files removed; replaced by ~440 LoC minimal CLI + 100 LoC adapter helper + 4 smoke pipelines).

Pre-1.0 per versioning policy: no migration shim, no back-compat.

Milestone commits

  1. refactor(layout): rename .wave/ → .agents/ for cross-tool convention
  2. refactor(skills): drop singular wave skill alias
  3. refactor(skills): drop tessl/lockfile/publish/classify, rebuild CLI minimal
  4. feat(adapter): native skill provisioning for all 4 adapters
  5. feat(pipeline): step-level skills declaration
  6. test(skills): smoke pipelines + step-level integration tests
  7. docs(skills): rewrite for adapter-native lazy-loading model

Adapter native loading

Adapter Workspace target Native invocation
claude <ws>/.claude/skills/<name>/ Skill tool
opencode <ws>/.agents/skills/<name>/ skill tool
gemini <ws>/.agents/skills/<name>/ activate_skill tool
codex <ws>/.agents/skills/<name>/ /skills command

Shared internal/adapter/ProvisionSkills enforces workspace-scope panic guard, drops .wave-managed sentinel, only removes sentinel-tagged dirs on re-provision (preserves user-committed skills in worktrees).

CLI surface

wave skills list     # scan all detection paths, show name+desc+source+used-by
wave skills check    # validate one skill, show pipelines using it
wave skills add      # install from local path or file:// (+ --project flag)
wave skills doctor   # diagnose duplicates, malformed, deprecated .wave/skills/

Detection: .agents/skills/, .claude/skills/, .opencode/skills/, .gemini/skills/ then ~/.agents/skills/, ~/.claude/skills/, ~/.config/opencode/skills/, ~/.gemini/skills/. First match wins per name.

Pipeline integration

Step-level skills: declaration is now first-class:

```yaml
steps:

  • id: implement
    persona: craftsman
    skills: [golang, gh-cli]
    ```

Preflight aggregates union of pipeline.Skills + steps[].skills, validates each against the discovery store, and emits a hint suggesting wave skills add for any missing reference.

Test plan

  • go build ./... clean
  • go test ./... green (39 packages)
  • wave skills list discovers from .agents/skills/ + ~/.claude/skills/
  • wave skills doctor scans all 8 detection paths, catches real malformed skill
  • wave skills check wave-smoke-test resolves OK
  • wave pipeline list registers all 4 wave-smoke-skills-*
  • wave serve + curl /api/skills → 200 OK on new layout
  • PR-gated mock-adapter test: step.Skills propagates to AdapterRunConfig.ResolvedSkills
  • PR-gated mock-adapter test: missing step skill fails preflight with wave skills add hint
  • PR-gated test: ProvisionSkills panics on workspace-escape; preserves user-committed skills; removes only sentinel-tagged dirs
  • End-to-end real-adapter smoke: wave run wave-smoke-skills-claude (requires ANTHROPIC_API_KEY — deferred, subscription-only)

Out of scope (per plan)

  • Onboarding wizard ecosystem cleanup (drops tessl/bmad/openspec/speckit) — follow-up, current ecosystem entries dead-code but compile-clean
  • wave migrate — not needed (single-user repo, pre-1.0)
  • Upstream RFC at agentsmd/agents.md — file after merge

Closes #1113.
Closes #1118.
Closes #1120.

Stake claim on .agents/ orchestrator subfolder namespace before
competitors. .agents/skills/ already de facto standard via opencode,
gemini, codex. Wave moves first on pipelines/personas/contracts/
workspaces/output/artifacts. Upstream RFC to follow.

Mechanical rename:
- .wave/{pipelines,personas,contracts,skills,docs,prompts,schemas,
  bench/results} via git mv (committed assets)
- .wave/{workspaces,output,artifacts,chat,logs,retros,traces,
  bench/{datasets,workspaces},state.db*,wave.db*} as ignored runtime
- All literals .wave/ → .agents/ across go/md/yaml/yml/json/html/css/js
- .gitignore patterns updated
- Bare ".wave" string literals updated where present

wave.yaml stays at project root. ~/.config/wave/ user-global config
unchanged (not project-level concern). Pre-1.0 per versioning policy:
no migration shim, no back-compat detection.

Refs #1113
All routes go through plural `wave skills` per clig.dev collection convention.
Part of #1113 skills overhaul.
…inimal

Delete tessl/bmad/openspec/speckit/github/url source adapters and the
classifier, lockfile, and publish subsystems they fed. Trim NewDefaultRouter
to file-only (the remaining install path).

Replace `wave skills` (8 subcommands) with the minimal four:
  list    — scan all detection paths, show name+desc+source+used-by
  check   — validate one skill, show resolved path + pipelines using it
  add     — install from local path or file:// URL
            (default ~/.agents/skills/, --project for .agents/skills/)
  doctor  — diagnose duplicates, malformed frontmatter, deprecated .wave/

Detection paths now cover the cross-tool standard:
  project: .agents/skills, .claude/skills, .opencode/skills, .gemini/skills
  user:    ~/.agents/skills, ~/.claude/skills, ~/.config/opencode/skills,
           ~/.gemini/skills

Net delta: cmd/wave/commands/skills.go 1000→440 LoC, internal/skill -2200 LoC.
Part of #1113 skills overhaul.
Wave now provisions resolved skills into the path each adapter natively
scans, so all four agents (claude, opencode, gemini, codex) lazy-load
skills via their built-in skill tool — no Wave-side prompt injection.

Targets per adapter:
- claude   → <workspace>/.claude/skills/<name>/
- opencode → <workspace>/.agents/skills/<name>/
- gemini   → <workspace>/.agents/skills/<name>/
- codex    → <workspace>/.agents/skills/<name>/

Shared helper `internal/adapter/ProvisionSkills` enforces:
- workspace-scope assertion (panic if target resolves outside workspace,
  guards against config tampering or path traversal)
- `.wave-managed` sentinel file written alongside each provisioned skill
- only sentinel-tagged dirs removed on re-provision; user-committed skills
  in worktree checkouts are preserved

Replaces the previous opencode/gemini/codex stderr WARN that skills were
declared but not injected (#1120 closed by this).

Closes #1120. Part of #1113.
Steps may now declare `skills: [name, ...]` to scope skills at the agent
run granularity (in addition to global, persona, and pipeline scopes).
Step-level skills take highest precedence in the resolved skill set and
are provisioned into the adapter workspace at step start.

Preflight aggregates the union of pipeline.Skills and steps[].skills,
validates each against the configured skill store, and emits a hint
suggesting `wave skills add` for any missing reference.

Part of #1113.
Ship four wave-smoke-skills-* pipelines (one per adapter) that exercise
adapter-native skill provisioning end-to-end:
  - wave-smoke-skills-claude   (Skill tool)
  - wave-smoke-skills-opencode (skill tool)
  - wave-smoke-skills-gemini   (activate_skill tool)
  - wave-smoke-skills-codex    (/skills command)

Each declares step-level `skills: [wave-smoke-test]` and instructs the
agent to activate the fixture skill and emit the sentinel string
SMOKE_TEST_OK_4f7a2b1c. Pipelines are nightly/manual — they require
real adapter binaries and API keys.

Add fixture skill .agents/skills/wave-smoke-test/SKILL.md.

PR-gated coverage:
  - TestSkillProvisioningIntegration/step_level_skills_propagate_to_adapter_config
    asserts step.Skills reach AdapterRunConfig.ResolvedSkills via mock adapter.
  - TestSkillProvisioningIntegration/step_level_skills_fail_preflight_when_missing
    asserts preflight fails with `wave skills add` hint when a step references
    an unknown skill.

Part of #1113.
- docs/reference/cli.md: replace `wave skill` (singular) section with the
  new `wave skills` four-subcommand surface (list/check/add/doctor) plus
  detection-path reference.
- docs/guide/skills.md: drop tessl-era install instructions, document
  per-adapter workspace targets, sentinel file behavior, and the new
  step-level `skills:` declaration.
- docs/guide/skill-ecosystems.md: deleted (tessl/bmad/openspec/speckit
  ecosystems removed in this PR).
- docs/guide/skill-configuration.md: deleted (tessl-coupled
  requires.skills install/check schema removed).
- docs/.vitepress/config.ts: prune the deleted guide entries.
- docs/reference/manifest-schema.md: drop `skill_publish_seconds`.
- README.md: collapse two skill-command rows into the single new entry.
- internal/webui/handlers_test.go: refresh fixture from
  `wave skill install` to `wave skills add`.

Part of #1113.
@nextlevelshit nextlevelshit merged commit 139e3ab into main Apr 18, 2026
4 checks passed
@nextlevelshit nextlevelshit deleted the feat/1113-skills-and-agents-folder branch April 18, 2026 01:57
nextlevelshit added a commit that referenced this pull request Apr 18, 2026
PR #1136 renamed the project config dir .wave/ → .agents/ but missed
inline path strings inside pipeline YAML (schema_path, path:, hook
commands, embedded bash heredocs), contract criteria, a docs example,
and the schema_path field on contract blocks across ~80 files.

Symptom: ops-hello-world (and every pipeline using json_schema
contracts) failed with:

  contract validation failed [json_schema]: failed to read schema
  file: .wave/contracts/smoke-review.schema.json
    open .wave/contracts/smoke-review.schema.json: no such file

Fix: bulk sed `\.wave/` → `.agents/` across *.yaml, *.yml, *.json,
*.go, *.md under .agents/pipelines/, .agents/contracts/, internal/,
cmd/, docs/. Excluded .agents/output/ (historical artifacts/logs).

Preserved two intentional `.wave/` mentions in cmd/wave/commands/skills.go
where `wave skills doctor` detects a leftover `.wave/skills/` dir and
reports a migration hint; tests updated accordingly.

Verified: `go test ./...` green.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant