thurview 0.14.0 → 0.15.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thurview",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "Guided, evidence-anchored reviews of agent-written code. A coding agent authors the review; you read, ask, comment and decide in the browser.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: thurview
3
- description: Author and publish a thurview document - a guided, evidence-anchored explanation the reader opens in the browser, annotates, asks questions about, and approves or sends back. Two kinds — a review of a branch, pull request or commit range, and a code explainer of a whole codebase or one subsystem at a pinned commit. For a design, an architecture proposal or an implementation plan — a change not written yet — use the thurview-design skill instead. Use when the user asks to review a branch or PR, to explain or walk through a change, "review my branch against main", to explain how a codebase or subsystem works or where its design problems might be, or invokes /thurview. Not for a pass/fail bug hunt.
3
+ description: Author and publish a thurview review - a guided, evidence-anchored explanation of a change, a review of a branch, pull request or commit range, which the reader opens in the browser, annotates, asks questions about, and approves or sends back. To explain a codebase or one subsystem as it stands, use the thurview-explain skill; for a design, an architecture proposal or an implementation plan — a change not written yet — use the thurview-design skill. Use when the user asks to review a branch or PR, to explain or walk through a change, "review my branch against main", or invokes /thurview. Not for a pass/fail bug hunt.
4
4
  user-invocable: true
5
- argument-hint: "[<pr-number|pr-url> | --base <ref> --head <ref> | explain [<path>]]"
5
+ argument-hint: "[<pr-number|pr-url> | --base <ref> --head <ref>]"
6
6
  ---
7
7
 
8
8
  # thurview
@@ -16,8 +16,9 @@ request asks for.
16
16
  - A **code explainer** explains a CODEBASE, or one subsystem, at a single
17
17
  pinned commit, so the reader can see the architecture well enough to spot
18
18
  design problems themselves. It has no diff and nothing to approve, and it
19
- states what it did not examine. Read
20
- [Code explainer](references/code-explainer.md) and follow that instead.
19
+ states what it did not examine. It is a separate skill —
20
+ `thurview-explain`, installed beside this one; run `thurview skill` for its
21
+ path. Stop here and read that instead.
21
22
  - A **design** explains a change that is NOT WRITTEN YET: a design, an
22
23
  architecture proposal, an implementation plan. It is pinned to the one commit
23
24
  it argues from, its anchors are the code as it stands, and what it would
@@ -64,10 +65,9 @@ directory; `thurview <command> --help` shows flags and examples.
64
65
  $ARGUMENTS
65
66
 
66
67
  Empty: a review of the current branch against its up-to-date trunk. A PR
67
- number or URL: that pull request. `--base`/`--head`: that range. `explain`, or
68
- a request to explain the codebase, a subsystem or its architecture rather than
69
- a change: a code explainer, per
70
- [Code explainer](references/code-explainer.md). A request for how something
68
+ number or URL: that pull request. `--base`/`--head`: that range. A request to
69
+ explain the codebase, a subsystem or its architecture rather than a change: a
70
+ code explainer, per the `thurview-explain` skill. A request for how something
71
71
  _should_ be built rather than what was built: a design, per the
72
72
  `thurview-design` skill.
73
73
 
@@ -86,8 +86,7 @@ Read [Components](references/components.md) before you edit `data.yaml` or add
86
86
  a fenced component. Read [Lifecycle](references/lifecycle.md) for statuses,
87
87
  storage and thread rules. Read [Software map](references/software-map.md)
88
88
  before you author `map.yaml`. Read [Theme](references/theme.md) before you
89
- write `theme.yaml`. Read [Code explainer](references/code-explainer.md) when
90
- the request is a codebase rather than a change.
89
+ write `theme.yaml`.
91
90
 
92
91
  ## Workflow
93
92
 
