clckernel 1.2.19 → 2.0.1

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.
Files changed (78) hide show
  1. package/.agents/skills/clckernel_cli/SKILL.md +23 -6
  2. package/.agents/skills/clckernel_cli/reference/audit.md +13 -3
  3. package/.agents/skills/clckernel_cli/reference/commit.md +1 -1
  4. package/.agents/skills/clckernel_cli/reference/doctor.md +5 -3
  5. package/.agents/skills/clckernel_cli/reference/feature.md +3 -3
  6. package/.agents/skills/clckernel_cli/reference/guard.md +48 -12
  7. package/.agents/skills/clckernel_cli/reference/phase.md +6 -3
  8. package/.agents/skills/clckernel_cli/reference/start.md +14 -4
  9. package/.agents/skills/clckernel_cli/reference/test.md +1 -1
  10. package/.agents/skills/clckernel_cli/reference/update.md +19 -19
  11. package/CHANGELOG.md +250 -0
  12. package/LICENSE +21 -0
  13. package/README.es.md +280 -51
  14. package/README.md +274 -50
  15. package/bin/deprecated.js +13 -0
  16. package/package.json +14 -4
  17. package/src/adapters/agent-os.js +161 -84
  18. package/src/adapters/astro.js +8 -6
  19. package/src/adapters/base.js +23 -38
  20. package/src/adapters/django.js +14 -13
  21. package/src/adapters/fastapi.js +16 -15
  22. package/src/adapters/go.js +11 -9
  23. package/src/adapters/laravel.js +12 -10
  24. package/src/adapters/nextjs.js +7 -5
  25. package/src/adapters/rails.js +13 -11
  26. package/src/adapters/rust.js +11 -9
  27. package/src/catalog.js +58 -49
  28. package/src/config.js +38 -240
  29. package/src/detector.js +243 -44
  30. package/src/doctor.js +18 -9
  31. package/src/generator.js +734 -302
  32. package/src/gitignore.js +60 -14
  33. package/src/index.js +257 -18
  34. package/src/io.js +409 -0
  35. package/src/known-hashes.json +309 -0
  36. package/src/onboarding.js +15 -0
  37. package/src/technologies/detector.js +1 -1
  38. package/src/technologies/guards/_shared.js +1 -1
  39. package/src/ui.js +233 -40
  40. package/src/updater.js +271 -38
  41. package/tools/_changes.js +279 -0
  42. package/tools/_changes.py +233 -0
  43. package/tools/_config.js +294 -0
  44. package/tools/_config.py +271 -0
  45. package/tools/_yaml.py +489 -0
  46. package/tools/audit.js +511 -111
  47. package/tools/audit.py +506 -128
  48. package/tools/celery_guard.py +13 -35
  49. package/tools/check_a11y.js +8 -28
  50. package/tools/check_api_contracts.js +13 -39
  51. package/tools/check_architecture.js +35 -44
  52. package/tools/check_architecture.py +172 -105
  53. package/tools/check_custom.js +108 -61
  54. package/tools/check_custom.py +108 -271
  55. package/tools/check_data_files.js +88 -0
  56. package/tools/check_db_efficiency.py +80 -65
  57. package/tools/check_hitl.js +112 -69
  58. package/tools/check_links.js +138 -0
  59. package/tools/check_migrations.py +143 -94
  60. package/tools/check_performance.js +35 -44
  61. package/tools/check_placeholders.js +104 -0
  62. package/tools/check_responsive.js +8 -28
  63. package/tools/check_scope.py +40 -31
  64. package/tools/check_seo.js +8 -28
  65. package/tools/check_skills.js +158 -0
  66. package/tools/check_storybook.js +8 -21
  67. package/tools/check_symlinks.js +40 -22
  68. package/tools/check_ui_reuse.js +17 -29
  69. package/tools/docker_guard.py +19 -41
  70. package/tools/postgres_guard.py +15 -36
  71. package/tools/redis_guard.py +13 -35
  72. package/tools/scan_secrets.js +134 -67
  73. package/tools/scan_secrets.py +163 -72
  74. package/tools/verify_tdd.js +867 -0
  75. package/tools/verify_tdd.py +407 -165
  76. package/tools/yaml.js +404 -132
  77. package/tools/check_domain_data.js +0 -100
  78. package/tools/check_test_calendar_sync.js +0 -111
@@ -5,7 +5,9 @@ description: >-
5
5
  Use when the user issues a clckernel command (e.g. clckernel feature, clckernel fix,
6
6
  clckernel audit, clckernel doctor, clckernel commit, clckernel update, clckernel start)
7
7
  or /clckernel, or asks to initiate a feature, fix a bug, audit architecture, run tests,
8
- diagnose health, or commit changes in a project governed by CLC Kernel.
8
+ diagnose health, or commit changes in a project governed by CLC Kernel. Also use in the
9
+ first session after install (tools/.clckernel-managed.json present, no .clckernel.yaml) to
10
+ orient the user and offer the start playbook.
9
11
  ---
10
12
 
11
13
  # 🤖 CLC Kernel — Agent Governance Engine
