Skip to content

Commit bccc574

Browse files
author
BumpyClock
committed
Bypass init wizard for explicit skill action flags
Update docs and tests to clarify that --install-skill and --uninstall-skill now skip auto-wizard mode unless --wizard is specified. Clean up skill package docs and installer references.
1 parent 9e910b5 commit bccc574

11 files changed

Lines changed: 44 additions & 24 deletions

File tree

.tasque/events.jsonl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,3 +1011,6 @@
10111011
{"id":"01KHSCCH64WY6MW1GCM3RM55NK","event_id":"01KHSCCH64WY6MW1GCM3RM55NK","ts":"2026-02-18T22:02:02.308Z","actor":"BumpyClock","type":"task.created","task_id":"tsq-3r9qk99s","payload":{"id":"tsq-3r9qk99s","title":"Refactor skill installer to copy SKILLS/<name> source directory","kind":"task","priority":1,"status":"open","planning_state":"planned"}}
10121012
{"id":"01KHSCCQWT4JKXY3EVCHSGRZTJ","event_id":"01KHSCCQWT4JKXY3EVCHSGRZTJ","ts":"2026-02-18T22:02:09.178Z","actor":"BumpyClock","type":"task.claimed","task_id":"tsq-3r9qk99s","payload":{"assignee":"codex"}}
10131013
{"id":"01KHSDRYBYVR8J2QMSVT6QHABR","event_id":"01KHSDRYBYVR8J2QMSVT6QHABR","ts":"2026-02-18T22:26:17.598Z","actor":"BumpyClock","type":"task.status_set","task_id":"tsq-3r9qk99s","payload":{"status":"closed","closed_at":"2026-02-18T22:26:17.598Z"}}
1014+
{"id":"01KHSFP1H5PGGDMVRM1ZXNSB70","event_id":"01KHSFP1H5PGGDMVRM1ZXNSB70","ts":"2026-02-18T22:59:39.685Z","actor":"BumpyClock","type":"task.created","task_id":"tsq-zzzkgbpf","payload":{"id":"tsq-zzzkgbpf","title":"Bypass init wizard when explicit skill action flags are passed","kind":"task","priority":1,"status":"open","planning_state":"planned"}}
1015+
{"id":"01KHSFP922YYP8HQAN0541D4ZQ","event_id":"01KHSFP922YYP8HQAN0541D4ZQ","ts":"2026-02-18T22:59:47.394Z","actor":"BumpyClock","type":"task.claimed","task_id":"tsq-zzzkgbpf","payload":{"assignee":"codex"}}
1016+
{"id":"01KHSFV4SQ553CAX9J1HSG61J8","event_id":"01KHSFV4SQ553CAX9J1HSG61J8","ts":"2026-02-18T23:02:26.871Z","actor":"BumpyClock","type":"task.status_set","task_id":"tsq-zzzkgbpf","payload":{"status":"closed","closed_at":"2026-02-18T23:02:26.871Z"}}

LEARNINGS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
## Init UX
4343
- Wizard contract baseline: run `tsq init` wizard only on TTY by default; `--no-wizard` is authoritative; `--wizard` is TTY-only; non-interactive agent flows must remain fully deterministic via flags.
4444
- Refined wizard UX contract (docs/design/init-wizard-design.md): preserve a 4-step max flow, always show resolved plan before writes, treat `--yes` as wizard auto-accept (no-op outside wizard), and keep preset semantics deterministic (`minimal`, `standard`, `full`) with explicit-flags-over-preset precedence.
45+
- Explicit skill actions (`--install-skill` / `--uninstall-skill`) should bypass auto-wizard mode so `tsq init` executes immediately; `--wizard` is still available to force interactive flow.
4546

4647
## Recent Updates
4748
- 2026-02-18: Event parsing now uses Zod at JSONL boundaries; canonical event field is `id` while reads still accept legacy `event_id`.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ Skill installer via `init`:
163163

164164
- `tsq init --install-skill`
165165
- `tsq init --uninstall-skill`
166+
- Explicit `--install-skill` / `--uninstall-skill` bypasses auto-wizard mode by default. Use `--wizard` if you want interactive prompts.
166167
- `--skill-targets claude,codex,copilot,opencode|all` (default `all`)
167168
- `--skill-name <name>` (default `tasque`)
168169
- `--force-skill-overwrite` (overwrite unmanaged skill dirs)

SKILLS/tasque/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ Managed skill package for `tsq`.
55

