@brainervirus/workit-cursor 0.8.9 → 0.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor-plugin/plugin.json +1 -1
- package/README.md +2 -2
- package/assets/templates/execution-contract.md +18 -18
- package/assets/templates/plan-template.md +1 -1
- package/assets/templates/spec-template.md +2 -2
- package/assets/templates/superpowers-doc-contract.md +10 -10
- package/dist/cursor-session-start.js +6 -6
- package/dist/mcp-server.js +52 -52
- package/package.json +2 -2
- package/rules/ask-question-only.mdc +1 -1
- package/rules/cursor-todowrite.mdc +2 -2
- package/rules/no-worktrees.mdc +3 -3
- package/rules/sdd-docs-path.mdc +3 -3
- package/skills/wk-changelog/SKILL.md +5 -5
- package/skills/wk-commit/SKILL.md +3 -3
- package/skills/wk-docs-refresh/SKILL.md +3 -3
- package/skills/wk-handoff/SKILL.md +6 -6
- package/skills/wk-implement/SKILL.md +9 -9
- package/skills/wk-issue-update/SKILL.md +9 -9
- package/skills/wk-issue-update/references/youtrack-update-style.md +1 -1
- package/skills/wk-meetings/SKILL.md +4 -4
- package/skills/wk-pr/SKILL.md +7 -7
- package/skills/wk-release-notes/SKILL.md +3 -3
- package/skills/wk-status/SKILL.md +1 -1
- package/skills/wk-verify/SKILL.md +3 -3
- package/vendor/superpowers/skills/subagent-driven-development/SKILL.md +4 -4
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ npx @brainervirus/workit-cli init
|
|
|
40
40
|
|
|
41
41
|
## What it provides
|
|
42
42
|
|
|
43
|
-
- MCP server exposing the `
|
|
43
|
+
- MCP server exposing the `workit_*` tools (branch setup, PR create/context, docs validate/promote, YouTrack post/log/time, templates, rules, presentation, doctor, handoff, and plan lifecycle `workit_plan_pause`/`resume`/`complete`).
|
|
44
44
|
- Session-start contract hook.
|
|
45
45
|
- 4 rules and 12 `wk-*` skills (plus 14 sanitized Superpowers skills).
|
|
46
46
|
|
|
@@ -98,7 +98,7 @@ The repository root carries `.cursor-plugin/marketplace.json`, indexing `package
|
|
|
98
98
|
- **Installing from Marketplace** — a Marketplace admin adds the repository URL through Cursor's authenticated publisher flow; end users then install the plugin from the Cursor Marketplace UI, which reads `.cursor-plugin/plugin.json` and the tracked components directly from Git.
|
|
99
99
|
- **Submission** — Marketplace submission is a separate, later authenticated action at `https://cursor.com/marketplace/publish`. It is **not** performed here and no publication or acceptance is claimed; the repository is kept validated and submission-ready.
|
|
100
100
|
- **Update review** — Git plugin metadata (manifest, rules, skills, assets) is reviewed by Cursor on Marketplace updates, while the npm runtime runs from `@latest` with `--prefer-online`. The selector is shared across `mcp.json`, `hooks-cursor.json`, and `run-cursor-mcp.sh`, and a stale `latest` resolution is prevented by the mandatory `--prefer-online` flag.
|
|
101
|
-
- **Troubleshooting** — `workit doctor` (or the `
|
|
101
|
+
- **Troubleshooting** — `workit doctor` (or the `workit_doctor` tool) reports installation health including runtime, token, VCS/YouTrack, and log-writability checks; it exits nonzero on failure. An MCP/hook startup failure with no network is an `npx`/registry reachability issue, not a Workit defect.
|
|
102
102
|
|
|
103
103
|
## Auto-load repair
|
|
104
104
|
|
|
@@ -20,48 +20,48 @@ This session is a handoff destination for a continued plan. The originating sess
|
|
|
20
20
|
## Hard gates
|
|
21
21
|
|
|
22
22
|
- The parent is coordinator-only: it does not edit product code or perform delegated exploration.
|
|
23
|
-
- Never use a worktree. Branch changes are in-place through `
|
|
24
|
-
- Working state, briefs, ledgers, and review diffs live only under gitignored `<SDD_DIR>` in `docs/<slug>/sdd/` and use `
|
|
23
|
+
- Never use a worktree. Branch changes are in-place through `workit_branch_setup` on `feature/*` or `bugfix/*`; never commit on protected branches.
|
|
24
|
+
- Working state, briefs, ledgers, and review diffs live only under gitignored `<SDD_DIR>` in `docs/<slug>/sdd/` and use `workit_sdd_*` tools.
|
|
25
25
|
- Use native `todowrite` for visible task state as well as the gitignored ledger.
|
|
26
26
|
- Use native `question` for branch/stash choices and guarded external mutations; call mutation tools only after approval with `confirmed: true` (grounded in the recorded NativeChoiceEvidence).
|
|
27
|
-
- Flow-tool confirmations are never agent-typed booleans and never caller-supplied evidence objects: on OpenCode the plugin records the user's native-`question` answer as a host-observed one-use receipt (`attested: true`, `callID`, `selectedLabel`, `recordedAt`) consumed by `
|
|
28
|
-
- Delegated authority is direct-child-only: a worker is the session whose host `parentID` exactly equals the activating coordinator's recorded `coordinator_session_id`; missing, mismatched, or multi-owner lineage fails closed with `delegation_lineage_denied`, and nested `opencode` launches are denied during active delegated work. An authorized child receives only the compact worker contract (execute the supplied brief, follow TDD, land one contiguous non-empty commit range, report results) — never coordinator guidance, `wk-implement`, or ledger management; coordinator bookkeeping via `
|
|
29
|
-
- On Cursor, for every repository-scoped `
|
|
27
|
+
- Flow-tool confirmations are never agent-typed booleans and never caller-supplied evidence objects: on OpenCode the plugin records the user's native-`question` answer as a host-observed one-use receipt (`attested: true`, `callID`, `selectedLabel`, `recordedAt`) consumed by `workit_spec_approve` / `workit_plan_approve` / `workit_plan_menu` — no evidence argument exists, and delegated worker status comes from host session parentage (`parentID`), never a caller `role` field. On Cursor, confirmations are policy-only (`attested: false`) and subagent-driven execution is rejected as unsupported.
|
|
28
|
+
- Delegated authority is direct-child-only: a worker is the session whose host `parentID` exactly equals the activating coordinator's recorded `coordinator_session_id`; missing, mismatched, or multi-owner lineage fails closed with `delegation_lineage_denied`, and nested `opencode` launches are denied during active delegated work. An authorized child receives only the compact worker contract (execute the supplied brief, follow TDD, land one contiguous non-empty commit range, report results) — never coordinator guidance, `wk-implement`, or ledger management; coordinator bookkeeping via `workit_sdd_*` stays with the coordinator session.
|
|
29
|
+
- On Cursor, for every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
30
30
|
- Use native `task` with only the built-in `explore` and `general` agents.
|
|
31
31
|
|
|
32
32
|
## Flow gates (HARD)
|
|
33
33
|
|
|
34
34
|
- `wk-implement` refuses to run unless the plan is `approved` (flow.json) and the post-plan menu was presented.
|
|
35
35
|
- `wk-handoff` refuses to run unless both spec and plan are `approved`.
|
|
36
|
-
- Sequence is enforced by tools: `
|
|
36
|
+
- Sequence is enforced by tools: `workit_spec_approve`, `workit_plan_approve`, `workit_plan_menu` — never skip a step (the spec/plan self-review runs automatically inside the transition; only the final approval asks for your confirmation).
|
|
37
37
|
|
|
38
38
|
## Setup
|
|
39
39
|
|
|
40
|
-
0. Call `
|
|
41
|
-
1. Call `
|
|
42
|
-
2. Call `
|
|
40
|
+
0. Call `workit_docs_validate` with the linked spec/plan paths. Hard-fail on any error before todos or branch setup.
|
|
41
|
+
1. Call `workit_sdd_context` with `<PLAN_PATH>` and initialize `todowrite` from returned tasks.
|
|
42
|
+
2. Call `workit_plan_tasks`; cache each top-level task's `section_text`.
|
|
43
43
|
3. Mark IDs in `completed_task_ids` completed and never redispatch them.
|
|
44
|
-
4. Call `
|
|
44
|
+
4. Call `workit_resolve_branch`, then show the current branch, target branch, and stash behavior before any in-place checkout/setup mutation.
|
|
45
45
|
5. Always use `question`: for a clean tree ask whether to proceed or cancel; for a dirty tree add the stash choice and describe what will be stashed.
|
|
46
|
-
6. Call `
|
|
46
|
+
6. Call `workit_branch_setup` with `confirmed: true` only after approval.
|
|
47
47
|
|
|
48
48
|
## Remaining-task loop
|
|
49
49
|
|
|
50
50
|
For each top-level task absent from `completed_task_ids`:
|
|
51
51
|
|
|
52
52
|
1. Mark it `in_progress` with `todowrite`.
|
|
53
|
-
2. Create a working-state brief with `
|
|
53
|
+
2. Create a working-state brief with `workit_sdd_task_brief` and `confirmed: true`.
|
|
54
54
|
3. Delegate read-only discovery, when needed, to an `explore` agent. Delegate implementation to a fresh `general` agent. Product changes follow TDD.
|
|
55
|
-
4. Create a working-state diff with `
|
|
55
|
+
4. Create a working-state diff with `workit_sdd_review_package` and `confirmed: true`.
|
|
56
56
|
5. Delegate spec-compliance review and code-quality review to separate `general` agents.
|
|
57
|
-
6. **Blocking** findings (Critical, Important, or spec-compliance) may trigger at most **two** fix+re-review rounds per task. **Advisory** findings (Minor, style, YAGNI, taste) never pause the loop — append them with `
|
|
58
|
-
7. Append the validated ledger entry with `
|
|
57
|
+
6. **Blocking** findings (Critical, Important, or spec-compliance) may trigger at most **two** fix+re-review rounds per task. **Advisory** findings (Minor, style, YAGNI, taste) never pause the loop — append them with `workit_sdd_append_advisory` (`--task <id> --text <text>`, `confirmed: true`) instead of an unrestricted file edit.
|
|
58
|
+
7. Append the validated ledger entry with `workit_sdd_append_progress` and `confirmed: true`; mark the todo completed.
|
|
59
59
|
|
|
60
60
|
## Final gate
|
|
61
61
|
|
|
62
|
-
Run a separate full-branch code review, then `
|
|
62
|
+
Run a separate full-branch code review, then `workit_verify`. Present the full `<SDD_DIR>/advisories.md` roll-up once, then use native `question` so the user can choose which advisory items to fix, discuss, or discard. Report exact check results and never infer success. Use `workit_git_context` for a commit preview and load `wk-commit` through `skill` for an approved commit. If working state contains a stash reference, preview reapplication through `question`, then call `workit_branch_setup` with `confirmed: true` after approval.
|
|
63
63
|
|
|
64
|
-
**Mandatory:** end the run by calling `
|
|
64
|
+
**Mandatory:** end the run by calling `workit_plan_complete` (OpenCode/Cursor) or the CLI `workit flow complete` (CLI host) after the final task once the SDD ledger is complete (all task IDs appended) and `workit_verify` passes — a complete ledger and green verification are the tool's gates. Never finish the run while the plan is still `active`.
|
|
65
65
|
|
|
66
66
|
## Task order
|
|
67
67
|
|
|
@@ -70,4 +70,4 @@ Run a separate full-branch code review, then `workflow_verify`. Present the full
|
|
|
70
70
|
## Quality gate (HARD)
|
|
71
71
|
|
|
72
72
|
- Specs/plans are written from `templates/spec-template.md` / `templates/plan-template.md`.
|
|
73
|
-
- After `
|
|
73
|
+
- After `workit_docs_validate`, surface `quality` findings (spec scan). Hard findings (missing required section, missing CA-XX) block task start unless the user explicitly waives them. Warnings are advisory.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
## Global Constraints
|
|
11
11
|
|
|
12
12
|
- Each task lands exactly one contiguous non-empty commit range (`base..head`): fix rounds append commits to that range and never rewrite/amend an active review range; each progress line records the task's real base..head shas.
|
|
13
|
-
- The final task ends execution with `
|
|
13
|
+
- The final task ends execution with `workit_plan_complete` (or the CLI `workit flow complete`) once the SDD ledger is complete and repository verification passes — a run never finishes while the plan is still `active`.
|
|
14
14
|
- <project-wide requirements, one line each>
|
|
15
15
|
|
|
16
16
|
---
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
|
|
17
17
|
## Architecture
|
|
18
18
|
|
|
19
|
-
<!-- REQUIRED if this spec has flows or architecture: render a mermaid diagram (
|
|
19
|
+
<!-- REQUIRED if this spec has flows or architecture: render a mermaid diagram (workit_present_flow). -->
|
|
20
20
|
```mermaid
|
|
21
21
|
flowchart TD
|
|
22
22
|
A[Start] --> B[Step]
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
<!-- REQUIRED if this spec touches UI: render an ASCII wireframe (
|
|
25
|
+
<!-- REQUIRED if this spec touches UI: render an ASCII wireframe (workit_present_ascii). -->
|
|
26
26
|
```text
|
|
27
27
|
┌──────────────┐
|
|
28
28
|
│ Header │
|
|
@@ -27,31 +27,31 @@ Plans require:
|
|
|
27
27
|
|
|
28
28
|
`bugfix/<slug>` is also valid. Never use `main`, `develop`, `master`, or `prod`. Use plain backtick paths. Top-level headings are exactly `### Task N: Title`; steps use `- [ ] **Step N:** ...`; task headings never appear inside fences.
|
|
29
29
|
|
|
30
|
-
Before writing **Branch:** into a new spec or plan, call `
|
|
30
|
+
Before writing **Branch:** into a new spec or plan, call `workit_docs_branch` and write the returned `branch` verbatim. When `action` is `keep`, use the current feature/bugfix branch. When `action` is `create_from_develop` or `create_from_base`, create the branch only through `workit_branch_setup`; it uses the configured workspace/global target branch.
|
|
31
31
|
|
|
32
32
|
## Execution and handoff
|
|
33
33
|
|
|
34
34
|
- Implementation uses `wk-implement` and subagent-driven development, with native `todowrite` and `task`.
|
|
35
35
|
- Commits use `wk-commit` after its native `question` confirmation.
|
|
36
|
-
- Continuation uses `wk-handoff`, whose `
|
|
37
|
-
- Never use worktrees. Resolve the declared branch with `
|
|
38
|
-
- Flow-tool confirmations are never agent-typed booleans and never caller-supplied evidence objects: on OpenCode the plugin records the user's native-`question` answer as a host-observed one-use receipt (`attested: true`, `callID`, `selectedLabel`, `recordedAt`) consumed by `
|
|
39
|
-
- Keep all SDD state under the gitignored `docs/<slug>/sdd/`; use `
|
|
40
|
-
- After implementation, use `question` before an approved stash reapply through `
|
|
36
|
+
- Continuation uses `wk-handoff`, whose `workit_handoff_session` creates and seeds the OpenCode session automatically.
|
|
37
|
+
- Never use worktrees. Resolve the declared branch with `workit_resolve_branch`, preview dirty-tree stash choices with `question`, and apply an approved in-place checkout through `workit_branch_setup` with `confirmed: true` (grounded in the recorded NativeChoiceEvidence).
|
|
38
|
+
- Flow-tool confirmations are never agent-typed booleans and never caller-supplied evidence objects: on OpenCode the plugin records the user's native-`question` answer as a host-observed one-use receipt (`attested: true`, `callID`, `selectedLabel`, `recordedAt`) consumed by `workit_spec_approve` / `workit_plan_approve` / `workit_plan_menu` — no evidence argument exists, and delegated worker status comes from host session parentage (`parentID`), never a caller `role` field. On Cursor, confirmations are policy-only (`attested: false`) and subagent-driven execution is rejected as unsupported.
|
|
39
|
+
- Keep all SDD state under the gitignored `docs/<slug>/sdd/`; use `workit_sdd_context` and the registered `workit_sdd_*` tools.
|
|
40
|
+
- After implementation, use `question` before an approved stash reapply through `workit_branch_setup` with `confirmed: true`.
|
|
41
41
|
|
|
42
42
|
## YouTrack content
|
|
43
43
|
|
|
44
|
-
Chat follows the user's language. YouTrack task comments are Spanish (`es-CL`) and use `
|
|
44
|
+
Chat follows the user's language. YouTrack task comments are Spanish (`es-CL`) and use `workit_youtrack_draft` followed by reviewed `workit_youtrack_post` with `confirmed: true`. Preserve the user's paragraph voice; do not inject commits, file paths, or robotic bullet reports.
|
|
45
45
|
|
|
46
46
|
## Final self-check
|
|
47
47
|
|
|
48
|
-
Before handoff, call `
|
|
48
|
+
Before handoff, call `workit_docs_validate` on the linked spec/plan pair. Hard-fail on any error; never offer execution when validation fails.
|
|
49
49
|
|
|
50
50
|
Before handoff, verify the saved spec path, plan path, declared branch, top-level task numbering, and workflow-managed SDD directory through the registered read-only workflow tools. Report structured failures; never infer success.
|
|
51
51
|
|
|
52
52
|
## Post-plan execution choice
|
|
53
53
|
|
|
54
|
-
After saving a plan, call `
|
|
54
|
+
After saving a plan, call `workit_docs_validate` on the spec/plan pair. On failure, stop and fix docs — do not offer execution.
|
|
55
55
|
|
|
56
56
|
On success, use native `question` / Cursor `AskQuestion` with exactly these options (no stay, no A/B/C prose duplicate):
|
|
57
57
|
|
|
@@ -62,7 +62,7 @@ On success, use native `question` / Cursor `AskQuestion` with exactly these opti
|
|
|
62
62
|
5. Review plan first
|
|
63
63
|
6. Change model first
|
|
64
64
|
|
|
65
|
-
`Change model first` is display-only deferral: it ends the turn without calling `
|
|
65
|
+
`Change model first` is display-only deferral: it ends the turn without calling `workit_plan_menu` and re-presents the menu on the next turn. Every other choice must call `workit_plan_menu` immediately after the answer and before any skill, branch question, mutation, or handoff.
|
|
66
66
|
|
|
67
67
|
Never emit Superpowers text beginning “Two execution options”.
|
|
68
68
|
|
|
@@ -322,14 +322,14 @@ var REMINDER_TEXT = `<workflow-contract-reminder>
|
|
|
322
322
|
- Bounded user choices → call the native \`question\` tool (never A/B/C or 1/2/3 lists in prose).
|
|
323
323
|
- After a plan is approved → native \`question\` menu with exactly: ${SOURCE_MENU_LABELS_DISPLAY.join(", ")}.
|
|
324
324
|
- Tools with \`confirmed\` → call them; never fabricate their result.
|
|
325
|
-
- Before the first \`
|
|
325
|
+
- Before the first \`workit_spec_approve\`/\`workit_plan_approve\` (self-review) run the superpowers writing-plans Self-Review checklist: spec coverage (every spec requirement maps to a task), placeholder scan, type consistency; fix findings inline.
|
|
326
326
|
- Delivering docs → clickable markdown link \`[spec.md](docs/<slug>/spec.md)\` + 3-5 bullet summary.
|
|
327
327
|
</workflow-contract-reminder>`;
|
|
328
328
|
var DESTINATION_REMINDER_TEXT = `<workflow-contract-reminder>
|
|
329
329
|
- Bounded user choices → call the native \`question\` tool (never A/B/C or 1/2/3 lists in prose).
|
|
330
330
|
- This session is a handoff destination: present the post-plan menu with exactly: ${DESTINATION_MENU_LABELS.join(", ")}.
|
|
331
331
|
- Tools with \`confirmed\` → call them; never fabricate their result.
|
|
332
|
-
- Before the first \`
|
|
332
|
+
- Before the first \`workit_spec_approve\`/\`workit_plan_approve\` (self-review) run the superpowers writing-plans Self-Review checklist: spec coverage (every spec requirement maps to a task), placeholder scan, type consistency; fix findings inline.
|
|
333
333
|
- Delivering docs → clickable markdown link \`[spec.md](docs/<slug>/spec.md)\` + 3-5 bullet summary.
|
|
334
334
|
${HANDOFF_DESTINATION_MARKER}
|
|
335
335
|
</workflow-contract-reminder>`;
|
|
@@ -416,19 +416,19 @@ HARD-GATE: Any user choice with options → call Cursor AskQuestion directly wit
|
|
|
416
416
|
</workit-askquestion-hard-gate>
|
|
417
417
|
|
|
418
418
|
<workit-visual-companion>
|
|
419
|
-
HARD-GATE: NEVER offer Superpowers visual companion or open a browser tab. For UI wireframes use
|
|
419
|
+
HARD-GATE: NEVER offer Superpowers visual companion or open a browser tab. For UI wireframes use workit_present_ascii; for flows use workit_present_flow. Overrides Superpowers brainstorming visual companion offer.
|
|
420
420
|
</workit-visual-companion>
|
|
421
421
|
|
|
422
422
|
<workit-no-worktrees>
|
|
423
|
-
HARD-GATE: NEVER using-git-worktrees or git worktree. In-place feature/* or bugfix/* checkout only via
|
|
423
|
+
HARD-GATE: NEVER using-git-worktrees or git worktree. In-place feature/* or bugfix/* checkout only via workit_resolve_branch + workit_branch_setup. Dirty tree → native AskQuestion before checkout.
|
|
424
424
|
</workit-no-worktrees>
|
|
425
425
|
|
|
426
426
|
<workit-sdd-path>
|
|
427
|
-
HARD-GATE: NEVER .superpowers/sdd. ALWAYS
|
|
427
|
+
HARD-GATE: NEVER .superpowers/sdd. ALWAYS workit_sdd_context with plan_path first — resolves canonical docs/<slug>/sdd/ and creates nothing (no empty ledger; progress.md appears only on the first confirmed append). workit_sdd_task_brief, workit_sdd_review_package, workit_sdd_append_progress only.
|
|
428
428
|
</workit-sdd-path>
|
|
429
429
|
|
|
430
430
|
<workit-todowrite>
|
|
431
|
-
HARD-GATE: After
|
|
431
|
+
HARD-GATE: After workit_sdd_context, call Cursor TodoWrite with returned todos (merge: false). SDD ledger is persistence — TodoWrite is the native task list UI. Keep in_progress/completed in sync each task.
|
|
432
432
|
</workit-todowrite>
|
|
433
433
|
|
|
434
434
|
<workit-superpowers-doc-contract>
|
package/dist/mcp-server.js
CHANGED
|
@@ -20868,7 +20868,7 @@ var resolveBranchPolicyFor = (workspaceRoot) => resolveBranchPolicy(readConfig()
|
|
|
20868
20868
|
if (dirty) {
|
|
20869
20869
|
if (stash !== "yes") {
|
|
20870
20870
|
return {
|
|
20871
|
-
error: "dirty working tree — ask with native question, then call
|
|
20871
|
+
error: "dirty working tree — ask with native question, then call workit_branch_setup with stash=yes"
|
|
20872
20872
|
};
|
|
20873
20873
|
}
|
|
20874
20874
|
try {
|
|
@@ -21621,7 +21621,7 @@ var runGit = (cwd, args) => {
|
|
|
21621
21621
|
- Entries should be human-readable and user-facing.
|
|
21622
21622
|
- Do not use raw commit messages as changelog bullets.
|
|
21623
21623
|
- MERGE into existing ### Category under [Unreleased] — never append a second ### Added / ### Fixed block.
|
|
21624
|
-
- Apply with the native
|
|
21624
|
+
- Apply with the native workit_changelog_apply tool only (not hand-edits under Unreleased).
|
|
21625
21625
|
- If Unreleased already has duplicate category headings, normalize_only first.`;
|
|
21626
21626
|
var init_repo_context = __esm(() => {
|
|
21627
21627
|
init_vcs_config();
|
|
@@ -24182,7 +24182,7 @@ function sddContext({
|
|
|
24182
24182
|
task_count,
|
|
24183
24183
|
flow: { spec: flow.spec, plan: flow.plan, menu: flow.menu },
|
|
24184
24184
|
todowrite_required: true,
|
|
24185
|
-
todowrite_hint: "REQUIRED: Call OpenCode todowrite with todos from this result so the native task list shows progress. Before each task set status in_progress; after
|
|
24185
|
+
todowrite_hint: "REQUIRED: Call OpenCode todowrite with todos from this result so the native task list shows progress. Before each task set status in_progress; after workit_sdd_append_progress set it completed."
|
|
24186
24186
|
};
|
|
24187
24187
|
}
|
|
24188
24188
|
function sddTaskBrief({
|
|
@@ -24636,7 +24636,7 @@ var COORDINATOR_RECOVERY_TEXT, CURSOR_SUBAGENT_UNSUPPORTED_TEXT, MENU_CHOICES, e
|
|
|
24636
24636
|
const file = flowPath(root, slug);
|
|
24637
24637
|
const rel = path20.posix.join("docs", slug, "sdd", "flow.json");
|
|
24638
24638
|
if (!existsSync12(file)) {
|
|
24639
|
-
return err2("flow_not_activated", `flow not activated for ${slug} — run
|
|
24639
|
+
return err2("flow_not_activated", `flow not activated for ${slug} — run workit_flow_status first`);
|
|
24640
24640
|
}
|
|
24641
24641
|
let text;
|
|
24642
24642
|
try {
|
|
@@ -25397,13 +25397,13 @@ var COORDINATOR_RECOVERY_TEXT, CURSOR_SUBAGENT_UNSUPPORTED_TEXT, MENU_CHOICES, e
|
|
|
25397
25397
|
return effective;
|
|
25398
25398
|
const state = effective.state;
|
|
25399
25399
|
if (state.spec.status !== "approved") {
|
|
25400
|
-
return err2("spec_not_approved", `spec not approved (status: ${state.spec.status}). Run
|
|
25400
|
+
return err2("spec_not_approved", `spec not approved (status: ${state.spec.status}). Run workit_spec_approve after the user's approval.`);
|
|
25401
25401
|
}
|
|
25402
25402
|
if (state.plan.status !== "approved") {
|
|
25403
|
-
return err2("plan_not_approved", `plan not approved (status: ${state.plan.status}). Run
|
|
25403
|
+
return err2("plan_not_approved", `plan not approved (status: ${state.plan.status}). Run workit_plan_approve after the user's approval.`);
|
|
25404
25404
|
}
|
|
25405
25405
|
if (opts.requireMenu && !state.menu.presented) {
|
|
25406
|
-
return err2("menu_not_presented", "post-plan menu not presented. Record the native question answer with
|
|
25406
|
+
return err2("menu_not_presented", "post-plan menu not presented. Record the native question answer with workit_plan_menu.");
|
|
25407
25407
|
}
|
|
25408
25408
|
if (opts.requireDocs) {
|
|
25409
25409
|
const validated = docsValidate({
|
|
@@ -26054,7 +26054,7 @@ var configPath = () => process.env.WORKFLOW_DOCS_REPO_CONFIG ?? path22.join(conf
|
|
|
26054
26054
|
const workspaceRootCanonical = resolved.layout.workspace;
|
|
26055
26055
|
const repoPath = docsRepoPath();
|
|
26056
26056
|
if (!repoPath)
|
|
26057
|
-
return { ok: false, error: "docs repo not linked — run
|
|
26057
|
+
return { ok: false, error: "docs repo not linked — run workit_docs_repo_link" };
|
|
26058
26058
|
const repoValid = validateDocsRepo(repoPath);
|
|
26059
26059
|
if (!repoValid.ok)
|
|
26060
26060
|
return { ok: false, error: repoValid.error };
|
|
@@ -26985,7 +26985,7 @@ async function postUpdate({
|
|
|
26985
26985
|
postedComment: true,
|
|
26986
26986
|
loggedMinutes: 0,
|
|
26987
26987
|
error: time3.error,
|
|
26988
|
-
retry: "
|
|
26988
|
+
retry: "workit_youtrack_log_time"
|
|
26989
26989
|
};
|
|
26990
26990
|
}
|
|
26991
26991
|
return { ok: true, issueId, postedComment: true, loggedMinutes: minutes };
|
|
@@ -27659,7 +27659,7 @@ var logger, readServerVersion = () => {
|
|
|
27659
27659
|
}
|
|
27660
27660
|
});
|
|
27661
27661
|
}, changelogCategorySchema, lifecycleTool = (action, description) => {
|
|
27662
|
-
registerTool(`
|
|
27662
|
+
registerTool(`workit_plan_${action}`, {
|
|
27663
27663
|
description,
|
|
27664
27664
|
inputSchema: {
|
|
27665
27665
|
plan_path: exports_external.string(),
|
|
@@ -27739,7 +27739,7 @@ var init_server3 = __esm(async () => {
|
|
|
27739
27739
|
name: "workit",
|
|
27740
27740
|
version: VERSION
|
|
27741
27741
|
});
|
|
27742
|
-
registerTool("
|
|
27742
|
+
registerTool("workit_verify", {
|
|
27743
27743
|
description: "Run project validation scripts (verify-project.sh). Defaults to Cursor workspace; pass workspace_root when the target repo differs.",
|
|
27744
27744
|
inputSchema: {
|
|
27745
27745
|
dry_run: exports_external.boolean().optional(),
|
|
@@ -27756,7 +27756,7 @@ var init_server3 = __esm(async () => {
|
|
|
27756
27756
|
workspace_root: cwd
|
|
27757
27757
|
}));
|
|
27758
27758
|
});
|
|
27759
|
-
registerTool("
|
|
27759
|
+
registerTool("workit_doctor", {
|
|
27760
27760
|
description: "Run the offline workit doctor and report installation health. Defaults to Cursor workspace; pass workspace_root when the target repo differs.",
|
|
27761
27761
|
inputSchema: {
|
|
27762
27762
|
workspace_root: workspaceRootSchema
|
|
@@ -27765,7 +27765,7 @@ var init_server3 = __esm(async () => {
|
|
|
27765
27765
|
const report = runDoctor({ host: "cursor", cwd: workspace_root });
|
|
27766
27766
|
return jsonResult(report);
|
|
27767
27767
|
});
|
|
27768
|
-
registerTool("
|
|
27768
|
+
registerTool("workit_pr_context", {
|
|
27769
27769
|
description: "Gather PR-ready repository context. On feature/* or bugfix/*, fetches and fast-forwards develop + current branch before diffing against develop.",
|
|
27770
27770
|
inputSchema: {
|
|
27771
27771
|
range: exports_external.string().optional(),
|
|
@@ -27829,7 +27829,7 @@ var init_server3 = __esm(async () => {
|
|
|
27829
27829
|
stderr: stderr || undefined
|
|
27830
27830
|
}));
|
|
27831
27831
|
});
|
|
27832
|
-
registerTool("
|
|
27832
|
+
registerTool("workit_pr_create", {
|
|
27833
27833
|
description: "Create GitLab MR or GitHub PR via glab/gh using vcs.json — requires confirmed: true",
|
|
27834
27834
|
inputSchema: {
|
|
27835
27835
|
confirmed: exports_external.boolean(),
|
|
@@ -27857,7 +27857,7 @@ var init_server3 = __esm(async () => {
|
|
|
27857
27857
|
}
|
|
27858
27858
|
return jsonResult(withWorkspace(workspace_root, { ...data }));
|
|
27859
27859
|
});
|
|
27860
|
-
registerTool("
|
|
27860
|
+
registerTool("workit_changelog_context", {
|
|
27861
27861
|
description: "Gather changelog update context. Defaults to Cursor workspace; pass workspace_root when the target repo differs.",
|
|
27862
27862
|
inputSchema: {
|
|
27863
27863
|
range: exports_external.string().optional(),
|
|
@@ -27874,7 +27874,7 @@ var init_server3 = __esm(async () => {
|
|
|
27874
27874
|
diff_stat: sections["Diff Stat"] ?? "",
|
|
27875
27875
|
files: sections["Changed Files"] ?? "",
|
|
27876
27876
|
unreleased,
|
|
27877
|
-
apply_hint: "ALWAYS merge via
|
|
27877
|
+
apply_hint: "ALWAYS merge via workit_changelog_apply — never hand-edit ### Added/Changed/… under [Unreleased].",
|
|
27878
27878
|
workspace_root: cwd,
|
|
27879
27879
|
stdout,
|
|
27880
27880
|
exitCode,
|
|
@@ -27889,7 +27889,7 @@ var init_server3 = __esm(async () => {
|
|
|
27889
27889
|
"Fixed",
|
|
27890
27890
|
"Security"
|
|
27891
27891
|
]);
|
|
27892
|
-
registerTool("
|
|
27892
|
+
registerTool("workit_changelog_apply", {
|
|
27893
27893
|
description: "Merge Keep a Changelog bullets into ## [Unreleased] under the correct ### category. Collapses duplicate category headings. NEVER append a second ### Added block.",
|
|
27894
27894
|
inputSchema: {
|
|
27895
27895
|
entries: exports_external.union([
|
|
@@ -27917,7 +27917,7 @@ var init_server3 = __esm(async () => {
|
|
|
27917
27917
|
unreleased: changelogUnreleasedStats(workspace_root, changelogPath)
|
|
27918
27918
|
}));
|
|
27919
27919
|
});
|
|
27920
|
-
registerTool("
|
|
27920
|
+
registerTool("workit_release_notes_context", {
|
|
27921
27921
|
description: "Gather release notes context. Defaults to Cursor workspace; pass workspace_root when the target repo differs.",
|
|
27922
27922
|
inputSchema: {
|
|
27923
27923
|
range_or_tag: exports_external.string().min(1),
|
|
@@ -27941,7 +27941,7 @@ var init_server3 = __esm(async () => {
|
|
|
27941
27941
|
stderr: stderr || undefined
|
|
27942
27942
|
}));
|
|
27943
27943
|
});
|
|
27944
|
-
registerTool("
|
|
27944
|
+
registerTool("workit_docs_context", {
|
|
27945
27945
|
description: "Gather docs refresh context. Defaults to Cursor workspace; pass workspace_root when the target repo differs.",
|
|
27946
27946
|
inputSchema: {
|
|
27947
27947
|
range: exports_external.string().optional(),
|
|
@@ -27961,7 +27961,7 @@ var init_server3 = __esm(async () => {
|
|
|
27961
27961
|
stderr: stderr || undefined
|
|
27962
27962
|
}));
|
|
27963
27963
|
});
|
|
27964
|
-
registerTool("
|
|
27964
|
+
registerTool("workit_git_context", {
|
|
27965
27965
|
description: "Gather git status for commit skill. Defaults to Cursor workspace; pass workspace_root when the target repo differs.",
|
|
27966
27966
|
inputSchema: {
|
|
27967
27967
|
paths: exports_external.array(exports_external.string()).optional(),
|
|
@@ -27971,7 +27971,7 @@ var init_server3 = __esm(async () => {
|
|
|
27971
27971
|
const data = gitContext(workspace_root, paths ?? []);
|
|
27972
27972
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
27973
27973
|
});
|
|
27974
|
-
registerTool("
|
|
27974
|
+
registerTool("workit_resolve_branch", {
|
|
27975
27975
|
description: "Resolve feature/* or bugfix/* branch from spec/plan. Returns current_branch, dirty, needs_checkout. No worktrees.",
|
|
27976
27976
|
inputSchema: {
|
|
27977
27977
|
spec_path: exports_external.string(),
|
|
@@ -27984,7 +27984,7 @@ var init_server3 = __esm(async () => {
|
|
|
27984
27984
|
return jsonResult({ error: data.error });
|
|
27985
27985
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
27986
27986
|
});
|
|
27987
|
-
registerTool("
|
|
27987
|
+
registerTool("workit_branch_setup", {
|
|
27988
27988
|
description: "In-place checkout of feature/* or bugfix/* branch. Stash required when dirty. NEVER uses worktrees.",
|
|
27989
27989
|
inputSchema: {
|
|
27990
27990
|
action: exports_external.enum(["setup", "reapply_stash"]).optional(),
|
|
@@ -28005,7 +28005,7 @@ var init_server3 = __esm(async () => {
|
|
|
28005
28005
|
return jsonResult({ error: data.error });
|
|
28006
28006
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28007
28007
|
});
|
|
28008
|
-
registerTool("
|
|
28008
|
+
registerTool("workit_sdd_context", {
|
|
28009
28009
|
description: "Resolve canonical docs/<slug>/sdd/ paths; creates nothing (progress.md appears only on the first confirmed append). NEVER use .superpowers/sdd.",
|
|
28010
28010
|
inputSchema: {
|
|
28011
28011
|
slug: exports_external.string().optional(),
|
|
@@ -28018,7 +28018,7 @@ var init_server3 = __esm(async () => {
|
|
|
28018
28018
|
return jsonResult({ error: data.error });
|
|
28019
28019
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28020
28020
|
});
|
|
28021
|
-
registerTool("
|
|
28021
|
+
registerTool("workit_sdd_task_brief", {
|
|
28022
28022
|
description: "Write task-N-brief.md under docs/<slug>/sdd/",
|
|
28023
28023
|
inputSchema: {
|
|
28024
28024
|
sdd_dir: exports_external.string(),
|
|
@@ -28041,7 +28041,7 @@ var init_server3 = __esm(async () => {
|
|
|
28041
28041
|
});
|
|
28042
28042
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28043
28043
|
});
|
|
28044
|
-
registerTool("
|
|
28044
|
+
registerTool("workit_sdd_review_package", {
|
|
28045
28045
|
description: "Write review diff under SDD dir between base and head SHAs",
|
|
28046
28046
|
inputSchema: {
|
|
28047
28047
|
sdd_dir: exports_external.string(),
|
|
@@ -28066,7 +28066,7 @@ var init_server3 = __esm(async () => {
|
|
|
28066
28066
|
return jsonResult({ error: data.error });
|
|
28067
28067
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28068
28068
|
});
|
|
28069
|
-
registerTool("
|
|
28069
|
+
registerTool("workit_sdd_append_progress", {
|
|
28070
28070
|
description: "Append one validated line to docs/<slug>/sdd/progress.md",
|
|
28071
28071
|
inputSchema: {
|
|
28072
28072
|
progress_path: exports_external.string(),
|
|
@@ -28085,7 +28085,7 @@ var init_server3 = __esm(async () => {
|
|
|
28085
28085
|
return jsonResult({ error: data.error });
|
|
28086
28086
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28087
28087
|
});
|
|
28088
|
-
registerTool("
|
|
28088
|
+
registerTool("workit_sdd_append_advisory", {
|
|
28089
28089
|
description: "Append a validated advisory line to docs/<slug>/sdd/advisories.md (coordinator-owned)",
|
|
28090
28090
|
inputSchema: {
|
|
28091
28091
|
advisories_path: exports_external.string(),
|
|
@@ -28105,7 +28105,7 @@ var init_server3 = __esm(async () => {
|
|
|
28105
28105
|
return jsonResult({ error: data.error, code: data.code });
|
|
28106
28106
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28107
28107
|
});
|
|
28108
|
-
registerTool("
|
|
28108
|
+
registerTool("workit_docs_branch", {
|
|
28109
28109
|
description: "Resolve branch for spec/plan authors: keep current feature|bugfix or create from the configured base.",
|
|
28110
28110
|
inputSchema: {
|
|
28111
28111
|
plan_path: exports_external.string().optional(),
|
|
@@ -28118,7 +28118,7 @@ var init_server3 = __esm(async () => {
|
|
|
28118
28118
|
return jsonResult(withWorkspace(workspace_root, { error: data.error }));
|
|
28119
28119
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28120
28120
|
});
|
|
28121
|
-
registerTool("
|
|
28121
|
+
registerTool("workit_docs_layout", {
|
|
28122
28122
|
description: "Canonical docs layout: prepare creates missing docs/ and docs/<slug>/; migrate detects legacy docs/superpowers/ and copies safe pairs after a native Migrate safely / Not now question",
|
|
28123
28123
|
inputSchema: {
|
|
28124
28124
|
action: exports_external.enum(["prepare", "migrate"]).default("prepare"),
|
|
@@ -28162,7 +28162,7 @@ var init_server3 = __esm(async () => {
|
|
|
28162
28162
|
return jsonResult(withWorkspace(workspace_root, { error: result.error }));
|
|
28163
28163
|
return jsonResult(withWorkspace(workspace_root, result));
|
|
28164
28164
|
});
|
|
28165
|
-
registerTool("
|
|
28165
|
+
registerTool("workit_docs_validate", {
|
|
28166
28166
|
description: "Hard-fail validate spec/plan headers, link, branch, task order; returns quality findings (hard/warning). Defaults to Cursor workspace; pass workspace_root when paths are relative to another repo.",
|
|
28167
28167
|
inputSchema: {
|
|
28168
28168
|
spec_path: exports_external.string(),
|
|
@@ -28176,7 +28176,7 @@ var init_server3 = __esm(async () => {
|
|
|
28176
28176
|
}
|
|
28177
28177
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28178
28178
|
});
|
|
28179
|
-
registerTool("
|
|
28179
|
+
registerTool("workit_plan_tasks", {
|
|
28180
28180
|
description: "Parse plan ### Task N sections into structured tasks with section_text. Defaults to Cursor workspace; pass workspace_root when paths are relative to another repo.",
|
|
28181
28181
|
inputSchema: {
|
|
28182
28182
|
plan_path: exports_external.string(),
|
|
@@ -28200,7 +28200,7 @@ var init_server3 = __esm(async () => {
|
|
|
28200
28200
|
}
|
|
28201
28201
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28202
28202
|
});
|
|
28203
|
-
registerTool("
|
|
28203
|
+
registerTool("workit_handoff_prompt", {
|
|
28204
28204
|
description: "Build copy-paste handoff prompt for next session. Defaults to Cursor workspace; pass workspace_root when spec/plan paths are relative to another repo.",
|
|
28205
28205
|
inputSchema: {
|
|
28206
28206
|
message: exports_external.string(),
|
|
@@ -28388,7 +28388,7 @@ var init_server3 = __esm(async () => {
|
|
|
28388
28388
|
return jsonResult({ error: data.error });
|
|
28389
28389
|
return jsonResult(data.data);
|
|
28390
28390
|
});
|
|
28391
|
-
registerTool("
|
|
28391
|
+
registerTool("workit_youtrack_verify_token", {
|
|
28392
28392
|
description: "Read-only YouTrack token test (GET /api/users/me). No work items created.",
|
|
28393
28393
|
inputSchema: {}
|
|
28394
28394
|
}, async () => {
|
|
@@ -28400,7 +28400,7 @@ var init_server3 = __esm(async () => {
|
|
|
28400
28400
|
return jsonResult({ error: data.error ?? "token invalid", ...data });
|
|
28401
28401
|
return jsonResult(data);
|
|
28402
28402
|
});
|
|
28403
|
-
registerTool("
|
|
28403
|
+
registerTool("workit_youtrack_parse_issue", {
|
|
28404
28404
|
description: "Parse YouTrack issue URL or bare id (e.g. NSR-40) into issueId",
|
|
28405
28405
|
inputSchema: {
|
|
28406
28406
|
issue_ref: exports_external.string().describe("YouTrack URL or issue id, e.g. https://…/issue/NSR-40 or NSR-40")
|
|
@@ -28411,7 +28411,7 @@ var init_server3 = __esm(async () => {
|
|
|
28411
28411
|
return jsonResult({ error: data.error });
|
|
28412
28412
|
return jsonResult(data);
|
|
28413
28413
|
});
|
|
28414
|
-
registerTool("
|
|
28414
|
+
registerTool("workit_youtrack_context", {
|
|
28415
28415
|
description: "YouTrack config, greeting, issue resolution (from issue_url/id or meetings)",
|
|
28416
28416
|
inputSchema: {
|
|
28417
28417
|
mode: exports_external.enum(["meetings", "task"]).optional(),
|
|
@@ -28440,7 +28440,7 @@ var init_server3 = __esm(async () => {
|
|
|
28440
28440
|
}
|
|
28441
28441
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28442
28442
|
});
|
|
28443
|
-
registerTool("
|
|
28443
|
+
registerTool("workit_youtrack_parse_duration", {
|
|
28444
28444
|
description: "Parse duration text (e.g. 1h 30m) to integer minutes",
|
|
28445
28445
|
inputSchema: {
|
|
28446
28446
|
text: exports_external.string(),
|
|
@@ -28452,7 +28452,7 @@ var init_server3 = __esm(async () => {
|
|
|
28452
28452
|
return jsonResult({ error: data.error });
|
|
28453
28453
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28454
28454
|
});
|
|
28455
|
-
registerTool("
|
|
28455
|
+
registerTool("workit_youtrack_log_time", {
|
|
28456
28456
|
description: "POST YouTrack work item (time only, no comment)",
|
|
28457
28457
|
inputSchema: {
|
|
28458
28458
|
issueId: exports_external.string(),
|
|
@@ -28473,7 +28473,7 @@ var init_server3 = __esm(async () => {
|
|
|
28473
28473
|
return jsonResult({ error: data.error });
|
|
28474
28474
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28475
28475
|
});
|
|
28476
|
-
registerTool("
|
|
28476
|
+
registerTool("workit_youtrack_draft", {
|
|
28477
28477
|
description: "Build ES-CL comment markdown without posting (envelope only by default)",
|
|
28478
28478
|
inputSchema: {
|
|
28479
28479
|
issueId: exports_external.string(),
|
|
@@ -28485,7 +28485,7 @@ var init_server3 = __esm(async () => {
|
|
|
28485
28485
|
facts: exports_external.record(exports_external.any()).optional()
|
|
28486
28486
|
}
|
|
28487
28487
|
}, async (input) => jsonResult(buildDraft(input)));
|
|
28488
|
-
registerTool("
|
|
28488
|
+
registerTool("workit_youtrack_post", {
|
|
28489
28489
|
description: "Post YouTrack comment and optional time — requires confirmed: true",
|
|
28490
28490
|
inputSchema: {
|
|
28491
28491
|
confirmed: exports_external.boolean(),
|
|
@@ -28506,7 +28506,7 @@ var init_server3 = __esm(async () => {
|
|
|
28506
28506
|
return jsonResult({ error: data.error });
|
|
28507
28507
|
return jsonResult(withWorkspace(workspace_root, data));
|
|
28508
28508
|
});
|
|
28509
|
-
registerTool("
|
|
28509
|
+
registerTool("workit_present_ascii", {
|
|
28510
28510
|
description: "Render deterministic ASCII UI wireframe from JSON spec",
|
|
28511
28511
|
inputSchema: {
|
|
28512
28512
|
title: exports_external.string().optional(),
|
|
@@ -28519,7 +28519,7 @@ var init_server3 = __esm(async () => {
|
|
|
28519
28519
|
return jsonResult({ error: data.error });
|
|
28520
28520
|
return jsonResult(data.data);
|
|
28521
28521
|
});
|
|
28522
|
-
registerTool("
|
|
28522
|
+
registerTool("workit_present_flow", {
|
|
28523
28523
|
description: "Render mermaid flowchart from JSON nodes/edges",
|
|
28524
28524
|
inputSchema: {
|
|
28525
28525
|
title: exports_external.string().optional(),
|
|
@@ -28541,7 +28541,7 @@ var init_server3 = __esm(async () => {
|
|
|
28541
28541
|
return jsonResult({ error: data.error });
|
|
28542
28542
|
return jsonResult(data.data);
|
|
28543
28543
|
});
|
|
28544
|
-
registerTool("
|
|
28544
|
+
registerTool("workit_flow_status", {
|
|
28545
28545
|
description: "Read the spec/plan approval flow state for a workflow; on first read it records flow activation and canonical document paths (FG-01)",
|
|
28546
28546
|
inputSchema: {
|
|
28547
28547
|
plan_path: exports_external.string().optional(),
|
|
@@ -28577,7 +28577,7 @@ var init_server3 = __esm(async () => {
|
|
|
28577
28577
|
flow_path: `docs/${slug}/sdd/flow.json`
|
|
28578
28578
|
});
|
|
28579
28579
|
});
|
|
28580
|
-
registerTool("
|
|
28580
|
+
registerTool("workit_spec_approve", {
|
|
28581
28581
|
description: "Advance spec status with the Cursor policy-only confirmation: draft -> approved in a single call. The self-review validation runs automatically inside the transition; only the final approval asks for your confirmation. Cursor records attested: false (the MCP cannot observe AskQuestion results); there is no evidence argument (CA-42).",
|
|
28582
28582
|
inputSchema: {
|
|
28583
28583
|
spec_path: exports_external.string(),
|
|
@@ -28593,7 +28593,7 @@ var init_server3 = __esm(async () => {
|
|
|
28593
28593
|
return jsonResult({ error: result.error, code: result.code });
|
|
28594
28594
|
return jsonResult({ spec: spec_path, status: readFlowState(workspace, slug).spec.status });
|
|
28595
28595
|
});
|
|
28596
|
-
registerTool("
|
|
28596
|
+
registerTool("workit_plan_approve", {
|
|
28597
28597
|
description: "Advance plan status with the Cursor policy-only confirmation: draft -> approved in a single call. The self-review validation runs automatically inside the transition; only the final approval asks for your confirmation. Requires approved spec. Cursor records attested: false; there is no evidence argument (CA-42).",
|
|
28598
28598
|
inputSchema: {
|
|
28599
28599
|
plan_path: exports_external.string(),
|
|
@@ -28609,7 +28609,7 @@ var init_server3 = __esm(async () => {
|
|
|
28609
28609
|
return jsonResult({ error: result.error, code: result.code });
|
|
28610
28610
|
return jsonResult({ plan: plan_path, status: readFlowState(workspace, slug).plan.status });
|
|
28611
28611
|
});
|
|
28612
|
-
registerTool("
|
|
28612
|
+
registerTool("workit_plan_menu", {
|
|
28613
28613
|
description: "Record the answered post-plan choice menu with the Cursor policy-only confirmation. subagent-driven is rejected as unsupported on Cursor (CA-42); there is no evidence argument.",
|
|
28614
28614
|
inputSchema: {
|
|
28615
28615
|
plan_path: exports_external.string(),
|
|
@@ -28629,7 +28629,7 @@ var init_server3 = __esm(async () => {
|
|
|
28629
28629
|
lifecycleTool("pause", "Pause a running plan with the Cursor policy-only confirmation: active -> paused. The MCP cannot observe AskQuestion results, so it records attested: false; there is no evidence argument (CA-42). Requires plan_path and workspace_root.");
|
|
28630
28630
|
lifecycleTool("resume", "Resume a paused plan with the Cursor policy-only confirmation: paused -> active. The MCP cannot observe AskQuestion results, so it records attested: false; there is no evidence argument (CA-42). Requires plan_path and workspace_root.");
|
|
28631
28631
|
lifecycleTool("complete", "Complete a running plan with the Cursor policy-only confirmation: active/paused -> completed, after the SDD ledger is complete and repository verification passes. The MCP cannot observe AskQuestion results, so it records attested: false; there is no evidence argument (CA-42). Requires plan_path and workspace_root.");
|
|
28632
|
-
registerTool("
|
|
28632
|
+
registerTool("workit_docs_repo_link", {
|
|
28633
28633
|
description: "Link the component docs repo in the toolkit config",
|
|
28634
28634
|
inputSchema: {
|
|
28635
28635
|
path: exports_external.string(),
|
|
@@ -28641,11 +28641,11 @@ var init_server3 = __esm(async () => {
|
|
|
28641
28641
|
return jsonResult({ error: result.error });
|
|
28642
28642
|
return jsonResult({ path: result.path });
|
|
28643
28643
|
});
|
|
28644
|
-
registerTool("
|
|
28644
|
+
registerTool("workit_docs_list", {
|
|
28645
28645
|
description: "List local specs with docs-repo promotion status",
|
|
28646
28646
|
inputSchema: { workspace_root: workspaceRootSchema }
|
|
28647
28647
|
}, async ({ workspace_root }) => jsonResult(listSpecs(workspace_root)));
|
|
28648
|
-
registerTool("
|
|
28648
|
+
registerTool("workit_docs_promote", {
|
|
28649
28649
|
description: "Promote a spec (+plan) to the linked docs repo with quality gate",
|
|
28650
28650
|
inputSchema: {
|
|
28651
28651
|
slug: exports_external.string(),
|
|
@@ -28663,11 +28663,11 @@ var init_server3 = __esm(async () => {
|
|
|
28663
28663
|
index_updated: result.index_updated
|
|
28664
28664
|
});
|
|
28665
28665
|
});
|
|
28666
|
-
registerTool("
|
|
28666
|
+
registerTool("workit_template_list", {
|
|
28667
28667
|
description: "List editable templates with their source",
|
|
28668
28668
|
inputSchema: { workspace_root: workspaceRootSchema }
|
|
28669
28669
|
}, async () => jsonResult({ templates: listTemplates() }));
|
|
28670
|
-
registerTool("
|
|
28670
|
+
registerTool("workit_template_edit", {
|
|
28671
28671
|
description: "Write an edited template to the toolkit config dir",
|
|
28672
28672
|
inputSchema: {
|
|
28673
28673
|
name: exports_external.enum(["issue-update", "greeting", "headers"]),
|
|
@@ -28680,11 +28680,11 @@ var init_server3 = __esm(async () => {
|
|
|
28680
28680
|
return jsonResult({ error: result.error });
|
|
28681
28681
|
return jsonResult({ path: result.path });
|
|
28682
28682
|
});
|
|
28683
|
-
registerTool("
|
|
28683
|
+
registerTool("workit_rule_list", {
|
|
28684
28684
|
description: "List canonical rules (config) with platforms",
|
|
28685
28685
|
inputSchema: { workspace_root: workspaceRootSchema }
|
|
28686
28686
|
}, async () => jsonResult({ rules: listRules() }));
|
|
28687
|
-
registerTool("
|
|
28687
|
+
registerTool("workit_rule_edit", {
|
|
28688
28688
|
description: "Write a canonical rule to the toolkit config dir",
|
|
28689
28689
|
inputSchema: {
|
|
28690
28690
|
name: exports_external.string(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brainervirus/workit-cursor",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.10",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Workit Cursor plugin: MCP server, hooks, rules, marketplace manifest (thin over @brainervirus/workit-core)",
|
|
6
6
|
"keywords": [
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"build": "bun scripts/build.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@brainervirus/workit-core": "^0.8.
|
|
42
|
+
"@brainervirus/workit-core": "^0.8.10",
|
|
43
43
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
44
44
|
"zod": "^3.24.0"
|
|
45
45
|
},
|
|
@@ -37,7 +37,7 @@ One AskQuestion per turn when possible. Open-ended free text (no options) may st
|
|
|
37
37
|
|
|
38
38
|
After writing a plan, **do not emit** Superpowers' inline text beginning “Two execution options”.
|
|
39
39
|
|
|
40
|
-
After `
|
|
40
|
+
After `workit_docs_validate` succeeds on the saved spec/plan pair, call Cursor `AskQuestion` with exactly:
|
|
41
41
|
|
|
42
42
|
- Subagent-driven → **unsupported on Cursor** (the MCP rejects it as `unsupported_mode`; use OpenCode `wk-implement`)
|
|
43
43
|
- Inline → execute in this session
|
|
@@ -7,8 +7,8 @@ alwaysApply: true
|
|
|
7
7
|
|
|
8
8
|
When executing a plan / SDD handoff:
|
|
9
9
|
|
|
10
|
-
1. MCP `
|
|
10
|
+
1. MCP `workit_sdd_context` returns `todos` — call Cursor **TodoWrite** with that array (`merge: false`) before Task 1.
|
|
11
11
|
2. SDD under `docs/<slug>/sdd/` is persistence only — **not** a substitute for the Cursor task list UI.
|
|
12
|
-
3. Per task: `in_progress` before dispatch; `completed` after `
|
|
12
|
+
3. Per task: `in_progress` before dispatch; `completed` after `workit_sdd_append_progress`.
|
|
13
13
|
|
|
14
14
|
Never skip TodoWrite because the SDD ledger exists.
|
package/rules/no-worktrees.mdc
CHANGED
|
@@ -16,10 +16,10 @@ alwaysApply: true
|
|
|
16
16
|
|
|
17
17
|
## Required flow (before Task 1)
|
|
18
18
|
|
|
19
|
-
1. MCP `
|
|
19
|
+
1. MCP `workit_resolve_branch` with spec + plan paths
|
|
20
20
|
2. If `needs_checkout` and `dirty` → native **AskQuestion** asks whether to stash before checkout
|
|
21
|
-
3. MCP `
|
|
22
|
-
4. After all tasks, if manifest has `stash_ref` → AskQuestion → `
|
|
21
|
+
3. MCP `workit_branch_setup` with `target_branch` and `stash: yes|no`
|
|
22
|
+
4. After all tasks, if manifest has `stash_ref` → AskQuestion → `workit_branch_setup` action=`reapply_stash`
|
|
23
23
|
|
|
24
24
|
## Tools only
|
|
25
25
|
|
package/rules/sdd-docs-path.mdc
CHANGED
|
@@ -9,9 +9,9 @@ alwaysApply: true
|
|
|
9
9
|
|
|
10
10
|
## Required
|
|
11
11
|
|
|
12
|
-
1. MCP `
|
|
12
|
+
1. MCP `workit_sdd_context` with `plan_path` — **always**, including fresh projects
|
|
13
13
|
2. Use returned `sdd_dir` (`docs/<slug>/sdd/`) for all SDD artifacts
|
|
14
|
-
3. `
|
|
14
|
+
3. `workit_sdd_task_brief`, `workit_sdd_review_package`, `workit_sdd_append_progress` — never Superpowers `sdd-workspace` script
|
|
15
15
|
|
|
16
16
|
## Forbidden
|
|
17
17
|
|
|
@@ -19,4 +19,4 @@ alwaysApply: true
|
|
|
19
19
|
- `cat .superpowers/sdd/progress.md` — missing file there does NOT mean "start fresh"
|
|
20
20
|
- Superpowers `task-brief` / `review-package` scripts under `.agents/skills/`
|
|
21
21
|
|
|
22
|
-
Fresh project with no ledger → `
|
|
22
|
+
Fresh project with no ledger → `workit_sdd_context` creates nothing; `progress.md` appears only on the first confirmed `workit_sdd_append_progress`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-changelog
|
|
3
|
-
description: Update CHANGELOG.md via
|
|
3
|
+
description: Update CHANGELOG.md via workit_changelog_context + workit_changelog_apply. Use for /wk-changelog or "update the changelog".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Changelog — Keep a Changelog Update
|
|
@@ -9,14 +9,14 @@ Update `CHANGELOG.md` for the current repository.
|
|
|
9
9
|
|
|
10
10
|
## Step 1 — Gather facts (required)
|
|
11
11
|
|
|
12
|
-
Call MCP tool `
|
|
12
|
+
Call MCP tool `workit_changelog_context` with arguments from the user's message (range, version, paths, etc.).
|
|
13
13
|
|
|
14
|
-
**Repository calls:** For every repository-scoped `
|
|
14
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
15
15
|
|
|
16
16
|
Use the tool return value as ground truth. Do not read git, run npm, or infer repo state yourself.
|
|
17
17
|
If the tool errors, report the error and stop.
|
|
18
18
|
|
|
19
|
-
If `unreleased.needs_normalize` is true, call `
|
|
19
|
+
If `unreleased.needs_normalize` is true, call `workit_changelog_apply` with `normalize_only: true` before merging new bullets.
|
|
20
20
|
|
|
21
21
|
## Step 2 — Decide entries (do not edit the file yet)
|
|
22
22
|
|
|
@@ -31,7 +31,7 @@ Follow Keep a Changelog 1.1.0:
|
|
|
31
31
|
|
|
32
32
|
## Step 3 — Apply via tool (required)
|
|
33
33
|
|
|
34
|
-
Call MCP `
|
|
34
|
+
Call MCP `workit_changelog_apply` with the new bullets. Examples:
|
|
35
35
|
|
|
36
36
|
```json
|
|
37
37
|
{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-commit
|
|
3
|
-
description: Structured local commits via
|
|
3
|
+
description: Structured local commits via workit_git_context. Use for /wk-commit or "use commit skill" only — not casual "ship it".
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -8,9 +8,9 @@ disable-model-invocation: true
|
|
|
8
8
|
|
|
9
9
|
## Step 1 — Gather facts (required)
|
|
10
10
|
|
|
11
|
-
Call MCP tool `
|
|
11
|
+
Call MCP tool `workit_git_context` with arguments from the user's message (paths after `/wk-commit`, etc.).
|
|
12
12
|
|
|
13
|
-
**Repository calls:** For every repository-scoped `
|
|
13
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
14
14
|
|
|
15
15
|
Use the tool return value as ground truth. Do not read git, run npm, or infer repo state yourself.
|
|
16
16
|
If the tool errors, report the error and stop.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-docs-refresh
|
|
3
|
-
description: Refresh stale README and docs via
|
|
3
|
+
description: Refresh stale README and docs via workit_docs_context. Use for /wk-docs-refresh or "refresh readme/docs".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Docs Refresh — Documentation Refresh
|
|
@@ -9,9 +9,9 @@ Inspect current changes and refresh stale documentation.
|
|
|
9
9
|
|
|
10
10
|
## Step 1 — Gather facts (required)
|
|
11
11
|
|
|
12
|
-
Call MCP tool `
|
|
12
|
+
Call MCP tool `workit_docs_context` with arguments from the user's message (range, version, paths, etc.).
|
|
13
13
|
|
|
14
|
-
**Repository calls:** For every repository-scoped `
|
|
14
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
15
15
|
|
|
16
16
|
Use the tool return value as ground truth. Do not read git, run npm, or infer repo state yourself.
|
|
17
17
|
If the tool errors, report the error and stop.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-handoff
|
|
3
|
-
description: Emit copy-paste implementation prompt for a new chat via
|
|
3
|
+
description: Emit copy-paste implementation prompt for a new chat via workit_handoff_prompt. Explicit /wk-handoff only.
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,20 +10,20 @@ Emit a copy-paste prompt for a **new** implementation chat.
|
|
|
10
10
|
|
|
11
11
|
## Step 1 — Gather facts (required)
|
|
12
12
|
|
|
13
|
-
Call MCP tool `
|
|
13
|
+
Call MCP tool `workit_handoff_prompt` with the **full** user message as `message`.
|
|
14
14
|
|
|
15
|
-
**Repository calls:** For every repository-scoped `
|
|
15
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
16
16
|
|
|
17
17
|
**Thread context:** If this thread has a known spec/plan pair (from brainstorming, writing-plans, or open files), append both paths to `message` even when the user only typed `/wk-handoff`. Without explicit paths, the tool picks the **most recently touched** linked pair under `docs/<slug>/` (plan `**Spec:**` link + file mtimes) — not “only one file in the folder.”
|
|
18
18
|
|
|
19
19
|
Use the tool return value as ground truth. Do not read git, run npm, or infer repo state yourself.
|
|
20
20
|
If the tool errors, report the error and stop.
|
|
21
21
|
|
|
22
|
-
The pasted prompt includes instructions to call `
|
|
22
|
+
The pasted prompt includes instructions to call `workit_sdd_context`, **Cursor TodoWrite** (with returned `todos`), and `workit_plan_tasks` in Chat B before Task 1. SDD artifacts go to `docs/<slug>/sdd/` — never `.superpowers/sdd`. TodoWrite is required for the native Cursor task list UI (remaining/completed); the SDD ledger is persistence only. The fenced `prompt` does not contain `section_text`. **Branch** is resolved automatically in the prompt (from spec/plan or derived as `feature/*` / `bugfix/*`). **No worktrees** — Chat B uses `workit_resolve_branch` + `workit_branch_setup` in-place. Commits use workit **/wk-commit** skill — no separate commit-policy field.
|
|
23
23
|
|
|
24
|
-
`
|
|
24
|
+
`workit_handoff_prompt` also returns `tasks[]`, `branch`, `sdd_dir`, `completed_task_ids`, and `todos` for same-session MCP use — not copy-paste transport.
|
|
25
25
|
|
|
26
|
-
A destination run that executes the plan must still end with `
|
|
26
|
+
A destination run that executes the plan must still end with `workit_plan_complete` once the SDD ledger is complete and repository verification passes, and never finish the run while the plan is still `active`.
|
|
27
27
|
|
|
28
28
|
## Output (success)
|
|
29
29
|
|
|
@@ -10,9 +10,9 @@ Execute the plan **inline in this coordinator session**. subagent-driven executi
|
|
|
10
10
|
|
|
11
11
|
## Step 1 — Gather facts (required)
|
|
12
12
|
|
|
13
|
-
Call MCP tool `
|
|
13
|
+
Call MCP tool `workit_plan_tasks` with `plan_path` from the user's message and `spec_path` when known.
|
|
14
14
|
|
|
15
|
-
**Repository calls:** For every repository-scoped `
|
|
15
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
16
16
|
|
|
17
17
|
Use the returned `tasks[]` as ground truth. Cache each `section_text` for subagent prompts. Do not read the plan file for task text.
|
|
18
18
|
|
|
@@ -20,7 +20,7 @@ Use the returned `tasks[]` as ground truth. Cache each `section_text` for subage
|
|
|
20
20
|
|
|
21
21
|
Resolve plugin root: `WORKFLOW_TOOLKIT_ROOT` env or `~/.cursor/plugins/local/workit/`.
|
|
22
22
|
|
|
23
|
-
Load `templates/execution-contract.md`. Substitute `<SPEC_PATH>`, `<PLAN_PATH>`, `<BRANCH>`, `<SDD_DIR>`, `<TASK_LIST>` from MCP. OMIT the `## Handoff destination` section and its `<workflow-handoff-destination>` marker line — that section is only for sessions started from a `
|
|
23
|
+
Load `templates/execution-contract.md`. Substitute `<SPEC_PATH>`, `<PLAN_PATH>`, `<BRANCH>`, `<SDD_DIR>`, `<TASK_LIST>` from MCP. OMIT the `## Handoff destination` section and its `<workflow-handoff-destination>` marker line — that section is only for sessions started from a `workit_handoff_prompt` destination prompt. This inline executor is NOT a destination and must never present itself as one (five-choice source menu, Handoff still available). If template missing, stop with error.
|
|
24
24
|
|
|
25
25
|
## Step 3 — Follow contract
|
|
26
26
|
|
|
@@ -28,17 +28,17 @@ Announce: "Using implement + inline."
|
|
|
28
28
|
|
|
29
29
|
**Before Task 1 — validate + SDD + TodoWrite UI + branch (no worktrees):**
|
|
30
30
|
|
|
31
|
-
0. `
|
|
32
|
-
1. `
|
|
31
|
+
0. `workit_docs_validate` with spec + plan paths — hard-fail before any SDD mutation
|
|
32
|
+
1. `workit_sdd_context` with `plan_path` — cache `sdd_dir`, `completed_task_ids`, **`todos`**
|
|
33
33
|
2. **TodoWrite** with `todos` from step 1 (`merge: false`) — required for Cursor native task list UI (SDD is not a UI substitute)
|
|
34
|
-
3. `
|
|
34
|
+
3. `workit_resolve_branch` with spec + plan paths
|
|
35
35
|
4. If `needs_checkout` and `dirty` → native **AskQuestion** asks whether to stash before checkout
|
|
36
|
-
5. `
|
|
36
|
+
5. `workit_branch_setup` with `target_branch`, `stash`, `sdd_dir` from step 1
|
|
37
37
|
|
|
38
|
-
Follow the contract verbatim. Keep TodoWrite `in_progress`/`completed` in sync each task. At verify/commit phase use `
|
|
38
|
+
Follow the contract verbatim. Keep TodoWrite `in_progress`/`completed` in sync each task. At verify/commit phase use `workit_verify` and `workit_git_context` MCP tools.
|
|
39
39
|
|
|
40
40
|
Each task lands exactly one contiguous non-empty commit range (`base..head`): fix rounds append commits to that range and never rewrite/amend an active review range; each progress line records the task's real base..head shas.
|
|
41
41
|
|
|
42
42
|
Do not emit a handoff fence — this is in-session execution.
|
|
43
43
|
|
|
44
|
-
**Mandatory:** end the run by calling MCP `
|
|
44
|
+
**Mandatory:** end the run by calling MCP `workit_plan_complete` after the final task once the SDD ledger is complete (all task IDs appended) and `workit_verify` passes — a complete ledger and green verification are the tool's gates. Never finish the run while the plan is still `active`.
|
|
@@ -14,7 +14,7 @@ Post a Spanish comment and log time on a **task** issue (not the meeting issue).
|
|
|
14
14
|
|
|
15
15
|
**Audience:** @Alejandra.Flores — not a developer. Clarify technical terms in plain language when they appear.
|
|
16
16
|
|
|
17
|
-
**Repository calls:** For every repository-scoped `
|
|
17
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
18
18
|
|
|
19
19
|
## Step 0 — Toolkit ready
|
|
20
20
|
|
|
@@ -27,12 +27,12 @@ If unsure, call `workit_status`. Stop if `ready: false`.
|
|
|
27
27
|
1. If the user did **not** already paste a YouTrack URL or issue id (`NSR-40`) in the message that started this flow, ask:
|
|
28
28
|
> Paste the YouTrack issue URL or id for this update (e.g. `https://…/issue/NSR-40` or `NSR-40`).
|
|
29
29
|
2. Wait for their reply. Do **not** guess from spec/plan unless they explicitly say to use the plan's issue.
|
|
30
|
-
3. Call `
|
|
30
|
+
3. Call `workit_youtrack_parse_issue` with `issue_ref` = what they pasted.
|
|
31
31
|
4. On error, ask again with the parse error. On success, note `issueId`.
|
|
32
32
|
|
|
33
33
|
## Step 2 — Context (required)
|
|
34
34
|
|
|
35
|
-
Call `
|
|
35
|
+
Call `workit_youtrack_context` with `issue_id` from Step 1 (or `issue_url` / `issue_ref` directly). Stop on error.
|
|
36
36
|
|
|
37
37
|
Show the resolved issue once in chat: `Updating **{issueId}**` (+ `issueUrl` if returned).
|
|
38
38
|
|
|
@@ -46,7 +46,7 @@ Ask user to paste rough notes, half-written update, or bullets. Skip to Step 5.
|
|
|
46
46
|
|
|
47
47
|
### Mode `remind` — Help me remember
|
|
48
48
|
|
|
49
|
-
1. Optionally call `
|
|
49
|
+
1. Optionally call `workit_git_context` (and read spec/plan title) **only to remind the user in English chat** — short prose: what repo, branch, themes of commits, not a pasteable comment.
|
|
50
50
|
2. Ask conversational follow-ups: *¿Qué te costó más? ¿Qué queda para mañana? ¿Algo bloqueado?*
|
|
51
51
|
3. User replies in their words (Spanish messy notes OK).
|
|
52
52
|
4. Treat their reply as the draft → Step 5.
|
|
@@ -55,14 +55,14 @@ Ask user to paste rough notes, half-written update, or bullets. Skip to Step 5.
|
|
|
55
55
|
|
|
56
56
|
### Mode `auto` — Draft for me to edit
|
|
57
57
|
|
|
58
|
-
1. Use `
|
|
58
|
+
1. Use `workit_git_context` + conversation context to infer what they likely worked on.
|
|
59
59
|
2. Write a **first draft in Spanish** per **youtrack-update-style.md** (paragraphs, manager-friendly, no file paths).
|
|
60
60
|
3. Show draft in a fenced block. Ask user to correct, add, or replace — user may reply with a full rewrite.
|
|
61
61
|
4. Use their corrected version as input → Step 5.
|
|
62
62
|
|
|
63
63
|
## Step 4 — Duration
|
|
64
64
|
|
|
65
|
-
Ask time spent on this task issue. User text → `
|
|
65
|
+
Ask time spent on this task issue. User text → `workit_youtrack_parse_duration`. **Do not compute minutes yourself.**
|
|
66
66
|
|
|
67
67
|
## Step 5 — Polish (ChatGPT pass)
|
|
68
68
|
|
|
@@ -73,7 +73,7 @@ Polish the approved draft per **youtrack-update-style.md**:
|
|
|
73
73
|
- Keep `# Actualización` + greeting — if user already included them, do not duplicate `@Alejandra.Flores`
|
|
74
74
|
- `## Off-topic` only if user's material has a clear tangent section
|
|
75
75
|
|
|
76
|
-
Call `
|
|
76
|
+
Call `workit_youtrack_draft` with:
|
|
77
77
|
|
|
78
78
|
- `issueId` from Step 1
|
|
79
79
|
- `userNotes` = polished **body only** (no `# Actualización`, no greeting line)
|
|
@@ -88,9 +88,9 @@ Show returned `markdown` in a fenced block. User may edit in chat (apply edits a
|
|
|
88
88
|
|
|
89
89
|
Use native `AskQuestion`: title `Post to YouTrack`; prompt `Post this reviewed update to YouTrack and log the approved time?`; options `Post and log time` and `Cancel`. On confirm:
|
|
90
90
|
|
|
91
|
-
`
|
|
91
|
+
`workit_youtrack_post` with `confirmed: true`, `issueId`, `markdown`, `minutes`. **Do not pass `date`.**
|
|
92
92
|
|
|
93
|
-
If the result has `partial: true`, the comment already posted. Report the time-log failure and retry only with `
|
|
93
|
+
If the result has `partial: true`, the comment already posted. Report the time-log failure and retry only with `workit_youtrack_log_time` using the same `issueId` and `minutes`; never call `workit_youtrack_post` again.
|
|
94
94
|
|
|
95
95
|
## Rules
|
|
96
96
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# YouTrack update style (Cristhofer / es-CL)
|
|
2
2
|
|
|
3
|
-
Use when writing or polishing the comment body before `
|
|
3
|
+
Use when writing or polishing the comment body before `workit_youtrack_draft`. **Preserve the author's voice** — like the ChatGPT revision thread: grammar, flow, and light structure, not a changelog.
|
|
4
4
|
|
|
5
5
|
## Audience
|
|
6
6
|
|
|
@@ -16,7 +16,7 @@ If unsure, call `workit_status`. Stop if `ready: false`.
|
|
|
16
16
|
|
|
17
17
|
## Step 1 — Context (required)
|
|
18
18
|
|
|
19
|
-
Call MCP `
|
|
19
|
+
Call MCP `workit_youtrack_context` with `mode: "meetings"` (no `issue_id` yet). Stop on error.
|
|
20
20
|
|
|
21
21
|
## Step 2 — Pick meeting type (required)
|
|
22
22
|
|
|
@@ -30,7 +30,7 @@ Use native **AskQuestion** with `meetingOptions` from context:
|
|
|
30
30
|
|
|
31
31
|
## Step 3 — Duration
|
|
32
32
|
|
|
33
|
-
Ask how much meeting time today (English UI). User text → `
|
|
33
|
+
Ask how much meeting time today (English UI). User text → `workit_youtrack_parse_duration`. **Do not compute minutes yourself.**
|
|
34
34
|
|
|
35
35
|
## Step 4 — Preview + confirm
|
|
36
36
|
|
|
@@ -40,9 +40,9 @@ Use native **AskQuestion** to confirm logging the shown meeting time; on yes:
|
|
|
40
40
|
|
|
41
41
|
## Step 5 — Log time only
|
|
42
42
|
|
|
43
|
-
Call `
|
|
43
|
+
Call `workit_youtrack_log_time` with `issueId`, `minutes`, `text` (from `workItemText`). **Do not pass `date`** — tool uses epoch ms automatically.
|
|
44
44
|
|
|
45
|
-
**Never** call `
|
|
45
|
+
**Never** call `workit_youtrack_post` from this skill.
|
|
46
46
|
|
|
47
47
|
## Rules
|
|
48
48
|
|
package/skills/wk-pr/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-pr
|
|
3
|
-
description: Draft or create PR/MR via
|
|
3
|
+
description: Draft or create PR/MR via workit_pr_context + glab/gh. Squash on merge + delete source branch. Use /wk-pr.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# PR — Draft or Create
|
|
@@ -9,13 +9,13 @@ Draft a merge request / pull request body, or create it on GitLab (`glab`) / Git
|
|
|
9
9
|
|
|
10
10
|
**Setup:** `/wk-init` → pick provider → VCS scaffold → edit active token file.
|
|
11
11
|
|
|
12
|
-
**Active provider:** read `vcs_config.provider` from `
|
|
12
|
+
**Active provider:** read `vcs_config.provider` from `workit_pr_context` (or `provider` in `~/.config/workit/vcs.json`). That decides `glab` vs `gh`.
|
|
13
13
|
|
|
14
14
|
## Step 1 — Gather facts (required)
|
|
15
15
|
|
|
16
|
-
Call MCP `
|
|
16
|
+
Call MCP `workit_pr_context` with **no `range` argument** unless the user supplied an explicit git range string.
|
|
17
17
|
|
|
18
|
-
**Repository calls:** For every repository-scoped `
|
|
18
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
19
19
|
|
|
20
20
|
On `feature/*` or `bugfix/*`, the tool compares **only against `develop`** (never `main`).
|
|
21
21
|
|
|
@@ -62,9 +62,9 @@ Body:
|
|
|
62
62
|
|
|
63
63
|
Use native `AskQuestion`: title `Create MR/PR`; prompt `Create the reviewed MR/PR now?`; options `Create` and `Cancel`. On `Create`:
|
|
64
64
|
|
|
65
|
-
`
|
|
65
|
+
`workit_pr_create` with `confirmed: true`, `title`, `body`, optional `target_branch` (defaults from vcs.json).
|
|
66
66
|
|
|
67
|
-
**On failure:** show the tool `error` / `stderr` / `hint` and stop. **Never** fall back to running `glab` or `gh` in the shell — creation must go through `
|
|
67
|
+
**On failure:** show the tool `error` / `stderr` / `hint` and stop. **Never** fall back to running `glab` or `gh` in the shell — creation must go through `workit_pr_create` only.
|
|
68
68
|
|
|
69
69
|
Creation uses vcs.json flags (both default `true`):
|
|
70
70
|
|
|
@@ -86,5 +86,5 @@ GitHub: use **Squash and merge** + **Delete branch** in the UI (or `gh pr merge
|
|
|
86
86
|
|
|
87
87
|
- Do not edit product files in this skill (except user asks to fix PR template).
|
|
88
88
|
- Never paste VCS tokens in chat.
|
|
89
|
-
- **Never run `glab` or `gh` directly** — only `
|
|
89
|
+
- **Never run `glab` or `gh` directly** — only `workit_pr_create`.
|
|
90
90
|
- Do not claim validation passed unless evidence exists.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-release-notes
|
|
3
|
-
description: Draft release notes via
|
|
3
|
+
description: Draft release notes via workit_release_notes_context. Use for /wk-release-notes or "draft release notes".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Release Notes — User-Facing Release Notes
|
|
@@ -11,9 +11,9 @@ Draft release notes for a given release, version, tag, or commit range.
|
|
|
11
11
|
|
|
12
12
|
If the user did not provide an exact tag, version, or commit range, ask for it before calling the tool.
|
|
13
13
|
|
|
14
|
-
Call MCP tool `
|
|
14
|
+
Call MCP tool `workit_release_notes_context` with arguments from the user's message (range, version, paths, etc.).
|
|
15
15
|
|
|
16
|
-
**Repository calls:** For every repository-scoped `
|
|
16
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
17
17
|
|
|
18
18
|
Use the tool return value as ground truth. Do not read git, run npm, or infer repo state yourself.
|
|
19
19
|
If the tool errors, report the error and stop.
|
|
@@ -82,4 +82,4 @@ Use `items[youtrack_token].token_create_url` / `token_edit_path`, or top-level `
|
|
|
82
82
|
|
|
83
83
|
- Do not call YouTrack HTTP directly — `workit_status` includes verify.
|
|
84
84
|
- Do not ask user to paste token — point them to edit the token file if `placeholder: true`.
|
|
85
|
-
- Optional: `
|
|
85
|
+
- Optional: `workit_youtrack_verify_token` only if user asks to re-test API alone.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wk-verify
|
|
3
|
-
description: Run project validation via
|
|
3
|
+
description: Run project validation via workit_verify MCP tool. Use for /wk-verify or when user says "use verify skill".
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,9 +10,9 @@ Run the repository's validation checks and report exact results.
|
|
|
10
10
|
|
|
11
11
|
## Step 1 — Gather facts (required)
|
|
12
12
|
|
|
13
|
-
Call MCP tool `
|
|
13
|
+
Call MCP tool `workit_verify` with arguments from the user's message (range, version, paths, etc.).
|
|
14
14
|
|
|
15
|
-
**Repository calls:** For every repository-scoped `
|
|
15
|
+
**Repository calls:** For every repository-scoped `workit_*` call, pass the active Cursor workspace as `workspace_root`; never rely on the MCP process default.
|
|
16
16
|
|
|
17
17
|
Use the tool return value as ground truth. Do not read git, run npm, or infer repo state yourself.
|
|
18
18
|
If the tool errors, report the error and stop.
|
|
@@ -63,7 +63,7 @@ digraph process {
|
|
|
63
63
|
"Read plan, note context and global constraints, create todos" [shape=box];
|
|
64
64
|
"More tasks remain?" [shape=diamond];
|
|
65
65
|
"Dispatch final code reviewer subagent (../requesting-code-review/code-reviewer.md)" [shape=box];
|
|
66
|
-
"Run verification, then
|
|
66
|
+
"Run verification, then workit_plan_complete once the ledger is complete and verification passes" [shape=box];
|
|
67
67
|
"Use superpowers:finishing-a-development-branch" [shape=box style=filled fillcolor=lightgreen];
|
|
68
68
|
|
|
69
69
|
"Read plan, note context and global constraints, create todos" -> "Dispatch implementer subagent (./implementer-prompt.md)";
|
|
@@ -79,12 +79,12 @@ digraph process {
|
|
|
79
79
|
"Mark task complete in todo list and progress ledger" -> "More tasks remain?";
|
|
80
80
|
"More tasks remain?" -> "Dispatch implementer subagent (./implementer-prompt.md)" [label="yes"];
|
|
81
81
|
"More tasks remain?" -> "Dispatch final code reviewer subagent (../requesting-code-review/code-reviewer.md)" [label="no"];
|
|
82
|
-
"Dispatch final code reviewer subagent (../requesting-code-review/code-reviewer.md)" -> "Run verification, then
|
|
83
|
-
"Run verification, then
|
|
82
|
+
"Dispatch final code reviewer subagent (../requesting-code-review/code-reviewer.md)" -> "Run verification, then workit_plan_complete once the ledger is complete and verification passes";
|
|
83
|
+
"Run verification, then workit_plan_complete once the ledger is complete and verification passes" -> "Use superpowers:finishing-a-development-branch";
|
|
84
84
|
}
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
**Mandatory completion:** after the final whole-branch review, run repository verification. Once the SDD ledger is complete and verification passes, end the run by calling `
|
|
87
|
+
**Mandatory completion:** after the final whole-branch review, run repository verification. Once the SDD ledger is complete and verification passes, end the run by calling `workit_plan_complete` (or the CLI `workit flow complete`) — a complete ledger and green verification are the tool's gates. Never finish while the plan is still `active`.
|
|
88
88
|
|
|
89
89
|
## Pre-Flight Plan Review
|
|
90
90
|
|