Loading
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 publishran an optional posting wrapper when one was onPATH. It now posts throughglabalone and asks nothing itself. The approval is the host's, keyed on the draft'shost:andproject:header.upran one named desktop notifier and the engine sourced one fixed file under the home directory. They are nowSIM_NOTIFY_CMDandSIM_ENV_FILE. Unset, there is no notification and the environment alone applies.contribute.mdandfiling.mdpointed at a voicing skill and at campaign artifacts. The mermaid render check and the 400-word epic spine are written in place.lint-messagehard-failed a tool-naming trailer even for a target whose ownCONTRIBUTING.mdprescribes one, whichpublic-writes.mdsays that target gets.--allow-tool-trailersskips 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 ascommit_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 theSIM_PUBLISHED_VIAguard 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.mdsays 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.
publishdoes not lint a post's text for AI disclosure.lint-messagestill checks commit messages. - Changelog. One entry per change under
[Unreleased], a lead sentence plus two (CHANGELOG.mdheader). Released entries are not edited. - Commits. Four, each one change.
Signed-off-by:,Changelog:andAI-Assisted: yesperCONTRIBUTING.md, with no tool-naming trailer. - A guard against regrowth.
tests/run.shfails 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
versionand the tags are untouched.
Testing
just cipasses: lint, the vale gate,commit-trailers,sims-checkandword-budget(50981 of 52000).tests/run.shpasses 482 checks. It drives every publish kind against aglabstub that keeps each request body, and proves both branches ofSIM_NOTIFY_CMD(set, unset, erroring, missing) andSIM_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.