@andresmassello/uscha 1.40.1 → 1.40.2

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/README.md CHANGED
@@ -12,13 +12,15 @@ instantiation in Claude Code, the **uscha-kit**.
12
12
 
13
13
  ```
14
14
  SpecLoop/
15
- ├── uscha-kit/ # canonical SOURCE of the kit (v1.40.1)
15
+ ??? package.json # npm package: @andresmassello/uscha
16
+ ??? bin/uscha.js # thin npx router to uscha-kit/install-uscha.py
17
+ ├── uscha-kit/ # ★ canonical SOURCE of the kit (v1.40.2)
16
18
  │ ├── .claude/skills/ # 8 skills: uscha-discovery · uscha-adr-refine · uscha-devloop · uscha-sysdoc
17
19
  │ │ # uscha-reverse-discovery · uscha-characterize · uscha-rubric · uscha-mirador
18
20
  │ ├── .claude/skills/uscha-devloop/qa_ledger.py # evidence engine (29 subcommands, stdlib)
19
21
  │ ├── hooks/ # PreToolUse: the agent never writes .approved (INV-GOLDEN-01)
20
22
  │ ├── templates/ # CLAUDE.md · CONSTITUTION.md · .gitattributes · docs/adr
21
- │ └── CHANGELOG-*.md # 1.2.x → 1.3.0 ("facts block, wired") → 1.4.0 (python) → 1.5.0 (node) → 1.6.0 (go) → 1.7.0 (rust+dotnet) → 1.8.0 (cpp) → 1.9.0 (gradle+swift) → 1.10.0 (traceable acceptance) → 1.11.0 (tests outside the budget) → 1.12.0 (secret-scan) → 1.13.0 (atomic ledger) → 1.14.0 (plateau/stop-signal) → 1.15.0 (golden scrub) → 1.16.0 (regression-capture) → 1.17.0 (threshold provenance) → 1.18.0 (derived FSM) → 1.19.0 (spikes — PragProg backlog CLOSED) → 1.20.0 (global install) → 1.21.0 (namespace uscha-*) → 1.22.0 (doctor) → 1.23.0 (rubric layer) → 1.24.0 (Claude Code plugin) → 1.25.0 (anti-ceremony) → 1.26.0 (waste-check REUSE-FIRST) → 1.27.0 (FTY) → 1.28.0 (measured acceptance %) → 1.29.0 (rebrand → Uscha) → 1.30.0 (dependency gate) → 1.31.0 (evidence freshness + doc-version gate) → 1.32.0 (mirador — bird's-eye view + dashboard --json) → 1.33.0 (mirador telemetry — per-model tokens/time/model + transcript extractor) → 1.34.0 (mirador: project name from config + live watch/auto-refresh) -> 1.35.0 (execution-policy routing) -> 1.36.0 (discovery-intake: production findings + spec-doubt) -> 1.37.0 (ADR experiments: visible hypotheses) -> 1.38.0 (contract closure: SCR bridge + golden labels + calibration) -> 1.39.0 (universal Codex/Claude installer) -> 1.40.1 (npm/npx router)
23
+ │ └── CHANGELOG-*.md # 1.2.x → 1.3.0 ("facts block, wired") → 1.4.0 (python) → 1.5.0 (node) → 1.6.0 (go) → 1.7.0 (rust+dotnet) → 1.8.0 (cpp) → 1.9.0 (gradle+swift) → 1.10.0 (traceable acceptance) → 1.11.0 (tests outside the budget) → 1.12.0 (secret-scan) → 1.13.0 (atomic ledger) → 1.14.0 (plateau/stop-signal) → 1.15.0 (golden scrub) → 1.16.0 (regression-capture) → 1.17.0 (threshold provenance) → 1.18.0 (derived FSM) → 1.19.0 (spikes — PragProg backlog CLOSED) → 1.20.0 (global install) → 1.21.0 (namespace uscha-*) → 1.22.0 (doctor) → 1.23.0 (rubric layer) → 1.24.0 (Claude Code plugin) → 1.25.0 (anti-ceremony) → 1.26.0 (waste-check REUSE-FIRST) → 1.27.0 (FTY) → 1.28.0 (measured acceptance %) → 1.29.0 (rebrand → Uscha) → 1.30.0 (dependency gate) → 1.31.0 (evidence freshness + doc-version gate) → 1.32.0 (mirador — bird's-eye view + dashboard --json) → 1.33.0 (mirador telemetry — per-model tokens/time/model + transcript extractor) → 1.34.0 (mirador: project name from config + live watch/auto-refresh) -> 1.35.0 (execution-policy routing) -> 1.36.0 (discovery-intake: production findings + spec-doubt) -> 1.37.0 (ADR experiments: visible hypotheses) -> 1.38.0 (contract closure: SCR bridge + golden labels + calibration) -> 1.39.0 (universal Codex/Claude installer) -> 1.40.0 (npm/npx router) -> 1.40.1 (npm package hygiene) -> 1.40.2 (install docs)
22
24
  ├── docs/ # published artifacts (canonical here; Downloads = snapshots)
23
25
  │ ├── uscha-claude-code-doc-FINAL.html # long deck ES (36 slides)
24
26
  │ ├── uscha-claude-code-doc-EN.html # long deck EN
@@ -40,7 +42,7 @@ SpecLoop/
40
42
 
41
43
  ## Status (2026-07-05)
42
44
 
43
- - **Kit v1.40.1** <!-- uscha:version --> — the fact-gates are WIRED into the engine (1.3.0: `log-gate`,
45
+ - **Kit v1.40.2** <!-- uscha:version --> — the fact-gates are WIRED into the engine (1.3.0: `log-gate`,
44
46
  `flag-blocker`, `resolve-escalation`; UNMEASURED; per-tool convergence with a veto from
45
47
  the measured snapshot) and the engine measures **Python** repos (1.4.0: pytest/Cobertura + ruff +
46
48
  mypy) **TypeScript/JS** (1.5.0: lcov + jest-junit + eslint + tsc) **Go** (1.6.0: native cover
@@ -62,13 +64,13 @@ SpecLoop/
62
64
  headline — M5). **Derived FSM** (1.18.0: `phase` computes the workflow state
63
65
  from the ledger's facts, never declared; the PR is gated with `--require
