Skip to content

feat(workspace): skill publish <name> and a "Publish to workspace" action - #1313

Open
sahrizvi wants to merge 2 commits into
feat/workspace-skill-publishfrom
feat/workspace-skill-publish-command
Open

sahrizvi wants to merge 2 commits into
feat/workspace-skill-publishfrom
feat/workspace-skill-publish-command

Conversation

@sahrizvi

@sahrizvi sahrizvi commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Issue for this PR

Part of #1271 — the surface. #1280 added the publish path; this PR is what invokes it.

Stacked on #1280. Base is feat/workspace-skill-publish, so the diff here is only the command and the dialog action. Retarget to main once #1280 merges.

Type of change

  • New feature

What does this PR do?

Two ways to publish a locally authored skill to the linked workspace, saying the same things.

altimate-code skill publish <name> — resolves the skill the way skill test does, refuses a built-in (there is no directory to bundle; the workspace-owned snapshot is refused by publishSkill itself), and prints one line on success. Every deliberate refusal is printed as-is, because each already says what to do next:

$ altimate-code skill publish hello
This project is not linked to a workspace. Run `altimate-code link` first.

"Publish to workspace" in the Skills dialog's per-skill action picker, next to Show / Edit / Test / Remove. This is the discoverability half: the UAT report was that a participant could not tell whether publishing from the CLI was possible at all. A row that anyone who opens a skill will see answers that; a row under /workspace would only be found by someone already thinking about workspaces — and the verb needs a skill name, which that menu does not have. Disabled for built-ins and for skills the workspace sent us, the same way Remove is disabled for built-ins.

Deliberately not done: auto-publishing from skill create. A freshly scaffolded skill is a stub, publish should be an explicit "this is ready for the team" act, and create works on unlinked projects where publish cannot.

describePublish / explainPublishError in skill-publish.ts give both surfaces one vocabulary; a skill_published telemetry event records the outcome alongside the existing skill_created / skill_installed / skill_removed.

How did you verify your code works?

  • 538 pass across test/altimate/workspace, test/altimate/plugin, the install classifier and the fork-feature guards; typecheck clean.
  • New tests pin the shared wording and that a deliberate error passes through while an unexpected one does not.
  • skill publish smoke-run from source on an unlinked project (prints the not-linked line) and on a missing skill (prints the not-found line); skill --help lists the subcommand.

Screenshots / recordings

Not a visual change beyond one new row in an existing picker.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

🤖 Generated with Claude Code

https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6


Summary by cubic

Adds a skill publish <name> CLI command and a "Publish to workspace" action in the Skills dialog's per-skill picker, so locally authored skills can be uploaded to the linked workspace. Previously the publish path existed but nothing invoked it. Built-in skills are refused in both surfaces, and the dialog also disables publishing for skills the workspace sent us. Both surfaces share one wording via describePublish and explainPublishError, and a skill_published telemetry event records the outcome from both the CLI and the TUI.

Written for commit 30ba5c3. Summary will update on new commits.

Review in cubic

…action

The publish path from the previous PR had no surface: nothing invoked it,
so a locally authored skill still had no route to the workspace, and the
CLI still did not say whether one existed.

- `altimate-code skill publish <name>` resolves the skill the way `skill
  test` does, refuses a built-in (no directory to bundle), and prints one
  line on success. Every deliberate refusal — not linked, workspace-owned,
  binary or linked file, empty, too large, name taken elsewhere, uploaded
  but not attached — is printed as-is, since each already says what to do.
- The Skills dialog gains "Publish to workspace" in the per-skill action
  picker, next to Show / Edit / Test / Remove — where a user who wonders
  whether publishing is possible will see it. Disabled for built-ins and
  for skills the workspace sent us.
- `describePublish` and `explainPublishError` give both surfaces the same
  words, and a `skill_published` telemetry event records the outcome.

Verified: 538 pass across the workspace + plugin suites and the fork
guards, typecheck clean; `skill publish` smoke-run on an unlinked project
and on a missing skill prints the intended line for each.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6

@claude claude Bot 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.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.

Tip: disable this comment in your organization's Code Review settings.

@coderabbitai

coderabbitai Bot commented Sep 15, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: cab31e5f-6f43-4725-be49-ab886b6d2d52

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@kilo-code-bot

kilo-code-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown

Code Review Summary

This review did not run. Your provider API key hit its rate limit, so the
request was rejected before the review started. Kilo does not retry
automatically, because the quota is your provider's; push a new commit once it
resets. Any inline comments below are from an earlier review.

Previous Review Summary

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review

This review did not run. Your provider API key hit its rate limit, so the
request was rejected before the review started. Kilo does not retry
automatically, because the quota is your provider's; push a new commit once it
resets. Any inline comments below are from an earlier review.

@cubic-dev-ai cubic-dev-ai Bot 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.

All reported issues were addressed across 5 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread packages/opencode/src/plugin/tui/altimate/skill-ops.tsx Outdated
Comment thread packages/opencode/src/plugin/tui/altimate/skill-ops.tsx
Comment thread packages/opencode/src/cli/cmd/skill.ts Outdated
…nst the project directory, record TUI publishes

- `skill publish` classifies built-ins through `skillSource`, which also
  knows the `~/.altimate/builtin` install; the prefix check let those
  through as absolute paths.
- The TUI action checks the managed snapshot against, and publishes from,
  `api.state.path.directory` — where the binding and the snapshot live —
  rather than the git root, which differs in a worktree subdirectory.
- A TUI publish records the same `skill_published` event as the CLI, with
  `source: "tui"`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant