@skillstech/thunderlang 0.1.6 → 0.1.7
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/CHANGELOG.md +47 -47
- package/LICENSE +201 -21
- package/NOTICE +15 -0
- package/README.md +5 -8
- package/dist/core.cjs +12 -12
- package/dist/index.cjs +16 -16
- package/package.json +12 -12
- package/src/ai-events.mjs +1 -1
- package/src/cli.mjs +139 -134
- package/src/codegen.mjs +1 -1
- package/src/compile.mjs +3 -3
- package/src/drift.mjs +3 -3
- package/src/emit.mjs +2 -2
- package/src/focus.mjs +1 -1
- package/src/guard.mjs +3 -3
- package/src/intellisense.mjs +1 -1
- package/src/intent-schema.mjs +4 -4
- package/src/ledger.mjs +1 -1
- package/src/lift.mjs +2 -2
- package/src/lsp.mjs +1 -1
- package/src/mcp.mjs +1 -1
- package/src/parse.mjs +3 -3
- package/src/proof-schema.mjs +2 -2
- package/src/report.mjs +1 -1
- package/src/sarif.mjs +1 -1
- package/src/scan-queries.mjs +1 -1
- package/src/style.mjs +3 -3
- package/src/twelve-factor.mjs +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -16,7 +16,7 @@ changes to 0.1.5.
|
|
|
16
16
|
errors/handlers, events, a pure runtime). `twelveFactorReport(ast)` returns a per-factor verdict
|
|
17
17
|
(`satisfied` | `partial` | `absent`) with evidence + a fix and a 0–100 score; `twelveFactorSummary`
|
|
18
18
|
is the compact form. `compileSource` and the proof envelope now carry a `twelveFactor` summary, so
|
|
19
|
-
"12-factor compliant" is a claim the proof asserts. CLI: `
|
|
19
|
+
"12-factor compliant" is a claim the proof asserts. CLI: `thunder twelve-factor <file> [--json]`.
|
|
20
20
|
Findings catalogued as `IL-12F-01..13`. Exported from `/core` and the root. See
|
|
21
21
|
`docs/twelve-factor-agents.md` and `examples/TwelveFactorAgent.intent` (scores 100/100).
|
|
22
22
|
|
|
@@ -109,33 +109,33 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
109
109
|
|
|
110
110
|
- **Executable intent (the Intent Runtime).** `evaluateDecision` (FIRST-hit, full trace),
|
|
111
111
|
`simulateLifecycle` (walk a state machine, reject illegal transitions), and
|
|
112
|
-
`checkDecisionCases`, powered by a safe no-`eval` expression engine. CLI: `
|
|
113
|
-
`
|
|
112
|
+
`checkDecisionCases`, powered by a safe no-`eval` expression engine. CLI: `thunder run`,
|
|
113
|
+
`thunder simulate`.
|
|
114
114
|
- **First-class tests.** `test` blocks (`case` / `scenario`) inside a `.intent` file, run
|
|
115
|
-
with `
|
|
115
|
+
with `thunder test` and `runTests`. The spec proves itself.
|
|
116
116
|
- **Outcome contracts.** `outcome_contract` binds an outcome to a target; `evaluateOutcomes`
|
|
117
|
-
and `
|
|
117
|
+
and `thunder outcomes` judge it met / missed / pending against a delivery `result`.
|
|
118
118
|
- **Full five-profile language.** System (`capability`, `interface`), delivery (`release`,
|
|
119
119
|
`result`, `learning`), and design (`component`, `artifact`) profiles join core, product,
|
|
120
120
|
and experience. Governance (`waiver`) and data privacy (`data`) too.
|
|
121
121
|
- **Interop.** Export to DMN, BPMN, NuSMV, JSON Schema, OpenAPI, W3C Design Tokens, and
|
|
122
|
-
Mermaid , the whole Intent Graph as a paste-anywhere diagram , (`
|
|
123
|
-
import from DMN and BPMN with a fidelity report (`
|
|
124
|
-
graph <-> source round-trip (`graphToSource`, `
|
|
125
|
-
(`migrateGraph`, `validateGraph`, `
|
|
126
|
-
merge (`
|
|
127
|
-
- **Editor support.** A Language Server (`
|
|
122
|
+
Mermaid , the whole Intent Graph as a paste-anywhere diagram , (`thunder export`, `toMermaid`);
|
|
123
|
+
import from DMN and BPMN with a fidelity report (`thunder import`, `importReport`); native
|
|
124
|
+
graph <-> source round-trip (`graphToSource`, `thunder source`); schema migrations
|
|
125
|
+
(`migrateGraph`, `validateGraph`, `thunder migrate` / `validate`); semantic diff + 3-way
|
|
126
|
+
merge (`thunder diff` / `merge`).
|
|
127
|
+
- **Editor support.** A Language Server (`thunder lsp`, `startLspServer`) providing
|
|
128
128
|
diagnostics, completion, and hover over LSP; a TextMate grammar
|
|
129
129
|
(`syntaxes/intent.tmLanguage.json`) for syntax highlighting.
|
|
130
|
-
- **Onboarding + CI.** `
|
|
131
|
-
recurses and gates a whole repo; `
|
|
130
|
+
- **Onboarding + CI.** `thunder init` scaffolds a runnable starter; `thunder check <dir>`
|
|
131
|
+
recurses and gates a whole repo; `thunder check --json` and `thunder explain <CODE>` for
|
|
132
132
|
tooling; a composite GitHub Action.
|
|
133
133
|
- **Style intent.** `style_intent` models brand + visual language as a governed
|
|
134
134
|
Experience-profile extension: design tokens bind to a canonical, lockable address space,
|
|
135
135
|
and `accessibility_target` is always a `proposed` claim (never IL-verified). `analyzeStyle`,
|
|
136
|
-
`styleDiagnostics`, `
|
|
136
|
+
`styleDiagnostics`, `thunder style`, diagnostics `IL-STYLE-001..005`, canonical `StyleIntent`
|
|
137
137
|
node with graph round-trip. Browser-safe via `/core`. Exports to **W3C Design Tokens
|
|
138
|
-
(DTCG)** via `
|
|
138
|
+
(DTCG)** via `thunder export --format tokens` / `toDesignTokens` (`intent-design-tokens-v1`)
|
|
139
139
|
and to a ready-to-use **CSS** custom-property sheet via `--format css` / `toCss`. Experiences
|
|
140
140
|
export to a **Playwright** E2E test scaffold via `--format playwright` / `toPlaywright`.
|
|
141
141
|
- **Security + type diagnostics.** Deterministic checks for the mistakes prompts ship:
|
|
@@ -154,21 +154,21 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
154
154
|
only the target lines so comments, formatting, and untouched blocks stay byte-identical. Closes
|
|
155
155
|
the sync fidelity gap: a PM edits fields and IL keeps the comments. Field removal takes the
|
|
156
156
|
field's indented modifiers with it (no orphans). Unmatched/unsupported edits are reported,
|
|
157
|
-
never applied blindly. Browser-safe. Also a CLI: `
|
|
157
|
+
never applied blindly. Browser-safe. Also a CLI: `thunder edit <file> --edits <json|-> |
|
|
158
158
|
--set-goal | --add-guarantee | ... [--write]`.
|
|
159
|
-
- **Verify a code change against its intent (`intent-verify-diff-v1`).** `
|
|
159
|
+
- **Verify a code change against its intent (`intent-verify-diff-v1`).** `thunder verify-diff
|
|
160
160
|
<intent> --after <code> [--before <code>]` / `verifyDiff()` proves, deterministically and with
|
|
161
161
|
no AI, which of the intent's guarantees/never-rules a change upholds or breaks, and returns a
|
|
162
162
|
gate verdict (PASS/BLOCK, non-zero exit on BLOCK). Blocks on regressions (a claim that held
|
|
163
163
|
before and broke after) and guardrail hits (an added line pushing a never-rule's protected
|
|
164
164
|
secret into a log/response). The keystone of the AI generate-verify loop; honest (catches
|
|
165
165
|
mechanical violations, does not claim to prove correctness).
|
|
166
|
-
- **Intent Atlas + lift-all.** `liftAll(source)` / `
|
|
166
|
+
- **Intent Atlas + lift-all.** `liftAll(source)` / `thunder lift <file> --all` lifts EVERY public
|
|
167
167
|
function in a file into its own inferred mission (not just the first), filtering internal
|
|
168
168
|
helpers (Go: exported-only; Python/Ruby: top-level, non-underscore) , so a whole module reads
|
|
169
169
|
as intent. Powers the Intent Atlas: `scripts/build-atlas.mjs` lifts well-known OSS projects
|
|
170
170
|
(Requests, Express, Flask, gorilla/mux, chi) into a browsable /atlas of ~99 inferred missions.
|
|
171
|
-
- **Prompt -> intent (`intent-draft-v1`).** `draftIntent(brief)` / `
|
|
171
|
+
- **Prompt -> intent (`intent-draft-v1`).** `draftIntent(brief)` / `thunder draft --brief <json|->`
|
|
172
172
|
turns a structured brief into a rigorous, canonically-formatted intent draft PLUS a review
|
|
173
173
|
checklist of what a human must still fill in (unverified guarantee, decision with no default,
|
|
174
174
|
unguarded secret, missing goal). The deterministic half of prompt->intent , an agent produces
|
|
@@ -179,9 +179,9 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
179
179
|
intent declares secret (Secret/Password/Token type, pii/sensitive data, or a secret-looking
|
|
180
180
|
name), deeply , so wrapping a logger enforces "never expose the token"; `assertAllowed(name,
|
|
181
181
|
inputs)` runs a declared decision and THROWS `INTENT_GUARD_DENIED` when the intent denies the
|
|
182
|
-
action , the intent's rules become a hard production gate. `
|
|
182
|
+
action , the intent's rules become a hard production gate. `thunder guard <file>` previews it.
|
|
183
183
|
Browser-safe.
|
|
184
|
-
- **MCP server for AI agents.** `
|
|
184
|
+
- **MCP server for AI agents.** `thunder mcp` / `startMcpServer` speaks the Model Context
|
|
185
185
|
Protocol over stdio, exposing ThunderLang as native tools for coding agents (Claude Code,
|
|
186
186
|
Cursor, ...): `intent_verify_diff` (the gate), `intent_check`, `intent_lift`, `intent_run`,
|
|
187
187
|
`intent_test`, `intent_graph`, `intent_explain`. The agent checks its own output against the
|
|
@@ -233,7 +233,7 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
233
233
|
attribution , a metric moving after release is correlation, not proof this feature caused it).
|
|
234
234
|
This closes the "technical success is mistaken for outcome success" gap: an outcome is only
|
|
235
235
|
trustworthy with a guardrail and honest attribution.
|
|
236
|
-
- **Change Lens , what a branch/PR changed by meaning (`
|
|
236
|
+
- **Change Lens , what a branch/PR changed by meaning (`thunder changes`).** `thunder changes
|
|
237
237
|
<base>..<head>` git-diffs the `.intent` files, semantic-diffs each (reusing `diffGraphs`), and
|
|
238
238
|
reports the behavior-level changes: guarantees / never-rules / invariants / decisions added or
|
|
239
239
|
removed, verification removed, and , crucially , a claim that **lost its verification** is
|
|
@@ -250,7 +250,7 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
250
250
|
`invariant-without-verification` warns when a global law has nothing proving it (that is exactly
|
|
251
251
|
where a locally-valid change silently breaks the whole system). Invariants count toward
|
|
252
252
|
comprehension C2 (Structured). Example: `examples/TenantIsolation.intent`.
|
|
253
|
-
- **Code generation , deterministic TypeScript from intent (`
|
|
253
|
+
- **Code generation , deterministic TypeScript from intent (`thunder gen`).** `toTypeScript(ast)`
|
|
254
254
|
(`intent-codegen-v1`, no AI) generates what the intent fully determines , typed input/output
|
|
255
255
|
interfaces, and the **decision logic**, which is real and behaviorally identical to the runtime
|
|
256
256
|
evaluator (proven by a property test over the input space) , and leaves honest `TODO` markers
|
|
@@ -259,33 +259,33 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
259
259
|
token becomes a string literal). **Now also generates C# and Java** (`--target csharp|java`):
|
|
260
260
|
typed records + the same first-hit decision logic, translated per language (C# `==` + `.Contains`;
|
|
261
261
|
Java `Objects.equals`, so string equality is value-correct, not reference `==`) via a
|
|
262
|
-
dialect-aware `exprToCode`. `
|
|
262
|
+
dialect-aware `exprToCode`. `thunder gen <file> [--target typescript|csharp|java] [--out <dir>]`. Pure
|
|
263
263
|
/ browser-safe and exported from `/core`, so the **playground now has a "Code" tab** , change
|
|
264
|
-
the intent, watch the code change. Completes the round-trip with `
|
|
264
|
+
the intent, watch the code change. Completes the round-trip with `thunder lift` (code -> intent).
|
|
265
265
|
- **Fix: non-mission root files no longer render as `# null`.** A standalone `event` / `api` /
|
|
266
266
|
`service` / `capability` file has no `mission`, so the graph titled its root node `null` and the
|
|
267
267
|
docs rendered `# null` (visible in the playground's BillingService / API / event examples). A
|
|
268
268
|
new `subjectName(ast)` derives the title from the primary construct, so these render under their
|
|
269
269
|
real name everywhere (graph, docs, generated code).
|
|
270
|
-
- **Comprehension Contract , the C0..C7 understanding level (`
|
|
270
|
+
- **Comprehension Contract , the C0..C7 understanding level (`thunder comprehension`).** The
|
|
271
271
|
measurable backbone of the Software Understanding System: `comprehensionLevel(ast)` scores how
|
|
272
272
|
well-understood a mission is, deterministically, from C0 (Unknown) through C4 (Verified) which
|
|
273
273
|
IL determines on its own, up to C5 (Observed), C6 (Teachable), and C7 (Governed) which a sibling
|
|
274
274
|
lifts by attaching evidence (`--observed` = OpenThunder/runtime, `--learning` = Skills Tech Talk,
|
|
275
275
|
`--governed` = Guardian + Workspace/Ledger). The ladder is cumulative (a gap caps the level) and
|
|
276
276
|
honest (a level is never claimed on evidence IL does not have; each missing rung names its owner).
|
|
277
|
-
`
|
|
277
|
+
`thunder comprehension <file|dir>` reports the level + the next rung; `intent-comprehension-v1` is
|
|
278
278
|
the shared contract every product reads. Pure / browser-safe, exported from `/core`, typed.
|
|
279
|
-
- **Intent Lens , Intent Scope + Focus Graph (`
|
|
279
|
+
- **Intent Lens , Intent Scope + Focus Graph (`thunder focus`).** A Focus Graph is a
|
|
280
280
|
deterministic subgraph of the Intent Atlas around a selected scope (a mission, a feature
|
|
281
281
|
query, or `--nodes a,b`), with every node tagged by WHY it is in focus (selected / governing
|
|
282
282
|
/ dependency / dependent / implementation / verification / risk / contextual) and bounded by
|
|
283
283
|
`--depth`. `makeScope` builds the typed Intent Scope; `buildFocusGraph` the subgraph;
|
|
284
284
|
`intentBrief` a deterministic what/who/guarantees/prohibitions/risks/unknowns brief whose
|
|
285
|
-
confidence is the weakest in scope (honesty). `
|
|
285
|
+
confidence is the weakest in scope (honesty). `thunder focus <mission|query|--nodes>
|
|
286
286
|
[--depth N] [--json]`. Built over the existing Atlas (not a fork); pure and browser-safe so
|
|
287
287
|
Studio / OpenThunder / RepoMastery / Skills Tech Talk consume one focused representation.
|
|
288
|
-
- **Focused scanner queries (`
|
|
288
|
+
- **Focused scanner queries (`thunder risks | gaps | unverified | coverage | unknowns |
|
|
289
289
|
contradictions`).** Part 3 of the Intent Scanner: one deterministic question each over the
|
|
290
290
|
shared Intent IR + Fable findings (`scan-queries.mjs`, `intent-scan-view-v1`), so a person
|
|
291
291
|
can ask "what is unverified?" or "what is the verification coverage?" without reading the
|
|
@@ -296,68 +296,68 @@ The executable + interoperable release. Everything is deterministic and requires
|
|
|
296
296
|
under-counted never-rule verification (and coverage read wrong). Never-rules with a `verify`
|
|
297
297
|
now emit `verified_by` edges + a `verify-declared` status, and `graphToSource` round-trips
|
|
298
298
|
them. Every downstream consumer (OpenThunder, RepoMastery) sees never-verification faithfully.
|
|
299
|
-
- **Code actions + autocorrect (`
|
|
299
|
+
- **Code actions + autocorrect (`thunder code-actions` / `apply-fix`).** `getCodeActions`
|
|
300
300
|
surfaces the available quick-fixes, safety-graded (`safe` autocorrects and `reviewable`
|
|
301
301
|
diagnostic fixes); `autocorrectSource` applies only meaning-preserving header fixes
|
|
302
302
|
(`goals` -> `goal`, `nevers` -> `never`, stray trailing colons), never a valid keyword
|
|
303
303
|
in another context (a decision's `inputs` sub-block is deliberately left alone).
|
|
304
|
-
`
|
|
304
|
+
`thunder code-actions <file>` lists them; `thunder apply-fix <file> [--write]` applies the
|
|
305
305
|
safe ones and reports the reviewable ones for a human. Both pure and browser-safe.
|
|
306
|
-
- **Per-audience docs (`
|
|
306
|
+
- **Per-audience docs (`thunder docs --lens`).** `thunder docs <file>` renders a mission as
|
|
307
307
|
Markdown; with `--lens <lens>` it produces an audience-specific doc that weaves that
|
|
308
|
-
lens's
|
|
308
|
+
lens's ThunderLens notes inline next to the input, output, guarantee, or never they
|
|
309
309
|
annotate, and states up front that notes are documentation, not verification. `--out`
|
|
310
310
|
writes the file; otherwise it prints. `renderLensDoc` is pure and browser-safe.
|
|
311
|
-
- **Intent AI event sink (`intent-ai-events-v1`).** `
|
|
311
|
+
- **Intent AI event sink (`intent-ai-events-v1`).** `thunder ai approve` / `reject` now
|
|
312
312
|
persist their integration event to an append-only JSON-Lines log at
|
|
313
313
|
`.intent/ai-events.jsonl`, so a project keeps a durable audit trail of every AI action.
|
|
314
|
-
`
|
|
314
|
+
`thunder ai events [dir] [--subject <id>]` reads it back (who did what, and the status
|
|
315
315
|
move). Pure sink module (`recordEvent`, `parseEventLog`, `serializeEventLog`, `timeline`),
|
|
316
316
|
exported from the barrel; rejects unknown event types; append-only (never mutates).
|
|
317
|
-
- **
|
|
317
|
+
- **ThunderLens notes CLI (`intent-notes-v1`).** `thunder notes <file>` lists the compiled
|
|
318
318
|
`note <lens>:` blocks grouped by lens, each with its target (mission / input / output /
|
|
319
319
|
guarantee / never) and source line; `--lens <lens>` filters to one audience and `--json`
|
|
320
320
|
emits the report. Notes explain meaning for a reader and are never verification. Reuses
|
|
321
321
|
the parser's `ast.notes` (no new parsing).
|
|
322
|
-
- **Intent Ledger (`intent-ledger-v1`).** `
|
|
322
|
+
- **Intent Ledger (`intent-ledger-v1`).** `thunder ledger <file.json>` / `verifyLedger`, `record*`,
|
|
323
323
|
`explain` keep the append-only, hash-chained (tamper-evident) record of a project's MEANING and
|
|
324
324
|
history: why a mission was built, who approved it, what was assumed, which inferred intent a human
|
|
325
325
|
corrected, which risks were accepted, what was verified, which lessons went stale. Each entry hashes
|
|
326
326
|
over the previous, so history cannot be quietly rewritten , `verifyLedger` locates any break to the
|
|
327
|
-
entry. Deterministic (caller supplies timestamps). `
|
|
327
|
+
entry. Deterministic (caller supplies timestamps). `thunder ledger <file> --subject <id>` explains
|
|
328
328
|
one mission's provenance; exit non-zero on a broken chain. Browser-safe.
|
|
329
|
-
- **Intent Simulator (`intent-simulate-v1`).** `
|
|
329
|
+
- **Intent Simulator (`intent-simulate-v1`).** `thunder impact <base> <proposed>` / `simulateChange`
|
|
330
330
|
estimates a change's impact BEFORE implementation: the deterministic BLAST RADIUS (transitive
|
|
331
331
|
reach over the intent graph, by node type), the risk it would introduce, contradictions, and
|
|
332
332
|
release risk , keeping deterministic dependency impact, rule-derived risk, AI-predicted (null in
|
|
333
333
|
deterministic mode), and unknown impact SEPARATE and honest. Browser-safe.
|
|
334
|
-
- **Intent Guardian (`intent-guardian-v1`).** `
|
|
334
|
+
- **Intent Guardian (`intent-guardian-v1`).** `thunder guardian <before> <after>` / `guardianReport`
|
|
335
335
|
detects drift a change introduced: what changed (semantic diff by mission identity, rename-safe),
|
|
336
336
|
what intent it affects, the risk it INTRODUCED (findings new in after), what must be reverified
|
|
337
337
|
(changed contract elements + invalidated approvals), and which missions' learning is now stale.
|
|
338
338
|
`needs-attention` only on newly-introduced blocking risk; exit non-zero gates a PR. Browser-safe.
|
|
339
|
-
- **Intent Scanner + Fable (`intent-scan-v1` / `intent-fable-v1`).** `
|
|
339
|
+
- **Intent Scanner + Fable (`intent-scan-v1` / `intent-fable-v1`).** `thunder scan [dir]` runs the
|
|
340
340
|
deterministic pipeline , parse -> Intent IR -> Fable findings -> risk themes , and prints an
|
|
341
341
|
executive/risk summary + a highest-impact remediation sequence; `--json` for the machine report,
|
|
342
342
|
`--ir <path>` to emit the shared Intent IR. Fable is the rule authority OVER the diagnostics
|
|
343
343
|
catalog (risk category + detection strategy + remediation + suppression policy); every finding is
|
|
344
344
|
fully explained (never "AI detected a possible issue"). `scanProject`, `universalPack`,
|
|
345
345
|
`fableRuleFor`, `toFinding` exported. Browser-safe.
|
|
346
|
-
- **Repo-wide health report.** `
|
|
346
|
+
- **Repo-wide health report.** `thunder report [dir]` / `buildReport(files)` aggregates every
|
|
347
347
|
.intent file into an intent-health summary (`intent-report-v1`): diagnostics by severity +
|
|
348
348
|
area, top codes, and coverage (guarantees verified, missions with tests, outcomes contracted).
|
|
349
|
-
- **SARIF code scanning.** `
|
|
349
|
+
- **SARIF code scanning.** `thunder check <path> --format sarif` emits a SARIF 2.1.0 log
|
|
350
350
|
(`toSarif`), so diagnostics appear natively in GitHub/GitLab code scanning and SARIF-aware
|
|
351
351
|
IDEs , with rule metadata, level mapping, and precise line regions where known.
|
|
352
352
|
- **Complete diagnostics reference.** Legacy core check codes (`missing-goal`,
|
|
353
353
|
`guarantee-without-verification`, ...) are now documented and explainable via
|
|
354
|
-
`CORE_DIAGNOSTICS` / `ALL_DIAGNOSTICS`, so `
|
|
354
|
+
`CORE_DIAGNOSTICS` / `ALL_DIAGNOSTICS`, so `thunder explain <any-code>`, `thunder rules`, and
|
|
355
355
|
`docs/diagnostics.md` cover everything the check pass emits (60 codes). A guard test keeps it
|
|
356
356
|
complete. The canonical `DIAGNOSTIC_RULES` stays IL-* only.
|
|
357
357
|
- **Canonical proof envelope (`intent-proof-v1`).** The `.intent-proof.json` shape is now a
|
|
358
358
|
published, versioned contract: `intentProofJsonSchema()` (JSON Schema), `validateProof()`
|
|
359
|
-
(dependency-free structural check), `
|
|
360
|
-
`
|
|
359
|
+
(dependency-free structural check), `thunder proof --schema`, and a well-formedness gate in
|
|
360
|
+
`thunder verify`. Browser-safe via `/core` so signers/renderers validate the envelope with
|
|
361
361
|
no Node build.
|
|
362
362
|
- **Browser-safe `/core` subpath**, the committed `intent-graph.schema.json`, and the
|
|
363
363
|
canonical 49-rule `IL-*` diagnostic catalog (60 codes documented including legacy core codes).
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,201 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "{}"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2026 Skills Tech Talk, LLC
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
package/NOTICE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ThunderLang
|
|
2
|
+
Copyright 2026 Skills Tech Talk, LLC
|
|
3
|
+
|
|
4
|
+
This product includes software developed by Skills Tech Talk, LLC
|
|
5
|
+
(https://thunderlang.dev).
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0. See the LICENSE file.
|
|
8
|
+
|
|
9
|
+
ThunderLang, the ThunderLang logo, and related marks are trademarks of
|
|
10
|
+
Skills Tech Talk, LLC. The Apache-2.0 license covers the source code only and
|
|
11
|
+
does not grant any right to use these marks. See TRADEMARKS.md.
|
|
12
|
+
|
|
13
|
+
ThunderLang was previously introduced as IntentLang. The paradigm it implements,
|
|
14
|
+
Intent-Oriented Programming, and its technical vocabulary (Intent Graph, Intent
|
|
15
|
+
Atlas, Intent Contracts, Intent IR, Intent Diff, Intent Proof) are retained.
|
package/README.md
CHANGED
|
@@ -6,10 +6,7 @@ and, for decisions, lifecycles, and outcomes, **executes the intent directly** (
|
|
|
6
6
|
generated). Every output is pure and deterministic: the same source always yields the same
|
|
7
7
|
result, so intent can be diffed, merged, tested, and trusted.
|
|
8
8
|
|
|
9
|
-
Part of [ThunderLang](https://thunderlang.dev), the intent
|
|
10
|
-
|
|
11
|
-
> Previously published as `@skillstech/intentlang`. The package was renamed to
|
|
12
|
-
> `@skillstech/thunderlang`; the old name remains as a deprecated alias.
|
|
9
|
+
Part of [ThunderLang](https://thunderlang.dev), the intent language for AI-era software.
|
|
13
10
|
|
|
14
11
|
## Install
|
|
15
12
|
|
|
@@ -54,7 +51,7 @@ intent diff <before> <after> intent merge <base> <ours> <theirs>
|
|
|
54
51
|
intent lift <file> intent approve <file> intent drift <file>
|
|
55
52
|
```
|
|
56
53
|
|
|
57
|
-
Run `
|
|
54
|
+
Run `thunder help` for the full reference.
|
|
58
55
|
|
|
59
56
|
## Executable intent
|
|
60
57
|
|
|
@@ -94,7 +91,7 @@ Export the tokens to **W3C Design Tokens**, a drop-in **CSS** sheet, the whole g
|
|
|
94
91
|
|
|
95
92
|
The compiler also catches the mistakes prompts ship: a secret-typed field on an event payload
|
|
96
93
|
(`IL-SEC-001`), a sensitive API output with no auth (`IL-SEC-002`), a mistyped field
|
|
97
|
-
(`IL-TYPE-001`), and more , the full catalog is `
|
|
94
|
+
(`IL-TYPE-001`), and more , the full catalog is `thunder rules` / [docs](https://thunderlang.dev/docs/diagnostics).
|
|
98
95
|
|
|
99
96
|
## Use as a library
|
|
100
97
|
|
|
@@ -141,10 +138,10 @@ so it keeps bundling everywhere. The `.` entry is this same surface plus the Nod
|
|
|
141
138
|
Compilation produces a canonical graph of 40 typed node kinds and 20 directed
|
|
142
139
|
relationship types, across five profiles (product, experience, system, delivery, design).
|
|
143
140
|
The vocabulary is closed and enforced (an anti-fork test guarantees the compiler only
|
|
144
|
-
emits canonical types); `
|
|
141
|
+
emits canonical types); `thunder schema` emits its draft-07 JSON Schema, also shipped as
|
|
145
142
|
the static `intent-graph.schema.json` in this package (CI-guaranteed in sync with the
|
|
146
143
|
code). Consumers (OpenThunder, Repo Mastery, SkillsTech Studio) build to this graph, and
|
|
147
|
-
`
|
|
144
|
+
`thunder validate <graph.json>` self-checks a graph against the canonical vocabulary.
|
|
148
145
|
|
|
149
146
|
## Output location
|
|
150
147
|
|
package/dist/core.cjs
CHANGED
|
@@ -471,7 +471,7 @@ var IL_AUTHOR_RULE_ROWS = [
|
|
|
471
471
|
{ ruleId: "IL-SEC-002", area: "security", severity: "blocker", blocks: ["release"], summary: "API returns a secret with no auth requirement." },
|
|
472
472
|
{ ruleId: "IL-TYPE-001", area: "type", severity: "info", blocks: [], summary: "Field uses an unrecognized (likely mistyped) type." },
|
|
473
473
|
// 12-Factor Agents conformance (twelve-factor-v1). Advisory: an intent's alignment with the
|
|
474
|
-
// humanlayer/12-factor-agents principles. `
|
|
474
|
+
// humanlayer/12-factor-agents principles. `thunder twelve-factor` scores these.
|
|
475
475
|
{ ruleId: "IL-12F-01", area: "twelve-factor", severity: "info", blocks: [], summary: "F1 Natural language to tool calls: model dispatch as a decision/command." },
|
|
476
476
|
{ ruleId: "IL-12F-02", area: "twelve-factor", severity: "info", blocks: [], summary: "F2 Own your prompts: behavior is an owned, guaranteed contract, not a black box." },
|
|
477
477
|
{ ruleId: "IL-12F-03", area: "twelve-factor", severity: "info", blocks: [], summary: "F3 Own your context window: declare a scope boundary." },
|
|
@@ -497,8 +497,8 @@ var IL_CORE_RULE_ROWS = [
|
|
|
497
497
|
{ ruleId: "unknown-block", area: "core", severity: "info", blocks: [], summary: "Unrecognized top-level block." },
|
|
498
498
|
{ ruleId: "INTENT-ARCH-001", area: "architecture", severity: "warning", blocks: [], summary: "Architecture rule not understood." },
|
|
499
499
|
{ ruleId: "INTENT-AI-010", area: "ai", severity: "warning", blocks: [], summary: "Unsupported implementation scope." },
|
|
500
|
-
{ ruleId: "INTENT_NOTE_UNKNOWN_LENS", area: "note", severity: "info", blocks: [], summary: "
|
|
501
|
-
{ ruleId: "INTENT_NOTE_EMPTY", area: "note", severity: "info", blocks: [], summary: "
|
|
500
|
+
{ ruleId: "INTENT_NOTE_UNKNOWN_LENS", area: "note", severity: "info", blocks: [], summary: "ThunderLens note uses an unknown lens." },
|
|
501
|
+
{ ruleId: "INTENT_NOTE_EMPTY", area: "note", severity: "info", blocks: [], summary: "ThunderLens note is empty." }
|
|
502
502
|
];
|
|
503
503
|
var RULE_PHASES = ["author", "verify"];
|
|
504
504
|
var RULE_OWNERS = ["IL", "OT"];
|
|
@@ -572,7 +572,7 @@ function intentProofJsonSchema() {
|
|
|
572
572
|
sourceProduct: { type: "string" },
|
|
573
573
|
missionName: { type: ["string", "null"] },
|
|
574
574
|
sourceFile: { type: "string" },
|
|
575
|
-
// sha256:<hex> , the source fingerprint `
|
|
575
|
+
// sha256:<hex> , the source fingerprint `thunder verify` re-checks for drift/tampering.
|
|
576
576
|
sourceHash: { type: "string", pattern: "^sha256:[0-9a-f]{64}$" },
|
|
577
577
|
compilerVersion: { type: "string" },
|
|
578
578
|
generatedAt: { type: ["string", "null"] },
|
|
@@ -3359,14 +3359,14 @@ function buildGuard(ast, { denyResults, mask = "[redacted]" } = {}) {
|
|
|
3359
3359
|
}
|
|
3360
3360
|
function decide(name, inputs) {
|
|
3361
3361
|
const d = decisions.get(name);
|
|
3362
|
-
if (!d) throw new Error(`
|
|
3362
|
+
if (!d) throw new Error(`thunder guard: no decision "${name}"`);
|
|
3363
3363
|
const r = evaluateDecision(d, inputs || {});
|
|
3364
3364
|
return { ...r, allowed: !isDenied(r.result) };
|
|
3365
3365
|
}
|
|
3366
3366
|
function assertAllowed(name, inputs) {
|
|
3367
3367
|
const r = decide(name, inputs);
|
|
3368
3368
|
if (!r.allowed) {
|
|
3369
|
-
const e = new Error(`
|
|
3369
|
+
const e = new Error(`thunder guard: decision "${name}" denied the action (result: ${r.result})`);
|
|
3370
3370
|
e.code = "INTENT_GUARD_DENIED";
|
|
3371
3371
|
e.decision = name;
|
|
3372
3372
|
e.result = r.result;
|
|
@@ -3570,7 +3570,7 @@ var FACTORS = [
|
|
|
3570
3570
|
const scoped = len(ast.scope?.include) + len(ast.scope?.exclude);
|
|
3571
3571
|
if (scoped) return { verdict: "satisfied", evidence: `context boundary declared (scope: ${len(ast.scope.include)} include / ${len(ast.scope.exclude)} exclude)` };
|
|
3572
3572
|
if (len(ast.requires)) return { verdict: "partial", evidence: "dependencies declared but no explicit scope boundary", fix: "Declare `scope include/exclude` so the context window is curated, not unbounded." };
|
|
3573
|
-
return { verdict: "absent", evidence: "no scope declared", fix: "Add a `scope` block to bound what belongs in context (
|
|
3573
|
+
return { verdict: "absent", evidence: "no scope declared", fix: "Add a `scope` block to bound what belongs in context (ThunderLens/Focus narrows it further)." };
|
|
3574
3574
|
}
|
|
3575
3575
|
},
|
|
3576
3576
|
{
|
|
@@ -4035,7 +4035,7 @@ function toDesignTokens(ast) {
|
|
|
4035
4035
|
});
|
|
4036
4036
|
for (const t of si.tokens) {
|
|
4037
4037
|
const leaf = { $value: coerceValue(t.value), $type: tokenType(t.path) };
|
|
4038
|
-
if (!isKnownPath(t.path)) leaf.$extensions = { "dev.
|
|
4038
|
+
if (!isKnownPath(t.path)) leaf.$extensions = { "dev.intentlanguage": { canonical: false } };
|
|
4039
4039
|
setPath(root, t.path, leaf);
|
|
4040
4040
|
}
|
|
4041
4041
|
}
|
|
@@ -4043,7 +4043,7 @@ function toDesignTokens(ast) {
|
|
|
4043
4043
|
$description: `Design tokens for ${ast.title || ast.mission || "intent"} (generated from style_intent by @skillstech/thunderlang)`,
|
|
4044
4044
|
...root,
|
|
4045
4045
|
$extensions: {
|
|
4046
|
-
"dev.
|
|
4046
|
+
"dev.intentlanguage": {
|
|
4047
4047
|
schema: DESIGN_TOKENS_SCHEMA,
|
|
4048
4048
|
format: "W3C Design Tokens (DTCG)",
|
|
4049
4049
|
source: ast.mission || null,
|
|
@@ -5527,7 +5527,7 @@ var LANG_EXT = {
|
|
|
5527
5527
|
ruby: "rb",
|
|
5528
5528
|
perl: "pl"
|
|
5529
5529
|
};
|
|
5530
|
-
function liftSource(source, { language = "typescript", file = "", seeds } = {}) {
|
|
5530
|
+
function liftSource(source, { language = "typescript", file = "", seeds = void 0 } = {}) {
|
|
5531
5531
|
const key = String(language).toLowerCase();
|
|
5532
5532
|
const adapter = ADAPTERS[key];
|
|
5533
5533
|
if (!adapter) {
|
|
@@ -5597,7 +5597,7 @@ function renderLensDoc(ast, lens) {
|
|
|
5597
5597
|
const L = [];
|
|
5598
5598
|
L.push(`# ${m} , for the ${lens} reader`, "");
|
|
5599
5599
|
L.push(
|
|
5600
|
-
`>
|
|
5600
|
+
`> ThunderLens \`${lens}\` notes are woven in below. They explain meaning for this`,
|
|
5601
5601
|
`> audience; they are documentation, not verification.`,
|
|
5602
5602
|
""
|
|
5603
5603
|
);
|
|
@@ -6069,7 +6069,7 @@ function fingerprint(parts) {
|
|
|
6069
6069
|
return `fp_${h.toString(16)}`;
|
|
6070
6070
|
}
|
|
6071
6071
|
function makeScope({ type = "custom", title = null, seeds = [], projectId = null, createdBy = null, createdAt = null, ...rest2 } = {}) {
|
|
6072
|
-
if (!SCOPE_TYPES.includes(type)) throw new Error(`
|
|
6072
|
+
if (!SCOPE_TYPES.includes(type)) throw new Error(`thunder focus: unknown scope type "${type}"`);
|
|
6073
6073
|
return {
|
|
6074
6074
|
schema: FOCUS_SCHEMA,
|
|
6075
6075
|
scopeId: `scope.${type}.${fingerprint([type, ...seeds].map(String))}`,
|