Validates Garura components (plays, agents, skills) against structural, semantic, and cross-reference rules. Reads quality profile to classify violation severities.
Scanned 9/10/2026
Install to Claude Code
npx -y skills add kapilvirenahuja/garura --skill lint-components --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Lint Components?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/kapilvirenahuja-lint-components)More formats (shields.io, HTML) on the badges page.
---
name: lint-components
description: Validates Garura components (plays, agents, skills) against structural, semantic, and cross-reference rules. Reads quality profile to classify violation severities.
user-invocable: false
model: sonnet
allowed-tools: Bash, Read
deprecated: true
deprecated_note: '#434 ProductOS realignment — superseded by the command model; retained for Phase E reference, not installed'
---
## Purpose
Run the deterministic Node.js component linter against `core/components/` and produce a structured lint report artifact. Reads the project quality profile to classify ERROR violations as blockers and WARNING violations as informational per the profile's maintainability and security targets.
## Input
STM input contract:
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `project_root` | string | Yes | Absolute path to the repository root |
| `output_path` | string | Yes | STM path where the lint report artifact will be written |
Example:
```yaml
stm:
input:
project_root: /path/to/repo
output:
lint_report: .garura/project/issues/{issue}/evidence/{play}/lint-report.yaml
```
## Process
1. **Check node_modules.** From `{project_root}`, check whether `core/tools/lint-components/node_modules/` exists. If not, run:
```bash
npm install --silent
```
in `core/tools/lint-components/`. This installs the `js-yaml` dependency required by the linter.
2. **Run the linter.** Execute:
```bash
node core/tools/lint-components/index.js --target core/components --output json
```
Capture stdout as the raw JSON output. The tool exits 0 if no errors; exits 1 if any errors are found (errors > 0). Both exit codes are expected — do NOT treat exit code 1 as a fatal failure.
3. **Parse JSON output.** Parse the captured stdout as JSON. Shape:
```json
{
"violations": [
{ "file": "...", "rule": "...", "severity": "error|warning|info", "message": "...", "line": 0 }
],
"summary": { "errors": 0, "warnings": 0, "infos": 0 }
}
```
4. **Read quality profile.** Read `.garura/product/specification/quality-profile.yaml`. Extract the `status` field and the maintainability and security target levels. If the file does not exist, log `quality_profile_status: not_found` in the output artifact and proceed with default classification: ERROR → blocker, WARNING → informational.
5. **Classify violations by severity.** Apply quality-profile-derived policy:
- Violations with `severity: error` → classified as `blocker` (blocking issues that prevent merge/ship)
- Violations with `severity: warning` → classified as `informational` (tracked but non-blocking)
- Violations with `severity: info` → classified as `informational`
6. **Log quality profile status.** Record the `status` field from the quality profile (e.g., `DRAFT`, `APPROVED`) in the output artifact as `quality_profile_status`.
7. **Write lint report to STM output path.** Write a structured YAML artifact:
```yaml
generated_at: <ISO timestamp>
quality_profile_status: <status from profile, or "not_found">
summary:
errors: <count>
warnings: <count>
infos: <count>
blockers: <count of error violations>
informational: <count of warning + info violations>
pass: <true if errors == 0, false otherwise>
violations:
- file: <path>
rule: <rule id>
severity: <error|warning|info>
classification: <blocker|informational>
message: <message>
line: <line number>
```
## Output
**Lint report artifact** written to `{output_path}`:
| Field | Description |
|-------|-------------|
| `generated_at` | ISO timestamp of when the lint was run |
| `quality_profile_status` | Status field from quality profile, or `not_found` |
| `summary.errors` | Count of error-severity violations |
| `summary.warnings` | Count of warning-severity violations |
| `summary.infos` | Count of info-severity violations |
| `summary.blockers` | Count of blocker-classified violations (= errors) |
| `summary.informational` | Count of informational violations (= warnings + infos) |
| `pass` | `true` if no errors found; `false` otherwise |
| `violations` | Array of all violations with classification |
**Return value:** The output artifact path.
## Constraints
- Must not modify any components under `core/components/` — read-only analysis only.
- Template validation (`--validate-templates`) is off by default. Do not pass this flag unless explicitly instructed.
- Quality profile path must be resolvable: `.garura/product/specification/quality-profile.yaml`. If absent, fall back to default classification and log `quality_profile_status: not_found`.
- Do not fail the skill if the linter exits with code 1 — that is the expected exit code when violations are found. Only fail on exit code 2 (fatal/unexpected error).
- Run from `{project_root}` so relative paths in the linter resolve correctly.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!