66
## Files
77

8-
- `SKILL.md`: focused operational guide for `tsq` (load first)
9-
- `README.md`: installer metadata and summary
10-
- `references/`: optional deep-dive docs (planning, command catalog, durability, checklists)
8+
- `SKILL.md`: operational guide for `tsq`
9+
- `README.md`: installer metadata and managed marker
10+
- `references/`: additional docs copied during install
1111
- `scripts/`: optional helper scripts copied during install
1212

1313
## Safety

SKILLS/tasque/SKILL.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,20 @@ description: Operational guide for Tasque (tsq) local task tracking and manageme
55

66
<!-- tsq-managed-skill:v1 -->
77

8-
8+
Graph-based issue tracker that survives conversation compaction. Provides persistent memory for multi-session work with complex dependencies.
9+
10+
**When to use tsq**:
11+
- Work spans multiple sessions or days
12+
- Tasks have dependencies or blockers
13+
- Need to survive conversation compaction
14+
- Exploratory/research work with fuzzy boundaries
15+
- Collaboration with team (git sync)
16+
17+
**When to use native task tool**:
18+
- Single-session linear tasks
19+
- Simple checklist for immediate work
20+
- All context is in current conversation
21+
- Will complete within current session
922

1023
Durable task tracking via `tsq`.
1124

SKILLS/tasque/references/README.md

Lines changed: 0 additions & 8 deletions
This file was deleted.

SKILLS/tasque/scripts/README.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/cli/init-flow.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ export function resolveInitPlan(
8080
throw new TsqError("VALIDATION_ERROR", "--preset is not supported with --json", 1);
8181
}
8282

83-
const wizardEnabled = !hasNoWizard && (hasWizard || (context.isTTY && !context.json));
83+
const hasExplicitSkillAction = Boolean(options.installSkill || options.uninstallSkill);
84+
const wizardEnabled =
85+
!hasNoWizard && (hasWizard || (!hasExplicitSkillAction && context.isTTY && !context.json));
8486
if (!wizardEnabled) {
8587
return {
8688
mode: "non_interactive",

tests/cli.e2e.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,8 @@ describe("cli e2e", () => {
402402
const skillPath = join(rootDir, "tasque");
403403
expect(await pathExists(join(skillPath, "SKILL.md"))).toBe(true);
404404
expect(await pathExists(join(skillPath, "README.md"))).toBe(true);
405-
expect(await pathExists(join(skillPath, "references", "README.md"))).toBe(true);
406-
expect(await pathExists(join(skillPath, "scripts", "README.md"))).toBe(true);
405+
expect(await pathExists(join(skillPath, "references", "planning-workflow.md"))).toBe(true);
406+
expect(await pathExists(join(skillPath, "scripts"))).toBe(true);
407407
}
408408
});
409409

tests/cli.init-flow.test.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ describe("init flow resolution", () => {
6969
expect(plan.mode).toBe("non_interactive");
7070
});
7171

72+
it("disables auto wizard in tty mode when explicit skill action is provided", () => {
73+
const plan = resolve({ installSkill: true }, ["init", "--install-skill"], { isTTY: true });
74+
expect(plan.mode).toBe("non_interactive");
75+
if (plan.mode !== "non_interactive") {
76+
throw new Error("expected non_interactive mode");
77+
}
78+
expect(plan.input.installSkill).toBe(true);
79+
expect(plan.input.uninstallSkill).toBe(false);
80+
});
81+
7282
it("marks wizard plan as auto-accept when --yes is provided", () => {
7383
const plan = resolve({ yes: true }, ["init"], { isTTY: true });
7484
expect(plan.mode).toBe("wizard");
@@ -108,11 +118,12 @@ describe("init flow resolution", () => {
108118
["init", "--preset", "full", "--uninstall-skill"],
109119
{ isTTY: true },
110120
);
111-
expect(plan.mode).toBe("wizard");
112-
if (plan.mode !== "wizard") {
113-
throw new Error("expected wizard mode");
121+
expect(plan.mode).toBe("non_interactive");
122+
if (plan.mode !== "non_interactive") {
123+
throw new Error("expected non_interactive mode");
114124
}
115-
expect(plan.seed.action).toBe("uninstall");
125+
expect(plan.input.uninstallSkill).toBe(true);
126+
expect(plan.input.installSkill).toBe(false);
116127
});
117128

118129
it("uses explicit skill targets over preset defaults", () => {

0 commit comments

Comments
 (0)