@@ -21,12 +23,12 @@ When the developer issues a \`clckernel <command>\` or \`/clckernel <command>\`
21
23
  | `feature` | Lifecycle | Execute full AIUP cycle for a new feature (Spec -> HIT -> TDD -> Clean Code -> Audit) | [reference/feature.md](reference/feature.md) |
22
24
  | `fix` | Lifecycle | Reproduce root cause with failing test, execute surgical fix, and audit | [reference/fix.md](reference/fix.md) |
23
25
  | `test` | Verification | Run stack test runner and verify clean green exit code | [reference/test.md](reference/test.md) |
24
- | `audit` | Verification | Run mandatory educational audit gate & AST validation | [reference/audit.md](reference/audit.md) |
25
- | `doctor` | Diagnostics | Check configuration health, hook parity, symlinks & AST engine | [reference/doctor.md](reference/doctor.md) |
26
+ | `audit` | Verification | Run mandatory educational audit gate & guard checks | [reference/audit.md](reference/audit.md) |
27
+ | `doctor` | Diagnostics | Check configuration health, hook parity, symlinks & guard scripts | [reference/doctor.md](reference/doctor.md) |
26
28
  | `commit` | Version Control | Pre-flight audit, verify SDD scope, and commit with Conventional Commits | [reference/commit.md](reference/commit.md) |
27
29
  | `update` | Maintenance | Non-destructive update: refresh core tools, playbooks & symlinks (preserves SDDs & custom guards) | [reference/update.md](reference/update.md) |
28
- | `start` | Setup | Discover tech stack & initialize `.clckernel.yaml` | [reference/start.md](reference/start.md) |
29
- | `create_guard` | Safeguards | Scaffold a new AST/linter guard in native stack language | [reference/guard.md](reference/guard.md) |
30
+ | `start` | Setup | Discover tech stack, install the harness if missing (`npx clckernel . --yes`) & propose an optional `.clckernel.yaml` | [reference/start.md](reference/start.md) |
31
+ | `create_guard` | Safeguards | Scaffold a new pattern-based/linter guard in native stack language | [reference/guard.md](reference/guard.md) |
30
32
  | `remove_guard` | Safeguards | Safely remove an existing guard and clean up config | [reference/guard.md](reference/guard.md) |
31
33
  | `phase` | Lifecycle | Add or remove pipeline execution phases | [reference/phase.md](reference/phase.md) |
32
34
 
@@ -43,4 +45,19 @@ When the developer issues a \`clckernel <command>\` or \`/clckernel <command>\`
43
45
  - *"Auditar / verificar arquitectura"* -> Route to `audit` ([reference/audit.md](reference/audit.md))
44
46
  - *"Revisar estado / diagnóstico"* -> Route to `doctor` ([reference/doctor.md](reference/doctor.md))
45
47
  - *"Commitear / guardar cambios"* -> Route to `commit` ([reference/commit.md](reference/commit.md))
46
- 4. **Mandatory Audit Gate:** Never declare success on code changes without running the audit gate and outputting the summary.
48
+ 4. **First session after install** (`tools/.clckernel-managed.json` exists, `.clckernel.yaml` does not):
49
+ follow the "First session after install" section of AGENTS.md. The user's own request comes first;
50
+ otherwise explain briefly what is installed, ask ONE question (run [reference/start.md](reference/start.md)
51
+ or keep the defaults) and STOP.
52
+ 5. **Mandatory Audit Gate:** Never declare success on code changes without running the audit gate and outputting the summary.
53
+
54
+ ## Human checkpoint
55
+
56
+ The user's explicit approval is required before any step that changes shared state or cannot be undone. At each checkpoint, show what will happen, stop, and wait for a clear "yes"; silence, an earlier approval, or approval of a different step does not count.
57
+
58
+ - **Spec before code:** after writing the spec for `feature` (or the root-cause plan for `fix`), present it and wait for approval before writing tests or code.
59
+ - **Before committing:** show the staged files, the audit result and the commit message, and wait for approval before running `git commit`.
60
+ - **Before publishing:** never push, open a pull request, tag or release without the user's explicit request.
61
+ - **Before destructive actions:** removing a guard or phase, deleting files, or overwriting files the project edited locally requires approval of the exact list of paths.
62
+
63
+ If the user declines, stop and report the current state; do not retry or look for a workaround.
@@ -4,13 +4,23 @@ Use this playbook when auditing code quality, architecture compliance, or execut
4
4
 
5
5
  ## Execution
6
6
 
7
- 1. **Locate Audit Tool:** Check available audit scripts:
7
+ 1. **Locate Audit Tool:** `npx clckernel audit [dir] [--change <name>]` runs every installed orchestrator for you. Or check the available audit scripts:
8
8
  - `node tools/audit.js` (JavaScript / Node environment)
9
9
  - `python tools/audit.py` (Python / Backend environment)
10
- 2. **Execute Audit:** Run the tool within project workspace.
10
+ 2. **Execute Audit:** Run the tool within the project workspace. CLI (both scripts):
11
+ `audit.(js|py) [targetDir] [--change <name>] [--staged]`.
12
+ - Working on an SDD change (`sdds/<name>/`): pass `--change <name>`. Only then are the report
13
+ (`05-audit-report.md`) and the receipt (`audit-receipt.json`) written, in `sdds/<name>/`.
14
+ On a mixed stack (both `tools/audit.js` and `tools/audit.py` installed) each orchestrator
15
+ writes its own pair: `05-audit-report.js.md` + `audit-receipt.js.json` and
16
+ `05-audit-report.py.md` + `audit-receipt.py.json`. Read both.
17
+ - Without `--change` nothing is written: read the summary from stdout.
18
+ - `--staged` is the default snapshot (staged changes, or the last commit when nothing is staged).
19
+ - An unknown flag exits 2 with the usage line: fix the command, do not report it as a guard failure.
11
20
  3. **Educational Summary:** Output the educational audit summary highlighting:
12
- - AST Architectural conformance
21
+ - Architectural conformance (layer-boundary guards)
13
22
  - TDD compliance & test coverage
14
23
  - Security & Secrets scan results
15
24
  - Performance / DB efficiency checks
16
25
  4. **Actionable Feedback:** If any guard fails, explain the exact violation, why it breaches architectural invariants, and how to remediate it.
26
+ 5. **Warnings:** A guard marked `WARN` / ⚠️ (level `warning`, from the guard or `severities` in `.clckernel.yaml`) failed but does not block: the verdict is `PASSED_WITH_WARNINGS`. Report it and propose the fix; do not hide it. A guard that crashed always blocks.
@@ -4,7 +4,7 @@ Safely commit changes after verifying all pre-flight quality and architecture ga
4
4
 
5
5
  ## Mandatory Execution Protocol
6
6
 
7
- ### Step 1: Pre-Flight AST Audit
7
+ ### Step 1: Pre-Flight Guard Audit
8
8
  1. Run \`node tools/audit.js\` or \`python tools/audit.py\`.
9
9
  2. Ensure 100% of discovered guards pass with 0 errors and 0 secret leaks.
10
10
 
@@ -4,7 +4,9 @@ Use this playbook to diagnose environment health, detect hook drift, or verify c
4
4
 
5
5
  ## Checks
6
6
 
7
- 1. **Config Integrity:** Validate `.clckernel.yaml` syntax and presence of required sections (`framework`, `language`, `project_type`, `safeguards`).
8
- 2. **Hook Parity:** Check that git hooks (`.githooks/pre-commit` or `.husky/pre-commit`) are installed and executable (`chmod +x`).
9
- 3. **Tools & Guards Health:** Verify that scripts referenced in `.clckernel.yaml` exist in `tools/` and run without syntax errors.
7
+ Start with `npx clckernel doctor [dir]`: it checks `AGENTS.md`, `sdds/`, `docs/Journal/`, `tools/`, the pre-commit hook, that each `tools/check_*` guard loads (JS) or parses (Python), and the orchestrators' imports. Then:
8
+
9
+ 1. **Config Integrity:** When `.clckernel.yaml` exists, check its keys against the README "Configuration" table (`rules`, `exclude_paths`, `mirrors`, `hitl`, `update`, `tdd`, `severities`); report any invalid value or deprecated key the guards warn about.
10
+ 2. **Hook Parity:** Check that the hook git runs (`.githooks/pre-commit` with `core.hooksPath=.githooks`, or `.husky/pre-commit` when Husky owns `core.hooksPath`) is executable and calls `node tools/audit.js --hook` and/or `python3 tools/audit.py --hook`.
11
+ 3. **Tools & Guards Health:** Run `npx clckernel audit`: it runs every guard the hook runs (kernel guards and project guards in `tools/guards/`).
10
12
  4. **Drift Remediation:** If drift is detected, offer automatic fix or report clear steps.
@@ -32,7 +32,7 @@ Guide the developer through implementing a new feature strictly governed by the
32
32
  2. Maintain strict Clean Architecture boundaries (Domain -> Use Case -> Infrastructure).
33
33
  3. Re-run tests to confirm 100% green pass.
34
34
 
35
- ### Step 6: Mandatory AST Audit Gate
36
- 1. Execute \`node tools/audit.js\` or \`python tools/audit.py\`.
35
+ ### Step 6: Mandatory Audit Gate
36
+ 1. Execute \`node tools/audit.js --change <name>\` or \`python tools/audit.py --change <name>\` (writes the report and receipt to \`sdds/<name>/\`).
37
37
  2. Output the Educational Summary table to stdout.
38
- 3. Verify zero secrets, zero layer violations, and zero N+1 queries.
38
+ 3. Verify zero secret findings, zero layer violations, and zero N+1 heuristic findings.
@@ -1,23 +1,59 @@
1
1
  # Playbook: Safeguards Management (Create & Remove)
2
2
 
3
- Use this playbook when the user wants to add, modify, or delete custom architecture/security guards (via `/clc create_guard`, `/clc remove_guard`, or natural language like *"creá un guard para bloquear imports prohibidos"*).
3
+ Use this playbook when the user wants to add, modify, or delete a project guard (via `/clc create_guard`, `/clc remove_guard`, or natural language like *"creá un guard para bloquear imports prohibidos"*).
4
+
5
+ Project guards hold the rules of this project's domain; the kernel ships none. They are project code: never listed in `tools/.clckernel-managed.json`, preserved by `clckernel update`, and evaluated by the other guards like any other file. Put them in `tools/guards/` (any `*.js` / `*.py` name). A guard file at the top of `tools/` whose name starts with `check_`, `scan_` or `verify_` (or ends with `_guard`) and that the registry does not list is a project guard too — for example a kernel guard the kernel no longer ships, which `clckernel update` leaves in place.
6
+
7
+ ## How project guards run
8
+
9
+ - **One discovery, two entry points:** the pre-commit hook calls `node tools/audit.js --hook` and `python3 tools/audit.py --hook` (each when installed); `clckernel audit` runs the same orchestrators without `--hook`. Both run exactly the same guards — the kernel guards and every project guard — each once, from the repository root. Adding a guard needs no `clckernel update`.
10
+ - **Which orchestrator runs which guard:** `audit.js` runs the `.js` guards and `audit.py` the `.py` ones. When a project has only one orchestrator (e.g. a Node stack without `tools/audit.py`), that one also runs the other language's guards (`python3` / `node`).
11
+ - **Audit:** the report lists them (architecture lens unless the JSON result names another). `--hook` writes no report: it prints one line per guard and the details of each failure.
12
+ - **Contract:** a non-zero exit code blocks the commit and fails the audit. Printing the standard JSON result is optional; when present the audit uses it for the report: `{ "exitCode": 0, "skipped": false, "name": "check_x", "data": { "message": "...", "violations": [{ "file": "...", "message": "..." }] } }` (optional `"lens"`: `correctness`, `security`, `architecture` or `performance`). Plain output is reported by its last line.
13
+ - **Snapshot helpers:** evaluate the commit being made, not the working copy. A JS guard imports `require('../_changes')`; a Python guard imports `_changes` after adding the parent directory to `sys.path`. Each helper exists only when the harness installed it (`tools/_changes.js` with JS guards, `tools/_changes.py` with Python guards).
4
14
 
5
15
  ## 🛠️ Create Guard
6
16
 
7
- 1. **Clarify Objective:** If not specified, ask what AST node, pattern, or security risk to intercept. **STOP.** Wait for details.
8
- 2. **Native Language Implementation:** Write the guard script in the native stack language:
9
- - Python projects -> Python `ast` script in `tools/guards/<name>_guard.py`
10
- - Node / TS projects -> JS/TS script in `tools/guards/<name>_guard.js`
11
- - Go projects -> Go `go/parser` / `ast` script
12
- - Ruby projects -> Ruby `parser` gem script
13
- 3. **Register in Config:** Add the guard definition under `custom_safeguards` or `tools` in `.clckernel.yaml`.
14
- 4. **Validation:** Run the script against test fixtures to confirm it flags violations and exits cleanly on compliant code.
17
+ 1. **Clarify Objective:** If not specified, ask what pattern, rule, or risk to intercept. **STOP.** Wait for details.
18
+ 2. **Write the guard** in `tools/guards/<name>.js` (Node) or `tools/guards/<name>.py` (Python). Only these two extensions run; use the one whose snapshot helper the project has. Minimal working examples:
19
+
20
+ ```js
21
+ // tools/guards/check_no_draft_json.js
22
+ const { changedFiles, readFile } = require('../_changes');
23
+
24
+ const { mode, files } = changedFiles(process.cwd(), { extensions: ['.json'] });
25
+ const violations = files
26
+ .filter((file) => (readFile(process.cwd(), file, mode) || '').includes('"draft": true'))
27
+ .map((file) => ({ file, message: 'draft data must not be committed' }));
28
+ const exitCode = violations.length > 0 ? 1 : 0;
29
+ console.log(JSON.stringify({ exitCode, skipped: false, name: 'check_no_draft_json', data: { message: `${violations.length} violation(s)`, violations } }));
30
+ process.exit(exitCode);
31
+ ```
32
+
33
+ ```python
34
+ # tools/guards/check_no_draft_json.py
35
+ import json, pathlib, sys
36
+ sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent))
37
+ from _changes import changed_files, read_file
38
+
39
+ snapshot = changed_files(".", extensions=[".json"])
40
+ violations = [
41
+ {"file": f, "message": "draft data must not be committed"}
42
+ for f in snapshot["files"]
43
+ if '"draft": true' in (read_file(".", f, snapshot["mode"]) or "")
44
+ ]
45
+ exit_code = 1 if violations else 0
46
+ print(json.dumps({"exitCode": exit_code, "skipped": False, "name": "check_no_draft_json",
47
+ "data": {"message": f"{len(violations)} violation(s)", "violations": violations}}))
48
+ sys.exit(exit_code)
49
+ ```
50
+
51
+ 3. **Validation:** stage a violating file and run `node tools/guards/<name>.js` (or `python3 tools/guards/<name>.py`): it must exit 1. Stage a compliant one: it must exit 0. Then run `node tools/audit.js` to see it reported.
15
52
 
16
53
  ---
17
54
 
18
55
  ## 🗑️ Remove Guard
19
56
 
20
57
  1. Identify the target guard from user request or ask for confirmation.
21
- 2. Update `.clckernel.yaml` removing the guard entry.
22
- 3. If requested, delete the corresponding file from `tools/guards/`.
23
- 4. Confirm removal cleanly.
58
+ 2. Delete the corresponding file from `tools/guards/` (or the top of `tools/`): the hook and the audit stop running it; nothing else to update. A kernel guard listed in `tools/.clckernel-managed.json` cannot be removed by deleting it (the hook fails on a missing kernel guard); exclude it with `update.exclude` in `.clckernel.yaml` instead.
59
+ 3. Confirm removal cleanly.
@@ -7,12 +7,15 @@ Use this playbook when adding, modifying, or removing lifecycle phases in the AI
7
7
  1. **Understand Phase Purpose:**
8
8
  - Pre-implementation (e.g. Research, SDD spec, RFC alignment)
9
9
  - Implementation (e.g. TDD Red/Green, Layer Check)
10
- - Verification / Audit (e.g. AST Audit, E2E, Smoke test)
10
+ - Verification / Audit (e.g. Guard Audit, E2E, Smoke test)
11
11
  - Delivery (e.g. Git pre-commit, PR generation)
12
12
 
13
- 2. **Update `.clckernel.yaml`:**
13
+ 2. **Update `AGENTS.md`:**
14
+ - Phases are agent instructions: record the new order in the Loop section of `AGENTS.md`, never in
15
+ `.clckernel.yaml` (its `phases` key is deprecated and has no effect).
14
16
  - Preserve execution order and dependencies.
15
- - Specify whether the phase is blocking (`required: true`) or advisory (`required: false`).
17
+ - Say whether the phase is blocking or advisory; a blocking check belongs in a guard under
18
+ `tools/guards/`, which the pre-commit hook runs.
16
19
 
17
20
  3. **Confirm & Validate:**
18
21
  - Present the updated pipeline flow to the user.
@@ -1,6 +1,7 @@
1
1
  # Playbook: Start / Initialize CLC Kernel
2
2
 
3
3
  Use this playbook when the user wants to initialize, start, or set up governance in a project (via `/clc start`, `/clckernel start`, or conversational request like *"inicializar el proyecto con clc"*).
4
+ It is also the playbook offered in the first session after install (AGENTS.md, "First session after install").
4
5
 
5
6
  ## Sequence
6
7
 
@@ -17,12 +18,21 @@ Use this playbook when the user wants to initialize, start, or set up governance
17
18
 
18
19
  ### Phase 2: Interactive Alignment
19
20
  Present detected stack and proposal clearly:
20
- 1. Summarize detected architecture and auto-provisioned safeguards (e.g., TDD Red/Green, AST architecture guard, DB efficiency, secrets scan, tech-specific guards).
21
+ 1. Summarize detected architecture and auto-provisioned safeguards (e.g., Red→Green TDD verifier on FastAPI/Django, architecture guard, N+1 heuristic, secrets scan, tech-specific guards).
21
22
  2. Ask one clear question:
22
23
  - *"¿Activamos estas fases y salvaguardas estándar, o querés personalizar alguna regla o fase?"*
23
24
  3. **STOP.** Wait for the user's response.
24
25
 
25
26
  ### Phase 3: Materialization
26
- 1. Write or update `.clckernel.yaml` at project root.
27
- 2. If hooks are configured, ensure `.githooks/pre-commit` or `.husky/pre-commit` are provisioned.
28
- 3. Confirm completion with a concise summary.
27
+ 1. If the harness is not installed (no `AGENTS.md` / `tools/audit.js` / `tools/audit.py`), run
28
+ `npx clckernel . --yes` (`--dry-run` first to show the plan). The CLI writes the guards, the
29
+ pre-commit hook (`.githooks/pre-commit`, or `.husky/pre-commit` when Husky already runs the
30
+ repository's hooks), the playbooks and the IDE mirrors. Never write the hook by hand.
31
+ 2. `.clckernel.yaml` is optional: without it every default applies. Write keys only when the user
32
+ chose a customization, only with the keys the README "Configuration" table lists (`rules`,
33
+ `exclude_paths`, `mirrors`, `hitl`, `update`, `tdd`, `severities`) and only what differs from the
34
+ defaults.
35
+ 3. If the user keeps the defaults, write a `.clckernel.yaml` that holds only a comment (for example
36
+ `# CLC Kernel: defaults accepted. Add keys only for settings that differ.`). It parses to the
37
+ defaults and ends the first-session onboarding, so the question is not asked again.
38
+ 4. Confirm completion with a concise summary.
@@ -5,7 +5,7 @@ Execute the repository test suite within the native environment runner.
5
5
  ## Mandatory Execution Protocol
