with one click
push
Push skill — draft, preview, push, back-link, audit
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Push skill — draft, preview, push, back-link, audit
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | push |
| description | Push skill — draft, preview, push, back-link, audit |
| risk_class | hard |
| confirm_action | push.create |
Push a wiki task page to an external backend as a new ticket.
$ARGUMENTS — Path to the task page (e.g., wiki/tasks/fix-login-bug.md)
Read the task page specified in $ARGUMENTS. Extract its frontmatter (title, description, tags, status, source) and body content.
If the task already has a backend reference (gh_ref, jira_ref, or asana_ref), warn the user that this task may already exist in the target system.
Read workspace.md frontmatter to get configured backends. If multiple, ask the user which to push to. If only one, use it. If none, stop.
If the workspace has repo_labels configured AND the task references a particular repo (in body or activity log), pre-fill the appropriate repo:<name> label. If the repo association isn't obvious, ask: "What repo does this work live in?" so the right label gets attached.
Use the ticket-writer agent. The agent reads @references/<backend>-ticket-template.md for structure and .claude/voice.md (if present) for tone:
Agent({
subagent_type: "ticket-writer",
prompt: "Draft a <backend-type> ticket from this wiki task page: <task content>"
})
If the draft contains NEEDS_INPUT placeholders (fields the agent couldn't infer), walk the user through each in plain prose:
The draft needs a few details before pushing:
- Priority? (high / med / low)
- Component or area?
Or say "ship it" and I'll push as-is with reasonable defaults.
The "ship it" shortcut accepts whatever defaults the agent picked.
This skill is risk_class: hard. The external write is performed
exclusively via rubber-ducky push, which consumes the confirm-token
internally — there is no way to bypass the gate.
Build the structured preview as plain text:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PUSH PREVIEW
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Backend: <name>
Target: (new ticket)
Title: <title>
Priority: <priority>
Labels: <tags + repo label>
Description:
<first 200 chars>...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Request the token (the CLI surfaces the preview and prompts the user
unless settings.confirm.<backend>.push is auto):
TOKEN=$(rubber-ducky --no-json confirm request \
--action <backend>.push \
--preview "$PREVIEW_TEXT")
If the command exits non-zero, the user declined or the call failed — stop here and tell the user the push did not happen. One confirmation covers the full push (the create call, frontmatter update, and back-link comments). Don't re-ask partway through.
rubber-ducky pushInvoke the CLI verb with the token. The verb consumes the token, calls
the backend, stamps <backend>_ref / pushed / updated on the wiki
task page, and appends the audit-log line. If the token is missing,
expired, or bound to a different action, the verb exits non-zero and
no external call is made — the gate is at the CLI layer, not in this
markdown.
rubber-ducky --json push <task-file> \
--backend <backend> \
--confirm-token "$TOKEN"
Capture the new ref and URL from the JSON response. If the push fails (any non-zero exit), surface the error to the user; do not retry without a fresh token.
rubber-ducky push set <backend>_ref, pushed, and updated
itself. For Jira pushes it also forces jira_needed: yes
regardless of any prior value — the act of pushing settles the
"was Jira needed?" question. No manual frontmatter edits needed.
If the source task originated in one backend (e.g., an Asana intake)
and was just pushed to another (e.g., Jira), post a one-line cross-
reference comment on each side. Each comment is itself a hard write and
needs its own gate — issue a fresh token for each and invoke
rubber-ducky comment:
TOKEN=$(rubber-ducky --no-json confirm request --action <source-backend>.comment --preview "Back-link to $NEW_REF")
rubber-ducky --json comment <source-task-file> \
--backend <source-backend> \
--text "$NEW_URL" \
--confirm-token "$TOKEN"
Repeat for the new side. Comments are URL-only — no commentary.
The push CLI already appended its own [write-back] push → ... line.
You only need to rebuild the index:
rubber-ducky index rebuild
Some backends create new tickets in a default backlog state that doesn't appear on active boards. If you suspect that's happened — the ticket exists but won't be visible to teammates without manual action — surface it as an ASAP item:
rubber-ducky asap add "Move <ref> onto the active board"
Skip this step for backends where new-ticket creation lands the issue on the active view automatically (most GitHub setups).
Capability discovery — the canonical answer to 'what can you do?' and 'what do I say to ...?'
Close skill — draft resolution comment, sync backends, redirect to next task
Start skill — begin task with optional backend sync
End-of-day wrap-up skill — daily summary and status update
Morning brief skill — prioritized daily summary
Reconcile skill — detect wiki/backend drift and let the User resolve it via four moves