64
66
  pr-ready` — M4). **Formal spikes** (1.19.0: a `spike/*` branch never passes the PR
65
- gate; the legitimate output is an ADR with lessons — M10). **Execution policy routing** (1.35.0: phase-level methodology/model/effort metadata for the operator and Mirador, not readiness scoring). **Discovery intake** (1.36.0: production findings + spec-doubt/SPEC-WRONG enter the ledger and reopen discovery instead of disappearing into narration). **ADR experiments** (1.37.0: `Status: Experiment` is visible/advisory in dashboard/Mirador with feedback/review metadata, not a readiness score). **Contract closure** (1.38.0: structured `spec-change-request`, golden intended vs observed-accidental labels, and post-merge calibration metrics). **Universal installer** (1.39.0: one machine installer for Codex plugin adoption and Claude global install, with dry-run/doctor/version checks). **npm/npx router** (1.40.1: `@andresmassello/uscha` exposes `uscha`/`uscha-kit` and delegates to the canonical Python installer). Smoke suite 224/224 green.
67
+ gate; the legitimate output is an ADR with lessons — M10). **Execution policy routing** (1.35.0: phase-level methodology/model/effort metadata for the operator and Mirador, not readiness scoring). **Discovery intake** (1.36.0: production findings + spec-doubt/SPEC-WRONG enter the ledger and reopen discovery instead of disappearing into narration). **ADR experiments** (1.37.0: `Status: Experiment` is visible/advisory in dashboard/Mirador with feedback/review metadata, not a readiness score). **Contract closure** (1.38.0: structured `spec-change-request`, golden intended vs observed-accidental labels, and post-merge calibration metrics). **Universal installer** (1.39.0: one machine installer for Codex plugin adoption and Claude global install, with dry-run/doctor/version checks). **npm/npx router** (1.40.0: `@andresmassello/uscha` exposes `uscha`/`uscha-kit` and delegates to the canonical Python installer). **Install docs** (1.40.2: npx-first guide for Codex, Claude Code, and mixed-machine setups). Smoke suite 224/224 green.
66
68
  **The PragProg backlog is CLOSED: 10 of 10** (see
67
69
  `docs/analisis-pragmatic-programmer.md`).
68
70
  License: MIT. The principle "facts block, guesses advise" is an enforced property,
69
71
  not a slogan.
70
72
  - **Docs** — passed through truth-pass against the real engine: every claim describes what
71
- v1.40.1 does; the references appendix has **fetch-verified links** to the 10
73
+ v1.40.2 does; the references appendix has **fetch-verified links** to the 10
72
74
  sources. Status convention in the docs: `in the kit` / `new` / `proposal`.
73
75
  - **In progress** — dogfooding on a real case (pilot project, Python): the 1.4.0 adapter unblocked it;
74
76
  what remains is the read-only dry-run (criterion 2 of the python-adapter HANDOFF) and the on-ramp.
@@ -76,17 +78,23 @@ SpecLoop/
76
78
  profiles).
77
79
 
78
80
 
79
- ## Install from npm/npx
81
+ ## Install
82
+
83
+ Recommended for Codex and Claude Code:
80
84
 
81
85
  ```bash
82
- npx @andresmassello/uscha@latest install --target codex
83
- npx @andresmassello/uscha@latest doctor --target codex
84
- # or both Codex + Claude:
85
- npx @andresmassello/uscha@latest install --target both
86
+ npx --yes @andresmassello/uscha@latest install --target codex
87
+ npx --yes @andresmassello/uscha@latest doctor --target codex
88
+ # or both Codex + Claude Code:
89
+ npx --yes @andresmassello/uscha@latest install --target both
90
+ npx --yes @andresmassello/uscha@latest doctor --target both
86
91
  ```
87
92
 
88
- The npm package is only a router. The canonical installer remains
89
- `uscha-kit/install-uscha.py`, and Python 3.8+ is still required on the target machine.
93
+ Full install guide: [`uscha-kit/INSTALL.md`](uscha-kit/INSTALL.md).
94
+
95
+ The npm package is only a thin router. The canonical installer remains
96
+ `uscha-kit/install-uscha.py`, and Python 3.8+ is still required on the target
97
+ machine.
90
98
 
91
99
  ## How the kit is re-packaged
92
100
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andresmassello/uscha",
3
- "version": "1.40.1",
3
+ "version": "1.40.2",
4
4
  "description": "Uscha installer for Codex and Claude coding-agent workflows.",
5
5
  "bin": {
6
6
  "uscha": "bin/uscha.js",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "uscha",
4
- "version": "1.40.1",
4
+ "version": "1.40.2",
5
5
  "displayName": "Uscha",
6
6
  "description": "Spec-driven development for LLM coding agents: 8 skills (discovery, adr-refine, reverse-discovery, characterize, devloop, sysdoc, rubric, mirador) + a stdlib measurement engine (qa_ledger.py, 29 subcommands + universal installer + npm/npx router). Facts block, guesses advise; the human approves.",
7
7
  "author": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uscha",
3
- "version": "1.40.1",
3
+ "version": "1.40.2",
4
4
  "description": "Uscha spec-driven development methodology for coding agents. Includes npm/npx router.",
5
5
  "author": {
6
6
  "name": "Andres Massello",
@@ -0,0 +1,13 @@
1
+ # uscha-kit 1.40.2
2
+
3
+ ## Changed
4
+
5
+ - Reworked install documentation around the npm/npx path for Codex, Claude Code, and mixed-machine setups.
6
+ - Added `uscha-kit/INSTALL.md` as the focused install guide.
7
+ - Kept Git checkout/link mode, Claude Code plugin commands, and manual copy as secondary/debugging options with tradeoffs.
8
+
9
+ ## Verification
10
+
11
+ - `npm view @andresmassello/uscha version`
12
+ - `npx --yes @andresmassello/uscha@latest version --json`
13
+ - `bash uscha-kit/tests/smoke-engine.sh`
@@ -0,0 +1,101 @@
1
+ # Install Uscha
2
+
3
+ Uscha installs as a machine-level helper for coding agents. The recommended path
4
+ is npm/npx because it works the same on a fresh Codex or Claude Code machine.
5
+
6
+ ## Quick path
7
+
8
+ ### Codex Desktop
9
+
10
+ ```bash
11
+ npx --yes @andresmassello/uscha@latest version
12
+ npx --yes @andresmassello/uscha@latest install --target codex --dry-run
13
+ npx --yes @andresmassello/uscha@latest install --target codex
14
+ npx --yes @andresmassello/uscha@latest doctor --target codex
15
+ ```
16
+
17
+ Then restart Codex or open a new thread. The installer registers Uscha as a
18
+ personal local plugin under `~/plugins/uscha` and updates
19
+ `~/.agents/plugins/marketplace.json`.
20
+
21
+ ### Claude Code
22
+
23
+ ```bash
24
+ npx --yes @andresmassello/uscha@latest install --target claude --dry-run
25
+ npx --yes @andresmassello/uscha@latest install --target claude
26
+ npx --yes @andresmassello/uscha@latest doctor --target claude
27
+ ```
28
+
29
+ This installs the `uscha-*` skills and hooks under `~/.claude`. Restart or reload
30
+ Claude Code after installing.
31
+
32
+ ### Same machine uses both
33
+
34
+ ```bash
35
+ npx --yes @andresmassello/uscha@latest install --target both --dry-run
36
+ npx --yes @andresmassello/uscha@latest install --target both
37
+ npx --yes @andresmassello/uscha@latest doctor --target both
38
+ ```
39
+
40
+ ## Prepare a project repo
41
+
42
+ After the machine install, initialize each project where Uscha should govern the
43
+ workflow:
44
+
45
+ ```bash
46
+ npx --yes @andresmassello/uscha@latest init --repo . --dry-run
47
+ npx --yes @andresmassello/uscha@latest init --repo .
48
+ ```
49
+
50
+ Project state stays in the project: `uscha.config.json`, `QA-LEDGER.json`,
51
+ `ACCEPTANCE.md`, and approved golden fixtures when used.
52
+
53
+ ## Requirements
54
+
55
+ | Requirement | Why |
56
+ |-------------|-----|
57
+ | Node.js + npm | Runs the universal `npx` entrypoint. |
58
+ | Python 3.8+ | Runs the canonical stdlib installer and engine. |
59
+ | Git | Used by the method and by project setup checks. |
60
+ | Codex Desktop and/or Claude Code | The agent runtime you want to install Uscha into. |
61
+
62
+ No `pip install` is required. The engine is Python stdlib-only.
63
+
64
+ ## Other install options
65
+
66
+ | Option | Use when | Tradeoff |
67
+ |--------|----------|----------|
68
+ | `npx @andresmassello/uscha@latest ...` | Normal install/update on any machine. | Requires npm registry access. |
69
+ | Git checkout + `python uscha-kit/install-uscha.py ...` | Developing Uscha itself or testing unreleased changes. | You must clone/pull the repo yourself. |
70
+ | `--mode link` from a checkout | This machine develops the kit and installed skills should follow local edits. | Links are great for development, risky for normal users. |
71
+ | Claude Code plugin commands | You specifically want Claude Code's native plugin flow. | Codex still needs the npm/git installer path. |
72
+ | Manual copy | Debugging the installer. | Easy to drift; not recommended for adoption. |
73
+
74
+ Development checkout example:
75
+
76
+ ```bash
77
+ git clone https://github.com/andresmassello/uscha.git
78
+ cd uscha
79
+ python uscha-kit/install-uscha.py install --target both --mode link --dry-run
80
+ python uscha-kit/install-uscha.py install --target both --mode link
81
+ ```
82
+
83
+ Claude Code plugin option:
84
+
85
+ ```text
86
+ /plugin marketplace add andresmassello/uscha
87
+ /plugin install uscha@uscha
88
+ ```
89
+
90
+ ## Update and verify
91
+
92
+ ```bash
93
+ npm view @andresmassello/uscha version
94
+ npx --yes @andresmassello/uscha@latest version
95
+ npx --yes @andresmassello/uscha@latest install --target both
96
+ npx --yes @andresmassello/uscha@latest doctor --target both
97
+ ```
98
+
99
+ If `npm view` returns `404` immediately after a new release, wait a few minutes:
100
+ npm search/dist-tags can propagate before the package metadata endpoint used by
101
+ `npx`. Do not republish the same version while propagation is in progress.
@@ -1,6 +1,6 @@
1
1
  # uscha-kit
2
2
 
3
- **Kit version:** v1.40.1 <!-- uscha:version -->
3
+ **Kit version:** v1.40.2 <!-- uscha:version -->
4
4
 
5
5
  Spec-driven orchestrator + multi-repo QA for Claude Code, with a deterministic ledger.
6
6
  **Eight skills** (`uscha-discovery`, `uscha-adr-refine`, `uscha-devloop`, `uscha-sysdoc`, `uscha-reverse-discovery`,
@@ -14,6 +14,8 @@ changes (a one-liner runs build+test and that's it).
14
14
 
15
15
  ```
16
16
  uscha-kit/
17
+ ?? INSTALL.md # install guide: npx, Codex, Claude Code, alternatives
18
+ ?? install-uscha.py # canonical installer used by npm/npx
17
19
  ├─ uscha.config.json # config: repos, thresholds, commands
18
20
  ├─ hooks/
19
21
  │ └─ block-approved-writes.ps1 # PreToolUse: the agent CANNOT write .approved (INV-GOLDEN-01)
@@ -206,76 +208,34 @@ BEFORE touching anything.
206
208
 
207
209
  ## Installation
208
210
 
209
- **Preferred public install (kit 1.40.1): use npm/npx.** The npm package is a
210
- thin router over the canonical Python installer, so adoption is easy without
211
- duplicating installer logic. You need Node/npm for this path and Python 3.8+ for
212
- the underlying installer.
213
-
214
- Codex-only machine:
215
-
216
- ```bash
217
- npx @andresmassello/uscha@latest version
218
- npx @andresmassello/uscha@latest install --target codex --dry-run
219
- npx @andresmassello/uscha@latest install --target codex
220
- npx @andresmassello/uscha@latest doctor --target codex
221
- ```
222
-
223
- Machine used by both Codex and Claude:
211
+ **Recommended path: npm/npx.** Use the same installer for Codex, Claude Code,
212
+ or both. Full guide: [`INSTALL.md`](INSTALL.md).
224
213
 
225
214
  ```bash
226
- npx @andresmassello/uscha@latest install --target both --dry-run
227
- npx @andresmassello/uscha@latest install --target both
228
- npx @andresmassello/uscha@latest doctor --target both
215
+ npx --yes @andresmassello/uscha@latest version
216
+ npx --yes @andresmassello/uscha@latest install --target codex --dry-run
217
+ npx --yes @andresmassello/uscha@latest install --target codex
218
+ npx --yes @andresmassello/uscha@latest doctor --target codex
229
219
  ```
230
220
 
231
- **Repo checkout install still works and is preferred when developing the kit
232
- itself.** One interface, two adapters: Codex gets a personal local plugin
233
- (`~/plugins/uscha` + `~/.agents/plugins/marketplace.json`), Claude gets global
234
- skills/hooks under `~/.claude`. Use `--dry-run` first on every new machine.
221
+ For a machine used by both Codex and Claude Code:
235
222
 
236
223
  ```bash
237
- python uscha-kit/install-uscha.py version
238
- python uscha-kit/install-uscha.py install --target codex --dry-run
239
- python uscha-kit/install-uscha.py install --target codex
240
- python uscha-kit/install-uscha.py doctor --target codex
224
+ npx --yes @andresmassello/uscha@latest install --target both --dry-run
225
+ npx --yes @andresmassello/uscha@latest install --target both
226
+ npx --yes @andresmassello/uscha@latest doctor --target both
241
227
  ```
242
228
 
243
- For the machine where you DEVELOP the kit, use links instead of copies so the
244
- installed skills follow the canonical repo after `git pull`:
229
+ Use a Git checkout only when developing Uscha itself or testing unreleased
230
+ changes:
245
231
 
246
232
  ```bash
247
233
  python uscha-kit/install-uscha.py install --target both --mode link --dry-run
248
234
  python uscha-kit/install-uscha.py install --target both --mode link
249
235
  ```
250
236
 
251
- Prepare a repo after the machine install:
252
-
253
- ```bash
254
- npx @andresmassello/uscha@latest init --repo <repo> --dry-run
255
- npx @andresmassello/uscha@latest init --repo <repo>
256
- # or from a checkout:
257
- python uscha-kit/install-uscha.py init --repo <repo>
258
- ```
259
-
260
- What remains PER PROJECT (state, not installable): `uscha.config.json` in the
261
- repo root where you run the run (the `path` values are relative to there ? and your declared
262
- quality bar lives there), the `QA-LEDGER.json`, the `ACCEPTANCE.md`, and for migration
263
- work the `.gitattributes` from `templates/` (`*.approved.* binary`).
264
-
265
- **Legacy/manual install** still works: copy `.claude/` and `uscha.config.json`
266
- per project, or copy the `uscha-*` skills to `~/.claude/skills/`. Prefer the
267
- installer unless you are debugging the installer itself.
268
-
269
- **Claude Code plugin** remains available for Claude Code users:
270
-
271
- ```
272
- /plugin marketplace add andresmassello/uscha
273
- /plugin install uscha@uscha
274
- ```
275
-
276
- Updates: `/plugin update uscha@uscha` for Claude Code plugin installs,
277
- `npx @andresmassello/uscha@latest install ...` for npm installs, or rerun
278
- `install-uscha.py install ...` from a repo checkout.
237
+ Claude Code's native plugin flow remains available for Claude-only users, but
238
+ `npx` is the universal path and also covers Codex.
279
239
 
280
240
 
281
241
 
package/uscha-kit/VERSION CHANGED
@@ -1 +1 @@
1
- uscha-kit 1.40.1
1
+ uscha-kit 1.40.2
@@ -1658,13 +1658,13 @@ sys.exit(0 if ok else 1)" \
1658
1658
  && { PASS=$((PASS+1)); echo " ok summary expone calibracion post-merge desde PF/SD/SCR"; } \
1659
1659
  || { FAIL=$((FAIL+1)); echo " FAIL summary no expone calibracion post-merge"; }
1660
1660
 
1661
- echo "== T66 universal installer (1.40.1): Codex plugin + Claude adapter, dry-run safe =="
1661
+ echo "== T66 universal installer (1.40.2): Codex plugin + Claude adapter, dry-run safe =="
1662
1662
  INST_HOME="$SB/home-installer"
1663
1663
  mkdir -p "$INST_HOME"
1664
1664
  "$PY" "$KIT/install-uscha.py" version --json 2>/dev/null | "$PY" -c "
1665
1665
  import json, sys
1666
1666
  d = json.load(sys.stdin)
1667
- ok = (d['source_version'] == '1.40.1' and 'codex' in d['targets'] and 'claude' in d['targets'])
1667
+ ok = (d['source_version'] == '1.40.2' and 'codex' in d['targets'] and 'claude' in d['targets'])
1668
1668
  sys.exit(0 if ok else 1)" \
1669
1669
  && { PASS=$((PASS+1)); echo " ok install-uscha version expone version fuente y targets"; } \
1670
1670
  || { FAIL=$((FAIL+1)); echo " FAIL install-uscha version no expone targets/version"; }
@@ -1688,7 +1688,7 @@ market = h/'.agents/plugins/marketplace.json'
1688
1688
  engine = h/'plugins/uscha/skills/uscha-devloop/qa_ledger.py'
1689
1689
  marker = h/'plugins/uscha/uscha-install.json'
1690
1690
  ok = (manifest.exists() and market.exists() and engine.exists() and
1691
- json.load(open(manifest, encoding='utf-8'))['version'] == '1.40.1' and
1691
+ json.load(open(manifest, encoding='utf-8'))['version'] == '1.40.2' and
1692
1692
  json.load(open(marker, encoding='utf-8'))['target'] == 'codex')
1693
1693
  sys.exit(0 if ok else 1)" \
1694
1694
  && { PASS=$((PASS+1)); echo " ok install codex crea plugin personal, marketplace y marker"; } \
@@ -1696,7 +1696,7 @@ sys.exit(0 if ok else 1)" \
1696
1696
  "$PY" "$KIT/install-uscha.py" doctor --target codex --home "$INST_HOME" --json 2>/dev/null | "$PY" -c "
1697
1697
  import json, sys
1698
1698
  d = json.load(sys.stdin)
1699
- ok = (d['source_version'] == '1.40.1' and d['targets']['codex']['installed'] is True and d['targets']['codex']['version_match'] is True)
1699
+ ok = (d['source_version'] == '1.40.2' and d['targets']['codex']['installed'] is True and d['targets']['codex']['version_match'] is True)
1700
1700
  sys.exit(0 if ok else 1)" \
1701
1701
  && { PASS=$((PASS+1)); echo " ok doctor detecta Codex instalado y version match"; } \
1702
1702
  || { FAIL=$((FAIL+1)); echo " FAIL doctor no detecta install Codex"; }
@@ -1705,12 +1705,12 @@ diff -qr "$KIT/.claude/skills" "$KIT/skills" -x __pycache__ >/dev/null 2>&1 \
1705
1705
  || { FAIL=$((FAIL+1)); echo " FAIL uscha-kit/skills drifted from .claude/skills"; }
1706
1706
 
1707
1707
 
1708
- echo "== T67 npm router (1.40.1): npx package delegates to canonical installer =="
1708
+ echo "== T67 npm router (1.40.2): npx package delegates to canonical installer =="
1709
1709
  if command -v node >/dev/null 2>&1; then
1710
1710
  node "$ROOT/bin/uscha.js" version --json 2>/dev/null | "$PY" -c "
1711
1711
  import json, sys
1712
1712
  d = json.load(sys.stdin)
1713
- ok = (d['source_version'] == '1.40.1' and 'codex' in d['targets'] and 'claude' in d['targets'])
1713
+ ok = (d['source_version'] == '1.40.2' and 'codex' in d['targets'] and 'claude' in d['targets'])
1714
1714
  sys.exit(0 if ok else 1)" \
1715
1715
  && { PASS=$((PASS+1)); echo " ok npm router expone version/targets desde install-uscha.py"; } \
1716
1716
  || { FAIL=$((FAIL+1)); echo " FAIL npm router no delega correctamente al installer"; }
@@ -1722,7 +1722,7 @@ if command -v npm >/dev/null 2>&1; then
1722
1722
  import json, sys
1723
1723
  d = json.load(sys.stdin)[0]
1724
1724
  files = {f['path'] for f in d['files']}
1725
- ok = (d['name'] == '@andresmassello/uscha' and d['version'] == '1.40.1'
1725
+ ok = (d['name'] == '@andresmassello/uscha' and d['version'] == '1.40.2'
1726
1726
  and 'bin/uscha.js' in files and 'uscha-kit/install-uscha.py' in files
1727
1727
  and '.atl/skill-registry.md' not in files and 'handoff.md' not in files and 'mirador.html' not in files
1728
1728
  and not any('__pycache__' in f or f.endswith(('.pyc', '.pyo')) for f in files))
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.40.1",
2
+ "version": "1.40.2",
3
3
  "project": null,
4
4
  "defaults": {
5
5
  "coverage_threshold": 60,