From 7401e92116fa25130489f5d14fba950ff8fb40f5 Mon Sep 17 00:00:00 2001 From: Steve Cliff Date: Mon, 23 Feb 2026 08:11:28 +0000 Subject: [PATCH] Configured openspec/planka for Windsurf as well as Claude --- .windsurf/skills/kanban/SKILL.md | 227 ++++++++ .../skills/openspec-apply-change/SKILL.md | 156 ++++++ .../skills/openspec-archive-change/SKILL.md | 114 ++++ .../openspec-bulk-archive-change/SKILL.md | 246 ++++++++ .../skills/openspec-continue-change/SKILL.md | 118 ++++ .windsurf/skills/openspec-explore/SKILL.md | 290 ++++++++++ .windsurf/skills/openspec-ff-change/SKILL.md | 101 ++++ .windsurf/skills/openspec-new-change/SKILL.md | 74 +++ .windsurf/skills/openspec-onboard/SKILL.md | 529 ++++++++++++++++++ .windsurf/skills/openspec-sync-specs/SKILL.md | 138 +++++ .../skills/openspec-verify-change/SKILL.md | 168 ++++++ .windsurf/workflows/kanban-sync.md | 45 ++ .windsurf/workflows/opsx-apply.md | 152 +++++ .windsurf/workflows/opsx-archive.md | 157 ++++++ .windsurf/workflows/opsx-bulk-archive.md | 242 ++++++++ .windsurf/workflows/opsx-continue.md | 114 ++++ .windsurf/workflows/opsx-explore.md | 174 ++++++ .windsurf/workflows/opsx-ff.md | 94 ++++ .windsurf/workflows/opsx-new.md | 69 +++ .windsurf/workflows/opsx-onboard.md | 525 +++++++++++++++++ .windsurf/workflows/opsx-sync.md | 134 +++++ .windsurf/workflows/opsx-verify.md | 164 ++++++ 22 files changed, 4031 insertions(+) create mode 100644 .windsurf/skills/kanban/SKILL.md create mode 100644 .windsurf/skills/openspec-apply-change/SKILL.md create mode 100644 .windsurf/skills/openspec-archive-change/SKILL.md create mode 100644 .windsurf/skills/openspec-bulk-archive-change/SKILL.md create mode 100644 .windsurf/skills/openspec-continue-change/SKILL.md create mode 100644 .windsurf/skills/openspec-explore/SKILL.md create mode 100644 .windsurf/skills/openspec-ff-change/SKILL.md create mode 100644 .windsurf/skills/openspec-new-change/SKILL.md create mode 100644 .windsurf/skills/openspec-onboard/SKILL.md create mode 100644 .windsurf/skills/openspec-sync-specs/SKILL.md create mode 100644 .windsurf/skills/openspec-verify-change/SKILL.md create mode 100644 .windsurf/workflows/kanban-sync.md create mode 100644 .windsurf/workflows/opsx-apply.md create mode 100644 .windsurf/workflows/opsx-archive.md create mode 100644 .windsurf/workflows/opsx-bulk-archive.md create mode 100644 .windsurf/workflows/opsx-continue.md create mode 100644 .windsurf/workflows/opsx-explore.md create mode 100644 .windsurf/workflows/opsx-ff.md create mode 100644 .windsurf/workflows/opsx-new.md create mode 100644 .windsurf/workflows/opsx-onboard.md create mode 100644 .windsurf/workflows/opsx-sync.md create mode 100644 .windsurf/workflows/opsx-verify.md diff --git a/.windsurf/skills/kanban/SKILL.md b/.windsurf/skills/kanban/SKILL.md new file mode 100644 index 0000000..6bde882 --- /dev/null +++ b/.windsurf/skills/kanban/SKILL.md @@ -0,0 +1,227 @@ +--- +name: kanban +description: Manage Planka project boards using the pcli CLI. Use when the user wants to interact with Planka boards, cards, lists, tasks, labels, or comments. +--- + +# pcli - Planka CLI + +CLI for the Planka project management API. All commands return JSON by default with envelope `{"data": ..., "error": null}`. Use `jq` to extract fields. + +## Prerequisites + +Ensure environment variables are set: +```bash +export PLANKA_URL="https://planka.example.com" +export PLANKA_API_KEY="your-api-key" +``` + +Ensure `jq` and `pcli` are installed and in the path. + +## Global Flags + +All commands accept: `--format json|table`, `--url `, `--api-key `, `--log-level debug|info|warn|error` + +## Commands + +### Status Overview + +```bash +pcli status +``` + +Returns summary of all boards, lists, and card counts (open/closed per list). + +### Projects + +```bash +pcli project list +pcli project get +``` + +### Boards + +```bash +pcli board list +pcli board get # includes lists and cards +pcli board actions [--limit N] +``` + +### Cards + +```bash +# List (one of --board or --list required, mutually exclusive) +pcli card list --board [--limit N] +pcli card list --list [--limit N] + +# CRUD +pcli card get +pcli card create --list --name "Name" [--description "..."] [--type project|story] [--position N] [--due-date "ISO8601"] [--due-completed] +pcli card update [--name "..."] [--description "..."] [--type ...] [--position N] [--due-date "..."] [--due-completed] +pcli card delete +pcli card duplicate --name "Copy" [--position N] +pcli card move --list [--position N] + +# Members +pcli card assign --user +pcli card unassign --user + +# Labels +pcli card add-label --label +pcli card remove-label --label + +# Actions +pcli card actions [--limit N] +``` + +### Comments + +```bash +pcli comment list --card [--limit N] +pcli comment create --card --text "..." +pcli comment update --text "..." +pcli comment delete +``` + +### Task Lists + +```bash +pcli task-list create --card --name "Checklist" [--position N] [--show-on-front] [--hide-completed] +pcli task-list get +pcli task-list update [--name "..."] [--position N] [--show-on-front] [--hide-completed] +pcli task-list delete +``` + +### Tasks + +```bash +pcli task create --task-list --name "Item" [--position N] [--completed] +pcli task update [--name "..."] [--position N] [--completed] +pcli task delete +``` + +### Lists + +```bash +pcli list create --board --name "List Name" --position 65536 [--type active|closed] +pcli list get +pcli list update [--name "..."] [--position N] [--type active|closed] [--color "..."] [--board ] +pcli list delete +``` + +### Labels + +```bash +pcli label create --board --name "Bug" --color "berry-red" [--position N] +pcli label update [--name "..."] [--color "..."] [--position N] +pcli label delete +``` + +## API Response Structure + +### Board Get Response +Board details include lists directly in `.data.lists[]`, not in an `included` section: +```bash +pcli board get | jq '.data.lists[] | {id, name, position}' +``` + +### Card List Labels +Card list returns labels as **plain strings**, not objects: +```bash +# Labels are strings like "agent", NOT objects like {name: "agent"} +pcli card list --board | jq '.data[] | select(.labels[]? == "agent")' +``` + +### Card Get Response +Card get includes `taskLists` and `tasks` arrays (when they exist): +```bash +pcli card get | jq '.data.taskLists[0].id' +pcli card get | jq '.data.tasks[] | {name, isCompleted}' +``` + +### Finding Boards in a Project +Use `board list --project` to find boards by project name: +```bash +pcli board list --project "" | jq '.data[] | {id, name}' +``` + +## Error Handling + +### Project Configuration +- Always strip quotes from yq output: `yq '.planka.project' project.yaml | tr -d '"'` +- Exit with error if configured project cannot be found or created +- The project name in project.yaml is the authoritative source + +### Idempotent Operations +- Use `2>/dev/null || true` for create operations that should not fail if resources already exist +- Check for empty results before attempting operations: `if [ -z "$PROJECT_ID" ]; then` + +## Extracting IDs from Output + +All responses use `{"data": ..., "error": null}`. Extract IDs with jq: + +```bash +# Single object +pcli card create --list --name "X" | jq -r '.data.id' + +# Array +pcli card list --board | jq -r '.data[].id' + +# With error checking +RESULT=$(pcli project list | jq -r --arg name "$PROJECT_NAME" '.data[] | select(.name == $name) | .id') +if [ -z "$RESULT" ]; then + echo "Not found" +else + echo "Found: $RESULT" +fi +``` + +## Common Workflows + +### Bootstrap Project Infrastructure + +```bash +# Read project configuration +PROJECT_NAME=$(yq '.planka.project' project.yaml | tr -d '"') +BOARD_NAME=$(yq '.planka.board' project.yaml | tr -d '"') + +# Find or create project (exit with error if fails) +PROJECT_ID=$(pcli project list | jq -r --arg name "$PROJECT_NAME" '.data[] | select(.name == $name) | .id') +if [ -z "$PROJECT_ID" ]; then + echo "Error: Project '$PROJECT_NAME' not found and creation failed" + exit 1 +fi + +# Find or create board +BOARD_ID=$(pcli board list --project "$PROJECT_NAME" | jq -r --arg name "$BOARD_NAME" '.data[] | select(.name == $name) | .id') +if [ -z "$BOARD_ID" ]; then + BOARD_ID=$(pcli board create --project $PROJECT_ID --name "$BOARD_NAME" | jq -r '.data.id') +fi + +# Create required lists (skip if exists) +pcli list create --board $BOARD_ID --name "Backlog" --position 65536 2>/dev/null || true +pcli list create --board $BOARD_ID --name "To Do" --position 131072 2>/dev/null || true +pcli list create --board $BOARD_ID --name "Planning" --position 196608 2>/dev/null || true +pcli list create --board $BOARD_ID --name "In Progress" --position 262144 2>/dev/null || true +pcli list create --board $BOARD_ID --name "Review" --position 327680 2>/dev/null || true +pcli list create --board $BOARD_ID --name "Done" --position 393216 2>/dev/null || true + +# Create agent label +pcli label create --board $BOARD_ID --name "agent" --color "berry-red" 2>/dev/null || true +``` + +### Create a card with a checklist + +```bash +CARD_ID=$(pcli card create --list --name "Task" | jq -r '.data.id') +TL_ID=$(pcli task-list create --card $CARD_ID --name "Steps" | jq -r '.data.id') +pcli task create --task-list $TL_ID --name "Step 1" +pcli task create --task-list $TL_ID --name "Step 2" +``` + +### Move all cards between lists + +```bash +pcli card list --list | jq -r '.data[].id' | while read id; do + pcli card move $id --list +done +``` diff --git a/.windsurf/skills/openspec-apply-change/SKILL.md b/.windsurf/skills/openspec-apply-change/SKILL.md new file mode 100644 index 0000000..47d4bc2 --- /dev/null +++ b/.windsurf/skills/openspec-apply-change/SKILL.md @@ -0,0 +1,156 @@ +--- +name: openspec-apply-change +description: Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks. +license: MIT +compatibility: Requires openspec CLI. +metadata: + author: openspec + version: "1.0" + generatedBy: "1.1.1" +--- + +Implement tasks from an OpenSpec change. + +**Input**: Optionally specify a change name. If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. + +**Steps** + +1. **Select the change** + + If a name is provided, use it. Otherwise: + - Infer from conversation context if the user mentioned a change + - Auto-select if only one active change exists + - If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select + + Always announce: "Using change: " and how to override (e.g., `/opsx:apply `). + +2. **Check status to understand the schema** + ```bash + openspec status --change "" --json + ``` + Parse the JSON to understand: + - `schemaName`: The workflow being used (e.g., "spec-driven") + - Which artifact contains the tasks (typically "tasks" for spec-driven, check status for others) + +3. **Get apply instructions** + + ```bash + openspec instructions apply --change "" --json + ``` + + This returns: + - Context file paths (varies by schema - could be proposal/specs/design/tasks or spec/tests/implementation/docs) + - Progress (total, complete, remaining) + - Task list with status + - Dynamic instruction based on current state + + **Handle states:** + - If `state: "blocked"` (missing artifacts): show message, suggest using openspec-continue-change + - If `state: "all_done"`: congratulate, suggest archive + - Otherwise: proceed to implementation + +4. **Read context files** + + Read the files listed in `contextFiles` from the apply instructions output. + The files depend on the schema being used: + - **spec-driven**: proposal, specs, design, tasks + - Other schemas: follow the contextFiles from CLI output + +5. **Show current progress** + + Display: + - Schema being used + - Progress: "N/M tasks complete" + - Remaining tasks overview + - Dynamic instruction from CLI + +6. **Implement tasks (loop until done or blocked)** + + For each pending task: + - Show which task is being worked on + - Make the code changes required + - Keep changes minimal and focused + - Mark task complete in the tasks file: `- [ ]` → `- [x]` + - Continue to next task + + **Pause if:** + - Task is unclear → ask for clarification + - Implementation reveals a design issue → suggest updating artifacts + - Error or blocker encountered → report and wait for guidance + - User interrupts + +7. **On completion or pause, show status** + + Display: + - Tasks completed this session + - Overall progress: "N/M tasks complete" + - If all done: suggest archive + - If paused: explain why and wait for guidance + +**Output During Implementation** + +``` +## Implementing: (schema: ) + +Working on task 3/7: +[...implementation happening...] +✓ Task complete + +Working on task 4/7: +[...implementation happening...] +✓ Task complete +``` + +**Output On Completion** + +``` +## Implementation Complete + +**Change:** +**Schema:** +**Progress:** 7/7 tasks complete ✓ + +### Completed This Session +- [x] Task 1 +- [x] Task 2 +... + +All tasks complete! Ready to archive this change. +``` + +**Output On Pause (Issue Encountered)** + +``` +## Implementation Paused + +**Change:** +**Schema:** +**Progress:** 4/7 tasks complete + +### Issue Encountered + + +**Options:** +1.