typebulb 0.39.1 → 0.39.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 +13 -2
- package/dist/agents/pi/matchu-patchu.ts +1 -1
- package/dist/format/serialize.d.ts +9 -2
- package/dist/format/serialize.d.ts.map +1 -1
- package/dist/format/serialize.js +56 -23
- package/dist/format/serialize.js.map +1 -1
- package/dist/index.js +171 -167
- package/dist/render.js +29 -29
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -44,8 +44,8 @@ typebulb call <file> <fn> […] Invoke one server.ts export headlessly: prints
|
|
|
44
44
|
typebulb send <file> [msg] Push a message into a running bulb's page (its tb.onMessage handlers); the client-side twin of call, no --trust.
|
|
45
45
|
With --wait, a handler's non-undefined return prints on stdout (JSON; a bare string raw)
|
|
46
46
|
typebulb send <file> tb:snapshot Print the live page's rendered outline (roles, names, visible text)
|
|
47
|
-
typebulb get <file> <kind> Print one block's content (data, insight, code, …) to stdout
|
|
48
|
-
typebulb put <file> <k>=<src> Write a file's (or stdin's
|
|
47
|
+
typebulb get <file> <kind> Print one block's content (data, insight, code, …) to stdout
|
|
48
|
+
typebulb put <file> <k>=<src> Write a file's (or stdin's) content into a block, surgically
|
|
49
49
|
typebulb pull <url|file> Fetch a bulb from typebulb.com into typebulbs/u/<user>/<slug>.bulb.md
|
|
50
50
|
typebulb push <file> Upload a local bulb to typebulb.com as you (needs TYPEBULB_TOKEN in .env)
|
|
51
51
|
typebulb check [file.bulb.md] Type-check a bulb without running it
|
|
@@ -449,6 +449,17 @@ One bulb per command, between typebulb.com and its conventional local file — t
|
|
|
449
449
|
- **In the agent mirror**, the launcher lists your typebulb.com bulbs (pull-on-play) and local `u/<user>/` rows carry pull/push icons — same rules, same `--force` confirm. Pasting any bulb URL into its filter offers a pull-on-play row.
|
|
450
450
|
- `TYPEBULB_ORIGIN` in `.env` overrides the default `https://typebulb.com` host.
|
|
451
451
|
|
|
452
|
+
## Block I/O (get & put)
|
|
453
|
+
|
|
454
|
+
Your ordinary tools already read and edit a bulb: open the file, patch a block. These two are for
|
|
455
|
+
what those do badly — a block too large or opaque to carry in context or to describe a change to
|
|
456
|
+
(usually `data.txt`, which can run to hundreds of KB). `get` hands you that one block instead of
|
|
457
|
+
the whole file; `put` replaces it blind, knowing neither its size, its format, nor what is in it.
|
|
458
|
+
|
|
459
|
+
- **Get**: `typebulb get <file> <kind>` prints that block to stdout (`kind` is `code`, `css`, `html`, `data`, `infer`, `insight`, `config`, or `notes`), so `… | jq` works. No content — absent or empty — exits **2**, apart from real errors (exit 1), so a probe can tell "nothing there yet" from a bad path.
|
|
460
|
+
- **Put**: `typebulb put <file> <kind>=<source>` writes a file's content into that block; `<kind>=-` reads stdin. Several pairs in one command are one atomic write. It replaces the block, appends it when absent, writes nothing when the content is identical, and **removes** the block when the source is empty — the only way to clear one.
|
|
461
|
+
- Only the named block changes; every other block and the frontmatter survive byte-for-byte. A running bulb hot-reloads on a `put`.
|
|
462
|
+
|
|
452
463
|
## Charts
|
|
453
464
|
|
|
454
465
|
Mermaid's `xychart-beta` is static, unlabeled bars and lines — no tooltips, no legend, no other chart types. Anything more is a bulb. Start from this skeleton:
|
|
@@ -2280,7 +2280,7 @@ var Patcher = class {
|
|
|
2280
2280
|
|
|
2281
2281
|
// cli/agents/pi/server/piPatcherExtension.ts
|
|
2282
2282
|
var DESCRIPTION = true ? "Apply unified diffs to files \u2014 tolerant of form, strict about intent. Repairs sloppy AI-generated diffs (mangled headers, whitespace drift, missing prefixes; line numbers can be wrong or absent \u2014 hunks anchor by fuzzy-matched context lines) and applies all hunks atomically when the intent is unambiguous; fails with a precise, typed error when it isn't. Use for multi-hunk edits in one step, or when exact string-replacement editing fails on whitespace or invisible characters." : "Apply unified diffs to files.";
|
|
2283
|
-
var BUILD_TAG = true ? "matchu-patchu-pi 0.3.1, built 2026-07-
|
|
2283
|
+
var BUILD_TAG = true ? "matchu-patchu-pi 0.3.1, built 2026-07-25 03:11:48" : "matchu-patchu-pi dev";
|
|
2284
2284
|
var errorBlocks = (errors) => {
|
|
2285
2285
|
const parts = [`Patch failed with ${errors.length} error(s):`];
|
|
2286
2286
|
for (const e of errors) parts.push("", e.toString());
|
|
@@ -9,8 +9,15 @@ export declare function serializeBulb(source: BulbSource): string;
|
|
|
9
9
|
* Replace one block's fence content in existing `.bulb.md` text, surgically — everything else
|
|
10
10
|
* (frontmatter beyond format/name, inter-block prose, block order) is preserved verbatim, which a
|
|
11
11
|
* parse→serialize round trip would lose. Appends the block at the end when absent. The fence grows
|
|
12
|
-
* if the new content carries a longer backtick run; an unterminated block is left untouched
|
|
13
|
-
* same defect parseBulb only warns on — rewriting inside it would guess at its extent).
|
|
12
|
+
* if the new content carries a longer backtick run; an unterminated block is left untouched.
|
|
14
13
|
*/
|
|
15
14
|
export declare function replaceBulbBlock(content: string, kind: SubscriptKind, newContent: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Remove one block — header, fence, and content — from existing `.bulb.md` text, surgically: the
|
|
17
|
+
* deletion counterpart of `replaceBulbBlock`, preserving everything else verbatim. The blank run
|
|
18
|
+
* that separated the block from what follows goes with it, so removal leaves no gap. An absent or
|
|
19
|
+
* unterminated block returns the input unchanged (a caller tells the two apart by checking presence
|
|
20
|
+
* first, as `typebulb put` does).
|
|
21
|
+
*/
|
|
22
|
+
export declare function removeBulbBlock(content: string, kind: SubscriptKind): string;
|
|
16
23
|
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,KAAK,aAAa,EAAqC,MAAM,eAAe,CAAA;AAWrF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAA;AAUzF,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAaxD;
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,KAAK,aAAa,EAAqC,MAAM,eAAe,CAAA;AAWrF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAA;AAUzF,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAaxD;AA2BD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAejG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAQ5E"}
|
package/dist/format/serialize.js
CHANGED
|
@@ -30,36 +30,69 @@ export function serializeBulb(source) {
|
|
|
30
30
|
].join('\n');
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* same defect parseBulb only warns on — rewriting inside it would guess at its extent).
|
|
33
|
+
* Locate a block for surgical rewriting: `'unterminated'` when its fence never closes — the defect
|
|
34
|
+
* parseBulb only warns on, which neither writer may touch (rewriting inside it would guess at its
|
|
35
|
+
* extent, and appending past it would plant a block inside the open fence) — and `null` when the
|
|
36
|
+
* block is simply absent, which each writer answers its own way.
|
|
38
37
|
*/
|
|
39
|
-
|
|
40
|
-
const { path } = blocks[kind];
|
|
41
|
-
const lines = content.split('\n');
|
|
38
|
+
function locateBlock(lines, path) {
|
|
42
39
|
for (let i = 0; i < lines.length; i++) {
|
|
43
40
|
if (lines[i]?.trim() !== `**${path}**`)
|
|
44
41
|
continue;
|
|
45
|
-
let
|
|
46
|
-
while (
|
|
47
|
-
|
|
48
|
-
const m = lines[
|
|
42
|
+
let open = i + 1;
|
|
43
|
+
while (open < lines.length && lines[open]?.trim() === '')
|
|
44
|
+
open++;
|
|
45
|
+
const m = lines[open]?.match(FENCE_OPEN_RE);
|
|
49
46
|
if (!m)
|
|
50
47
|
continue;
|
|
51
48
|
const closeRe = fenceCloseRe(m[1]);
|
|
52
|
-
let
|
|
53
|
-
while (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return content;
|
|
59
|
-
const grown = getFence(newContent);
|
|
60
|
-
const fence = grown.length > m[1].length ? grown : m[1];
|
|
61
|
-
return [...lines.slice(0, j), fence + m[2], ...newContent.split('\n'), fence, ...lines.slice(k + 1)].join('\n');
|
|
49
|
+
let close = open + 1;
|
|
50
|
+
while (close < lines.length && !lines[close]?.match(closeRe))
|
|
51
|
+
close++;
|
|
52
|
+
if (close >= lines.length)
|
|
53
|
+
return 'unterminated';
|
|
54
|
+
return { header: i, open, close, fence: m[1], lang: m[2] };
|
|
62
55
|
}
|
|
63
|
-
return
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Replace one block's fence content in existing `.bulb.md` text, surgically — everything else
|
|
60
|
+
* (frontmatter beyond format/name, inter-block prose, block order) is preserved verbatim, which a
|
|
61
|
+
* parse→serialize round trip would lose. Appends the block at the end when absent. The fence grows
|
|
62
|
+
* if the new content carries a longer backtick run; an unterminated block is left untouched.
|
|
63
|
+
*/
|
|
64
|
+
export function replaceBulbBlock(content, kind, newContent) {
|
|
65
|
+
const lines = content.split('\n');
|
|
66
|
+
const span = locateBlock(lines, blocks[kind].path);
|
|
67
|
+
if (span === 'unterminated')
|
|
68
|
+
return content;
|
|
69
|
+
if (!span)
|
|
70
|
+
return `${content.replace(/\s*$/, '')}\n\n${blockSection(kind, newContent)}\n`;
|
|
71
|
+
const grown = getFence(newContent);
|
|
72
|
+
const fence = grown.length > span.fence.length ? grown : span.fence;
|
|
73
|
+
return [
|
|
74
|
+
...lines.slice(0, span.open),
|
|
75
|
+
fence + span.lang,
|
|
76
|
+
...newContent.split('\n'),
|
|
77
|
+
fence,
|
|
78
|
+
...lines.slice(span.close + 1),
|
|
79
|
+
].join('\n');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Remove one block — header, fence, and content — from existing `.bulb.md` text, surgically: the
|
|
83
|
+
* deletion counterpart of `replaceBulbBlock`, preserving everything else verbatim. The blank run
|
|
84
|
+
* that separated the block from what follows goes with it, so removal leaves no gap. An absent or
|
|
85
|
+
* unterminated block returns the input unchanged (a caller tells the two apart by checking presence
|
|
86
|
+
* first, as `typebulb put` does).
|
|
87
|
+
*/
|
|
88
|
+
export function removeBulbBlock(content, kind) {
|
|
89
|
+
const lines = content.split('\n');
|
|
90
|
+
const span = locateBlock(lines, blocks[kind].path);
|
|
91
|
+
if (!span || span === 'unterminated')
|
|
92
|
+
return content;
|
|
93
|
+
let end = span.close + 1;
|
|
94
|
+
while (end < lines.length && lines[end]?.trim() === '')
|
|
95
|
+
end++;
|
|
96
|
+
return [...lines.slice(0, span.header), ...lines.slice(end)].join('\n').replace(/\s*$/, '') + '\n';
|
|
64
97
|
}
|
|
65
98
|
//# sourceMappingURL=serialize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAsB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAE5C,2FAA2F;AAC3F,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAID,yFAAyF;AACzF,SAAS,YAAY,CAAC,IAAmB,EAAE,OAAe;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAA;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,OAAO,KAAK,KAAK,EAAE,CAAA;AAC/D,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,QAAQ,GAAG,YAAY;SAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,CAAA;IAEjD,OAAO;QACL,KAAK;QACL,WAAW,WAAW,EAAE;QACxB,SAAS,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACxC,KAAK;QACL,EAAE;QACF,GAAG,QAAQ;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"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"}
|