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 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; absent block exits 2, real errors 1
48
- typebulb put <file> <k>=<src> Write a file's (or stdin's: <kind>=-) content into a block, surgically — replace, or append if absent; several pairs are one atomic write; identical content writes nothing. No --trust
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-24 20:09:43" : "matchu-patchu-pi dev";
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 (the
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;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoBjG"}
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"}
@@ -30,36 +30,69 @@ export function serializeBulb(source) {
30
30
  ].join('\n');
31
31
  }
32
32
  /**
33
- * Replace one block's fence content in existing `.bulb.md` text, surgically — everything else
34
- * (frontmatter beyond format/name, inter-block prose, block order) is preserved verbatim, which a
35
- * parse→serialize round trip would lose. Appends the block at the end when absent. The fence grows
36
- * if the new content carries a longer backtick run; an unterminated block is left untouched (the
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
- export function replaceBulbBlock(content, kind, newContent) {
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 j = i + 1;
46
- while (j < lines.length && lines[j]?.trim() === '')
47
- j++;
48
- const m = lines[j]?.match(FENCE_OPEN_RE);
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 k = j + 1;
53
- while (k < lines.length && !lines[k]?.match(closeRe))
54
- k++;
55
- // Unterminated fence: refuse to touch the file at all — rewriting inside it would guess at its
56
- // extent, and falling through to append would plant a duplicate block inside the open fence.
57
- if (k >= lines.length)
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 `${content.replace(/\s*$/, '')}\n\n${blockSection(kind, newContent)}\n`;
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":"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"}
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"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"}