skillscript-runtime 0.27.3 → 0.30.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/CHANGELOG.md +10 -0
- package/docs/configuration.md +5 -5
- package/docs/language-reference.md +10 -10
- package/docs/sqlite-skill-store.md +3 -3
- package/examples/skillscripts/classify-support-ticket.skill.provenance.json +1 -1
- package/examples/skillscripts/data-store-roundtrip.skill.provenance.json +1 -1
- package/examples/skillscripts/doc-qa-with-citations.skill.provenance.json +1 -1
- package/examples/skillscripts/feedback-sentiment-scan.skill.provenance.json +1 -1
- package/examples/skillscripts/hello-world.skill.provenance.json +1 -1
- package/examples/skillscripts/morning-brief.skill.provenance.json +1 -1
- package/examples/skillscripts/queue-length-monitor.skill.provenance.json +1 -1
- package/examples/skillscripts/service-health-watch.skill.provenance.json +1 -1
- package/examples/skillscripts/skill-store-roundtrip.skill.provenance.json +1 -1
- package/examples/skillscripts/youtrack-morning-sweep.skill.provenance.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Each release carries an **Upgrade impact:** line (first in its section) so a bump's requirements are visible at a glance. Tags (closed set): **BREAKING** (a manual change is needed to keep working) · **RE-APPROVE** (secured-mode signature invalidation — skills must be re-approved before they run) · **CONFIG** (`connectors.json` / config edit needed) · **none (additive)** (no action; backward-compatible). Standard from 0.20.0 forward; the pre-0.20 transitions that need action are flagged inline below (0.14.0, 0.18.8, 0.19.0). Full walkthrough: [UPGRADING.md](UPGRADING.md).
|
|
4
4
|
|
|
5
|
+
## 0.30.0 — 2026-07-10 — public launch cut
|
|
6
|
+
|
|
7
|
+
**Upgrade impact:** none (additive). Documentation only; no runtime, API, or behavior change.
|
|
8
|
+
|
|
9
|
+
The public-announcement release. A final leakage-scrub pass over the shipped docs, closing the coverage gap the 0.27.3 audit left, so no doc names an internal substrate as an example.
|
|
10
|
+
|
|
11
|
+
- **`sqlite-skill-store.md` (npm-shipped): removed AMP from the three substrate examples** the 0.27.3 audit didn't cover — the "choose your substrate" list (`AMP, Pinecone, S3, Postgres…` → `Pinecone, S3, Postgres, Redis…`), the forking-checklist class-rename example (`AmpSkillStore` → `RedisSkillStore`), and the `manifest()` example (`kind: "amp"` → `kind: "postgres"`). Example-name swaps only; no structural change.
|
|
12
|
+
- **`configuration.md`: genericized two AMP-named examples** — the `connectors.json` `${VAR}`-substitution example (an `"amp"` connector using `${AMP_ENDPOINT}`/`${AMP_TOKEN}` → a generic `"memory"` connector using `${MEMORY_ENDPOINT}`/`${MEMORY_TOKEN}`) and an inline `_comment` ("AMP-style dogfooding" → "local dogfooding").
|
|
13
|
+
- **`language-reference.md` re-rendered from atoms** — the worked-example op dispatches that previously used `$ amp.*` connector calls (mailbox / memory-write / query) now use `$ github.*` / `$ linear.*`, and the substrate-neutrality note lists `$ github.*` / `$ linear.*` as the "substrate-specific tools the adopter declares" example. The "Source of truth: AMP" provenance footer is intentionally retained.
|
|
14
|
+
|
|
5
15
|
## 0.27.3 — 2026-07-10 — dashboard highlighter fix + adopter-facing docs audit
|
|
6
16
|
|
|
7
17
|
**Upgrade impact:** none (additive). One dashboard rendering fix + docs; no runtime behavior change.
|
package/docs/configuration.md
CHANGED
|
@@ -83,18 +83,18 @@ Once `.env` populates `process.env`, both `skillscript.config.json` (`runtime-co
|
|
|
83
83
|
|
|
84
84
|
```json
|
|
85
85
|
{
|
|
86
|
-
"
|
|
86
|
+
"memory": {
|
|
87
87
|
"class": "HttpMcpConnector",
|
|
88
88
|
"config": {
|
|
89
|
-
"endpoint": "${
|
|
90
|
-
"headers": { "Authorization": "Bearer ${
|
|
89
|
+
"endpoint": "${MEMORY_ENDPOINT}",
|
|
90
|
+
"headers": { "Authorization": "Bearer ${MEMORY_TOKEN}" },
|
|
91
91
|
"identityHeader": "X-Agent-Id"
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
`
|
|
97
|
+
`MEMORY_ENDPOINT` and `MEMORY_TOKEN` in `.env`; declarative shape committed to `connectors.json`.
|
|
98
98
|
|
|
99
99
|
### `.env` file format
|
|
100
100
|
|
|
@@ -365,7 +365,7 @@ Underscore-prefixed top-level keys (`_comment`, `_note_security`, etc.) are igno
|
|
|
365
365
|
|
|
366
366
|
```json
|
|
367
367
|
{
|
|
368
|
-
"_comment": "Last edited 2026-05-28 — switched skill_store to sqlite for
|
|
368
|
+
"_comment": "Last edited 2026-05-28 — switched skill_store to sqlite for local dogfooding",
|
|
369
369
|
"substrate": { "skill_store": "sqlite" }
|
|
370
370
|
}
|
|
371
371
|
```
|
|
@@ -460,11 +460,11 @@ Calls a tool through a configured connector. Connector name resolves against `co
|
|
|
460
460
|
$ <connector>.<tool> kwarg=value, ... [-> R]
|
|
461
461
|
```
|
|
462
462
|
|
|
463
|
-
The text before the dot is the connector name (must match an entry in `connectors.json`); the rest is the tool name + args. Named form is canonical for any tool whose semantics are substrate-specific — adopter MCP servers (`
|
|
463
|
+
The text before the dot is the connector name (must match an entry in `connectors.json`); the rest is the tool name + args. Named form is canonical for any tool whose semantics are substrate-specific — adopter MCP servers (`github_*`, `linear_*`, etc.).
|
|
464
464
|
|
|
465
465
|
```
|
|
466
|
-
$
|
|
467
|
-
$
|
|
466
|
+
$ youtrack.search_issues query="project:INFRA state:Open" limit=20 -> ISSUES
|
|
467
|
+
$ github.create_issue repo="acme/foo" title="..." body="..." -> ACK
|
|
468
468
|
$ github.search_issues query="repo:acme/foo state:open" -> ISSUES
|
|
469
469
|
$ linear.find_issues filter="project:INFRA" -> TICKETS
|
|
470
470
|
```
|
|
@@ -508,7 +508,7 @@ Four surfaces apply to every `$` dispatch and to `shell()` (notably `(fallback:)
|
|
|
508
508
|
|
|
509
509
|
```
|
|
510
510
|
$ llm prompt="..." timeout=30 -> R
|
|
511
|
-
$
|
|
511
|
+
$ youtrack.run_report report_id="INFRA-weekly" timeout=120 -> DISPATCH
|
|
512
512
|
```
|
|
513
513
|
|
|
514
514
|
**`approved="<reason>"`** — Author-intent marker for the mutation-gate lint. Any non-empty string satisfies. Extracted at runtime; **not forwarded to the connector**. The value is required but not parsed semantically — presence is the signal.
|
|
@@ -523,7 +523,7 @@ Note: an envelope object like `{items: []}` is a non-empty object and does NOT t
|
|
|
523
523
|
|
|
524
524
|
```
|
|
525
525
|
$ llm prompt="Classify: ${INPUT}" -> VERDICT (fallback: "unknown")
|
|
526
|
-
$
|
|
526
|
+
$ youtrack.search_issues query="${TOPIC}" -> RESULTS (fallback: [])
|
|
527
527
|
shell(argv=["gh","pr","list","--repo","acme/foo"]) -> PRS (fallback: "No open PRs")
|
|
528
528
|
$ ticketing.search query="..." -> ISSUES (fallback: "search-unavailable")
|
|
529
529
|
```
|
|
@@ -590,8 +590,8 @@ $ json_parse ${RAW_JSON} -> PARSED
|
|
|
590
590
|
### Worked examples
|
|
591
591
|
|
|
592
592
|
```
|
|
593
|
-
$
|
|
594
|
-
$
|
|
593
|
+
$ youtrack.run_report report_id="INFRA-weekly" -> DISPATCH
|
|
594
|
+
$ github.search_issues query="repo:acme/foo updated:>2026-01-01" limit=5 -> RECENT
|
|
595
595
|
$ llm prompt="Classify: ${INPUT}" timeout=30 -> VERDICT
|
|
596
596
|
$ llm prompt="Summarize: ${TEXT}" model="qwen" maxTokens=500 -> SUMMARY
|
|
597
597
|
$ data_read mode=fts query="${TOPIC}" limit=5 -> RESULTS (fallback: [])
|
|
@@ -601,7 +601,7 @@ $ ticketing.search query="project:INFRA state:Open" limit=20 -> ISSUES
|
|
|
601
601
|
|
|
602
602
|
Tool args are unconstrained `key=value` pairs — the connector forwards them to the underlying MCP tool. If a dispatched call returns `isError: true`, the executor throws via `makeOpError`, which routes through the target's `else:` handler. The inner tool's error text is preserved in `result.errors[]`.
|
|
603
603
|
|
|
604
|
-
**Substrate-neutrality.** Typed-contract bare ops (`$ llm`, `$ data_read`, `$ data_write`, `$ skill_*`, `$ json_parse`) are not reserved built-ins — they're typed-contract bridges the adopter wires through `substrate.local_model` / `substrate.data_store` / `substrate.skill_store` in `skillscript.config.json`. Substrate-specific tools (`$
|
|
604
|
+
**Substrate-neutrality.** Typed-contract bare ops (`$ llm`, `$ data_read`, `$ data_write`, `$ skill_*`, `$ json_parse`) are not reserved built-ins — they're typed-contract bridges the adopter wires through `substrate.local_model` / `substrate.data_store` / `substrate.skill_store` in `skillscript.config.json`. Substrate-specific tools (`$ github.*`, `$ linear.*`, etc.) are whatever the adopter declares in `connectors.json`. For external MCP servers, three bundled wiring paths cover the common cases:
|
|
605
605
|
|
|
606
606
|
- `HttpMcpConnector` — declarative wiring for any Streamable HTTP MCP server (JSON-RPC over HTTP + SSE). No subprocess. Adopters declare instances by class name in `connectors.json`.
|
|
607
607
|
- `RemoteMcpConnector` — stdio bridging for MCPs distributed as spawnable binaries (YouTrack, GitHub, Linear when run locally) or HTTP MCPs adapted via `npx mcp-remote ... --sse`.
|
|
@@ -2173,7 +2173,7 @@ For *data skills* (skills marked `# Type: data`), the compile-time inline primit
|
|
|
2173
2173
|
- Recursion is legal but bounded. If your design requires deeper recursion than the configured limit, reshape the workflow — almost always a sign of an iteration that should be expressed as `foreach` rather than recursion.
|
|
2174
2174
|
|
|
2175
2175
|
## Session isolation — a skill can't mutate the calling agent's session
|
|
2176
|
-
A skill executes in its OWN session; agent session state (context, persona) is session-local. Calling
|
|
2176
|
+
A skill executes in its OWN session; agent session state (context, persona) is session-local. Calling a session-context tool (or similar) inside a skill sets it for the SKILL's session, not the caller's — the caller sees no change. The contract: **skills assemble and RETURN data; the agent owns its SESSION STATE.** To "enter a project," a skill returns the instruction bodies and the AGENT applies its own session context.
|
|
2177
2177
|
|
|
2178
2178
|
## Static vs Dynamic — skill execution model
|
|
2179
2179
|
|
|
@@ -2565,5 +2565,5 @@ When any of these primitives ship, the relevant grammar moves into its canonical
|
|
|
2565
2565
|
|
|
2566
2566
|
---
|
|
2567
2567
|
|
|
2568
|
-
*Rendered from `skillscript/skillscript-language-reference` — 2026-07-10
|
|
2568
|
+
*Rendered from `skillscript/skillscript-language-reference` — 2026-07-10 14:34 EDT*
|
|
2569
2569
|
*Source of truth: AMP (`amp_render_document("skillscript/skillscript-language-reference")`)*
|
|
@@ -21,7 +21,7 @@ SkillStore (choose which connector)
|
|
|
21
21
|
└── Adopter-custom (you write your own)
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
If your substrate is
|
|
24
|
+
If your substrate is Pinecone, S3, Postgres, Redis, or anything else, write a `class FooSkillStore implements SkillStore { ... }` and call `registry.registerSkillStore("primary", new FooSkillStore(...))`. The runtime is none the wiser.
|
|
25
25
|
|
|
26
26
|
This SqliteSkillStore is one such impl — useful as a copy-paste starting point, or directly usable if your needs match.
|
|
27
27
|
|
|
@@ -160,10 +160,10 @@ The same holds for a fork: your `store()` neither stamps nor verifies — persis
|
|
|
160
160
|
|
|
161
161
|
When forking into your codebase:
|
|
162
162
|
|
|
163
|
-
1. Rename the class (e.g., `PostgresSkillStore`, `
|
|
163
|
+
1. Rename the class (e.g., `PostgresSkillStore`, `RedisSkillStore`)
|
|
164
164
|
2. Replace the SQL with your substrate's API (HTTP, DataStore, vector DB, etc.)
|
|
165
165
|
3. Update `staticCapabilities()` to match what your substrate actually supports — drop `supports_versioning` if you can't track history, drop `supports_tag_filter` if querying tags isn't tractable
|
|
166
|
-
4. Update `manifest()` to describe your substrate (`kind: "
|
|
166
|
+
4. Update `manifest()` to describe your substrate (`kind: "postgres"` or whatever)
|
|
167
167
|
5. **Optional but high-value for network-backed forks: implement `version()`** — a cheap store-wide change-token computed WITHOUT loading bodies (a list ETag, max-revision, or metadata digest), where any add/remove/edit/status-change moves it. It lets `skill_list` skip its N+1 catalog rebuild on unchanged polls (each entry otherwise costs a `load()` — one network round-trip per skill against a remote store). `SqliteSkillStore` hashes `(name, status, current_version)` in one body-free query. Skip it and `skill_list` just always rebuilds.
|
|
168
168
|
6. Tests: copy `tests/SqliteSkillStore.test.ts` as a starting point + run the conformance suite (`SkillStoreConformance.buildTests()` from `skillscript-runtime/testing`)
|
|
169
169
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skillscript-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"description": "Runtime, compiler, lint, CLI, and dashboard for Skillscript — a small declarative language for authoring agent workflows.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Scott Shwarts <scotts@pobox.com>",
|