Make the skill stand alone from any host

What

The skill now installs and runs on its own. Four things in it depended on a tool or path that one host has, and a reader could not follow them.

  • just publish ran an optional posting wrapper when one was on PATH. It now posts through glab alone and asks nothing itself. The approval is the host's, keyed on the draft's host: and project: header.
  • up ran one named desktop notifier and the engine sourced one fixed file under the home directory. They are now SIM_NOTIFY_CMD and SIM_ENV_FILE. Unset, there is no notification and the environment alone applies.
  • contribute.md and filing.md pointed at a voicing skill and at campaign artifacts. The mermaid render check and the 400-word epic spine are written in place.
  • lint-message hard-failed a tool-naming trailer even for a target whose own CONTRIBUTING.md prescribes one, which public-writes.md says that target gets. --allow-tool-trailers skips that one rule.

publish also gains two kinds it lacked, as plain glab calls, and a stricter suggestion batch:

  • work-item-note: looks the item up by path and iid, then creates the note through GraphQL.
  • commit: a Commits API commit. The draft body is the message and the action list is a file the draft records by sha256.
  • suggestions-apply: every id must belong to the draft's MR before anything is sent, and the draft's commit message goes as commit_message.

Diagram

flowchart LR
  D["draft file<br/>host: and project: in the header"] --> H{"host permission prompt<br/>reads the header"}
  H -- "allow or ask" --> P["publish.sh<br/>sha256 check, one request per kind"]
  H -- "deny" --> X["nothing runs"]
  P --> G["glab api"]
  G --> F[("forge")]

Conventions applied

  • ADR-0006 supersedes ADR-0005. docs/adr/README.md: accepted ADRs are immutable, so ADR-0005 changes only its status line. The lab, contrib and publish split and the SIM_PUBLISHED_VIA guard carry over, now grounded in one verb and one destination header. ADR-0005's body keeps its original wording, as the released changelog entries do.
  • A host with no gate posts at once. public-writes.md says so, and says the Approval rule then rests on showing the draft and waiting for the yes. The guard is a convention, not a security boundary, and ADR-0006 says that too.
  • Not ported. publish does not lint a post's text for AI disclosure. lint-message still checks commit messages.
  • Changelog. One entry per change under [Unreleased], a lead sentence plus two (CHANGELOG.md header). Released entries are not edited.
  • Commits. Four, each one change. Signed-off-by:, Changelog: and AI-Assisted: yes per CONTRIBUTING.md, with no tool-naming trailer.
  • A guard against regrowth. tests/run.sh fails if a live file names a tool or fixed secrets path that exists on one host only. The released changelog and ADR-0005 are skipped.
  • No release. The plugin version and the tags are untouched.

Testing

  • just ci passes: lint, the vale gate, commit-trailers, sims-check and word-budget (50981 of 52000).
  • tests/run.sh passes 482 checks. It drives every publish kind against a glab stub that keeps each request body, and proves both branches of SIM_NOTIFY_CMD (set, unset, erroring, missing) and SIM_ENV_FILE (set, unset, naming no file).
  • Refusals are proven: an action file edited after the draft, a suggestion id not on the MR, a missing work item, a GraphQL error and a bad action list.
  • The new publish kinds were not run against a live forge.

Merge request reports

Loading
Loading