@yawlabs/ctxlint 0.25.3 → 0.25.4
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/.pre-commit-hooks.yaml +1 -1
- package/README.md +15 -3
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/.pre-commit-hooks.yaml
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# Version-pinned so a checkout at `rev: vX.Y.Z` runs exactly that release
|
|
5
5
|
# of ctxlint — matches the pinning done by `ctxlint init`. release.sh keeps
|
|
6
6
|
# this in sync with package.json on each bump.
|
|
7
|
-
entry: npx @yawlabs/ctxlint@0.25.
|
|
7
|
+
entry: npx @yawlabs/ctxlint@0.25.4 --strict
|
|
8
8
|
language: node
|
|
9
9
|
always_run: true
|
|
10
10
|
pass_filenames: false
|
package/README.md
CHANGED
|
@@ -234,7 +234,7 @@ Checks whose signal is what the agent did (commands run, files written or read)
|
|
|
234
234
|
## Example Output
|
|
235
235
|
|
|
236
236
|
```
|
|
237
|
-
ctxlint v0.25.
|
|
237
|
+
ctxlint v0.25.4
|
|
238
238
|
|
|
239
239
|
Scanning /Users/you/my-app...
|
|
240
240
|
|
|
@@ -258,7 +258,7 @@ Summary: 2 errors, 2 warnings, 1 info
|
|
|
258
258
|
## Options
|
|
259
259
|
|
|
260
260
|
```
|
|
261
|
-
Usage: ctxlint [options] [path]
|
|
261
|
+
Usage: ctxlint [options] [command] [path]
|
|
262
262
|
|
|
263
263
|
Arguments:
|
|
264
264
|
path Project directory to scan (default: ".")
|
|
@@ -287,12 +287,15 @@ Options:
|
|
|
287
287
|
--hooks-global Also scan the user-global ~/.claude/settings.json in the
|
|
288
288
|
dead-hook check (default scans project .claude/ only)
|
|
289
289
|
--mcp-server Start the MCP server (alias: `serve` subcommand)
|
|
290
|
+
--lsp Start in LSP server mode (JSON-RPC over stdio for editor integration)
|
|
291
|
+
--no-ignore-file Disable .ctxlintignore suppression (see all findings)
|
|
290
292
|
--watch Re-lint on context file changes
|
|
291
293
|
-V, --version Output the version number
|
|
292
294
|
-h, --help Display help
|
|
293
295
|
|
|
294
296
|
Commands:
|
|
295
297
|
init Set up a git pre-commit hook
|
|
298
|
+
serve Start the MCP server (same as --mcp-server)
|
|
296
299
|
```
|
|
297
300
|
|
|
298
301
|
**Available checks:** `paths`, `commands`, `staleness`, `tokens`, `tier-tokens`, `redundancy`, `contradictions`, `frontmatter`, `ci-coverage`, `ci-secrets`, `content-secrets`, `hook-coverage`, `mcp-schema`, `mcp-security`, `mcp-commands`, `mcp-deprecated`, `mcp-env`, `mcp-urls`, `mcp-consistency`, `mcp-redundancy`, `session-missing-secret`, `session-diverged-file`, `session-missing-workflow`, `session-stale-memory`, `session-duplicate-memory`, `session-loop-detection`, `session-memory-index-overflow`, `session-shared-temp-path`, `session-unverified-gate-claimed-clean`, `session-default-branch-accumulation`, `session-unresolvable-sha`, `session-large-read`, `skill-frontmatter`, `skill-broken-ref`, `skill-trigger-collision`, `skill-orphaned`, `skill-dead-tool-restriction`
|
|
@@ -377,7 +380,7 @@ Add to your `.pre-commit-config.yaml`:
|
|
|
377
380
|
```yaml
|
|
378
381
|
repos:
|
|
379
382
|
- repo: https://github.com/yawlabs/ctxlint
|
|
380
|
-
rev: v0.25.
|
|
383
|
+
rev: v0.25.4
|
|
381
384
|
hooks:
|
|
382
385
|
- id: ctxlint
|
|
383
386
|
```
|
|
@@ -390,6 +393,9 @@ Create a `.ctxlintrc` or `.ctxlintrc.json` in your project root:
|
|
|
390
393
|
{
|
|
391
394
|
"checks": ["paths", "commands", "tokens", "contradictions", "frontmatter"],
|
|
392
395
|
"ignore": ["redundancy"],
|
|
396
|
+
"ignoreRules": [
|
|
397
|
+
{ "check": "paths", "match": "^docs/archive/", "reason": "archived docs cite removed files" }
|
|
398
|
+
],
|
|
393
399
|
"strict": true,
|
|
394
400
|
"tokenThresholds": {
|
|
395
401
|
"info": 500,
|
|
@@ -416,6 +422,11 @@ The `exclude` array is its counterpart: globs of context files to drop from the
|
|
|
416
422
|
| ------------------------------- | ---------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
417
423
|
| `checks` | `string[]` | all checks | Checks to run. Check names include `paths`, `commands`, `tokens`, `tier-tokens`, `redundancy`, `contradictions`, `frontmatter`, `staleness`, `ci-coverage`, `ci-secrets`, `content-secrets`, `hook-coverage`, plus any `mcp-*` / `session-*` / `skill-*`. |
|
|
418
424
|
| `ignore` | `string[]` | `[]` | Checks to skip, evaluated after `checks`. |
|
|
425
|
+
| `ignoreRules` | `object[]` | `[]` | Per-finding suppression, finer than `ignore`: each rule drops only the findings it matches, and the first matching rule wins. Rules that never fire, and rules missing a `reason`, are listed in the text report and in JSON `_meta.ignoreReport`. |
|
|
426
|
+
| `ignoreRules[].check` | `string` | required | The check the rule applies to, by exact name (`paths`, `session-stale-memory`, ...). |
|
|
427
|
+
| `ignoreRules[].match` | `string` | none | Regex tested against the finding's message. A rule with neither `match` nor `pathPattern` drops every finding of its check; with both, both must match. |
|
|
428
|
+
| `ignoreRules[].pathPattern` | `string` | none | Regex tested against each path a finding names; the rule fires only when every path matches. Honored only for `session-stale-memory`: on any other check the rule never fires, and loading the config prints a warning. |
|
|
429
|
+
| `ignoreRules[].reason` | `string` | none | Why the finding is suppressed. Optional, but rules without one are listed in the report for review. |
|
|
419
430
|
| `strict` | `boolean` | `false` | Exit non-zero on any warning or error. |
|
|
420
431
|
| `tokenThresholds` | `object` | see below | Per-file and cross-file token thresholds. |
|
|
421
432
|
| `tokenThresholds.info` | `number` | `1000` | Per-file info threshold for `tokens/info`. |
|
|
@@ -433,6 +444,7 @@ The `exclude` array is its counterpart: globs of context files to drop from the
|
|
|
433
444
|
| `sessionOnly` | `boolean` | `false` | Run only session checks, skip context and MCP checks (same as `--session-only`). |
|
|
434
445
|
| `skills` | `boolean` | `false` | Enable agent-skill checks (`~/.claude/skills` + `~/.claude/agents`); same as `--skills`. |
|
|
435
446
|
| `skillsOnly` | `boolean` | `false` | Run only agent-skill checks, skip everything else (same as `--skills-only`). |
|
|
447
|
+
| `hooksGlobal` | `boolean` | `false` | Also scan the user-global `~/.claude/settings.json` in the dead-hook check (same as `--hooks-global`). |
|
|
436
448
|
|
|
437
449
|
Config file resolution order: `.ctxlintrc` → `.ctxlintrc.json` in the project root. Use `--config <path>` to point elsewhere. CLI flags override config fields.
|
|
438
450
|
|
package/dist/index.js
CHANGED
|
@@ -30420,7 +30420,7 @@ import { readFileSync as readFileSync10 } from "node:fs";
|
|
|
30420
30420
|
import { resolve as resolve18, dirname as dirname10 } from "node:path";
|
|
30421
30421
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
30422
30422
|
function loadVersion() {
|
|
30423
|
-
if (true) return "0.25.
|
|
30423
|
+
if (true) return "0.25.4";
|
|
30424
30424
|
try {
|
|
30425
30425
|
const __dir = dirname10(fileURLToPath2(import.meta.url));
|
|
30426
30426
|
const pkgPath = resolve18(__dir, "../package.json");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yawlabs/ctxlint",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.4",
|
|
4
4
|
"mcpName": "io.github.YawLabs/ctxlint",
|
|
5
5
|
"description": "Linter for AI agent context files and MCP configs: CLAUDE.md, AGENTS.md, .cursorrules, .mcp.json - catches broken paths, wrong commands, leaked secrets",
|
|
6
6
|
"bin": {
|