diff --git a/.changeset/check-paths-outside-project.md b/.changeset/check-paths-outside-project.md deleted file mode 100644 index 6bdb905b..00000000 --- a/.changeset/check-paths-outside-project.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@taskless/cli": patch ---- - -`check` no longer reports a clean result for paths it never scanned. A path outside the project, existing or not, is refused with `INVALID_INPUT` and exit 1. A path that does not exist is still skipped with exit 0, so raw `git diff --name-only` output can still be piped in, but the skipped paths are now named in a notice (`notices` under `--json`). diff --git a/.changeset/feedback-channels.md b/.changeset/feedback-channels.md deleted file mode 100644 index b1475c22..00000000 --- a/.changeset/feedback-channels.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@taskless/cli": patch ---- - -An agent can now send the Taskless team general feedback (`taskless agent feedback`) or a bug report (`taskless agent bug-report`) on the user's behalf, without a GitHub account. Both show the user the exact payload and send only on their explicit yes, and both appear in the `taskless agent` index. A bug report's version information is filled in by the CLI from local state. The invited rule-authoring survey's recipe is renamed to `taskless agent rule-feedback`; its questions, invite, and cadence are unchanged. `feedback send` payloads now carry a required `kind` (`rule`, `general`, or `bug`). With telemetry disabled, nothing is sent and the CLI points to https://github.com/taskless/cli/issues instead. diff --git a/.changeset/rename-rule-checks.md b/.changeset/rename-rule-checks.md deleted file mode 100644 index e626de5f..00000000 --- a/.changeset/rename-rule-checks.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -"@taskless/cli": minor ---- - -**Breaking: the two rule-checking commands are renamed for the question each one answers.** - -| 0.13 | before 0.13 | question | -| ---------- | ----------- | ---------------------------------------------------------------------- | -| `validate` | `verify` | Is the rule well formed? Decided from its files alone. | -| `verify` | `test` | Does the rule check what you want? Runs `validate`, then the fixtures. | - -What to change: - -- **A call to `taskless test`** fails as an unknown command. Call `taskless verify`. The output is the same. -- **A call to `taskless verify`** still runs, but it now runs the rule's fixtures as well, so it is stricter and slower. For the old quick check, call `taskless validate`. The JSON envelope is unchanged. -- **A pre-commit hook installed from the `hooks` recipe** runs `taskless test` and fails after the upgrade until it says `taskless verify`. -- **The `verify-rule` agent topic** is now `validate-rule`. -- **The `./schemas` export `verifyTestOutputSchema`** is renamed `ruleCheckOutputSchema`, with no alias. The schema itself is unchanged. -- **`@taskless/cli/reference.json`** moves to `version` 3. Its shape is unchanged, but `enforcedBy` now reads `"validate"` or `"verify"`, so each value names a different command than it did in version 2. The corpus's own `version` is the signal a consumer should refuse on, not the package version. - -`validate` also catches more on an ast-grep rule: - -- It has ast-grep load the rule on its own, so a `kind` the grammar does not have (a keyword such as `readonly`, a Markdown inline construct such as `link`) is rejected under that rule's name, in ast-grep's own words. Before, it passed and then broke every `sg` rule's report in `check`. -- A top-level `strictness:` is rejected under the new constraint `sg-no-top-level-strictness`. ast-grep ignores the key there, so the pattern stayed narrowed while the rule read as fixed. -- It reports three silent authoring traps from `create-sg-rule` as notices, which never fail a rule: `$$$` beside a comma, `follows`/`precedes` without `stopBy: end`, and a callee `regex` that misses awaited generic calls in TypeScript and Tsx. - -`verify` runs an ast-grep rule's fixtures against a config holding only that rule, so another rule ast-grep refuses no longer fails it under the wrong name. - -Installed skills pin their CLI version, so a project keeps the old names until it upgrades, and the upgrade rewrites the skill with the new ones. diff --git a/.changeset/sg-empty-scope-notice.md b/.changeset/sg-empty-scope-notice.md deleted file mode 100644 index bdd4ae8f..00000000 --- a/.changeset/sg-empty-scope-notice.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@taskless/cli": patch ---- - -`taskless verify` (formerly `taskless test`) now says when an ast-grep rule's `files:`/`ignores:` globs match no file in the project. A fixture snippet has no path, so the globs never apply to it, and a rule scoped to `lib/**` in a project that keeps its code in `src/` used to pass `taskless test` while `check` never ran it. The rule still passes; the result carries a notice naming the globs, on the human output and in `notices` under `--json`. Rules scoped by `language:` alone are not checked, since a project with no code in that language is honestly clean. diff --git a/.changeset/sg-rule-quirks.md b/.changeset/sg-rule-quirks.md deleted file mode 100644 index 9909438d..00000000 --- a/.changeset/sg-rule-quirks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@taskless/cli": patch ---- - -`taskless agent create-sg-rule` now collects its ast-grep authoring traps into one **Quirks** section, and the recipe moves to topic v7. Each entry gives the symptom (a config error that aborts the scan, or a rule that silently matches nothing), a minimal repro, and the workaround, and the table says which ones `validate` reports. Two new entries: a keyword such as `readonly` is not a valid `kind` (read kinds from `--debug-query=ast`, not the CST dump), and in TypeScript and Tsx `await f(...)` parses as a call of the await expression, so a rule keyed on the callee silently skips every awaited generic call. Both workarounds cover the common shapes (`private readonly x`, optional and decorated parameters, method callees) and pass `verify`. diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 0c10eec1..175ec2d1 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "taskless", "description": "Taskless skills for code quality rules, authentication, and project management", - "version": "0.12.0", + "version": "0.13.0", "author": { "name": "Taskless" }, diff --git a/package.json b/package.json index 9b48c17c..631e4592 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@taskless/skills", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "repository": "taskless/cli.git", "scripts": { diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 13b07207..15a9d293 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,42 @@ # @taskless/cli +## 0.13.0 + +[Compare with v0.12.0](https://github.com/taskless/cli/compare/v0.12.0...v0.13.0) + +### Minor Changes + +- 6c661e9: **Breaking: the two rule-checking commands are renamed for the question each one answers.** + + | 0.13 | before 0.13 | question | + | ---------- | ----------- | ---------------------------------------------------------------------- | + | `validate` | `verify` | Is the rule well formed? Decided from its files alone. | + | `verify` | `test` | Does the rule check what you want? Runs `validate`, then the fixtures. | + + What to change: + - **A call to `taskless test`** fails as an unknown command. Call `taskless verify`. The output is the same. + - **A call to `taskless verify`** still runs, but it now runs the rule's fixtures as well, so it is stricter and slower. For the old quick check, call `taskless validate`. The JSON envelope is unchanged. + - **A pre-commit hook installed from the `hooks` recipe** runs `taskless test` and fails after the upgrade until it says `taskless verify`. + - **The `verify-rule` agent topic** is now `validate-rule`. + - **The `./schemas` export `verifyTestOutputSchema`** is renamed `ruleCheckOutputSchema`, with no alias. The schema itself is unchanged. + - **`@taskless/cli/reference.json`** moves to `version` 3. Its shape is unchanged, but `enforcedBy` now reads `"validate"` or `"verify"`, so each value names a different command than it did in version 2. The corpus's own `version` is the signal a consumer should refuse on, not the package version. + + `validate` also catches more on an ast-grep rule: + - It has ast-grep load the rule on its own, so a `kind` the grammar does not have (a keyword such as `readonly`, a Markdown inline construct such as `link`) is rejected under that rule's name, in ast-grep's own words. Before, it passed and then broke every `sg` rule's report in `check`. + - A top-level `strictness:` is rejected under the new constraint `sg-no-top-level-strictness`. ast-grep ignores the key there, so the pattern stayed narrowed while the rule read as fixed. + - It reports three silent authoring traps from `create-sg-rule` as notices, which never fail a rule: `$$$` beside a comma, `follows`/`precedes` without `stopBy: end`, and a callee `regex` that misses awaited generic calls in TypeScript and Tsx. + + `verify` runs an ast-grep rule's fixtures against a config holding only that rule, so another rule ast-grep refuses no longer fails it under the wrong name. + + Installed skills pin their CLI version, so a project keeps the old names until it upgrades, and the upgrade rewrites the skill with the new ones. + +### Patch Changes + +- 7140552: `check` no longer reports a clean result for paths it never scanned. A path outside the project, existing or not, is refused with `INVALID_INPUT` and exit 1. A path that does not exist is still skipped with exit 0, so raw `git diff --name-only` output can still be piped in, but the skipped paths are now named in a notice (`notices` under `--json`). +- eaa4061: An agent can now send the Taskless team general feedback (`taskless agent feedback`) or a bug report (`taskless agent bug-report`) on the user's behalf, without a GitHub account. Both show the user the exact payload and send only on their explicit yes, and both appear in the `taskless agent` index. A bug report's version information is filled in by the CLI from local state. The invited rule-authoring survey's recipe is renamed to `taskless agent rule-feedback`; its questions, invite, and cadence are unchanged. `feedback send` payloads now carry a required `kind` (`rule`, `general`, or `bug`). With telemetry disabled, nothing is sent and the CLI points to https://github.com/taskless/cli/issues instead. +- a36bab1: `taskless verify` (formerly `taskless test`) now says when an ast-grep rule's `files:`/`ignores:` globs match no file in the project. A fixture snippet has no path, so the globs never apply to it, and a rule scoped to `lib/**` in a project that keeps its code in `src/` used to pass `taskless test` while `check` never ran it. The rule still passes; the result carries a notice naming the globs, on the human output and in `notices` under `--json`. Rules scoped by `language:` alone are not checked, since a project with no code in that language is honestly clean. +- 7f66001: `taskless agent create-sg-rule` now collects its ast-grep authoring traps into one **Quirks** section, and the recipe moves to topic v7. Each entry gives the symptom (a config error that aborts the scan, or a rule that silently matches nothing), a minimal repro, and the workaround, and the table says which ones `validate` reports. Two new entries: a keyword such as `readonly` is not a valid `kind` (read kinds from `--debug-query=ast`, not the CST dump), and in TypeScript and Tsx `await f(...)` parses as a call of the await expression, so a rule keyed on the callee silently skips every awaited generic call. Both workarounds cover the common shapes (`private readonly x`, optional and decorated parameters, method callees) and pass `verify`. + ## 0.12.0 [Compare with v0.11.2](https://github.com/taskless/cli/compare/v0.11.2...v0.12.0) diff --git a/packages/cli/package.json b/packages/cli/package.json index 77484bce..7b3313b6 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@taskless/cli", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "repository": { "type": "git", diff --git a/skills/taskless/SKILL.md b/skills/taskless/SKILL.md index b9c4a9df..cf60aef0 100644 --- a/skills/taskless/SKILL.md +++ b/skills/taskless/SKILL.md @@ -22,7 +22,7 @@ description: | `agent route`; it does NOT suppress the skill. metadata: author: taskless - version: 0.12.0 + version: 0.13.0 commandName: tskl compatibility: Designed for Agents implementing the Agent Skills specification. ---