6
6
 
7
7
  ### Step 1: Detect Test Runner
8
- 1. Inspect \`.clckernel.yaml\` or project files to identify the configured test runner:
8
+ 1. Inspect the project files to identify the test runner:
9
9
  - Node: \`npm test\` / \`vitest\` / \`jest\`
10
10
  - Python: \`pytest\`
11
11
  - Go: \`go test ./...\`
@@ -5,29 +5,29 @@ Use this playbook when the user wants to update an existing project to the lates
5
5
  ## Invariants: The Non-Destructive Update Contract
6
6
 
7
7
  1. **NEVER DELETE OR OVERWRITE `sdds/`:** All local specifications (`sdds/*/spec.md`, `plan.md`) must stay 100% intact.
8
- 2. **NEVER TOUCH CUSTOM GUARDS:** Any user-defined scripts under `tools/guards/` are preserved without alteration.
9
- 3. **NEVER OVERWRITE CONFIGURATION:** Existing `.clckernel.yaml` or `.clc-forge.yaml` settings and custom thresholds remain intact.
10
- 4. **NEVER MODIFY APPLICATION CODE:** Source files, domain layers, and application tests are never touched.
8
+ 2. **NEVER TOUCH PROJECT GUARDS:** Scripts under `tools/guards/` and unmanaged guard files at the top of `tools/` are preserved without alteration. A kernel guard the new release no longer ships stays where it is and keeps running as a project guard; nothing is moved or deleted.
9
+ 3. **NEVER OVERWRITE CONFIGURATION:** Existing `.clckernel.yaml` settings (or a config under an older name) remain intact.
10
+ 4. **NEVER OVERWRITE EDITED KERNEL FILES:** A kernel file the project edited is kept; the new version is written next to it as `<file>.clckernel-new`.
11
+ 5. **NEVER MODIFY APPLICATION CODE:** Source files, domain layers, and application tests are never touched.
11
12
 
12
13
  ## Update Sequence
13
14
 
14
- ### Phase 1: Inspection & Detection
15
- 1. Verify the project is already governed by checking for `AGENTS.md`, `.clckernel.yaml`, `.husky/pre-commit`, or `.githooks/pre-commit`.
16
- 2. Inspect the active framework and test runner.
15
+ ### Phase 1: Inspection & Plan
16
+ 1. Verify the project is already governed by checking for `AGENTS.md`, `tools/.clckernel-managed.json`, `.githooks/pre-commit` or `.husky/pre-commit`.
17
+ 2. Run `npx clckernel update [dir] --dry-run` and show the plan (written, kept, excluded by `update.exclude`). Nothing is written.
18
+ 3. **STOP.** Wait for the user's approval of the plan.
17
19
 
18
- ### Phase 2: Refresh Core Infrastructure
19
- 1. Refresh bundled AST audit tools in `tools/`:
20
- - `tools/audit.js` / `tools/audit.py`
21
- - Built-in guards (`scan_secrets.js`, `check_responsive.js`, `check_seo.js`, `check_db_efficiency.py`, `check_custom.js`, `docker_guard.py`, etc.)
22
- 2. Refresh Agent Skills & Playbooks:
23
- - Synchronize `.agents/skills/clckernel_cli/` with latest playbooks and references.
24
- 3. Refresh Cross-IDE Rule Symlinks:
25
- - Ensure `CLAUDE.md`, `GEMINI.md`, `.cursorrules`, `.cursor/rules/*.mdc`, `.github/copilot-instructions.md`, and `.antigravity/rules.md` link to `AGENTS.md`.
26
- 4. Refresh Pre-commit Hook:
27
- - Ensure the git pre-commit hook runs the latest standard guards while preserving any custom checks.
20
+ ### Phase 2: Run the Update
21
+ 1. Run `npx clckernel update [dir]`. It refreshes, in one pass:
22
+ - the kernel tools the project already has in `tools/` (`audit.js` / `audit.py`, guards, helpers) — update never adds a guard the project did not choose;
23
+ - the skill and playbooks in `.agents/skills/clckernel_cli/`;
24
+ - the IDE mirrors that link to `AGENTS.md`;
25
+ - the pre-commit hook, which calls `node tools/audit.js --hook` and/or `python3 tools/audit.py --hook` (every kernel and project guard, once) and then the stack's external tools when they are available.
26
+ 2. To install additional guards, add `--add-guards <a,b|all>` (e.g. `npx clckernel update . --add-guards check_skills`), only with the user's approval.
27
+ 3. Never copy or edit kernel files by hand to "refresh" them.
28
28
 
29
29
  ### Phase 3: Verification & Reporting
30
- 1. Run `node tools/audit.js` or `python tools/audit.py` to verify harness health.
30
+ 1. Run `npx clckernel audit` (or `node tools/audit.js` / `python3 tools/audit.py`) to verify harness health.
31
31
  2. Output a transparent Educational Summary highlighting:
32
- - What was updated (core tools, playbooks, symlinks)
33
- - What was preserved (SDDs, custom guards, YAML configuration)
32
+ - What was updated (core tools, hook, playbooks, symlinks)
33
+ - What was preserved (SDDs, project guards, edited files kept with a `.clckernel-new` copy, YAML configuration)
package/CHANGELOG.md ADDED
@@ -0,0 +1,250 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to
6
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Fixed
11
+
12
+ - `npx clckernel` no longer prints the `clc-forge` deprecation notice. The legacy `clc-forge` and
13
+ `create-clc-forge` binaries now point to `bin/deprecated.js`, so npx runs the bin named like the package
14
+ instead of the first (alphabetically sorted) one.
15
+
16
+ ## [2.0.0] - 2026-10-26
17
+
18
+ ### ⚠ BREAKING CHANGES
19
+
20
+ - **Strict YAML subset for `.clckernel.yaml`.** `check_custom` (JS and Python) now parses a documented YAML
21
+ subset and fails closed: a config that relied on lenient parsing, or that contains invalid rules or invalid
22
+ regexes, now fails the pre-commit hook instead of being silently skipped.
23
+ - **Frontend hook location.** On Next.js and Astro projects the pre-commit hook is written to `.husky/` only
24
+ when Husky is active; otherwise it goes to `.githooks/` with `core.hooksPath`. Re-running `update` may move
25
+ your hook.
26
+ - **Legacy `clc-forge` artifacts.** Installs no longer create the `clc_forge_cli` skill, the
27
+ `clc_forge_context.mdc` Cursor rule or `.clc-forge.resolved.json`, and `clckernel update` removes them when
28
+ they are provably harness-generated (it reports anything it keeps).
29
+ - **`check_hitl` requires an explicit marker.** A changed skill or playbook must contain a `HITL:` line or a
30
+ `## Human checkpoint` / `## HITL` section; words such as "review" or "confirm" no longer pass. The guard now
31
+ also covers `playbooks/` and evaluates the files changed in the commit. Existing Agent-OS repositories may
32
+ start failing when they touch a skill or playbook without a marker.
33
+ - **Domain guards leave the kernel.** `check_domain_data` and `check_test_calendar_sync` are no longer shipped
34
+ or installed, and Agent-OS detection no longer reacts to the `marketing-os` / `laila-mos` names or a
35
+ "marketing operating system" description (`agent-os` and `ai-agents` still work). `clckernel update` leaves
36
+ copies installed by earlier releases exactly where they are in `tools/` (never moves or deletes them), takes
37
+ them out of the registry and reports them as retired kernel guards, so they keep running as project guards.
38
+ - **The pre-commit hook and `clckernel audit` run the same guards (sdds/unified-discovery).** The generated hook
39
+ no longer lists one line per guard plus a `tools/guards/` loop: it calls `node tools/audit.js --hook` and
40
+ `python3 tools/audit.py --hook` (each when installed; with neither the commit fails), then the external tools.
41
+ The orchestrators discover every guard — kernel guards and project guards, both `tools/guards/*` and
42
+ unmanaged `check_*` / `scan_*` / `verify_*` / `*_guard` files at the top of `tools/` — and run each exactly
43
+ once (`.js` via `audit.js`, `.py` via `audit.py`; a lone orchestrator runs both languages). A project guard
44
+ placed at the top of `tools/`, previously run only by `clckernel audit`, now also blocks commits. A guard the
45
+ registry lists but that is missing on disk now fails the hook and the audit. `--hook` writes no report or
46
+ receipt and prints one line per guard. Re-run `clckernel update` to get the new hook.
47
+ - **Retired kernel guards stay in place.** A guard in the registry that the current kernel no longer ships is
48
+ kept where it is (no move to `tools/guards/`, which broke guards that `require` a sibling such as
49
+ `./_changes`), leaves the registry, and `update` reports it as "retired kernel guard kept as project guard".
50
+ `updateHarness()` returns `retiredGuards` instead of `guardMigration`.
51
+ - **`.clckernel.yaml` is read by install, update and the guards; keys without an effect are gone
52
+ (sdds/config-foundation).** `active_guards`, `phases`, `gate_mode`, `layers` and `scope` never
53
+ changed anything: they now print a deprecation warning and are ignored (`severities` got a real effect in
54
+ sdds/audit-cli, below). The config-driven metadata path (`.clckernel.resolved.json`, `CLCKERNEL_SEVERITIES`) is
55
+ removed. An invalid value now stops install, update and every guard with
56
+ `Invalid .clckernel.yaml: key "<key>" — <reason>`.
57
+ - **The audit writes a report only when told where (sdds/audit-cli).** `node tools/audit.js`,
58
+ `python3 tools/audit.py` and `clckernel audit` used to write `05-audit-report.md` and `audit-receipt.json`
59
+ into a guessed folder (the first directory under `sdds/`, or `sdds/audit-run/`), i.e. into an unrelated spec.
60
+ Now a plain run only prints the summary; `--change <name>` (also `clckernel audit [dir] --change <name>`)
61
+ writes both files to `sdds/<name>/`, creating that folder only then. `<name>` must be one path segment.
62
+ The orchestrators take `[targetDir] [--hook] [--change <name>] [--staged]`; any other flag, a second
63
+ positional or `--hook` with `--change` exits 2 with the usage (unknown flags used to be ignored). The Python
64
+ orchestrator now resolves `sdds/` against the target directory, like the JS one. Agents that need the report
65
+ must pass `--change <sdd name>`: re-run `clckernel update` to get the AGENTS.md and playbook wording.
66
+
67
+ ### Added
68
+
69
+ - **Onboarding after install (sdds/onboarding).** A real install ends with a "Next steps" block true to that
70
+ install: commit the harness (or the exact command that activates the hook when it is not active), the AI
71
+ harnesses whose mirrors were written, `clckernel start`, `npx clckernel audit`, `tools/guards/` and
72
+ `npx clckernel update --dry-run`. An update prints a short one only when protected `*.clckernel-new` files or
73
+ available guards need attention. Every generated AGENTS.md gains a "First session after install" section, and
74
+ the skill triggers on it: the user's request comes first; otherwise the agent explains what is installed, asks
75
+ one question (run the `start` playbook or keep the defaults) and stops.
76
+ - **Red→Green TDD verification for Go, Rust, Ruby and PHP (sdds/tdd-other-stacks).** `tools/verify_tdd.js`
77
+ gains language profiles (`go test`, `cargo test --test`, RSpec / Minitest through bundler, Pest / PHPUnit),
78
+ grouped by the nearest `go.mod` / `Cargo.toml` / `Gemfile` / `composer.json`, and is installed for the Go,
79
+ Rust, Rails and Laravel stacks: their commits now fail when production code changes without a test that
80
+ fails on `HEAD` and passes on the staged code. A missing toolchain fails closed with an install hint. Rust
81
+ unit tests inside `src/` cannot be separated for the red run: a `src/` change needs an integration test.
82
+ - **Wider secret coverage in `scan_secrets` (sdds/secret-patterns).** New labels: `Anthropic API Key`,
83
+ `OpenAI Project Key` (project, service-account and admin keys), `Google API Key`, `Slack Token`, `GitHub Token`
84
+ (OAuth, user, server and refresh prefixes) and `GitHub Fine-Grained PAT`. `Quoted Key Secret` flags a quoted
85
+ JSON/YAML key (`"api_key": "…"`) whose value holds a letter and a digit. `Dotenv Secret` flags a committed
86
+ `.env`, `.env.*` or `*.env` file (unquoted values included) when a secret-looking variable has a real value;
87
+ `.env.example`, `.env.sample` and `.env.template` are left alone. Both generic rules skip placeholders (`${VAR}`,
88
+ `<…>`, `changeme`, `your-…`, `xxx`, one repeated character, …). Existing labels are unchanged. The pure matcher
89
+ is exported as `findSecrets(text, filename)` (JS) and `find_secrets(text, filename)` (Python).
90
+
91
+ - **Non-blocking warnings in the audit and the pre-commit hook (sdds/audit-cli).** A guard result may carry
92
+ `level: 'warning'`, and `.clckernel.yaml` `severities: { <guard name>: warning | error }` sets it per guard
93
+ (overriding the guard; values are validated — the key is no longer deprecated). A failing guard at `warning`
94
+ prints `WARN`, does not change the exit code, and is listed separately in the report and in the receipt's
95
+ `warnings`; the verdict is `PASSED_WITH_WARNINGS` when only warnings failed. A guard that crashes (throws,
96
+ returns no result, cannot run, or is missing) always blocks, whatever its severity. `--staged` is accepted as
97
+ an explicit name for the default snapshot (staged changes, else the last commit).
98
+
99
+ - **Configuration keys with a real effect (sdds/config-foundation).** `exclude_paths` (paths no diff-based guard
100
+ evaluates), `mirrors.list` / `mirrors.required` (mirrors install creates and `check_symlinks` verifies),
101
+ `hitl.markers` / `hitl.paths` / `hitl.optOut` (`check_hitl`), `update.exclude` (paths install/update never
102
+ write; reported as *excluded by config*) and `tdd.code` / `tdd.ignore` (what `verify_tdd.js/.py` count as
103
+ production code, e.g. Python tools tested by JS tests). Defaults keep the earlier behaviour. One schema in
104
+ `tools/_config.js` and its twin `tools/_config.py` (the Python YAML fallback parser moved to `tools/_yaml.py`),
105
+ installed next to `_changes.js/.py`. README "Configuration" lists every key.
106
+
107
+ - **Safe `update` and `--dry-run` (sdds/safe-update).** `clckernel update` and a reinstall with `--yes` never
108
+ overwrite a kernel file (`tools/*`, the pre-commit hook, the `clckernel_cli` skill) they cannot prove is
109
+ theirs and intact: a locally edited file, or a project file that only shares a kernel file's name, is kept
110
+ and the new version is written as `<file>.clckernel-new` (added to the consumer `.gitignore`). An older
111
+ intact install without hashes still updates silently: `src/known-hashes.json` holds the sha256 of every
112
+ version the kernel published (built from the git history by `scripts/build-known-hashes.js`).
113
+ `--dry-run` (`clckernel update [dir] --dry-run`, `clckernel [dir] --yes --dry-run`) prints the plan and
114
+ writes nothing — no files, directories, `.gitignore` or `git config`.
115
+
116
+ - **Full-stack and monorepo support.** The detector finds code parts at the root, in declared workspaces
117
+ (`package.json#workspaces`, `pnpm-workspace.yaml`) and in conventional directories (`frontend`, `backend`,
118
+ `web`, `api`, `server`, `client`, `apps/*`, `services/*`, `packages/*`). Several parts install the union of
119
+ their guards once, run each part's external tools inside its directory, list the parts in AGENTS.md and in
120
+ the install summary, and `update` re-detects them. `verify_tdd.py` and `verify_tdd.js` group the changed
121
+ files by their nearest project root and verify red→green per group; code changed in a part without a test
122
+ in that part fails. A repository with a single part at its root is installed exactly as before.
123
+ - `tools/verify_tdd.py` now runs the changed tests with pytest and requires them to fail on the base tree and
124
+ pass on the staged tree; it is installed for FastAPI and Django.
125
+ - `tools/verify_tdd.js`, its twin for vitest, jest and node:test, installed for Next.js, Astro and Agent-OS.
126
+ - `tools/_changes.js` / `tools/_changes.py`: guards read the staged snapshot (or `HEAD` when nothing is staged)
127
+ instead of the working copy.
128
+ - `clckernel audit [dir]` runs every installed audit orchestrator.
129
+ - `tools/.clckernel-managed.json` registry, so guards and both TDD verifiers skip the harness's own files and
130
+ the first commit after an install passes the real hook.
131
+ - `scan_secrets` detects Stripe `sk_`/`rk_` live and test keys.
132
+ - Generic Agent-OS detection: `SKILL.md` in `skills/<name>/`, `.agents/skills/<name>/` or
133
+ `.claude/skills/<name>/`, or a `playbooks/` / `rules/` folder with Markdown (the `package.json` keywords
134
+ still work). The harness's own skill is ignored, and a code stack in the same repository wins.
135
+ - Agent-OS guards `check_skills` (SKILL.md frontmatter: `name`, `description`, unique names),
136
+ `check_links` (relative Markdown links resolve in the commit) and `check_placeholders` (forgotten draft
137
+ markers outside `templates/`); `check_custom` is now installed for Agent-OS.
138
+ - `listFiles` / `list_files` in `tools/_changes.*`: every file of the snapshot being verified.
139
+ - **Project guards run.** Every generated pre-commit hook ends with a generic block that runs each
140
+ `tools/guards/*.js` with `node` and `tools/guards/*.py` with `python3` (alphabetical, after the kernel guards;
141
+ no-op without `tools/guards/`), and `audit.js` / `audit.py` report them. A non-zero exit blocks; the standard
142
+ JSON result is used when printed. Guards can import the snapshot helpers (`require('../_changes')`).
143
+ - Agent-OS guard `check_data_files`: every changed `.json` file must parse (snapshot content, any folder).
144
+ - CI on Node 18/20/22 and Python 3.9/3.13 (without PyYAML), plus a shared YAML conformance suite and
145
+ regression tests for documentation claims and repository hygiene.
146
+
147
+ ### Changed
148
+
149
+ - **Mixed stacks keep both audit reports (sdds/residual-fixes).** When `tools/audit.js` and `tools/audit.py`
150
+ are both installed, `--change <name>` makes each orchestrator write its own pair:
151
+ `05-audit-report.js.md` + `audit-receipt.js.json` and `05-audit-report.py.md` + `audit-receipt.py.json`
152
+ (before, `clckernel audit --change` ran both and the second overwrote the first). Single-orchestrator
153
+ projects keep `05-audit-report.md` and `audit-receipt.json`.
154
+ - **`update` never adds what the project did not choose.** It refreshes only the guards the project has (in
155
+ the registry or present in `tools/`) and runs only those in the hook; the stack's other guards are listed
156
+ as *available, not installed* and opted in with the new `clckernel update --add-guards <name,...|all>`
157
+ (an unknown name exits 1 without writing). It no longer recreates IDE mirrors the project deleted (*not
158
+ present (skipped)*), and neither install nor update adds a `.gitignore` entry for a path git tracks
159
+ (*tracked, not ignored*). `--dry-run` shows the three new sections. A part added to a monorepo gets its
160
+ external tools on update; its guards are offered as available.
161
+ - **The kernel skill obeys `check_hitl`.** `check_hitl` no longer exempts `clckernel_cli` (it also reads
162
+ registry-listed files, via the new `includeManaged` option of `_changes.js`); the skill gains a
163
+ `## Human checkpoint` section: approval before code after a spec, before committing, before destructive
164
+ steps, and no publishing without an explicit request. The retired `clc_forge_cli` and vendored plugin
165
+ skills (`impeccable`) stay exempt.
166
+ - **Hashed registry.** `tools/.clckernel-managed.json` is now `{ "kernelVersion", "files": [{ "path",
167
+ "sha256" }] }` and also covers the hook and the skill; `_changes.js`/`_changes.py` read both this and the
168
+ older list format, and `update` migrates it. Protected files are left out of it.
169
+ - **Every install/update write goes through `src/io.js`**, one write point that applies the ownership rule and
170
+ records the plan. The `update` summary now lists written, unchanged, protected, moved, removed, `.gitignore`
171
+ and `git config` changes, and exits 0 with a visible warning when files were protected. `update` rejects
172
+ unknown flags.
173
+ - **Old domain guards are moved only when intact.** A locally modified `tools/check_domain_data.js` or
174
+ `tools/check_test_calendar_sync.js` stays in `tools/` with a warning instead of being moved.
175
+
176
+ - Generated hooks run under `set -e` without `|| true`; audit orchestrators report a crashing guard as
177
+ FAILED.
178
+ - Hooks run each stack's external tools (ruff, pytest, rubocop, rspec, phpstan, golangci-lint, go test, cargo)
179
+ when available and print "not available, skipped" otherwise; Rails, Go, Laravel and Rust run the secret scan.
180
+ - Choosing another stack in the prompt selects a real adapter instead of only changing the project type.
181
+ - Agent-OS: the kernel installs only guards that hold for any Agent-OS (domain rules belong in the project's
182
+ `tools/guards/`); `check_symlinks` also fails a rule mirror that does not point to `AGENTS.md` (symlink or
183
+ identical copy); the generated `AGENTS.md` describes only the folders the repository has, and its Clean
184
+ Creation State rule is domain-neutral (a field without a real value stays empty or `null`).
185
+ - The CLI refuses missing targets and reserved words as directories, sets `core.hooksPath` only at the
186
+ repository root when unset or already `.githooks`, and `doctor` exits 1 when a check fails.
187
+ - `scan_secrets` redacts detected secrets in its output.
188
+ - Documentation, the website and generated `AGENTS.md` describe guards by what they check and drop claims the
189
+ code does not support.
190
+
191
+ ### Fixed
192
+
193
+ - A fresh install no longer adds `.agents/skills/clc_forge_cli/`, `.clckernel.resolved.json` or
194
+ `.clc-forge.resolved.json` to `.gitignore`; each is added only when that artifact exists in the project.
195
+ - `check_scope.py` reads paths that start with a dot (`.agents/...`, `.clckernel.yaml`,
196
+ `.github/workflows/ci.yml`; extension-less dotfiles such as `` `.gitignore` `` in backticks) and no longer
197
+ truncates table cells (`| src/foo.js |` was read as `oo.js`) (sdds/final-sweep).
198
+ - Docs and website describe the real hook (`.githooks/pre-commit` calling `tools/audit.js --hook` /
199
+ `tools/audit.py --hook`, `.husky/pre-commit` only when Husky already runs the hooks), the real install
200
+ command (`npx clckernel` / `npx clckernel . --yes`; `start` is an agent command) and only real
201
+ `.clckernel.yaml` keys. The AGENTS.md command tables and the playbooks name the CLI options (`--change`,
202
+ `--dry-run`, `--add-guards`) and no longer say `start` materializes `.clckernel.yaml`; the READMEs gained
203
+ a "Known limitations" section (sdds/final-sweep).
204
+ - Install/update decide from the repository's own (`--local`) `core.hooksPath`: a global or system value
205
+ (a user-wide hooks dir) no longer blocks setting `.githooks` nor makes a frontend project look like Husky.
206
+ The local value is set and a note says a global `core.hooksPath` is configured (sdds/residual-fixes).
207
+ - `check_architecture.py` decides Django vs Clean Architecture per changed file, from its nearest project root
208
+ (`manage.py`, `pyproject.toml`, `setup.cfg`, `requirements*.txt`), so a Django app in `backend/` or
209
+ `apps/api/` gets the Django rules and a FastAPI part next to it keeps the layer rules (sdds/residual-fixes).
210
+ - `verify_tdd`: a file native to one verifier that matches `tdd.code` is handed to the other-language verifier
211
+ when both are installed (`.py` to `verify_tdd.js`, JS/TS to `verify_tdd.py`), so "Python tools tested by JS
212
+ tests" no longer fails `verify_tdd.py` for lack of a pytest test. With one verifier nothing changes
213
+ (sdds/residual-fixes).
214
+ - Website: no "100% Verified Code" claim; the file-tree hook example is the generated `.githooks/pre-commit`
215
+ (`audit.js --hook` / `audit.py --hook`, then external tools; `.husky/` only when Husky is active)
216
+ (sdds/residual-fixes).
217
+ - `scan_secrets.py` matches the assignment rules case-insensitively, as the JS guard always did, and splits
218
+ lines the same way, so both report identical findings.
219
+ - `check_custom`: Python glob translation, JS/Python glob parity and an infinite loop on empty regex matches.
220
+ - `check_architecture`: classifies layers by path segment and checks every imported name, including relative
221
+ imports.
222
+ - `check_migrations`: compares upgrade and downgrade to check that destructive upgrades are reversed.
223
+ - `check_db_efficiency`: flags only ORM-like calls inside loops, not `dict.get` or `requests.get`.
224
+ - `postgres_guard`: detects unsafe SQL passed to `execute()`.
225
+ - `check_ui_reuse`: skips test files and harness-owned `tools/` sources.
226
+ - `check_test_calendar_sync` reports drift instead of writing files from the hook (`--fix` keeps the old
227
+ behavior).
228
+ - Technology guards are run by the generated hook and discovered by `audit`.
229
+ - `update` prints success lines with a defined color.
230
+
231
+ ### Deprecated
232
+
233
+ - The `clc-forge` and `create-clc-forge` binaries print a deprecation notice and will be removed in the next
234
+ major release; use `clckernel`.
235
+ - `.clc-forge.yml` / `.clc-forge.yaml` still load with a warning; rename them to `.clckernel.yaml`.
236
+
237
+ ### Upgrade notes
238
+
239
+ - Run `clckernel update` in each existing project to refresh guards, the hook and the managed-files registry,
240
+ then review any `.clckernel.yaml` that now fails to parse.
241
+ - After pulling this repository on another machine, regenerate the local IDE mirrors (they are no longer
242
+ tracked) with `clckernel update`.
243
+
244
+ ## [1.2.19]
245
+
246
+ - Previous release.
247
+
248
+ [Unreleased]: https://github.com/CarlosLeonCode/clc_forge/compare/v2.0.0...HEAD
249
+ [2.0.0]: https://github.com/CarlosLeonCode/clc_forge/compare/v1.2.19...v2.0.0
250
+ [1.2.19]: https://github.com/CarlosLeonCode/clc_forge/releases/tag/v1.2.19
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Carlos Leon Code
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.