Files
tree-sitter-shellspec/CLAUDE.md
Ismo Vuorinen 7353f2729c feat: implement complete tree-sitter-shellspec grammar with comprehensive testing (#1)
* feat: implement complete tree-sitter-shellspec grammar with comprehensive testing

- Add full ShellSpec grammar extending tree-sitter-bash
- Support all ShellSpec constructs: Describe, Context, It, hooks, utilities
- Include Data block parsing with statements and argument styles
- Add 61 comprehensive test cases covering real-world patterns
- Implement optimized GitHub workflows with CI/CD automation
- Configure complete development tooling (linting, formatting, pre-commit)
- Add comprehensive documentation and contribution guidelines
- Optimize grammar conflicts to zero warnings
- Support editor integration for Neovim, VS Code, Emacs

Breaking Changes:
- Initial release, no previous API to break

BREAKING CHANGE: Initial implementation of tree-sitter-shellspec grammar

* fix(ci): checkout before using local actions

* fix(ci): use inline steps instead of actions

* fix(ci): add checkout before testing, cleanup

* chore(ci): add coderabbit config

* chore: lint and code review fixes

* chore(ci): update workflows

* refactor: enhance CI/CD workflows and apply CodeRabbit suggestions

- Convert GitHub Actions from local to inline actions for better maintainability
- Add comprehensive caching for npm dependencies, tree-sitter CLI, and build artifacts
- Fix checkout steps missing in test matrix jobs
- Apply defensive programming in test coverage validation
- Use local tree-sitter CLI via npx instead of global installation
- Update tree-sitter-cli to v0.25.0 for compatibility with tree-sitter-bash
- Add proper tree-sitter field to package.json with grammar metadata
- Fix grammar precedence for Data blocks (#| lines now have higher precedence)
- Standardize dates in memory files to September 12, 2025
- Enhance workflow robustness with dynamic workflow ID resolution
- Improve test file pattern matching and error handling

This commit addresses all CodeRabbit review suggestions and optimizes
GitHub Actions workflows for better performance and reliability.

* fix: apply CodeRabbit nitpick suggestions and improve code quality

- Fix grammar.js TypeScript errors by correcting optional field usage
- Update .yamlignore to use more robust glob pattern (**/node_modules/**)
- Remove hard-coded test count from README.md for maintainability
- Fix shellcheck directive format (add space after #) in all test specs
- Fix typos throughout test specifications:
  - 'can not' → 'cannot'
  - 'expantion' → 'expansion'
  - 'singnal' → 'signal'
  - 'It mean' → 'It means'
- Update CODE_OF_CONDUCT.md HTTP links to HTTPS
- Update tree-sitter parse command to use --scope instead of --language
- Add comments to .mega-linter.yml explaining disabled linters

All grammar tests still pass (61/61) and the parser functions correctly
with the updated tree-sitter CLI v0.25.0.

* perf: optimize grammar for 32x faster parsing performance

- Reduce grammar conflicts to essential bash and ShellSpec rules only
- Restore original precedence values for consistent rule ordering
- Simplify Data block rule while maintaining all functionality
- Add required statements field to match test expectations

Performance improvements:
- Parse speed: ~55 bytes/ms → 1784 bytes/ms (32x faster)
- All 61 tests still pass (100% success rate)
- Significantly reduced parser generation time and runtime complexity

The optimizations focused on minimizing unnecessary conflicts and
simplifying complex choice structures while preserving full ShellSpec
grammar compatibility and correctness.

* fix(ci): ensure parser is built before testing in GitHub workflows

- Add explicit parser build step before sample code testing
- Remove --scope parameter that requires parser to be compiled first
- Fix tree-sitter CLI v0.25.0 compatibility issue in CI environment

The issue was that tree-sitter CLI v0.25.0 requires the parser to be
compiled before it can recognize custom language scopes. This fix
ensures the parser is always built before attempting to parse test files,
resolving the 'Unknown scope' error in GitHub Actions.

* feat(ci): expand cache paths to support all Node.js package managers

- Add comprehensive caching for npm, yarn, and pnpm package managers
- Cache paths now include:
  - npm: ~/.npm, node_modules/.cache
  - yarn: ~/.yarn, ~/.cache/yarn, ~/.cache/yarn/global
  - pnpm: ~/.pnpm-store, ~/.cache/pnpm, ~/.local/share/pnpm/global
- Update cache keys to include all lockfile types (package-lock.json, yarn.lock, pnpm-lock.yaml)
- Rename 'Cache Tree-sitter CLI' to 'Cache npx store' for clarity
- Apply changes consistently across test, lint, and coverage jobs

This improves cache hit rates and build performance regardless of which
Node.js package manager is used in the development environment.

* chore: tweaks to megalinter and grammar.js

* fix(scanner): address memory safety and correctness issues in C code

- Add len==0 check in set_contains() to prevent buffer overflow
- Add missing stdlib.h include in scanner.c
- Clear heredoc stack properly in deserialize when length==0
- Ensure NUL termination in delimiter deserialization
- Create alloc.c to define ts_current_* symbols for TREE_SITTER_REUSE_ALLOCATOR

All changes tested with full test suite: 61/61 tests passing.

Addresses PR #1 review comments from CodeRabbit.

* ci: improve workflow determinism and security scanning

- Add --language=shellspec flag to tree-sitter parse for deterministic grammar selection
- Add C++ language to CodeQL analysis to scan src/scanner.c for security issues

Addresses PR #1 review comments from CodeRabbit.

* test: fix typos and incorrect hook usage in spec files

- Fix 'yot' → 'yet' typos in test/spec/03.example_spec.sh
- Fix 'Sometime' → 'Sometimes' and cpunum.sh references in test/spec/22.sourcced_spec.sh
- Fix Before → After in after hook section of test/spec/07.before_after_hook_spec.sh
- Improve wording and capitalization throughout hook spec file

All 61 tests still passing after corrections.

Addresses PR #1 review comments from Copilot and CodeRabbit.

* docs: update Node.js requirement to match CI configuration

- Change Node.js requirement from v16 to v22+ to align with CI matrix
- Update tree-sitter CLI recommendation from global install to npx usage
- Matches actual devDependency configuration in package.json

Addresses PR #1 review comment from CodeRabbit.

* chore: update dependencies and workflow actions

- Update GitHub Actions to latest versions (checkout v6, setup-node v6, cache v4.3)
- Update package dependencies
- Format workflow files
- Update .gitignore and project configuration

* fix(ci): remove unsupported --language flag from tree-sitter parse

The --language flag is not supported in tree-sitter-cli 0.25.10.
Tree-sitter correctly auto-detects the grammar based on file extension.

* chore: add prettier and format all files

- Install prettier ^3.6.2
- Add .prettierrc with project formatting rules
- Add .prettierignore to exclude generated files and dependencies
- Add npm scripts: format and format:check
- Format all files with prettier

* chore: add eclint for editorconfig linting and fix violations

- Install eclint ^2.8.1 for editorconfig validation and fixing
- Add .eclintignore to exclude generated files and dependencies
- Add npm scripts: lint:editorconfig and lint:editorconfig:fix
- Fix indentation issues in CONTRIBUTING.md (3 spaces -> 2 spaces)
- Fix code alignment in scanner.c to match editorconfig rules
- Regenerate parser after scanner.c formatting changes

* feat: add post-generation script to preserve buffer overflow fix

Created scripts/post-generate.sh that automatically re-applies the critical
buffer overflow fix to parser.h after tree-sitter generate runs. This fix
prevents undefined behavior in set_contains() when accessing an empty array.

The script is automatically executed after tree-sitter generate via the npm
generate script. Added generate:only for cases where post-processing should
be skipped.

* fix: address code review findings and critical issues

Critical Fixes:
- Fixed EditorConfig violations in grammar.js, scanner.c, README.md, .mega-linter.yml
  - Changed JSDoc comments from 1-space to 2-space indent per .editorconfig
  - Fixed line length violations in README.md and .mega-linter.yml
- Updated test count badge from 59/59 to 61/61 in README.md
- Created queries/highlights.scm for syntax highlighting support
- Updated package.json with repository and files fields

Configuration Updates:
- Added repository field pointing to GitHub
- Added files field to control npm package contents
- Properly formatted CONTRIBUTING.md with prettier

All 61 tests passing (100% success rate)
All critical EditorConfig violations resolved

* enhance: add Data block test coverage and improve syntax highlighting

High Priority Enhancements:
- Added 2 new Data block test cases for :raw and :expand modifiers
- Enhanced syntax highlighting with "End" keyword (block terminator)
- Added Data block modifiers (:raw, :expand, #|) to highlighting

Test Coverage:
- 63/63 tests passing (100%)
- Test count increased from 61 to 63
- Average parse speed: 623 bytes/ms

* docs: add comprehensive grammar documentation and precedence explanation

Medium Priority Enhancement:
- Added detailed precedence strategy comments explaining how ShellSpec extends bash
- Documented all 5 conflicts with resolution strategies
- Explained why conflicts are necessary and optimal
- Added context about GLR parsing and precedence hints

Documentation improvements:
- Precedence levels clearly explained (bash: 1, ShellSpec: 2)
- Each conflict documented with resolution strategy
- Notes on intentional design decisions
- Helps future maintainers understand grammar design

* fix: resolve documentation inconsistencies and add ExampleGroup variants

Documentation Fixes:
- README.md: Update test count from 59 to 63 (badge, features, test command)
- README.md: Fix lint script references to actual npm scripts
- CONTRIBUTING.md: Correct format script reference to npm run format:check
- package.json: Remove non-existent yamllint script, split lint:markdown into check/fix variants

Grammar Enhancements:
- Add fExampleGroup and xExampleGroup to Context block variants
- Regenerate parser with new grammar (63/63 tests passing, 100% success rate)

Syntax Highlighting:
- Add fExampleGroup and xExampleGroup to focused/skipped block highlights
- Remove non-matching Data modifier tokens (:raw, :expand, #|)
- Add "End" keyword as block terminator

Memory File Corrections:
- Remove incorrect merge_group trigger references
- Remove pr-lint.yml workflow references (deleted in previous optimization)
- Update test counts with timestamps (59→63, added 2025-12-11)
- Update conflict count (13→5, optimized)

Code Style:
- Auto-format renovate.json and tree-sitter.json with prettier

* chore: update dependencies and project configuration

- Align tree-sitter dependencies to latest versions (bash 0.25.1, cli 0.25.10)
- Clean up .gitignore redundant patterns and normalize path styles
- Improve CodeRabbit configuration with path filters and simplified instructions
- Add test corpus exclusion to match project intent

* docs: improve documentation and memory files

- Update CONTRIBUTING.md code style check commands with actual available scripts
- Use npx tree-sitter in test examples to avoid assuming global installation
- Improve project status memory file with proper JSON formatting
- Add CI enforcement recommendation for zero-conflict grammar generation
- Align prerequisites with CI requirements (Node 22+)

* ci: improve workflow configuration and reliability

- Replace global read-all permissions with scoped permissions (contents: read, actions: write)
- Fix cache configuration to exclude node_modules and include package-lock.json
- Improve CI workflow resolution with flexible path matching and pagination
- Verify version instead of committing version bumps from CI
- Detect prereleases and publish with appropriate npm tags (next vs latest)
- Use generic test suite description in release notes to avoid drift

* fix: remove non-existent locals.scm reference from tree-sitter.json

Remove queries/locals.scm from locals array as the file does not exist.
Only queries/highlights.scm is present in the repository.

* security: replace vulnerable eclint with editorconfig-checker

- Remove eclint@2.8.1 (has 15 vulnerabilities, possibly abandoned)
- Add editorconfig-checker@6.1.1 (actively maintained, zero vulnerabilities)
- Update npm scripts to use editorconfig-checker commands
- Resolves all 15 security vulnerabilities (8 moderate, 7 high)

editorconfig-checker is a more modern, actively maintained alternative
written in Go with no Node.js dependency vulnerabilities.

* style: fix JSDoc comment indentation

* fix(ci): separate CodeQL languages in matrix

Previously 'actions,javascript' was treated as a single language.
Now correctly split into separate 'actions' and 'javascript' entries.

* chore(deps): update GitHub Actions dependencies

- actions/checkout: v6.0.0 -> v6.0.1
- actions/setup-node: v6.0.0 -> v6.1.0
- softprops/action-gh-release: v2.4.2 -> v2.5.0
- ivuorinen/actions/*: v2025.11.x -> v2025.12.10

* ci: restore pr-lint workflow from main

* chore(deps): update GitHub Actions dependencies

Update action pins: checkout v6.0.2, setup-node v6.3.0, cache v5.0.3,
pr-lint v2026.03.07. Add checkov skip comment, VERSION prefix strip,
and scanner.c to grammar cache key.

* feat: extend grammar with hooks, mocks, statements, and directives

Add 27 ShellSpec-specific grammar rules covering hook blocks/statements,
mock blocks, When/The/Assert statements, Path/Set/Dump/Intercept statements,
Parameters variants, Pending/Skip/Todo, and percent directives. Update
highlights and test corpus with 128 passing tests.

* docs: update README, CLAUDE.md, and test spec comments

Comprehensive README rewrite documenting all 27 grammar rules, block types,
statement types, and directives. Add CLAUDE.md project instructions for
Claude Code. Update test spec file comments for clarity.

* chore: update project config and dependencies

Update tree-sitter-cli to ^0.26.6, remove broken lint:editorconfig:fix
script. Update shellcheck disabled rules. Add JSDoc header to
post-generate script. Update gitignore for build artifacts.

* fix(ci): use env var for version in release publish step

Replace direct expression interpolation with VERSION env var to fix
actionlint SC2193 false positive in the npm publish step.

* style: fix editorconfig and markdownlint issues

Break long cache key YAML value into multiline scalar to comply with
160-character line length limit.

* ci: update MegaLinter config for ShellSpec project

Add disabled linters for generated/DSL code false positives, v8r exclude
pattern, and broader path filter. Remove .coderabbit.yaml in favor of
shared org config.

* chore: add Claude Code automation config

Add hooks (pre-edit guard for generated files, post-edit lint),
skills (generate-and-test, add-shellspec-rule, debug-parse-failure,
update-highlights, validate-release), and grammar-validator agent.

* chore: update Serena memory files

Update project status, real-world ShellSpec patterns, and GitHub
workflows optimization memory files.

* fix(ci): fix MegaLinter config and remove C from CodeQL

- Change FILTER_REGEX_EXCLUDE from `>` to `>-` to strip trailing
  newline that silently broke all path exclusions
- Add YAML_V8R_FILTER_REGEX_EXCLUDE to skip schema validation on
  .mega-linter.yml (schemastore enum is outdated for BASH_BASH_EXEC)
- Remove "c" from CodeQL language matrix since src/parser.c is
  generated and produces false positives

* fix: add missing test spec stub files

- Add test/spec/lib.sh stub with calc() function (referenced by
  01.very_simple_spec.sh)
- Add test/spec/count_cpus.sh stub (referenced by
  21.intercept_spec.sh)
2026-03-09 03:02:34 +02:00

12 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

This is a tree-sitter grammar for ShellSpec (a BDD testing framework for POSIX shell scripts). The grammar extends tree-sitter-bash to parse ShellSpec-specific constructs like Describe/Context/It blocks, hooks, and directives.

Development Commands

Core Workflow

# Generate parser from grammar.js
npm run generate

# Run all tests (must be 100% passing)
npm test

# Combined generate + test workflow
npm run dev

# Watch mode for active development
npm run dev:watch

# Build the parser
npm run build

# Full rebuild (clean + generate + build)
npm run rebuild

Testing

# Run all tests
npm test

# Test specific patterns (use tree-sitter CLI via npx)
npx tree-sitter test -i "describe_blocks"
npx tree-sitter test -i "real_world_patterns"

# Parse a specific file to test grammar
npx tree-sitter parse path/to/file.shellspec

Code Quality

# Run all linters (MegaLinter)
npm run lint

# Fix markdown issues
npm run lint:markdown

# Run pre-commit hooks manually
npm run precommit

Grammar Architecture

Core Grammar Structure

The grammar extends tree-sitter-bash with 27 ShellSpec-specific rules:

Block rules (require End terminator):

  1. shellspec_describe_block - Describe/fDescribe/xDescribe blocks
  2. shellspec_context_block - Context/ExampleGroup blocks (with f/x variants)
  3. shellspec_it_block - It/Example/Specify blocks (with f/x variants)
  4. shellspec_hook_block - BeforeEach/AfterEach/BeforeAll/AfterAll/BeforeCall/AfterCall/BeforeRun/AfterRun
  5. shellspec_utility_block - Parameters blocks (with :block/:value/:matrix/:dynamic variants)
  6. shellspec_data_block - Data blocks with :raw/:expand modifiers, #| lines, pipe filters
  7. shellspec_mock_block - Mock command blocks

Statement rules (single-line, no End):

  1. shellspec_hook_statement - Before/After/BeforeEach/AfterEach/BeforeAll/AfterAll/BeforeCall/AfterCall/BeforeRun/AfterRun statements
  2. shellspec_directive_statement - Include and conditional Skip if
  3. shellspec_when_statement - When call/run evaluation statements
  4. shellspec_the_statement - The subject should matcher expectations
  5. shellspec_assert_statement - Assert function calls
  6. shellspec_path_statement - Path/File/Dir statements
  7. shellspec_set_statement - Set option statements
  8. shellspec_dump_statement - Dump standalone
  9. shellspec_intercept_statement - Intercept statements
  10. shellspec_todo_statement - Todo standalone
  11. shellspec_pending_statement - Pending standalone
  12. shellspec_skip_statement - Skip standalone

Directive rules (% prefixed):

  1. shellspec_text_directive - %text/%text:raw/%text:expand directives
  2. shellspec_const_directive - %const and % directives
  3. shellspec_output_directive - %puts/%putsn/%-/%= directives
  4. shellspec_preserve_directive - %preserve directive
  5. shellspec_logger_directive - %logger directive

Helper rules (used internally by other rules):

  1. shellspec_subject - Subject words in The statements
  2. shellspec_matcher - Matcher words in The statements
  3. shellspec_data_line_content - Content after #| prefix

Grammar Pattern

All blocks follow this structure:

prec.right(1, seq(
  choice("BlockType", "fBlockType", "xBlockType"),
  field("description", choice($.string, $.raw_string, $.word)),
  repeat($._terminated_statement),
  "End"
))

Conflict Management

The grammar has 6 total conflicts (minimized for performance):

  • 3 inherited from bash grammar
  • 3 ShellSpec-specific: [$.command_name, $.shellspec_data_block], [$.command_name, $.shellspec_hook_statement], and [$.shellspec_hook_block]

When adding new rules, minimize new conflicts. Test thoroughly with npm test after grammar changes.

Grammar Gotchas

  • Compound keyword tokenization: Adding "Data:raw" as a single keyword token in ANY variant forces the tokenizer to prefer it everywhere, breaking variants that expect "Data" ":" "raw" as separate tokens. Only use compound keywords in variants where they're strictly required (e.g., pipe+#| variant).
  • Precedence at shift/reduce boundaries: prec(N) on a simple alternative (e.g., Data arg) applies at reduce time. A block alternative's higher prec.right(M) only takes effect when End is matched. Adding even prec(1) to a simple variant can cause it to win over prec.right(4) blocks at the initial ambiguity point.
  • Bash test expressions: [ ... ] parses as $.test_command in tree-sitter-bash, not as literal [/] tokens. Use $.test_command when grammar rules need to accept bracket test expressions.
  • Verify spec files after grammar changes: Corpus tests can pass while real spec files still have parse errors. Always run for f in test/spec/*.sh; do tree-sitter parse "$f" 2>&1 | grep -c ERROR; done after changes.

Testing Requirements

Quality Gates

  • Minimum tests: 96 (currently 128 tests passing)
  • Success rate: Must be 100% (no failing tests allowed)
  • Coverage: All ShellSpec constructs must be tested
  • CI validation: Tests run on Node 22 and 24

Test Structure

Tests are organized in test/corpus/:

  • describe_blocks.txt - Describe block variants
  • context_blocks.txt - Context/ExampleGroup blocks
  • it_blocks.txt - It/Example/Specify blocks
  • hook_blocks.txt - Hook blocks and statements
  • utility_blocks.txt - Parameters/Skip/Pending/Todo/Data blocks
  • nested_structures.txt - Complex nesting scenarios
  • real_world_patterns.txt - Official ShellSpec examples
  • when_the_assert.txt - When/The/Assert evaluation and expectation statements
  • mock_blocks.txt - Mock command blocks
  • shellspec_statements.txt - Path/Set/Dump/Intercept statements
  • parameters_variants.txt - Parameters :block/:value/:matrix/:dynamic variants
  • pending_skip_statements.txt - Pending/Skip/Todo standalone statements
  • percent_directives.txt - %text/%const/%puts/%preserve/%logger directives

Test Format

Each test follows tree-sitter's corpus format:

==================
Test name
==================

ShellSpec code here

---

(program
  (expected AST structure))

Code Style

EditorConfig Rules (MUST follow)

  • Indentation: 2 spaces (no tabs, except Makefiles)
  • Line endings: LF (Unix)
  • Charset: UTF-8
  • Max line length: 160 characters
  • Trailing whitespace: Remove (except .md files)
  • Final newline: Required

JavaScript/Grammar Conventions

  • Use JSDoc comments for file headers
  • Include TypeScript reference for tree-sitter DSL: /// <reference types="tree-sitter-cli/dsl" />
  • Prefix ShellSpec rules with shellspec_
  • Use descriptive field names (e.g., field("description", ...))
  • Use prec.right() for right-associative block structures

Development Workflow

Making Grammar Changes

  1. Edit grammar.js - Make your changes
  2. Generate parser - npm run generate
  3. Test changes - npm test (must be 100% passing)
  4. Lint code - npm run lint (must pass)
  5. Build parser - npm run build

Adding New ShellSpec Constructs

  1. Add the rule to grammar.js in the rules object
  2. Extend _statement_not_subshell to include the new rule
  3. Create comprehensive test cases in appropriate test/corpus/*.txt file
  4. Verify no new conflicts introduced
  5. Update README.md if adding user-facing features

Debugging Parse Failures

# Parse a file and see where it fails
npx tree-sitter parse path/to/failing.shellspec

# View detailed AST
npx tree-sitter parse path/to/file.shellspec --debug

# Open web UI for interactive debugging
npm run web

CI/CD Pipeline

GitHub Actions

  • test.yml: Runs tests on Node 22 and 24, validates parser generation
  • lint: MegaLinter code quality checks
  • coverage: Validates minimum 96 tests passing
  • All checks must pass for PR merge

Disabled Linters

The following linters are intentionally disabled in .mega-linter.yml:

  • C_CLANG_FORMAT (generated code may not follow style)
  • JSON_PRETTIER (causes problems)
  • SPELL_LYCHEE/CSPELL (too many false positives)
  • JAVASCRIPT_PRETTIER (not using Prettier)

ShellSpec Language Support

Block Types Supported

  • Describe: Describe, fDescribe, xDescribe
  • Context: Context, ExampleGroup, fContext, xContext
  • It: It, Example, Specify, fIt, fExample, fSpecify, xIt, xExample, xSpecify
  • Hooks: BeforeEach, AfterEach, BeforeAll, AfterAll, BeforeCall, AfterCall, BeforeRun, AfterRun
  • Utility: Parameters (with :block/:value/:matrix/:dynamic), Data (with :raw/:expand)
  • Mock: Mock command blocks

Statement Types

  • Hook statements: Before func1 func2, After cleanup, BeforeRun setup, AfterRun cleanup, etc.
  • Include: Include ./helper.sh
  • Conditional Skip: Skip if "reason" condition (supports [ ... ] test expressions)
  • When: When call func, When run command cmd
  • The: The output should equal "expected"
  • Assert: Assert function args
  • Path/File/Dir: Path name="value", File name="value", Dir name="value"
  • Set: Set option:value
  • Dump: Dump standalone
  • Intercept: Intercept name
  • Todo/Pending/Skip: Standalone statement variants

Directive Types

  • %text: %text, %text:raw, %text:expand with #| content lines
  • %const / %: %const NAME "value", % NAME "value"
  • %puts / %putsn / %- / %=: Output directives
  • %preserve: %preserve VAR
  • %logger: %logger "message"

Known Limitations

  • % standalone shorthand may conflict with bash job control in edge cases
  • %text with multiple #| lines may not work outside of block contexts
  • Tagging (Describe 'name' tag:value) and % directives beyond the supported set (%text, %const, %puts, %putsn, %preserve, %logger) are not yet supported
  • These are documented in README.md "Areas for Contribution"

Important Notes

  • Never modify generated files in src/ directory (parser.c, grammar.json, node-types.json)
  • Always run tests after grammar changes - failing tests block PRs
  • Follow EditorConfig rules strictly - violations are blocking errors
  • Maintain 100% test pass rate - CI enforces minimum 96 tests passing
  • Use system tree-sitter for CLI commands — the npx tree-sitter binary may not work; fall back to the system-installed tree-sitter CLI
  • The grammar extends bash, so all bash syntax remains valid

Claude Code Automations

Hooks (.claude/hooks/)

Hook scripts are in .claude/hooks/, invoked by .claude/settings.json:

  • pre-edit-guard.sh (PreToolUse): Blocks edits to generated files (src/parser.c, src/grammar.json, src/node-types.json) and lock files
  • post-edit-lint.sh (PostToolUse): Auto-regenerates parser after grammar.js edits, checks EditorConfig compliance, validates corpus format

Skills (.claude/skills/)

Skill Invocation Description
/generate-and-test User Generate parser, run tests, verify spec files
/add-shellspec-rule User Guided workflow to add a new grammar rule with tests
/debug-parse-failure User Diagnose ERROR nodes and trace to grammar rules
/update-highlights User Sync highlights.scm with all grammar keywords
/validate-release User only Full pre-release validation checklist

Agents (.claude/agents/)

  • grammar-validator: Runs tests and spec file parsing, reports results without editing