feat(cli): Remove Taskless from unchecked tool locations#22
Merged
Conversation
Make the `taskless init` wizard's tool-selection step manifest-aware so unchecking a location removes Taskless's stubs from it. Previously the multiselect pre-checked detected tools only, so a location Taskless had installed into — notably `.agents/`, which has no detection signal of its own — could not be unchecked, leaving the removal path the install engine already supports unreachable from the UI. - Pre-check the union of manifest-recorded and detected directories, so an installed location shows checked and can be unchecked. - Hint each entry by origin: `installed`, `detected`, or `not detected`. - Itemize the removal confirmation per target (e.g. "Remove Taskless from .claude/ (2 stubs)?") instead of a generic prompt. The removal engine itself is unchanged — this only surfaces it. The non-interactive paths and the canonical `.taskless/` store are untouched. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates the interactive taskless init wizard to make install-location selection “manifest-aware”, so locations that Taskless previously installed into are pre-checked and can be unchecked to trigger the existing manifest-diff removal behavior. It also improves the summary-step removal confirmation by itemizing removals per target directory with stub counts.
Changes:
- Make
locationChoicespre-check the union of detected tool directories and manifest-recorded install targets (excluding the canonical.tasklessstore), and addinstalled/detected/not detectedorigin hints. - Update
promptLocationsto read install state and pass manifest targets intolocationChoices. - Itemize the summary removal confirmation message per target (with tests + end-to-end coverage for “uncheck removes stubs” and “decline keeps stubs”).
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/cli/src/wizard/steps/locations.ts | Reads install state and pre-checks union of detected + manifest targets; adds origin hints. |
| packages/cli/src/wizard/steps/summary.ts | Builds an itemized “remove stubs” confirmation message from diff entries. |
| packages/cli/test/wizard-steps.test.ts | Adds unit tests for manifest-aware pre-checking and itemized removal confirm message. |
| packages/cli/test/wizard-integration.test.ts | Adds end-to-end coverage for uninstall-on-uncheck and decline-keeps-stubs flows. |
| openspec/changes/uninstall-unchecked-locations/** | Proposal/design/spec/task artifacts documenting the behavior change. |
| .changeset/uninstall-unchecked-locations.md | Patch changeset describing the CLI behavior update. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Move the completed change under openspec/changes/archive/ and sync the two modified cli-init requirements into the main spec. Satisfies the PR OpenSpec archive gate. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
buildRemovalConfirmMessage used the same "Remove Taskless from …" wording for every diff entry. A diff carrying canonical-store removals (e.g. a legacy v0.6→v0.7 upgrade) would render "Remove Taskless from .taskless/ …", which is misleading — that is not an uninstall of a tool location. Skip canonical entries in the itemized list and fall back to a generic prompt when only canonical removals are present. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Make the
taskless initwizard's tool-selection step manifest-aware so unchecking a location removes Taskless's stubs from it. This makes it easy to centralize on one location (e.g..agents/) and drop the shims from other tools.Previously the multiselect pre-checked detected tools only. A location Taskless had installed into — notably
.agents/, which has no detection signal of its own — would render unchecked, so it could not be meaningfully unchecked. The install engine already performs manifest-diffed, target-scoped removal behind a confirm prompt; that path was simply unreachable from the UI because the manifest never reached the multiselect's pre-checked state.What changes:
installed(in the manifest, takes precedence),detected, ornot detected..claude/(2 stubs)?") instead of a generic single-line prompt.The removal engine itself (
applyInstallPlan,computeInstallDiff) is unchanged — this only surfaces existing capability. The non-interactiveinit --no-interactive/updatepaths and the canonical.taskless/store are untouched. Full uninstall (removing the canonical store) is explicitly out of scope.Review notes:
locationChoicesis kept pure —promptLocationsdoes the manifest I/O and passes the target list in, so the detection-and-manifest-to-choices mapping stays unit-testable..tasklesstarget has skill removals, so the itemized prompt would read "Remove Taskless from .taskless/ (N stubs)" — slightly off wording for canonical full files. Harmless and out of scope here.The OpenSpec change artifacts (
openspec/changes/uninstall-unchecked-locations/) are included for the proposal, design, andcli-initspec delta.