@taskless/cli 0.10.1 → 0.11.0

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.
@@ -0,0 +1,311 @@
1
+ /**
2
+ * What the two local engines can actually read.
3
+ *
4
+ * PURE DATA, DELIBERATELY. This module is imported by `src/prompts/recipes.ts`,
5
+ * which is a Worker-safe library surface — no citty, no telemetry, no
6
+ * filesystem, no network — and `assert-prompts-graph` in `vite.config.ts`
7
+ * fails the build if the prompts chunk's graph reaches a host capability. So
8
+ * nothing here may read `package.json`, spawn a binary, or import a node
9
+ * builtin. The values are transcribed once, here, and pinned by tests that do
10
+ * spawn the binaries.
11
+ *
12
+ * THE BINARIES ARE THE ONLY AUTHORITY, and neither of them can be asked at
13
+ * render time:
14
+ *
15
+ * - `src/generated/ast-grep-rule-schema.json` types `$defs.Language` as a bare
16
+ * string with no enum — its only hint is an `example` reading `"typescript"`,
17
+ * which is not even the canonical spelling — so the vendored schema cannot
18
+ * answer the question. `verify` answers it from the constants below instead
19
+ * (see `validateLanguage` in `verify.ts`).
20
+ * - `detect --json` reports the *repository's* languages in a different
21
+ * vocabulary — `C++` where ast-grep says `Cpp` — and says nothing about what
22
+ * an engine can parse.
23
+ * - Vale self-reports nothing at all. Its reach was measured by probing the
24
+ * shipped binary, which is why the Vale constants below carry a probe-shaped
25
+ * contract test rather than a parsed capability listing.
26
+ *
27
+ * BUMPING AN ENGINE IS A ONE-FILE EDIT. Change the version constant and the
28
+ * list beside it; `test/ast-grep-vendor-contract.test.ts` and
29
+ * `test/vale-vendor-contract.test.ts` fail until the two agree, which is the
30
+ * whole point of transcribing rather than describing. See taskless/cli#151 for
31
+ * the routing miss this exists to prevent: two GitHub Actions workflow rules
32
+ * were escalated to `runtime` because nothing said ast-grep parses YAML.
33
+ */
34
+ /**
35
+ * The ast-grep release pinned in `packages/cli/package.json`, both for
36
+ * `@ast-grep/cli` and for every `@ast-grep/cli-<platform>` optional dependency.
37
+ *
38
+ * Pinned against the binary by `test/ast-grep-vendor-contract.test.ts`
39
+ * ("engine capabilities" → "reports the pinned version").
40
+ */
41
+ export declare const AST_GREP_VERSION = "0.45.2";
42
+ /**
43
+ * Every language ast-grep can parse, verbatim from
44
+ * `sg run -h` → `Supported languages are: [...]` at
45
+ * {@link AST_GREP_VERSION}.
46
+ *
47
+ * SPELLINGS ARE ast-grep's, NOT ours and not `detect`'s. `Cpp`, `CSharp`,
48
+ * `JavaScript`, `Tsx` — a rule's `language:` field is handed to ast-grep
49
+ * unchanged, so the binary has the final opinion. MEASURED at 0.45.2: it
50
+ * accepts more than this list — case variants and a fixed set of extension
51
+ * aliases, both enumerated in {@link AST_GREP_LANGUAGE_ALIASES} — so an
52
+ * off-list spelling is not on its own an error. The two real failures are a
53
+ * name ast-grep does not know at all (`C#`), which aborts config parsing so
54
+ * every rule goes unreported, and a valid name for the wrong parser
55
+ * (`TypeScript` over `.tsx`), which reports nothing and reads as a clean
56
+ * codebase. `verify` catches both; see `verify.ts`.
57
+ *
58
+ * Pinned by set-equality against the binary in
59
+ * `test/ast-grep-vendor-contract.test.ts`, so a version bump that adds or drops
60
+ * a language fails there rather than silently narrowing what the router
61
+ * believes is buildable locally.
62
+ */
63
+ export declare const AST_GREP_LANGUAGES: readonly ["Bash", "C", "Cpp", "CSharp", "Css", "Dart", "Elixir", "Go", "Haskell", "Hcl", "Html", "Java", "JavaScript", "Json", "Kotlin", "Lua", "Markdown", "Nix", "Php", "Python", "Ruby", "Rust", "Scala", "Solidity", "Swift", "Tsx", "TypeScript", "Yaml"];
64
+ /** One of the spellings {@link AST_GREP_LANGUAGES} lists, canonically cased. */
65
+ export type AstGrepLanguage = (typeof AST_GREP_LANGUAGES)[number];
66
+ /**
67
+ * The spellings ast-grep also accepts that are not on the canonical list,
68
+ * mapped to the language each resolves to.
69
+ *
70
+ * Keys are lowercase because ast-grep's own matching is case-insensitive:
71
+ * `TYPESCRIPT`, `Cs` and `GOLANG` all resolve at 0.45.2. That makes the whole
72
+ * accepted vocabulary "the canonical list plus these, compared lowercased",
73
+ * which is what {@link resolveAstGrepLanguage} implements.
74
+ *
75
+ * Every value here was probed through a real config, because that is the only
76
+ * thing a rule file is ever fed to. That is deliberate: `sg run --lang` is a
77
+ * SEPARATE vocabulary and cannot stand in for this one. MEASURED at 0.45.2,
78
+ * the two agree on `C++` and `cxx` (both accepted) and on `C#` (both
79
+ * rejected), but `--lang` rejects with clap's own `is not supported!` before
80
+ * a rule is ever read, so it exercises a different code path and is not
81
+ * evidence about `language:`. At 0.41.0 they diverged outright: `--lang C++`
82
+ * was rejected while `language: C++` parsed. Nothing here probes `--lang`.
83
+ *
84
+ * THIS IS THE ONE LIST HERE THE BINARY CANNOT BE ASKED TO ENUMERATE. `sg run
85
+ * -h` prints the canonical list, so `AST_GREP_LANGUAGES` above is checked by
86
+ * set-equality against it; nothing prints the aliases. Each entry is instead
87
+ * pinned by *probing*, in the "language aliases" suite of
88
+ * `test/ast-grep-vendor-contract.test.ts`: every key is fed to the binary in a
89
+ * config and the resolution is read back out of the scan stream's own
90
+ * `language` field — ast-grep reports the canonical name it settled on, so the
91
+ * mapping is the binary's answer rather than ours. The same suite feeds a
92
+ * sweep of near-misses (`h`, `mjs`, `sh`, `tf`, `csx`) and asserts they are
93
+ * rejected, so a bump that ADDS an alias fails there too.
94
+ *
95
+ * Whitespace is not folded, deliberately: `language: "ts "` is rejected by the
96
+ * binary, so accepting it here would pass a rule that cannot run.
97
+ */
98
+ export declare const AST_GREP_LANGUAGE_ALIASES: Readonly<Record<string, AstGrepLanguage>>;
99
+ /**
100
+ * The language ast-grep would parse `spelling` as, or `undefined` if it would
101
+ * reject the config outright.
102
+ *
103
+ * `undefined` is the fatal case, not a stylistic one: an unrecognized name
104
+ * fails `SgLang` deserialization, which aborts parsing of the single config
105
+ * Taskless assembles for the run — so every *other* sg rule goes unreported
106
+ * with it.
107
+ */
108
+ export declare function resolveAstGrepLanguage(spelling: string): AstGrepLanguage | undefined;
109
+ /**
110
+ * The `.ts` / `.tsx` split — the one pair of ast-grep languages that share a
111
+ * family and read disjoint file extensions.
112
+ *
113
+ * MEASURED at 0.45.2: a `TypeScript` rule over a `.tsx` tree exits zero having
114
+ * matched nothing, and a `Tsx` rule scans `.tsx` only. That is the quiet
115
+ * failure of the two, because "no findings" is exactly what a clean codebase
116
+ * looks like. Pinned by "treats Tsx and TypeScript as different parsers, not
117
+ * aliases" in `test/ast-grep-vendor-contract.test.ts`.
118
+ *
119
+ * Kept to this pair deliberately. Every other language's extensions would be a
120
+ * second vendored table with no measured backing, and the trap only exists
121
+ * where two languages look like spellings of one thing.
122
+ */
123
+ export declare const AST_GREP_TSX_SPLIT: Readonly<Partial<Record<AstGrepLanguage, string>>>;
124
+ /**
125
+ * The Vale release carried by the `@taskless/vale-<platform>` packages pinned
126
+ * in `packages/cli/package.json`. Their npm versions append a build stamp
127
+ * (`3.17.1-20260810052605`); this is the version Vale itself reports.
128
+ *
129
+ * Pinned against the binary by `test/vale-vendor-contract.test.ts`
130
+ * ("engine capabilities" → "reports the pinned version").
131
+ */
132
+ export declare const VALE_VERSION = "3.18.0";
133
+ /**
134
+ * Which tier Vale routes an extension to.
135
+ *
136
+ * `converter:<program>` carries the program's own name in the tier, so one
137
+ * table row states both the tier and the thing a user would install. The name
138
+ * is the one Vale prints in its `E100` text, because that is the string a
139
+ * reader will search for.
140
+ */
141
+ export type ValeFormatTier =
142
+ /** Parsed in-process: the document is prose, its own syntax is skipped. */
143
+ "markup"
144
+ /** Parsed in-process: comment text is linted, the code body is invisible. */
145
+ | "comment"
146
+ /** No parser: the whole file is linted as one block of prose. */
147
+ | "plaintext"
148
+ /** Vale shells out to a program the `@taskless/vale-*` packages do not ship. */
149
+ | `converter:${string}`;
150
+ /**
151
+ * EVERY MEASURED VALE EXTENSION, AND ITS TIER. THE ONLY TABLE.
152
+ *
153
+ * Adding an extension is one line here; every list, glob, notice and test below
154
+ * derives from this record, so there is no second place to keep in step. Two
155
+ * branches once measured this independently and produced two tables that
156
+ * disagreed about six extensions — that is what this single record exists to
157
+ * make impossible.
158
+ *
159
+ * MEASURED, NOT DOCUMENTED, AND MEASURED BY A DISCRIMINATING PROBE. Ordinary
160
+ * prose fires in all three readable tiers, so it can never separate them. Each
161
+ * tier is pinned by the property only that tier has, in
162
+ * `test/vale-vendor-contract.test.ts`:
163
+ *
164
+ * - **markup** — a construct only a real parser skips yields ZERO (a fenced
165
+ * code block, an Org `#` line, an HTML comment).
166
+ * - **comment** — the token in a comment yields one finding and the same token
167
+ * on a bare non-comment line yields ZERO. A type that fires on both is the
168
+ * plaintext fallback wearing a code extension.
169
+ * - **plaintext** — a bare line yields a finding. Listed only where the tier is
170
+ * surprising: `.tex`, `.mkd` and `.mkdn` all look like markup and are not.
171
+ * Everything unnamed lands here too, which is why this tier does not need to
172
+ * be exhaustive.
173
+ * - **converter** — a non-zero exit whose output carries `E100` and the
174
+ * program's name.
175
+ *
176
+ * Measured spellings, not families. `.mdown` is native Markdown and `.mkd` and
177
+ * `.mkdn` are not; `.asc` is a third AsciiDoc spelling that crashes exactly
178
+ * like `.adoc`; `.ditamap` is plaintext while `.dita` needs `dita`. Case is
179
+ * part of the key — `.r` and `.R` were both measured, `.PY` was measured and is
180
+ * not comment-aware. Add a row only after probing it; the contract test refuses
181
+ * to take one on faith.
182
+ *
183
+ * A VERSION BUMP INVALIDATES THIS TABLE — RE-MEASURE THE WHOLE OF IT. The tiers
184
+ * are a property of {@link VALE_VERSION}'s binary, and the dangerous direction
185
+ * is a format Vale *learns*: an extension missing from this table is read as
186
+ * plain text today, but the moment Vale routes it to a converter the same
187
+ * omission is a crash that takes down every Vale rule in the run.
188
+ *
189
+ * The 3.17.1 → 3.18.0 bump is what that warning looks like in practice. Every
190
+ * row below was re-probed against the 3.18.0 binary, and eight moved, in three
191
+ * different directions — which is why "re-measure" is not boilerplate here:
192
+ *
193
+ * - `.mdx` gained a native parser: `converter:mdx2vast` → `markup`. It is
194
+ * supported now, and `[*.{md,mdx}]` is a legitimate matcher again.
195
+ * - `.typ` gained a parser that shells out to `typst2vast`
196
+ * (https://docs.vale.sh/formats/typst): `plaintext` →
197
+ * `converter:typst2vast`. That is the dangerous direction — 3.17.1 read it as
198
+ * prose, and the same row on 3.18.0 crashes the run. It stays unsupported
199
+ * permanently, since we do not support formats needing an external program.
200
+ * - `.rmd` gained a real Markdown parser, so it left the "looks like markup and
201
+ * is not" list above: `plaintext` → `markup`.
202
+ * - `.qml` and `.scss` gained parsers that see their comments: `plaintext` →
203
+ * `comment`. Vale's docs had claimed both for years; on 3.17.1 the claim was
204
+ * measurably false and on 3.18.0 it is true.
205
+ * - `.qmd` (Quarto) and `.myst` (MyST) measured as `markup`, and `.qdoc` as
206
+ * `comment` — QDoc documentation lives in a doc-comment block, so it is
207
+ * comment extraction rather than the markup tier a first reading of the
208
+ * release notes suggests, and probing it with bare prose reads as no support
209
+ * at all. All three are new rows, none of them reachable on 3.17.1.
210
+ *
211
+ * PHP also changed without the release notes saying so: comment extraction now
212
+ * needs a real `<?php` tag, where 3.17.1 linted a bare `//` comment without
213
+ * one. The tier did not move, but the probe had to. Re-probe every row on the
214
+ * next bump, by the discriminating property and by each language's own comment
215
+ * syntax — a wrong delimiter reads exactly like absent support.
216
+ */
217
+ export declare const VALE_FORMAT_TIERS: Readonly<Record<string, ValeFormatTier>>;
218
+ /**
219
+ * Extensions Vale parses as markup: the whole document is prose, and the
220
+ * format's own non-prose constructs are excluded.
221
+ *
222
+ * The HTML entries carry a consequence worth stating to an author: prose
223
+ * outside an element is not linted, so a bare sentence in a `.html` file yields
224
+ * nothing.
225
+ */
226
+ export declare const VALE_MARKUP_EXTENSIONS: readonly string[];
227
+ /**
228
+ * Extensions where Vale lints **comment text only** and ignores the code body.
229
+ */
230
+ export declare const VALE_COMMENT_EXTENSIONS: readonly string[];
231
+ /**
232
+ * Extensions measured into the plaintext fallback whose spelling suggests
233
+ * otherwise.
234
+ *
235
+ * Not exhaustive and not meant to be — every unnamed extension is plaintext
236
+ * too. These are the ones an author would reasonably assume were parsed, so
237
+ * they are worth naming in a recipe rather than leaving to "everything else".
238
+ */
239
+ export declare const VALE_PLAINTEXT_EXTENSIONS: readonly string[];
240
+ /**
241
+ * The converter each converter-dependent extension needs, keyed by extension.
242
+ *
243
+ * The lookup `rules/vale/formats.ts` uses to name a converter in the skip
244
+ * notice. Keys are lowercase because every measured converter format is; a
245
+ * caller comparing an extension off the filesystem must lowercase it first, or
246
+ * `README.RST` becomes a crash on case-insensitive platforms only.
247
+ */
248
+ export declare const VALE_CONVERTER_BY_EXTENSION: Readonly<Record<string, string>>;
249
+ /** A format Vale supports upstream but cannot read without an external tool. */
250
+ export interface ValeConverterFormat {
251
+ /** Extensions Vale routes through this converter. */
252
+ extensions: readonly string[];
253
+ /** The executable or artifact Vale looks for, named in its own E100 text. */
254
+ converter: string;
255
+ }
256
+ /**
257
+ * Formats that fail rather than lint, because Vale shells out to a converter
258
+ * this CLI does not ship.
259
+ *
260
+ * SAY THIS ACCURATELY: Vale supports these formats. What is missing is the
261
+ * external program it delegates the parse to. The failure is environmental, and
262
+ * describing it as "Vale does not support reStructuredText" sends an author
263
+ * looking for the wrong fix.
264
+ *
265
+ * The blast radius is what makes this worth surfacing at routing time rather
266
+ * than at authoring time: Vale exits 2 with an `E100` runtime error and
267
+ * abandons the run, and `--no-exit` does not suppress it. One `.typ` file
268
+ * caught by a rule's glob takes down the entire Vale pass, including every
269
+ * other rule and every other file — so `[*.{md,typ}]` is not a slightly wider
270
+ * matcher than `[*.md]`, it is a broken one. (`[*.{md,mdx}]` was that example
271
+ * until 3.18.0 gave MDX a native parser — the membership of this tier is a
272
+ * property of {@link VALE_VERSION}, and so is the worked example.)
273
+ */
274
+ export declare const VALE_CONVERTER_DEPENDENT: readonly ValeConverterFormat[];
275
+ /**
276
+ * Vale's checker tag per converter-dependent extension, from the `E100` text.
277
+ *
278
+ * This is the host-independent half of the failure. The prose after the tag is
279
+ * not: `.xml` reports `xsltproc not found` where the program is absent and
280
+ * `no XSLT transform provided` where it is present, and the two are split by
281
+ * platform — macOS ships `/usr/bin/xsltproc`, the Linux CI image does not. A
282
+ * contract test that matched on the program name therefore passed locally and
283
+ * failed in CI, which is how this list came to exist.
284
+ *
285
+ * `.xml` is also the one entry whose converter is not sufficient on its own. An
286
+ * XSLT transform is document-specific, so there is no default to ship and
287
+ * installing `xsltproc` does not make `.xml` lintable — unlike `asciidoctor`,
288
+ * which genuinely fixes `.adoc`. That is why its `converter` names the
289
+ * stylesheet as well as the program.
290
+ */
291
+ export declare const VALE_CONVERTER_CHECKERS: Readonly<Record<string, string>>;
292
+ /** Every converter-dependent extension, flattened. */
293
+ export declare const VALE_CONVERTER_DEPENDENT_EXTENSIONS: readonly string[];
294
+ /** `Bash, C, Cpp, …` — the ast-grep language list as recipe prose. */
295
+ export declare function astGrepLanguageList(): string;
296
+ /** `.htm, .html, …` — Vale's markup extensions as recipe prose. */
297
+ export declare function valeMarkupList(): string;
298
+ /** `.c, .c++, …` — Vale's comment-only extensions as recipe prose. */
299
+ export declare function valeCommentList(): string;
300
+ /**
301
+ * `.mkd, .mkdn, …` — the plaintext extensions worth naming, as recipe prose.
302
+ *
303
+ * Rendered rather than written into the recipe because the surprising cases are
304
+ * exactly the ones a hand-written list gets wrong.
305
+ */
306
+ export declare function valePlaintextList(): string;
307
+ /**
308
+ * `.rst (needs rst2html), …` — Vale's converter-dependent formats as recipe
309
+ * prose, each naming the tool whose absence is the actual failure.
310
+ */
311
+ export declare function valeConverterList(): string;
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ /** Input schema for `taskless rule create --from` JSON file */
3
+ export declare const inputSchema: z.ZodObject<{
4
+ prompt: z.ZodString;
5
+ successCases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ failureCases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
+ }, z.core.$strip>;
8
+ /** Output schema for `taskless rule create --json` on success */
9
+ export declare const outputSchema: z.ZodObject<{
10
+ success: z.ZodLiteral<true>;
11
+ ruleId: z.ZodString;
12
+ rules: z.ZodArray<z.ZodString>;
13
+ files: z.ZodArray<z.ZodString>;
14
+ }, z.core.$strip>;
15
+ /** Error schema for `taskless rule create --json` on failure */
16
+ export declare const errorSchema: z.ZodObject<{
17
+ error: z.ZodString;
18
+ }, z.core.$strip>;
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ /** Input schema for `taskless rule improve --from` JSON file */
3
+ export declare const inputSchema: z.ZodObject<{
4
+ ruleId: z.ZodString;
5
+ guidance: z.ZodString;
6
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
7
+ filename: z.ZodString;
8
+ content: z.ZodString;
9
+ }, z.core.$strip>>>;
10
+ }, z.core.$strip>;
11
+ /** Output schema for `taskless rule improve --json` on success */
12
+ export declare const outputSchema: z.ZodObject<{
13
+ success: z.ZodLiteral<true>;
14
+ requestId: z.ZodString;
15
+ rules: z.ZodArray<z.ZodString>;
16
+ files: z.ZodArray<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ /** Error schema for `taskless rule improve --json` on failure */
19
+ export declare const errorSchema: z.ZodObject<{
20
+ error: z.ZodString;
21
+ }, z.core.$strip>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The published CLI invocation baked into skill, command, and recipe source.
3
+ * Build targets other than prod rewrite it: to a repo-root-relative path so a
4
+ * locally built CLI can be dogfooded in this repo (`build:self`), and to
5
+ * `npx @taskless/cli-nightly@<version>` for a nightly, whose shipped
6
+ * instructions must name the package the reader actually installed rather than
7
+ * the released one. There is no target that emits a path usable from outside
8
+ * this checkout; a nightly covers that. See `scripts/build-target.ts`,
9
+ * `vite.config.ts`, and the root `package.json` scripts.
10
+ */
11
+ export declare const PROD_INVOCATION = "npx @taskless/cli";
12
+ /**
13
+ * Whether this build's invocation is the released one.
14
+ *
15
+ * `false` means the build knows exactly what it is — a `nightly` pinned to its
16
+ * published version, or a `self` path — and its instructions must say so
17
+ * rather than naming `@taskless/cli`. `true` means the build is the released
18
+ * package and has no idea how it was launched, which is a different situation
19
+ * from knowing it was launched as `npx @taskless/cli`.
20
+ */
21
+ export declare function isProductionInvocation(): boolean;
22
+ /** This build's invocation, whatever the target. */
23
+ export declare function buildInvocation(): string;
24
+ /**
25
+ * Rewrite the canonical `npx @taskless/cli` invocation to the build-target
26
+ * invocation (`__TASKLESS_CLI__`).
27
+ *
28
+ * A no-op for prod builds, where the define equals {@link PROD_INVOCATION}, so
29
+ * emitted content stays byte-identical to source. For `dev`/`self`/`nightly`
30
+ * builds it swaps both the bare form and the `@latest`-pinned form (the
31
+ * version-pinned form first, so the bare replacement can't leave a dangling
32
+ * `@latest` — which for a nightly would read
33
+ * `npx @taskless/cli-nightly@<version>@latest`).
34
+ */
35
+ export declare function applyCliInvocation(content: string): string;
36
+ /**
37
+ * Prepend the build-target notice (`__TASKLESS_CLI_NOTICE__`) to a canonical
38
+ * skill/command body. A no-op for prod, where the notice is empty. For
39
+ * `dev`/`self` builds the banner is inserted immediately after the frontmatter
40
+ * block so it renders as the first body line without corrupting the YAML.
41
+ */
42
+ export declare function withCliBuildNotice(content: string): string;
package/package.json CHANGED
@@ -1,20 +1,21 @@
1
1
  {
2
2
  "name": "@taskless/cli",
3
- "version": "0.10.1",
3
+ "version": "0.11.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/taskless/skills.git",
7
+ "url": "https://github.com/taskless/cli.git",
8
8
  "directory": "packages/cli"
9
9
  },
10
10
  "scripts": {
11
- "prebuild": "tsx scripts/fetch-rule-hash-vectors.ts",
12
- "build": "vite build",
13
- "build:dev": "TASKLESS_BUILD_TARGET=dev vite build",
11
+ "build": "vite build && tsc -p tsconfig.prompts.json",
12
+ "build:nightly": "TASKLESS_BUILD_TARGET=nightly vite build && tsc -p tsconfig.prompts.json",
14
13
  "build:self": "TASKLESS_BUILD_TARGET=self vite build",
15
14
  "generate:api": "openapi-typescript https://app.taskless.io/cli/api/__schema -o src/generated/api.d.ts",
16
15
  "generate:ast-grep-schema": "tsx scripts/fetch-ast-grep-schema.ts",
17
16
  "generate:rule-hash-vectors": "tsx scripts/fetch-rule-hash-vectors.ts",
17
+ "generate:vale-schema": "tsx scripts/generate-vale-schema.ts",
18
+ "prebuild": "tsx scripts/fetch-rule-hash-vectors.ts",
18
19
  "test": "vitest run",
19
20
  "typecheck": "tsc --noEmit"
20
21
  },
@@ -23,6 +24,10 @@
23
24
  "exports": {
24
25
  ".": {
25
26
  "import": "./dist/index.js"
27
+ },
28
+ "./prompts": {
29
+ "types": "./dist/prompts/index.d.ts",
30
+ "import": "./dist/prompts.js"
26
31
  }
27
32
  },
28
33
  "files": [
@@ -32,7 +37,6 @@
32
37
  "node": ">=22.22.0"
33
38
  },
34
39
  "dependencies": {
35
- "@ast-grep/cli": "^0.41.0",
36
40
  "@clack/prompts": "^1.2.0",
37
41
  "chalk": "^5.6.2",
38
42
  "citty": "^0.1.6",
@@ -47,6 +51,7 @@
47
51
  "zod": "^4.3.6"
48
52
  },
49
53
  "devDependencies": {
54
+ "@ast-grep/cli": "0.45.2",
50
55
  "@types/sprintf-js": "^1.1.4",
51
56
  "openapi-typescript": "^7.13.0",
52
57
  "typescript": "^5.7.2",
@@ -58,12 +63,18 @@
58
63
  "taskless": "./dist/index.js"
59
64
  },
60
65
  "optionalDependencies": {
61
- "@ast-grep/cli-darwin-arm64": "^0.41.0",
62
- "@ast-grep/cli-darwin-x64": "^0.41.0",
63
- "@ast-grep/cli-linux-arm64-gnu": "^0.41.0",
64
- "@ast-grep/cli-linux-x64-gnu": "^0.41.0",
65
- "@ast-grep/cli-win32-arm64-msvc": "^0.41.0",
66
- "@ast-grep/cli-win32-ia32-msvc": "^0.41.0",
67
- "@ast-grep/cli-win32-x64-msvc": "^0.41.0"
66
+ "@ast-grep/cli-darwin-arm64": "0.45.2",
67
+ "@ast-grep/cli-darwin-x64": "0.45.2",
68
+ "@ast-grep/cli-linux-arm64-gnu": "0.45.2",
69
+ "@ast-grep/cli-linux-x64-gnu": "0.45.2",
70
+ "@ast-grep/cli-win32-arm64-msvc": "0.45.2",
71
+ "@ast-grep/cli-win32-ia32-msvc": "0.45.2",
72
+ "@ast-grep/cli-win32-x64-msvc": "0.45.2",
73
+ "@taskless/vale-darwin-arm64": "3.18.0-20260824195610",
74
+ "@taskless/vale-darwin-x64": "3.18.0-20260824195610",
75
+ "@taskless/vale-linux-arm64": "3.18.0-20260824195610",
76
+ "@taskless/vale-linux-x64": "3.18.0-20260824195610",
77
+ "@taskless/vale-win32-arm64": "3.18.0-20260824195610",
78
+ "@taskless/vale-win32-x64": "3.18.0-20260824195610"
68
79
  }
69
80
  }