@andresmassello/uscha 1.66.0 → 1.67.0
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 +1 -1
- package/package.json +1 -1
- package/uscha-kit/.claude/skills/uscha-mirador/mirador.template.html +12 -2
- package/uscha-kit/.claude/skills/uscha-status/SKILL.md +5 -0
- package/uscha-kit/.claude-plugin/plugin.json +1 -1
- package/uscha-kit/.codex-plugin/plugin.json +1 -1
- package/uscha-kit/README.md +1 -1
- package/uscha-kit/VERSION +1 -1
- package/uscha-kit/skills/uscha-mirador/mirador.template.html +12 -2
- package/uscha-kit/skills/uscha-status/SKILL.md +5 -0
- package/uscha-kit/uscha.config.json +1 -1
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ Requires **Python 3.8+** on the machine (the engine is Python stdlib — no pip
|
|
|
40
40
|
runtime dependencies). The npm package is a thin router; the canonical installer is
|
|
41
41
|
`uscha-kit/install-uscha.py`.
|
|
42
42
|
|
|
43
|
-
**Kit v1.
|
|
43
|
+
**Kit v1.67.0** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
|
|
44
44
|
[changelog](https://github.com/andresmassello/uscha/blob/main/uscha-kit/CHANGELOG.md)
|
|
45
45
|
(the per-release changelogs live in the repo, not in the npm tarball)
|
|
46
46
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andresmassello/uscha",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.67.0",
|
|
4
4
|
"description": "Spec-driven development for LLM coding agents: 9 skills + a stdlib evidence engine. Facts block, guesses advise; the human approves.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Andres Massello",
|
|
@@ -665,8 +665,8 @@ function renderModes(){
|
|
|
665
665
|
ledger fact visible. BOTH keys are conditional in dashboard --json, so a project
|
|
666
666
|
that never used either sees no card at all (absent block = identical view). */
|
|
667
667
|
const card=$("#card-modes");if(!card)return;
|
|
668
|
-
const fp=DATA.fast_path,sd=DATA.spec_drift;
|
|
669
|
-
if(!fp&&!sd){card.hidden=true;return;}
|
|
668
|
+
const fp=DATA.fast_path,sd=DATA.spec_drift,cr=DATA.clean_room;
|
|
669
|
+
if(!fp&&!sd&&!cr){card.hidden=true;return;}
|
|
670
670
|
const host=$("#modes");host.replaceChildren();
|
|
671
671
|
const parts=[];
|
|
672
672
|
if(fp){
|
|
@@ -677,6 +677,16 @@ function renderModes(){
|
|
|
677
677
|
node("span","chip "+(cls[e.verdict]||"st-todo"),String(e.verdict||"?"))));});
|
|
678
678
|
parts.push(Object.keys(fp).length+" repo"+(Object.keys(fp).length>1?"s":""));
|
|
679
679
|
}
|
|
680
|
+
if(cr){
|
|
681
|
+
const cls={GREEN:"st-done",RED:"st-block"};
|
|
682
|
+
Object.keys(cr).forEach(r=>{const e=cr[r]||{};
|
|
683
|
+
const sha=(e.ref||"").slice(0,8)||"?";
|
|
684
|
+
const wall=(typeof e.wall_ms==="number")?(" · "+(e.wall_ms/1000).toFixed(1)+"s"):"";
|
|
685
|
+
append(host,append(node("div","spec"),node("span","id","clean-room"),
|
|
686
|
+
node("span","t",r+" @ "+sha+wall),
|
|
687
|
+
node("span","chip "+(cls[e.status]||"st-prog"),String(e.status||"?"))));});
|
|
688
|
+
parts.push("clean-room ×"+Object.keys(cr).length);
|
|
689
|
+
}
|
|
680
690
|
if(sd){
|
|
681
691
|
const cls={SPEC_STALE:"st-block",CLEAN:"st-done",UNMAPPED:"st-todo",UNTRACKED:"st-todo"};
|
|
682
692
|
const res=sd.results||[];
|
|
@@ -100,6 +100,11 @@ nothing and gates nothing.
|
|
|
100
100
|
`spec-drift: N stale / M docs (advisory)` — or `spec-drift: no drift measured` when zero are
|
|
101
101
|
stale. Always label it advisory; it never explains a blocked phase. Absent key → no line.
|
|
102
102
|
|
|
103
|
+
**Clean-room (ADR-008):** if the ledger carries `clean_room` runs, add ONE line with the
|
|
104
|
+
latest run per repo: `clean-room: GREEN @ <sha8> (12.3s)` / `RED @ <sha8>`. When the gate is
|
|
105
|
+
declared (`mode: "final"`) and the latest run does not match the current HEAD, append
|
|
106
|
+
`(stale for gate)`. Absent key → no line.
|
|
107
|
+
|
|
103
108
|
**Roundtrip (ADR-009 slice 2):** if the ledger carries a `roundtrip` run, add ONE line:
|
|
104
109
|
`roundtrip: N/M promoted traceable by uscha-spec id (advisory)`. Absent key → no line —
|
|
105
110
|
silence is honest when the loop was never measured.
|
|
@@ -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.
|
|
4
|
+
"version": "1.67.0",
|
|
5
5
|
"displayName": "Uscha",
|
|
6
6
|
"description": "Spec-driven development for LLM coding agents: 9 skills (discovery, adr-refine, reverse-discovery, characterize, devloop, sysdoc, rubric, mirador, status) + a stdlib measurement engine (qa_ledger.py, 35 subcommands + universal installer + npm/npx router). Facts block, guesses advise; the human approves.",
|
|
7
7
|
"author": {
|
package/uscha-kit/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# uscha-kit
|
|
2
2
|
|
|
3
|
-
**Kit version:** v1.
|
|
3
|
+
**Kit version:** v1.67.0 <!-- uscha:version --> · **[uscha.dev](https://uscha.dev)**
|
|
4
4
|
|
|
5
5
|
Spec-driven orchestrator + multi-repo QA for Claude Code, with a deterministic ledger.
|
|
6
6
|
**Nine skills** (`uscha-discovery`, `uscha-adr-refine`, `uscha-devloop`, `uscha-sysdoc`, `uscha-reverse-discovery`,
|
package/uscha-kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
uscha-kit 1.
|
|
1
|
+
uscha-kit 1.67.0
|
|
@@ -665,8 +665,8 @@ function renderModes(){
|
|
|
665
665
|
ledger fact visible. BOTH keys are conditional in dashboard --json, so a project
|
|
666
666
|
that never used either sees no card at all (absent block = identical view). */
|
|
667
667
|
const card=$("#card-modes");if(!card)return;
|
|
668
|
-
const fp=DATA.fast_path,sd=DATA.spec_drift;
|
|
669
|
-
if(!fp&&!sd){card.hidden=true;return;}
|
|
668
|
+
const fp=DATA.fast_path,sd=DATA.spec_drift,cr=DATA.clean_room;
|
|
669
|
+
if(!fp&&!sd&&!cr){card.hidden=true;return;}
|
|
670
670
|
const host=$("#modes");host.replaceChildren();
|
|
671
671
|
const parts=[];
|
|
672
672
|
if(fp){
|
|
@@ -677,6 +677,16 @@ function renderModes(){
|
|
|
677
677
|
node("span","chip "+(cls[e.verdict]||"st-todo"),String(e.verdict||"?"))));});
|
|
678
678
|
parts.push(Object.keys(fp).length+" repo"+(Object.keys(fp).length>1?"s":""));
|
|
679
679
|
}
|
|
680
|
+
if(cr){
|
|
681
|
+
const cls={GREEN:"st-done",RED:"st-block"};
|
|
682
|
+
Object.keys(cr).forEach(r=>{const e=cr[r]||{};
|
|
683
|
+
const sha=(e.ref||"").slice(0,8)||"?";
|
|
684
|
+
const wall=(typeof e.wall_ms==="number")?(" · "+(e.wall_ms/1000).toFixed(1)+"s"):"";
|
|
685
|
+
append(host,append(node("div","spec"),node("span","id","clean-room"),
|
|
686
|
+
node("span","t",r+" @ "+sha+wall),
|
|
687
|
+
node("span","chip "+(cls[e.status]||"st-prog"),String(e.status||"?"))));});
|
|
688
|
+
parts.push("clean-room ×"+Object.keys(cr).length);
|
|
689
|
+
}
|
|
680
690
|
if(sd){
|
|
681
691
|
const cls={SPEC_STALE:"st-block",CLEAN:"st-done",UNMAPPED:"st-todo",UNTRACKED:"st-todo"};
|
|
682
692
|
const res=sd.results||[];
|
|
@@ -100,6 +100,11 @@ nothing and gates nothing.
|
|
|
100
100
|
`spec-drift: N stale / M docs (advisory)` — or `spec-drift: no drift measured` when zero are
|
|
101
101
|
stale. Always label it advisory; it never explains a blocked phase. Absent key → no line.
|
|
102
102
|
|
|
103
|
+
**Clean-room (ADR-008):** if the ledger carries `clean_room` runs, add ONE line with the
|
|
104
|
+
latest run per repo: `clean-room: GREEN @ <sha8> (12.3s)` / `RED @ <sha8>`. When the gate is
|
|
105
|
+
declared (`mode: "final"`) and the latest run does not match the current HEAD, append
|
|
106
|
+
`(stale for gate)`. Absent key → no line.
|
|
107
|
+
|
|
103
108
|
**Roundtrip (ADR-009 slice 2):** if the ledger carries a `roundtrip` run, add ONE line:
|
|
104
109
|
`roundtrip: N/M promoted traceable by uscha-spec id (advisory)`. Absent key → no line —
|
|
105
110
|
silence is honest when the loop was never measured.
|