@stylusnexus/work-plan 2026.6.9 → 2026.6.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/README.md +91 -13
- package/VERSION +1 -1
- package/bin/work-plan +23 -0
- package/package.json +2 -2
- package/skills/work-plan/SKILL.md +41 -8
- package/skills/work-plan/commands/auto_triage.py +243 -0
- package/skills/work-plan/commands/batch_slot.py +184 -0
- package/skills/work-plan/commands/brief.py +6 -6
- package/skills/work-plan/commands/canonicalize.py +71 -17
- package/skills/work-plan/commands/close.py +21 -6
- package/skills/work-plan/commands/coverage.py +100 -0
- package/skills/work-plan/commands/duplicates.py +21 -8
- package/skills/work-plan/commands/group.py +86 -10
- package/skills/work-plan/commands/handoff.py +17 -5
- package/skills/work-plan/commands/hygiene.py +29 -3
- package/skills/work-plan/commands/init.py +39 -7
- package/skills/work-plan/commands/init_repo.py +43 -1
- package/skills/work-plan/commands/list_cmd.py +34 -6
- package/skills/work-plan/commands/move.py +131 -0
- package/skills/work-plan/commands/new_track.py +100 -23
- package/skills/work-plan/commands/reconcile.py +175 -33
- package/skills/work-plan/commands/refresh_md.py +19 -6
- package/skills/work-plan/commands/set_field.py +17 -7
- package/skills/work-plan/commands/slot.py +20 -5
- package/skills/work-plan/commands/where_was_i.py +23 -5
- package/skills/work-plan/lib/config.py +6 -0
- package/skills/work-plan/lib/export_model.py +57 -2
- package/skills/work-plan/lib/github_state.py +54 -13
- package/skills/work-plan/lib/notes_readme.py +38 -0
- package/skills/work-plan/lib/prompts.py +34 -3
- package/skills/work-plan/lib/tracks.py +208 -18
- package/skills/work-plan/tests/test_auto_triage.py +351 -0
- package/skills/work-plan/tests/test_batch_slot.py +291 -0
- package/skills/work-plan/tests/test_close_tier.py +166 -0
- package/skills/work-plan/tests/test_config_shared.py +57 -0
- package/skills/work-plan/tests/test_coverage.py +192 -0
- package/skills/work-plan/tests/test_export.py +204 -1
- package/skills/work-plan/tests/test_export_command.py +2 -2
- package/skills/work-plan/tests/test_github_state.py +52 -14
- package/skills/work-plan/tests/test_group_apply.py +411 -0
- package/skills/work-plan/tests/test_init_repo.py +128 -0
- package/skills/work-plan/tests/test_init_shared.py +185 -0
- package/skills/work-plan/tests/test_list_sort.py +162 -0
- package/skills/work-plan/tests/test_move.py +240 -0
- package/skills/work-plan/tests/test_new_track.py +169 -4
- package/skills/work-plan/tests/test_notes_readme.py +78 -0
- package/skills/work-plan/tests/test_prompts.py +121 -0
- package/skills/work-plan/tests/test_reconcile_move.py +154 -0
- package/skills/work-plan/tests/test_reconcile_readonly.py +92 -0
- package/skills/work-plan/tests/test_track_resolution.py +295 -0
- package/skills/work-plan/tests/test_tracks.py +395 -1
- package/skills/work-plan/tests/test_where_was_i.py +135 -0
- package/skills/work-plan/work_plan.py +38 -18
|
@@ -31,6 +31,8 @@ SUBCOMMANDS = {
|
|
|
31
31
|
"orient": "commands.where_was_i",
|
|
32
32
|
"--orient": "commands.where_was_i", # flag-style alias
|
|
33
33
|
"slot": "commands.slot",
|
|
34
|
+
"batch-slot": "commands.batch_slot",
|
|
35
|
+
"move": "commands.move",
|
|
34
36
|
"close": "commands.close",
|
|
35
37
|
"refresh-md": "commands.refresh_md",
|
|
36
38
|
"list": "commands.list_cmd",
|
|
@@ -38,9 +40,11 @@ SUBCOMMANDS = {
|
|
|
38
40
|
"init-repo": "commands.init_repo",
|
|
39
41
|
"suggest-priorities": "commands.suggest_priorities",
|
|
40
42
|
"group": "commands.group",
|
|
43
|
+
"auto-triage": "commands.auto_triage",
|
|
41
44
|
"reconcile": "commands.reconcile",
|
|
42
45
|
"--reconcile": "commands.reconcile", # flag-style alias
|
|
43
46
|
"duplicates": "commands.duplicates",
|
|
47
|
+
"coverage": "commands.coverage",
|
|
44
48
|
"canonicalize": "commands.canonicalize",
|
|
45
49
|
"hygiene": "commands.hygiene",
|
|
46
50
|
"--hygiene": "commands.hygiene", # flag-style alias
|
|
@@ -62,25 +66,33 @@ DESCRIPTIONS = [
|
|
|
62
66
|
"Wrap up a session: capture touched/next/blockers, update body status table. Use --set-next to set the next_up list explicitly. Use --auto-next to suggest a priority-sorted list from open issues (interactive: apply / edit / skip).",
|
|
63
67
|
"Ending a work block — before stepping away, going to bed, or switching tracks. Use --auto-next when you don't want to hand-pick issue numbers.",
|
|
64
68
|
"/work-plan handoff tabletop --auto-next"),
|
|
65
|
-
("where-was-i", "[track] [--pick]",
|
|
66
|
-
"Re-orient. With a track name: track paste-block. With no args: cwd snapshot (branch, recent commits, modified files). Add --pick to force the interactive track picker.",
|
|
69
|
+
("where-was-i", "[track | track@repo] [--pick] [--repo=<key>]",
|
|
70
|
+
"Re-orient. With a track name: track paste-block. With no args: cwd snapshot (branch, recent commits, modified files). Add --pick to force the interactive track picker. Use --repo=<key> or track@repo to disambiguate when the same track slug exists in multiple repos.",
|
|
67
71
|
"Switching to a fresh Claude Code session — either on a known track or in a directory that doesn't yet belong to one.",
|
|
68
72
|
"/work-plan where-was-i ux-redesign (or just `/work-plan orient` for cwd snapshot)"),
|
|
69
|
-
("slot", "<issue-num> [track]",
|
|
70
|
-
"Add a GitHub issue to a track's frontmatter. If the issue is already in another active track in the same repo, prompts to move it (remove from source) rather than duplicate.",
|
|
73
|
+
("slot", "<issue-num> [track | track@repo] [--repo=<key>]",
|
|
74
|
+
"Add a GitHub issue to a track's frontmatter. If the issue is already in another active track in the same repo, prompts to move it (remove from source) rather than duplicate. Use --repo=<key> or track@repo to disambiguate when the same track slug exists in multiple repos.",
|
|
71
75
|
"When a new GitHub issue is filed and you want it associated with a track — or when an existing issue was relabeled and needs to move tracks.",
|
|
72
76
|
"/work-plan slot 4234 tabletop"),
|
|
73
|
-
("
|
|
74
|
-
"
|
|
77
|
+
("batch-slot", "<issue-num>... <track | track@repo> [--repo=<key>] [--move|--no-move]",
|
|
78
|
+
"Slot multiple GitHub issues into a track at once. The last positional argument is the track; everything before it is an issue number. Skips issues already in the track. Use --move to remove issues from any prior owning tracks.",
|
|
79
|
+
"After bulk-triage with auto-triage or group — when several issues need the same track assignment.",
|
|
80
|
+
"/work-plan batch-slot 100 101 102 tabletop --move"),
|
|
81
|
+
("move", "<issue-num> <from-track> <to-track> [--repo=<key>]",
|
|
82
|
+
"Move an issue from one track to another (remove from source frontmatter, add to destination). Source-first — the verb is the intent. Both tracks must be active and in the same repo.",
|
|
83
|
+
"When an issue belongs in a different track than where it currently sits — cleaner than slot --move.",
|
|
84
|
+
"/work-plan move 4234 platform-health org-sharing"),
|
|
85
|
+
("close", "<track | track@repo> [--repo=<key>]",
|
|
86
|
+
"Retire a track: shipped / parked / abandoned. Moves to archive/. Use --repo=<key> or track@repo to disambiguate when the same track slug exists in multiple repos.",
|
|
75
87
|
"When a track is done, paused, or won't ship — frees mental space.",
|
|
76
88
|
"/work-plan close tabletop"),
|
|
77
89
|
("refresh-md", "<track> | --all | --repo=<key> [--yes]",
|
|
78
90
|
"Update issue STATE (open/closed, status labels) inside the track body's status table. Does not change track membership.",
|
|
79
91
|
"Usually NOT needed directly: `handoff` already refreshes the body table for its own track, and `brief` reads GitHub live. Reach for this when a sibling track has drifted because you haven't `handoff`'d it lately. `--all` sweeps every active track; `--repo=<key>` scopes the sweep to one repo (also runs as part of weekly `hygiene`).",
|
|
80
92
|
"/work-plan refresh-md --repo=critforge"),
|
|
81
|
-
("list", "[--all]",
|
|
93
|
+
("list", "[--all] [--sort=recent|priority]",
|
|
82
94
|
"List active tracks (or all including parked/archived).",
|
|
83
|
-
"Quick scan of what tracks exist; --all to see archived.",
|
|
95
|
+
"Quick scan of what tracks exist; --all to see archived. --sort orders by last_touched recency or launch_priority.",
|
|
84
96
|
"/work-plan list --all"),
|
|
85
97
|
("init", "<path-to-md>",
|
|
86
98
|
"Add frontmatter to an existing track .md file.",
|
|
@@ -94,31 +106,39 @@ DESCRIPTIONS = [
|
|
|
94
106
|
"AI-assisted batch backfill of priority/PN labels.",
|
|
95
107
|
"ONE-TIME setup, or whenever a wave of new unlabeled issues piles up.",
|
|
96
108
|
"/work-plan suggest-priorities --repo=myproject"),
|
|
97
|
-
("group", "[--milestone=X] [--label=Y] [--repo=Z] [--apply]",
|
|
98
|
-
"AI-cluster GitHub issues into thematic track files.",
|
|
109
|
+
("group", "[--milestone=X] [--label=Y] [--repo=Z] [--apply] [--limit=N]",
|
|
110
|
+
"AI-cluster GitHub issues into thematic track files. --limit controls how many issues are shown in the prompt (default 100).",
|
|
99
111
|
"ONE-TIME bulk organization of an unsorted milestone, or after a re-org.",
|
|
100
112
|
"/work-plan group --milestone='v1.0.0 — Public Launch'"),
|
|
101
|
-
("
|
|
102
|
-
"
|
|
113
|
+
("auto-triage", "[--repo=<key>] [--apply] [--limit=N]",
|
|
114
|
+
"AI-assign untracked open issues to existing tracks. Step 1 (no --apply): fetches untracked issues + existing tracks, prints AI prompt. Step 2 (--apply): reads AI's JSON answers and slots each assignment into track frontmatter. Complements `group` (which creates new tracks); `auto-triage` assigns to tracks that already exist. --limit controls how many untracked issues are shown (default 100).",
|
|
115
|
+
"Periodically — when new issues have piled up outside the track model. Run /work-plan coverage first to confirm there's a gap worth triaging.",
|
|
116
|
+
"/work-plan auto-triage --repo=critforge"),
|
|
117
|
+
("reconcile", "<track> | --all | --repo=<key> [--draft] [--yes]",
|
|
118
|
+
"Update track MEMBERSHIP (the `github.issues` list in frontmatter) by syncing it against a GitHub label. Default label is `track/<slug>`; override per-track via `github.labels: [...]` in frontmatter. Read-only on GitHub. In an --all/--repo sweep it also detects MOVEs — an issue relabeled from one track to another in the same repo is moved (removed from the old track, added to the new). Add --draft to preview proposed ADDs/MOVEs/FLAGs without prompting or writing; add --yes to apply without prompting (non-interactive, e.g. from the VS Code extension; PUBLIC-repo move destinations are skipped under --yes). NOT for hand-curated tracks — see `refresh-md` if you only want to update issue state.",
|
|
103
119
|
"WEEKLY hygiene on label-driven tracks — pulls labeled issues into their tracks, flags un-labeled ones. Use --repo=<key> to scope the sweep to one repo. Skip on hand-curated tracks (it'll propose dropping curated issues every run).",
|
|
104
120
|
"/work-plan reconcile --repo=critforge --draft"),
|
|
105
|
-
("duplicates", "[--min-similarity=0.7] [--limit=20] [--state=open]",
|
|
121
|
+
("duplicates", "[--min-similarity=0.7] [--limit=20] [--state=open] [--timeout=N]",
|
|
106
122
|
"Find likely-duplicate issues by title similarity.",
|
|
107
123
|
"WEEKLY hygiene, or before a milestone planning session — find consolidation candidates.",
|
|
108
124
|
"/work-plan duplicates --min-similarity=0.85"),
|
|
109
|
-
("
|
|
110
|
-
"
|
|
125
|
+
("coverage", "[--repo=<key>] [--list] [--limit=N]",
|
|
126
|
+
"Report how many open issues are not referenced by any track (per repo). --list prints issue titles (default: show 20; override with --limit=N). Read-only; derives live from gh.",
|
|
127
|
+
"On-demand: measure how much of a repo's backlog has fallen outside the planning layer. Pairs with /work-plan group to bulk-cluster the orphans.",
|
|
128
|
+
"/work-plan coverage --repo=critforge --list"),
|
|
129
|
+
("canonicalize", "<track | track@repo> | --all [--force] [--repo=<key>]",
|
|
130
|
+
"Insert a canonical master issue table at the top of a track. Refresh-md then targets ONLY this table, leaving narrative tables alone. Use --repo=<key> or track@repo to disambiguate; with --all, --repo=<key> scopes to one repo.",
|
|
111
131
|
"ONE-TIME for hand-written tracks with multiple narrative tables, OR after restructuring a track.",
|
|
112
132
|
"/work-plan canonicalize ux-redesign"),
|
|
113
|
-
("hygiene", "[--yes] [--no-duplicates] [--repo=<key>]",
|
|
114
|
-
"Weekly cleanup wrapper: refresh-md + reconcile + duplicates. With --repo=<key>, steps 1 and 2 scope to that repo; the duplicates step (a global similarity scan) is skipped.",
|
|
133
|
+
("hygiene", "[--yes] [--no-duplicates] [--repo=<key>] [--timeout=N]",
|
|
134
|
+
"Weekly cleanup wrapper: refresh-md + reconcile + duplicates. With --repo=<key>, steps 1 and 2 scope to that repo; the duplicates step (a global similarity scan) is skipped. --timeout=N sets the gh subprocess timeout for the duplicates step (default 30s).",
|
|
115
135
|
"WEEKLY — runs all three hygiene commands in sequence so you don't have to remember each. Use --repo=<key> to clean up one project without touching the others.",
|
|
116
136
|
"/work-plan hygiene --repo=critforge"),
|
|
117
137
|
("export", "--json",
|
|
118
138
|
"Emit the viewer-ready JSON read surface (schema 1): every frontmatter'd track with repo, tier, status, visibility, blockers, next_up, an open/closed rollup, and per-issue state/assignee/milestone. Read-only; derives live from gh. Consumed by the VS Code extension.",
|
|
119
139
|
"When a tool (the VS Code viewer, or any script) needs structured track state instead of the human-facing brief/orient text.",
|
|
120
140
|
"/work-plan export --json"),
|
|
121
|
-
("set", "<track> field=value [field=value …] [--confirm=<token>]",
|
|
141
|
+
("set", "<track | track@repo> field=value [field=value …] [--repo=<key>] [--confirm=<token>]",
|
|
122
142
|
"Guarded edit of a track's frontmatter fields (status, launch_priority, milestone_alignment, blockers, next_up). Validates field names + status values; blockers/next_up take comma-separated issue numbers. Writes into a PUBLIC repo only with a confirm token: without one it prints {needs_confirm, reason, token} and makes no change (the VS Code viewer surfaces that as a modal, then re-invokes with --confirm=<token>).",
|
|
123
143
|
"Programmatic/GUI edits that have no dedicated verb — e.g. the VS Code extension changing a status or blockers list. On the terminal you'll usually use the named verbs instead.",
|
|
124
144
|
"/work-plan set ux-redesign status=parked"),
|