@@ -170,6 +169,13 @@ depends on what, what it left untested. Then compare the stated intent (commit
170
169
  messages, PR description, the user's own words) with what the code does. The
171
170
  gap is the most valuable finding.
172
171
 
172
+ Answer one question explicitly while you are in there: where does the change
173
+ let input cross a trust boundary? What counts is defined once, in the
174
+ `thurview-fix` skill's `SKILL.md` under "Findings" - read it there rather than
175
+ deciding again, and record the answer in `data.yaml` under `security` in step 5.
176
+ It is a place for the reader to look, not a finding and not a severity; a
177
+ repository with a SAST tool already has that job covered.
178
+
173
179
  Do not spend the review on naming, formatting, import order, or missing
174
180
  defensive checks. Linters, type checkers and `/code-review` catch those, and a
175
181
  reader who wanted them would have run those instead.
@@ -226,6 +232,13 @@ format. See [Components](references/components.md) for the shape and
226
232
  [Document authoring](references/document-authoring.md) for what earns an
227
233
  entry. Never write one for a capability the change did not deliver.
228
234
 
235
+ Then answer the security question from step 3 in the same file: `security: none`
236
+ when the change crosses no trust boundary, or one entry per place it does, each
237
+ with a head anchor the reader opens. Both are answers; leaving the key out is
238
+ not, and publishes as "not assessed". See
239
+ [Document authoring](references/document-authoring.md) and
240
+ [Components](references/components.md).
241
+
229
242
  ### 6. Theme the review after the project
230
243
 
231
244
  Read [Theme](references/theme.md). Decide the look in its order: what the
@@ -258,6 +271,8 @@ Tell the user, in a few lines and nothing more:
258
271
  - what the review covers, in one sentence, and where to start: the Review tab
259
272
  as a rule; the Files tab when the change is small and the diff is the story
260
273
  - the interface delta `verdict`, in its own words
274
+ - the `security` verdict, in one clause: what the change crosses, or that it
275
+ crosses nothing
261
276
  - which theme source you used: the user's request, the project's design
262
277
  system (name the files), or the default skin
263
278
  - when the review has no map, why not, in one clause
@@ -323,11 +338,11 @@ Do not pin the same commit as base and head to fake it. That leaves a review
323
338
  whose Files, Commits and interface-delta surfaces all describe a change that
324
339
  does not exist, which is a claim, not a gap.
325
340
 
326
- Run `thurview explain [<path>]` instead and follow
327
- [Code explainer](references/code-explainer.md). It is the same loop - pin,
328
- author, publish, wait, answer - over a document kind whose unit is a codebase:
329
- no diff, no commits, no interface delta, and a Coverage tab stating what the
330
- document reached and what it did not.
341
+ Run `thurview explain [<path>]` instead and follow the `thurview-explain`
342
+ skill. It is the same loop - pin, author, publish, wait, answer - over a
343
+ document kind whose unit is a codebase: no diff, no commits, no interface
344
+ delta, and a Coverage tab stating what the document reached and what it did
345
+ not.
331
346
 
332
347
  ## Designing a change rather than reviewing one
333
348
 
@@ -343,6 +358,8 @@ Report completion only when all of these hold:
343
358
  - The reader has the URL of a published revision.
344
359
  - Every `error` diagnostic is resolved.
345
360
  - The map is published, or you said why it is not.
361
+ - `security` in `data.yaml` is answered: `none`, or the crossings. A review
362
+ published as "not assessed" is not finished.
346
363
  - The review is waiting on the reader, accepted, closed, dismissed or deleted.
347
364
 
348
365
  Close with the decision and its summary (`wait.decision`), and the URL. When
@@ -42,6 +42,10 @@ interfaces:
42
42
  change: added # added | changed | removed
43
43
  capability: Validate a review without sealing a revision.
44
44
  anchor: dryRunFlag # must hold a line the diff moved
45
+
46
+ security: # a review only; omit until you have looked
47
+ - boundary: The --shell flag reaches execFile's argv unquoted.
48
+ anchor: spawn # a head anchor, with a peek
45
49
  ```
46
50
 
47
51
  An anchor without `peek` can label a map node but cannot open code.
@@ -70,6 +74,40 @@ Each entry in `interfaces` does one of two things, and never both:
70
74
  "`thurview publish` gains `--dry-run`", not "added a boolean to
71
75
  PublishOptions".
72
76
 
77
+ ## security
78
+
79
+ Where this change lets input cross a trust boundary. The browser shows it under
80
+ the interface delta, so the reader is told either way rather than left to
81
+ remember to look for it.
82
+
83
+ **What counts as a trust boundary is defined once**, in the `thurview-fix`
84
+ skill's `SKILL.md` under "Findings". Read it there. Nothing here repeats it, so
85
+ the two cannot drift into disagreeing about what counts. That skill turns what
86
+ it names into a ranked finding; this one only puts the place in front of the
87
+ reader, so the same definition selects the lines and stops there.
88
+
89
+ Three states, and they are three different claims:
90
+
91
+ - **omitted**, or the word `pending` - you have not looked yet. The panel says
92
+ "not assessed", which is what a stub published before the walkthrough should
93
+ be saying.
94
+ - **`security: none`** - you looked, and the change crosses none. Say it
95
+ explicitly: it is what makes this panel worth reading the next time.
96
+ - **a list** - one entry per place. `boundary` is one sentence in the reader's
97
+ terms; `anchor` is a head anchor with a `peek`, because a crossing is the
98
+ boundary as the change leaves it.
99
+
100
+ `publish` refuses an unknown anchor, an anchor with no `peek` and a `graph: base`
101
+ anchor: an anchor that opens nothing is how a reader stops trusting the ones that
102
+ do. It also refuses an empty list - write `none` rather than leave the reader to
103
+ work out which of the two you meant. Resolving a crossing marks its anchor used,
104
+ so an anchor that only a crossing names raises no "defined but never used".
105
+
106
+ There is no severity here. A crossing is a place for the reader to look; the
107
+ severity that exists belongs to the findings in `thurview-fix`, not to this
108
+ document. An explainer and a design are pinned to one commit and have no change,
109
+ so `publish` refuses the key on either.
110
+
73
111
  ## Anchor link
74
112
 
75
113
  ```markdown
@@ -94,6 +94,25 @@ only when one of these holds:
94
94
  Anything else is noise: the entry is already there, or there is nothing to
95
95
  add. An interface the change did not deliver is never an entry.
96
96
 
97
+ ## Trust boundaries
98
+
99
+ Every review answers where the change lets input cross a trust boundary, in
100
+ `data.yaml` under `security`. It is not a section you write: the browser shows
101
+ it under the interface delta, one line per place with the anchor the reader
102
+ opens.
103
+
104
+ Answer it after you have read the diff and the graph, and answer it either way.
105
+ `security: none` is the whole answer for a change that crosses none, and writing
106
+ it is what makes the panel worth reading on the review where it is not none. A
107
+ review that leaves the key out publishes as "not assessed", which is honest for
108
+ a stub and is not an answer.
109
+
110
+ What counts as a trust boundary is defined once, in the `thurview-fix` skill's
111
+ `SKILL.md` under "Findings" - read it there rather than deciding again. Do not
112
+ turn this into an audit: thurview surfaces the places, it does not rank them,
113
+ and a repository that runs a SAST tool already has the other job covered. See
114
+ [Components](components.md) for the shape and what `publish` refuses.
115
+
97
116
  ## Evidence
98
117
 
99
118
  Every claim about code carries an anchor. An anchor is a named source range
@@ -54,11 +54,11 @@ whole repository. The rest of the request is what to design.
54
54
 
55
55
  ## Which kind is this
56
56
 
57
- | The request is about | Kind | Skill |
58
- | ------------------------------------------------------------- | ---------- | ---------------------------------------- |
59
- | code that is written — a branch, a PR, a range | review | `thurview` |
60
- | code that exists, explained — "how does this work" | explainer | `thurview`, its code-explainer reference |
61
- | code that is **not written yet** — "how should we build this" | **design** | this one |
57
+ | The request is about | Kind | Skill |
58
+ | ------------------------------------------------------------- | ---------- | ------------------ |
59
+ | code that is written — a branch, a PR, a range | review | `thurview` |
60
+ | code that exists, explained — "how does this work" | explainer | `thurview-explain` |
61
+ | code that is **not written yet** — "how should we build this" | **design** | this one |
62
62
 
63
63
  A plan for work already done is a review. An explanation with a
64
64
  recommendation stapled on is an explainer that broke its own rule. If the
@@ -1,33 +1,80 @@
1
- # Code explainer
1
+ ---
2
+ name: thurview-explain
3
+ description: Author and publish a thurview code explainer - a guided, evidence-anchored explanation of a codebase, or one subsystem of it, at a single pinned commit, which the reader opens in the browser, annotates, asks questions about, and sends back or marks done. Every claim is anchored to a file and line range, a software map carries the parts the prose does not reach, and coverage states what was never examined. Use when the user asks to explain or walk through a codebase, how a system or a subsystem works, where its design problems might be, "explain this repository", "how does the server work", or invokes /thurview-explain. Not for reviewing a change that is already written, which is the thurview skill.
4
+ user-invocable: true
5
+ argument-hint: "[<path scope>] [--commit <ref>]"
6
+ ---
7
+
8
+ # thurview explain
2
9
 
3
10
  A **review** explains a change. An **explainer** explains a codebase, or one
4
11
  subsystem of it, at a single pinned commit, so the reader can see the
5
12
  architecture well enough to spot design problems themselves.
6
13
 
7
14
  Same engine, different unit. It shares anchors, peeks, the map, threads,
8
- revisions and the publish → wait → answer loop. It has no diff, no commits and
9
- no interface delta, because those are claims about a change and there is no
10
- change. Where a review shows the interface delta, an explainer shows
11
- **coverage**: what it examined at that commit, and what it did not.
12
-
13
- | Tab | Review | Explainer |
14
- | ------------- | ---------------------------------- | --------------------------------------------- |
15
- | Review | the walkthrough, with the delta | **Explainer**: the document, with coverage |
16
- | Files | split diff of the changed files | absent |
17
- | Commits | base..head | absent |
18
- | Map | parts, marked added/changed/removed | parts at the pinned commit |
19
- | Coverage | absent | **what the document reached, and what it did not** |
20
- | Threads | ask, comment, decide | same, and the decision reads *Done reading* / *Send it back* |
21
-
22
- ## When to write one
15
+ revisions and the publish → wait → answer loop with the `thurview` skill's
16
+ review. It has no diff, no commits and no interface delta, because those are
17
+ claims about a change and there is no change. Where a review shows the
18
+ interface delta, an explainer shows **coverage**: what it examined at that
19
+ commit, and what it did not.
20
+
21
+ | Tab | Review | Explainer |
22
+ | -------- | ----------------------------------- | ------------------------------------------------------------ |
23
+ | Review | the walkthrough, with the delta | **Explainer**: the document, with coverage |
24
+ | Files | split diff of the changed files | absent |
25
+ | Commits | base..head | absent |
26
+ | Map | parts, marked added/changed/removed | parts at the pinned commit |
27
+ | Coverage | absent | **what the document reached, and what it did not** |
28
+ | Threads | ask, comment, decide | same, and the decision reads _Done reading_ / _Send it back_ |
29
+
30
+ ## Which kind is this
23
31
 
24
32
  Write an explainer when the request is about the code as it stands: "explain
25
33
  this codebase", "how does the server work", "walk me through `src/graph`",
26
- "I want to see the architecture". Write a review when the request is about a
27
- change: a branch, a pull request, a range.
34
+ "I want to see the architecture".
35
+
36
+ | The request is about | Kind | Skill |
37
+ | ------------------------------------------------------------- | ------------- | ----------------- |
38
+ | code that exists, explained - "how does this work" | **explainer** | this one |
39
+ | code that is written - a branch, a PR, a range | review | `thurview` |
40
+ | code that is **not written yet** - "how should we build this" | design | `thurview-design` |
28
41
 
29
42
  If the request is a change, do not reach for an explainer because the change is
30
- large. A large change is still a change.
43
+ large. A large change is still a change. An explanation with a recommendation
44
+ stapled on is an explainer that broke its own rule - see "Surface structure; do
45
+ not grade it" below, and write the design instead when the request is genuinely
46
+ "explain this, then propose a change".
47
+
48
+ ## Request
49
+
50
+ $ARGUMENTS
51
+
52
+ A path scope narrows the explainer to one part of the system; with none it is
53
+ the whole repository.
54
+
55
+ ## Before authoring
56
+
57
+ Read the guidance files that exist, in this order; the second wins on conflict.
58
+
59
+ 1. `~/.thurview/THURVIEW.md` (or `$THURVIEW_HOME/THURVIEW.md`), user guidance.
60
+ 2. `THURVIEW.md` at the repository root, repository guidance.
61
+
62
+ `thurview explain` lists the ones it found under `guidance`.
63
+
64
+ The `thurview` skill ships the references this one shares - document authoring,
65
+ components, software map, theme, lifecycle. `thurview skill` prints the path of
66
+ every bundled SKILL.md; the references sit beside each one. Read **Document
67
+ authoring** before you write `review.md`, **Components** before you edit
68
+ `data.yaml`, **Software map** before you author `map.yaml`, **Theme** before you
69
+ write `theme.yaml`, and **Lifecycle** for statuses, storage and thread rules -
70
+ they are identical for all three kinds.
71
+
72
+ Run the CLI as `thurview`; `npx -y thurview` runs the published package with
73
+ the same commands. Every command prints TOON on stdout - the result, then
74
+ `help[]` with the next commands. Errors are structured on stdout too (`error`,
75
+ `code`, `help`); exit 1 is a failure, 2 a usage error. If a command answers
76
+ `unknown command` for something this skill tells you to run, the installed CLI
77
+ is older than the skill: run `thurview update`, retry once, then report it.
31
78
 
32
79
  ## The document kind, in one command
33
80
 
@@ -59,7 +106,8 @@ So work in three layers, and let each carry what it is good at.
59
106
  `thurview graph architecture --review <id>`: communities become nodes, their
60
107
  files become the node's `files` globs, and the edges between communities
61
108
  become edges. Every part of the scope should appear here, including the parts
62
- the prose will not reach. See [Software map](software-map.md) for the shape.
109
+ the prose will not reach. See the `thurview` skill's Software map
110
+ reference for the shape.
63
111
  2. **Subsystem — the prose carries depth.** Pick the parts that carry the most
64
112
  structure and the most traffic, and explain those. Three to six sections.
65
113
  Everything else stays on the map.
@@ -85,7 +133,7 @@ puts one of three states on it:
85
133
 
86
134
  The counts go above the document and onto the Coverage tab, and `publish`
87
135
  prints them with the files it did not examine. You cannot forget to state
88
- coverage, and you cannot overstate it: to move a file out of *not examined* you
136
+ coverage, and you cannot overstate it: to move a file out of _not examined_ you
89
137
  have to actually anchor it or actually place it on the map.
90
138
 
91
139
  Two consequences worth planning for:
@@ -106,8 +154,8 @@ smaller than it is.
106
154
 
107
155
  ## Surface structure; do not grade it
108
156
 
109
- thurview's thesis holds here: *it does not review the code for you; it helps
110
- you understand it fast enough to review it yourself.* An explainer exists so
157
+ thurview's thesis holds here: _it does not review the code for you; it helps
158
+ you understand it fast enough to review it yourself._ An explainer exists so
111
159
  the reader can **detect** design problems. That is only consistent with the
112
160
  thesis if you surface structure and leave the conclusion to them.
113
161
 
@@ -145,17 +193,19 @@ the code" - not a finding.
145
193
  `thurview graph callers <name>` and `tests-for <name>` answer the follow-ups.
146
194
  `graph interfaces` and `graph impact` compare two commits and are refused.
147
195
  3. Author `map.yaml` from the architecture output, covering the whole scope.
148
- Dispatch a sub-agent for it if you have one, exactly as a review does.
149
- 4. Author `review.md` and `data.yaml` per [Document authoring](document-authoring.md),
150
- minus the interface-delta section: an explainer has none, and declaring
151
- `interfaces` in `data.yaml` is an error. So is `graph: base` on an anchor -
152
- there is one commit.
153
- 5. `theme.yaml` as usual - see [Theme](theme.md).
196
+ Dispatch a sub-agent for it if you have one, exactly as the `thurview`
197
+ skill's review does.
198
+ 4. Author `review.md` and `data.yaml` per **Document authoring**, minus the
199
+ interface-delta section: an explainer has none, and declaring
200
+ `interfaces` in `data.yaml` is an error. So is `security`, which is what a
201
+ change carries input across and an explainer has no change. So is
202
+ `graph: base` on an anchor - there is one commit.
203
+ 5. `theme.yaml` as usual - see **Theme**.
154
204
  6. `thurview publish --review <id>`. Read `coverage` and `notExamined`. If the
155
205
  split is not the one you meant, anchor or place more and publish again.
156
206
  7. `thurview open --review <id>`, then `thurview wait --review <id>`. The loop,
157
207
  the statuses and the thread rules are identical to a review; see
158
- [Lifecycle](lifecycle.md).
208
+ **Lifecycle**.
159
209
 
160
210
  ## Hand over
161
211
 
@@ -164,3 +214,18 @@ words (including how many files were not examined), which parts you chose to
164
214
  explain and on what basis, and that you are waiting for their questions. Do not
165
215
  list the design problems you think you saw. The document is built so the reader
166
216
  finds them.
217
+
218
+ ## Completion criteria
219
+
220
+ Report completion only when all of these hold:
221
+
222
+ - The reader has the URL of a published revision.
223
+ - Every `error` diagnostic is resolved.
224
+ - The map is published, or you said why it is not - and the coverage split says
225
+ the same thing the document does.
226
+ - The explainer is waiting on the reader, accepted, closed, dismissed or
227
+ deleted.
228
+
229
+ Close with the decision and its summary (`wait.decision`) and the URL. When the
230
+ reader has not responded, say so and leave it open; a later session picks it up
231
+ from `thurview` in the same worktree.