@bendyline/squisq 1.5.2 → 2.0.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/README.md +63 -10
- package/dist/{Doc-BBVGq1_9.d.ts → Doc-ylqWKDc_.d.ts} +248 -37
- package/dist/{ImageEditDoc-FuyGtt6o.d.ts → ImageEditDoc-D828IXJ1.d.ts} +1 -1
- package/dist/annotationCoercion-Dr_DY9Hx.d.ts +86 -0
- package/dist/{chunk-VWUFZ6ZG.js → chunk-3E5F2XMR.js} +2 -29
- package/dist/chunk-3E5F2XMR.js.map +1 -0
- package/dist/chunk-4X3JQXNM.js +35 -0
- package/dist/chunk-4X3JQXNM.js.map +1 -0
- package/dist/{chunk-P3K7NLHF.js → chunk-5DKBFXPY.js} +31 -121
- package/dist/chunk-5DKBFXPY.js.map +1 -0
- package/dist/{chunk-DLXZMS5K.js → chunk-5J4HKRJF.js} +51 -3
- package/dist/chunk-5J4HKRJF.js.map +1 -0
- package/dist/chunk-5UYI3RJB.js +2503 -0
- package/dist/chunk-5UYI3RJB.js.map +1 -0
- package/dist/{chunk-BEQODJWV.js → chunk-66QO7XFB.js} +11 -291
- package/dist/chunk-66QO7XFB.js.map +1 -0
- package/dist/{chunk-KKNUBQ6Y.js → chunk-6PJRB2CF.js} +156 -91
- package/dist/chunk-6PJRB2CF.js.map +1 -0
- package/dist/{chunk-HWVFJAAH.js → chunk-AMIR72JP.js} +28 -10
- package/dist/chunk-AMIR72JP.js.map +1 -0
- package/dist/chunk-FVJUUTEM.js +74 -0
- package/dist/chunk-FVJUUTEM.js.map +1 -0
- package/dist/{chunk-5TYS5V3G.js → chunk-GF3BVNLU.js} +4127 -3538
- package/dist/chunk-GF3BVNLU.js.map +1 -0
- package/dist/{chunk-Q3ROPT5H.js → chunk-GZY66SDN.js} +1 -1
- package/dist/{chunk-Q3ROPT5H.js.map → chunk-GZY66SDN.js.map} +1 -1
- package/dist/chunk-JOQYPRDZ.js +127 -0
- package/dist/chunk-JOQYPRDZ.js.map +1 -0
- package/dist/{chunk-A4O7GIWE.js → chunk-LYNJEOAC.js} +10 -73
- package/dist/chunk-LYNJEOAC.js.map +1 -0
- package/dist/{chunk-LDQ2HJIX.js → chunk-PXLVXTLW.js} +252 -54
- package/dist/chunk-PXLVXTLW.js.map +1 -0
- package/dist/{chunk-TQWLI6S2.js → chunk-Q7LROV2H.js} +4 -2
- package/dist/{chunk-TQWLI6S2.js.map → chunk-Q7LROV2H.js.map} +1 -1
- package/dist/{chunk-T5UK6YOB.js → chunk-QTSJOY54.js} +60 -17
- package/dist/chunk-QTSJOY54.js.map +1 -0
- package/dist/chunk-QVANWDPH.js +2358 -0
- package/dist/chunk-QVANWDPH.js.map +1 -0
- package/dist/{chunk-GPLTCSXO.js → chunk-R2GC6RLD.js} +7 -7
- package/dist/chunk-R2GC6RLD.js.map +1 -0
- package/dist/chunk-R2YZTCLO.js +292 -0
- package/dist/chunk-R2YZTCLO.js.map +1 -0
- package/dist/chunk-S7A5D7ZJ.js +174 -0
- package/dist/chunk-S7A5D7ZJ.js.map +1 -0
- package/dist/chunk-T3TI7GSZ.js +884 -0
- package/dist/chunk-T3TI7GSZ.js.map +1 -0
- package/dist/{chunk-LTN6I7QW.js → chunk-TUWMK62B.js} +55 -4
- package/dist/chunk-TUWMK62B.js.map +1 -0
- package/dist/{chunk-IMSCRLLV.js → chunk-VR7UPJ7C.js} +35 -25
- package/dist/chunk-VR7UPJ7C.js.map +1 -0
- package/dist/doc/index.d.ts +2334 -5
- package/dist/doc/index.js +127 -33
- package/dist/generate/index.d.ts +7 -2
- package/dist/generate/index.js +1 -1
- package/dist/imageEdit/index.d.ts +9 -6
- package/dist/imageEdit/index.js +3 -3
- package/dist/index.d.ts +12 -10
- package/dist/index.js +246 -80
- package/dist/jsonForm/index.d.ts +7 -3
- package/dist/jsonForm/index.js +9 -4
- package/dist/markdown/index.d.ts +6 -70
- package/dist/markdown/index.js +13 -9
- package/dist/narration/index.d.ts +618 -0
- package/dist/narration/index.js +82 -0
- package/dist/recommend/index.d.ts +15 -1
- package/dist/recommend/index.js +2 -2
- package/dist/schemas/index.d.ts +28 -6
- package/dist/schemas/index.js +15 -13
- package/dist/spatial/index.d.ts +0 -1
- package/dist/spatial/index.js +1 -1
- package/dist/storage/index.js +1 -1
- package/dist/{themeLibrary-CehcJhzz.d.ts → themeLibrary-RjVgLpUi.d.ts} +10 -11
- package/dist/timing/index.js +5 -3
- package/dist/transform/index.d.ts +35 -24
- package/dist/transform/index.js +9 -10
- package/dist/{types-DlAZ7MW4.d.ts → types-BwMPl2CB.d.ts} +1 -1
- package/dist/{types-D98li1gV.d.ts → types-C4kiRn_k.d.ts} +3 -1
- package/dist/versions/index.d.ts +2 -1
- package/dist/versions/index.js +2 -2
- package/package.json +6 -6
- package/src/__tests__/applyNarrationTiming.test.ts +190 -0
- package/src/__tests__/applyRenderStyle.test.ts +3 -3
- package/src/__tests__/asciiDiagramBattle.test.ts +246 -0
- package/src/__tests__/asciiDiagramDetect.test.ts +162 -0
- package/src/__tests__/asciiDiagramMapping.test.ts +38 -0
- package/src/__tests__/asciiDiagramParse.test.ts +233 -0
- package/src/__tests__/asciiDiagramPipeline.test.ts +273 -0
- package/src/__tests__/asciiDiagramRender.test.ts +162 -0
- package/src/__tests__/asciiDiagramRepair.test.ts +84 -0
- package/src/__tests__/asciiTimelineDetect.test.ts +157 -0
- package/src/__tests__/asciiTimelineParse.test.ts +205 -0
- package/src/__tests__/asciiTimelinePipeline.test.ts +349 -0
- package/src/__tests__/asciiTimelineRender.test.ts +376 -0
- package/src/__tests__/attrTokens.test.ts +5 -0
- package/src/__tests__/contentContainer.test.ts +43 -0
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -15
- package/src/__tests__/dataTable.test.ts +25 -15
- package/src/__tests__/diagramBlock.test.ts +3 -3
- package/src/__tests__/diagramText.test.ts +26 -0
- package/src/__tests__/docToMarkdownMedia.test.ts +83 -0
- package/src/__tests__/drawingBlock.test.ts +3 -3
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +512 -0
- package/src/__tests__/fixtures/asciiDiagrams.ts +287 -0
- package/src/__tests__/fixtures/asciiTimelines.ts +35 -0
- package/src/__tests__/fixtures/treeviewFixtures.ts +243 -0
- package/src/__tests__/getLayers.test.ts +32 -18
- package/src/__tests__/getLayersFallback.test.ts +8 -8
- package/src/__tests__/imageEditVersions.test.ts +2 -0
- package/src/__tests__/jsonForm.pointer.test.ts +47 -1
- package/src/__tests__/layoutBlock.test.ts +3 -3
- package/src/__tests__/majorApiTypes.test.ts +18 -0
- package/src/__tests__/markdown.test.ts +41 -0
- package/src/__tests__/matchFontFamily.test.ts +114 -0
- package/src/__tests__/materializeBlockLayers.test.ts +135 -0
- package/src/__tests__/materializeTestUtils.ts +17 -0
- package/src/__tests__/narrationAlign.test.ts +150 -0
- package/src/__tests__/narrationFeatures.test.ts +71 -0
- package/src/__tests__/narrationNuclei.test.ts +45 -0
- package/src/__tests__/narrationPacing.test.ts +189 -0
- package/src/__tests__/narrationScript.test.ts +149 -0
- package/src/__tests__/narrationSessionRepro.test.ts +62 -0
- package/src/__tests__/narrationSidecar.test.ts +88 -0
- package/src/__tests__/narrationSyllables.test.ts +65 -0
- package/src/__tests__/narrationTestSignals.ts +167 -0
- package/src/__tests__/narrationVad.test.ts +66 -0
- package/src/__tests__/resolveDocTheme.test.ts +16 -2
- package/src/__tests__/rootExports.test.ts +18 -0
- package/src/__tests__/scopedContentContainer.test.ts +20 -0
- package/src/__tests__/shapeGeometry.test.ts +12 -0
- package/src/__tests__/templateAnnotationParse.test.ts +10 -0
- package/src/__tests__/templateInputs.test.ts +69 -0
- package/src/__tests__/templateMetadata.test.ts +2 -1
- package/src/__tests__/templates.test.ts +143 -17
- package/src/__tests__/themeCompile.test.ts +49 -22
- package/src/__tests__/transformProvenance.test.ts +160 -0
- package/src/__tests__/transformV2.test.ts +40 -14
- package/src/__tests__/treeviewBattle.test.ts +76 -0
- package/src/__tests__/treeviewDetect.test.ts +168 -0
- package/src/__tests__/treeviewParse.test.ts +118 -0
- package/src/__tests__/treeviewPipeline.test.ts +183 -0
- package/src/__tests__/treeviewRender.test.ts +91 -0
- package/src/__tests__/versions.test.ts +44 -0
- package/src/doc/applyNarrationTiming.ts +244 -0
- package/src/doc/asciiDiagram/chars.ts +210 -0
- package/src/doc/asciiDiagram/detect.ts +175 -0
- package/src/doc/asciiDiagram/index.ts +38 -0
- package/src/doc/asciiDiagram/mapping.ts +225 -0
- package/src/doc/asciiDiagram/parse.ts +1095 -0
- package/src/doc/asciiDiagram/render.ts +963 -0
- package/src/doc/asciiDiagram/repair.ts +400 -0
- package/src/doc/asciiDiagram/types.ts +65 -0
- package/src/doc/asciiTimeline/detect.ts +138 -0
- package/src/doc/asciiTimeline/index.ts +26 -0
- package/src/doc/asciiTimeline/mapping.ts +43 -0
- package/src/doc/asciiTimeline/parse.ts +870 -0
- package/src/doc/asciiTimeline/render.ts +427 -0
- package/src/doc/asciiTimeline/types.ts +73 -0
- package/src/doc/asciiTimeline/wrappedFlow.ts +427 -0
- package/src/doc/audioMapping.ts +60 -46
- package/src/doc/customTemplatesFrontmatter.ts +0 -41
- package/src/doc/docToMarkdown.ts +70 -2
- package/src/doc/index.ts +76 -4
- package/src/doc/markdownToDoc.ts +135 -1
- package/src/doc/materializeBlockLayers.ts +304 -0
- package/src/doc/mediaAnnotations.ts +20 -0
- package/src/doc/resolveDocTheme.ts +8 -7
- package/src/doc/templateInputs.ts +185 -2
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +22 -8
- package/src/doc/templates/diagramBlock.ts +237 -38
- package/src/doc/templates/fallbackBlock.ts +1 -1
- package/src/doc/templates/index.ts +134 -279
- package/src/doc/templates/inputDescriptors.ts +20 -1
- package/src/doc/templates/metadata.ts +10 -0
- package/src/doc/templates/persistentLayers.ts +12 -126
- package/src/doc/templates/registry.ts +88 -0
- package/src/doc/templates/templateNames.ts +22 -0
- package/src/doc/templates/timelineBlock.ts +613 -0
- package/src/doc/templates/treeBlock.ts +131 -0
- package/src/doc/treeview/chars.ts +72 -0
- package/src/doc/treeview/detect.ts +145 -0
- package/src/doc/treeview/index.ts +30 -0
- package/src/doc/treeview/mapping.ts +95 -0
- package/src/doc/treeview/parse.ts +201 -0
- package/src/doc/treeview/render.ts +41 -0
- package/src/doc/treeview/types.ts +43 -0
- package/src/doc/utils/applyRenderStyle.ts +2 -9
- package/src/doc/utils/diagramText.ts +78 -0
- package/src/doc/utils/shapeGeometry.ts +67 -5
- package/src/doc/validate.ts +1 -1
- package/src/generate/templateMapper.ts +7 -0
- package/src/imageEdit/export.ts +6 -5
- package/src/imageEdit/versionPaths.ts +13 -26
- package/src/imageEdit/versions.ts +21 -100
- package/src/index.ts +1 -0
- package/src/internal/immutable.ts +58 -0
- package/src/jsonForm/index.ts +9 -1
- package/src/jsonForm/pointer.ts +68 -23
- package/src/markdown/attrTokens.ts +7 -5
- package/src/markdown/index.ts +1 -0
- package/src/markdown/stringify.ts +4 -9
- package/src/markdown/utils.ts +36 -14
- package/src/narration/align.ts +514 -0
- package/src/narration/features.ts +231 -0
- package/src/narration/index.ts +86 -0
- package/src/narration/nuclei.ts +118 -0
- package/src/narration/pacing.ts +211 -0
- package/src/narration/script.ts +239 -0
- package/src/narration/session.ts +100 -0
- package/src/narration/sidecar.ts +187 -0
- package/src/narration/syllables.ts +85 -0
- package/src/narration/trace.ts +50 -0
- package/src/narration/types.ts +299 -0
- package/src/narration/vad.ts +131 -0
- package/src/recommend/numberHighlight.ts +25 -0
- package/src/recommend/templates.ts +108 -12
- package/src/schemas/BlockTemplates.ts +156 -7
- package/src/schemas/Doc.ts +72 -9
- package/src/schemas/Media.ts +12 -2
- package/src/schemas/Theme.ts +45 -25
- package/src/schemas/Viewport.ts +2 -2
- package/src/schemas/fontStacks.ts +79 -0
- package/src/schemas/themeCompile.ts +15 -0
- package/src/schemas/themeConstants.ts +2 -0
- package/src/schemas/themeLibrary.ts +25 -19
- package/src/schemas/themeValidator.ts +1 -1
- package/src/spatial/Geohash.ts +0 -3
- package/src/storage/ContentContainer.ts +17 -9
- package/src/storage/ScopedContentContainer.ts +45 -15
- package/src/transform/applyTransform.ts +5 -5
- package/src/transform/index.ts +3 -1
- package/src/transform/registry.ts +169 -49
- package/src/transform/templateSelector.ts +21 -2
- package/src/transform/timingAllocator.ts +152 -21
- package/src/transform/types.ts +14 -1
- package/src/versions/gitignore.ts +34 -0
- package/src/versions/index.ts +2 -0
- package/src/versions/operations.ts +18 -104
- package/src/versions/paths.ts +13 -28
- package/src/versions/snapshotStore.ts +202 -0
- package/src/versions/types.ts +3 -1
- package/dist/chunk-5TYS5V3G.js.map +0 -1
- package/dist/chunk-A4O7GIWE.js.map +0 -1
- package/dist/chunk-BEQODJWV.js.map +0 -1
- package/dist/chunk-DLXZMS5K.js.map +0 -1
- package/dist/chunk-GPLTCSXO.js.map +0 -1
- package/dist/chunk-HWVFJAAH.js.map +0 -1
- package/dist/chunk-IMSCRLLV.js.map +0 -1
- package/dist/chunk-JELIRVDP.js +0 -24
- package/dist/chunk-JELIRVDP.js.map +0 -1
- package/dist/chunk-KKNUBQ6Y.js.map +0 -1
- package/dist/chunk-LDQ2HJIX.js.map +0 -1
- package/dist/chunk-LTN6I7QW.js.map +0 -1
- package/dist/chunk-P3K7NLHF.js.map +0 -1
- package/dist/chunk-T5UK6YOB.js.map +0 -1
- package/dist/chunk-UY7KGQ5R.js +0 -192
- package/dist/chunk-UY7KGQ5R.js.map +0 -1
- package/dist/chunk-VLJJHDAC.js +0 -218
- package/dist/chunk-VLJJHDAC.js.map +0 -1
- package/dist/chunk-VWUFZ6ZG.js.map +0 -1
- package/dist/story/index.d.ts +0 -1801
- package/dist/story/index.js +0 -279
- package/src/doc/getLayers.ts +0 -195
- /package/dist/{story → narration}/index.js.map +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared ASCII-diagram fixtures for the codec test suites (parse, render
|
|
3
|
+
* fixpoint, detection corpus, pipeline). Positive fixtures are the parse
|
|
4
|
+
* contract; the negative corpus is the detection contract.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const TWO_BOX_VERTICAL = [
|
|
8
|
+
'┌────────┐',
|
|
9
|
+
'│ Alpha │',
|
|
10
|
+
'└───┬────┘',
|
|
11
|
+
' │',
|
|
12
|
+
' ▼',
|
|
13
|
+
'┌────────┐',
|
|
14
|
+
'│ Beta │',
|
|
15
|
+
'└────────┘',
|
|
16
|
+
].join('\n');
|
|
17
|
+
|
|
18
|
+
export const TWO_BOX_VERTICAL_ASCII = [
|
|
19
|
+
'+--------+',
|
|
20
|
+
'| Alpha |',
|
|
21
|
+
'+---+----+',
|
|
22
|
+
' |',
|
|
23
|
+
' v',
|
|
24
|
+
'+--------+',
|
|
25
|
+
'| Beta |',
|
|
26
|
+
'+--------+',
|
|
27
|
+
].join('\n');
|
|
28
|
+
|
|
29
|
+
export const TWO_BOX_HORIZONTAL_ASCII = [
|
|
30
|
+
'+--------+ +--------+',
|
|
31
|
+
'| Input | --> | Output |',
|
|
32
|
+
'+--------+ +--------+',
|
|
33
|
+
].join('\n');
|
|
34
|
+
|
|
35
|
+
export const TWO_BOX_HORIZONTAL_UNICODE = [
|
|
36
|
+
'┌────────┐ ┌────────┐',
|
|
37
|
+
'│ Input │────►│ Output │',
|
|
38
|
+
'└────────┘ └────────┘',
|
|
39
|
+
].join('\n');
|
|
40
|
+
|
|
41
|
+
export const UNDIRECTED = [
|
|
42
|
+
'┌────────┐ ┌────────┐',
|
|
43
|
+
'│ Left │─────│ Right │',
|
|
44
|
+
'└────────┘ └────────┘',
|
|
45
|
+
].join('\n');
|
|
46
|
+
|
|
47
|
+
export const BIDIRECTIONAL = [
|
|
48
|
+
'┌───────┐ ┌───────┐',
|
|
49
|
+
'│ Peer │◄───────►│ Peer │',
|
|
50
|
+
'└───────┘ └───────┘',
|
|
51
|
+
].join('\n');
|
|
52
|
+
|
|
53
|
+
export const FAN_OUT_COLUMNS = [
|
|
54
|
+
'┌──────────────────────┐',
|
|
55
|
+
'│ Source │',
|
|
56
|
+
'└──────┬───────┬───────┘',
|
|
57
|
+
' │ │',
|
|
58
|
+
' ▼ ▼',
|
|
59
|
+
' ┌─────┐ ┌─────┐',
|
|
60
|
+
' │ One │ │ Two │',
|
|
61
|
+
' └─────┘ └─────┘',
|
|
62
|
+
].join('\n');
|
|
63
|
+
|
|
64
|
+
export const FAN_OUT_BUS = [
|
|
65
|
+
'┌──────────────────────┐',
|
|
66
|
+
'│ Source │',
|
|
67
|
+
'└──────────┬───────────┘',
|
|
68
|
+
' ┌─────┴─────┐',
|
|
69
|
+
' ▼ ▼',
|
|
70
|
+
' ┌─────┐ ┌─────┐',
|
|
71
|
+
' │ One │ │ Two │',
|
|
72
|
+
' └─────┘ └─────┘',
|
|
73
|
+
].join('\n');
|
|
74
|
+
|
|
75
|
+
export const PARALLEL_DUPES = [
|
|
76
|
+
'┌────────────────┐',
|
|
77
|
+
'│ Wide A │',
|
|
78
|
+
'└──┬──────────┬──┘',
|
|
79
|
+
' │ │',
|
|
80
|
+
' ▼ ▼',
|
|
81
|
+
'┌────────────────┐',
|
|
82
|
+
'│ Wide B │',
|
|
83
|
+
'└────────────────┘',
|
|
84
|
+
].join('\n');
|
|
85
|
+
|
|
86
|
+
/** The canonical AI-style nested diagram: container + 2×3 children + column edges. */
|
|
87
|
+
export const NESTED_CONTAINER = [
|
|
88
|
+
'┌────────────────────────────────────────────────┐',
|
|
89
|
+
'│ Data Pipeline │',
|
|
90
|
+
'│ │',
|
|
91
|
+
'│ ┌────────┐ ┌─────────┐ ┌────────┐ │',
|
|
92
|
+
'│ │ Ingest │ │ Enrich │ │ Export │ │',
|
|
93
|
+
'│ └───┬────┘ └────┬────┘ └───┬────┘ │',
|
|
94
|
+
'│ │ │ │ │',
|
|
95
|
+
'│ ▼ ▼ ▼ │',
|
|
96
|
+
'│ ┌────────┐ ┌─────────┐ ┌────────┐ │',
|
|
97
|
+
'│ │ Raw │ │ Silver │ │ Gold │ │',
|
|
98
|
+
'│ └────────┘ └─────────┘ └────────┘ │',
|
|
99
|
+
'└────────────────────────────────────────────────┘',
|
|
100
|
+
].join('\n');
|
|
101
|
+
|
|
102
|
+
export const CONTAINER_EMBEDDED_TITLE = [
|
|
103
|
+
'┌─── Cluster ────┐',
|
|
104
|
+
'│ ┌──────────┐ │',
|
|
105
|
+
'│ │ Worker │ │',
|
|
106
|
+
'│ └──────────┘ │',
|
|
107
|
+
'└────────────────┘',
|
|
108
|
+
].join('\n');
|
|
109
|
+
|
|
110
|
+
export const MULTILINE_LABELS = [
|
|
111
|
+
'┌──────────────┐ ┌──────────────┐',
|
|
112
|
+
'│ molen-kernel │ │ molen-client │',
|
|
113
|
+
'│ headless sim │ │ three.js │',
|
|
114
|
+
'│ no DOM │ │ cameras │',
|
|
115
|
+
'└──────┬───────┘ └──────────────┘',
|
|
116
|
+
' │',
|
|
117
|
+
' ▼',
|
|
118
|
+
'┌──────────────┐',
|
|
119
|
+
'│ Worker │',
|
|
120
|
+
'└──────────────┘',
|
|
121
|
+
].join('\n');
|
|
122
|
+
|
|
123
|
+
/** `├──┤` interior dividers are indistinguishable from stacked shared-border boxes → two nodes. */
|
|
124
|
+
export const SECTIONED_CARD = [
|
|
125
|
+
'┌──────────┐',
|
|
126
|
+
'│ Header │',
|
|
127
|
+
'├──────────┤',
|
|
128
|
+
'│ Body │',
|
|
129
|
+
'└──────────┘',
|
|
130
|
+
].join('\n');
|
|
131
|
+
|
|
132
|
+
export const STACKED_SHARED_BORDER_ASCII = [
|
|
133
|
+
'+-------+',
|
|
134
|
+
'| Upper |',
|
|
135
|
+
'+-------+',
|
|
136
|
+
'| Lower |',
|
|
137
|
+
'+-------+',
|
|
138
|
+
].join('\n');
|
|
139
|
+
|
|
140
|
+
export const EDGE_LABEL = [
|
|
141
|
+
'┌────────┐ ┌────────┐',
|
|
142
|
+
'│ Client │──auth──────►│ Server │',
|
|
143
|
+
'└────────┘ └────────┘',
|
|
144
|
+
].join('\n');
|
|
145
|
+
|
|
146
|
+
export const EDGE_LABEL_SPACED = [
|
|
147
|
+
'┌────────┐ ┌────────┐',
|
|
148
|
+
'│ Client │── auth flow ─►│ Server │',
|
|
149
|
+
'└────────┘ └────────┘',
|
|
150
|
+
].join('\n');
|
|
151
|
+
|
|
152
|
+
export const DUPLICATE_LABELS = [
|
|
153
|
+
'┌───────┐ ┌───────┐',
|
|
154
|
+
'│ Cache │ │ Cache │',
|
|
155
|
+
'└───────┘ └───────┘',
|
|
156
|
+
].join('\n');
|
|
157
|
+
|
|
158
|
+
export const ROUNDED_AND_DOUBLE = [
|
|
159
|
+
'╭────────╮ ╔════════╗',
|
|
160
|
+
'│ Round │ ║ Double ║',
|
|
161
|
+
'╰────────╯ ╚════════╝',
|
|
162
|
+
].join('\n');
|
|
163
|
+
|
|
164
|
+
export const SINGLE_BOX = ['┌────────┐', '│ Alone │', '└────────┘'].join('\n');
|
|
165
|
+
|
|
166
|
+
/** Every positive fixture the fixpoint suite must survive. */
|
|
167
|
+
export const POSITIVE_FIXTURES: Record<string, string> = {
|
|
168
|
+
TWO_BOX_VERTICAL,
|
|
169
|
+
TWO_BOX_VERTICAL_ASCII,
|
|
170
|
+
TWO_BOX_HORIZONTAL_ASCII,
|
|
171
|
+
TWO_BOX_HORIZONTAL_UNICODE,
|
|
172
|
+
UNDIRECTED,
|
|
173
|
+
BIDIRECTIONAL,
|
|
174
|
+
FAN_OUT_COLUMNS,
|
|
175
|
+
FAN_OUT_BUS,
|
|
176
|
+
PARALLEL_DUPES,
|
|
177
|
+
NESTED_CONTAINER,
|
|
178
|
+
CONTAINER_EMBEDDED_TITLE,
|
|
179
|
+
MULTILINE_LABELS,
|
|
180
|
+
SECTIONED_CARD,
|
|
181
|
+
STACKED_SHARED_BORDER_ASCII,
|
|
182
|
+
EDGE_LABEL,
|
|
183
|
+
EDGE_LABEL_SPACED,
|
|
184
|
+
DUPLICATE_LABELS,
|
|
185
|
+
ROUNDED_AND_DOUBLE,
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
// Negative corpus — all of these must be REJECTED by detectAsciiDiagram.
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
|
|
192
|
+
export const NEG_MARKDOWN_TABLE = [
|
|
193
|
+
'| Name | Role |',
|
|
194
|
+
'|-------|----------|',
|
|
195
|
+
'| Ada | Engineer |',
|
|
196
|
+
'| Grace | Admiral |',
|
|
197
|
+
].join('\n');
|
|
198
|
+
|
|
199
|
+
export const NEG_PSQL_TABLE = [
|
|
200
|
+
'+----+-------+',
|
|
201
|
+
'| id | name |',
|
|
202
|
+
'+----+-------+',
|
|
203
|
+
'| 1 | Alice |',
|
|
204
|
+
'+----+-------+',
|
|
205
|
+
'| 2 | Bob |',
|
|
206
|
+
'+----+-------+',
|
|
207
|
+
].join('\n');
|
|
208
|
+
|
|
209
|
+
export const NEG_MYSQL_TABLE = [
|
|
210
|
+
'+----------+----------+---------+',
|
|
211
|
+
'| Database | Table | Rows |',
|
|
212
|
+
'+----------+----------+---------+',
|
|
213
|
+
'| app | users | 1042 |',
|
|
214
|
+
'| app | sessions | 98213 |',
|
|
215
|
+
'+----------+----------+---------+',
|
|
216
|
+
].join('\n');
|
|
217
|
+
|
|
218
|
+
export const NEG_SHELL_PIPES = [
|
|
219
|
+
'cat access.log | grep 500 | awk "{print $7}" | sort | uniq -c',
|
|
220
|
+
'ps aux | head -20',
|
|
221
|
+
'docker ps -a | wc -l',
|
|
222
|
+
].join('\n');
|
|
223
|
+
|
|
224
|
+
export const NEG_TS_UNION = [
|
|
225
|
+
'type Result<T> =',
|
|
226
|
+
' | { ok: true; value: T }',
|
|
227
|
+
' | { ok: false; error: Error };',
|
|
228
|
+
'const x: A | B | C = pick();',
|
|
229
|
+
].join('\n');
|
|
230
|
+
|
|
231
|
+
export const NEG_SQL_DDL = [
|
|
232
|
+
'CREATE TABLE users (',
|
|
233
|
+
' id INTEGER PRIMARY KEY,',
|
|
234
|
+
' name TEXT NOT NULL,',
|
|
235
|
+
' created_at TIMESTAMP',
|
|
236
|
+
');',
|
|
237
|
+
].join('\n');
|
|
238
|
+
|
|
239
|
+
export const NEG_FILE_TREE = [
|
|
240
|
+
'src/',
|
|
241
|
+
'├── components/',
|
|
242
|
+
'│ ├── App.tsx',
|
|
243
|
+
'│ └── Button.tsx',
|
|
244
|
+
'└── utils/',
|
|
245
|
+
' └── math.ts',
|
|
246
|
+
].join('\n');
|
|
247
|
+
|
|
248
|
+
export const NEG_YAML = [
|
|
249
|
+
'services:',
|
|
250
|
+
' web:',
|
|
251
|
+
' image: nginx',
|
|
252
|
+
' ports:',
|
|
253
|
+
' - "80:80"',
|
|
254
|
+
].join('\n');
|
|
255
|
+
|
|
256
|
+
export const NEG_LOG_COLUMNS = [
|
|
257
|
+
'2026-01-01 │ INFO │ started',
|
|
258
|
+
'2026-01-02 │ WARN │ disk low',
|
|
259
|
+
'2026-01-03 │ ERROR │ crashed',
|
|
260
|
+
].join('\n');
|
|
261
|
+
|
|
262
|
+
export const NEG_PROSE_HEAVY = [
|
|
263
|
+
'This paragraph explains the architecture in detail before showing it.',
|
|
264
|
+
'There is a great deal of text here that is not part of any box at all,',
|
|
265
|
+
'and the actual diagram below is a small part of the overall content.',
|
|
266
|
+
'More prose lines continue to pad this out considerably, adding noise',
|
|
267
|
+
'that should push the loose-content ratio well past the threshold.',
|
|
268
|
+
'┌───┐ ┌───┐',
|
|
269
|
+
'│ A │ │ B │',
|
|
270
|
+
'└───┘ └───┘',
|
|
271
|
+
'And afterwards even more explanation text follows the tiny diagram,',
|
|
272
|
+
'ensuring that the fence is mostly prose rather than mostly diagram.',
|
|
273
|
+
].join('\n');
|
|
274
|
+
|
|
275
|
+
export const NEGATIVE_FIXTURES: Record<string, string> = {
|
|
276
|
+
NEG_MARKDOWN_TABLE,
|
|
277
|
+
NEG_PSQL_TABLE,
|
|
278
|
+
NEG_MYSQL_TABLE,
|
|
279
|
+
NEG_SHELL_PIPES,
|
|
280
|
+
NEG_TS_UNION,
|
|
281
|
+
NEG_SQL_DDL,
|
|
282
|
+
NEG_FILE_TREE,
|
|
283
|
+
NEG_YAML,
|
|
284
|
+
NEG_LOG_COLUMNS,
|
|
285
|
+
NEG_PROSE_HEAVY,
|
|
286
|
+
SINGLE_BOX,
|
|
287
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** The motivating timeline from the feature request, byte-for-byte inside its fence. */
|
|
2
|
+
export const TICK_INTERPOLATION_TIMELINE = ` kernel ticks (30 Hz): T28 T29 T30 T31
|
|
3
|
+
─────────────────────●──────────●──────────●──────────●──────────► sim time
|
|
4
|
+
deltas sent: └─Δ28──────└─Δ29──────└─Δ30──────└─Δ31
|
|
5
|
+
|
|
6
|
+
client frames (e.g. 120 Hz): f f f f f f f f f f f f f f f f
|
|
7
|
+
estimated kernel clock: ▲ estTick ≈ 30.4
|
|
8
|
+
render position: ▲ renderTick = estTick − 1.5 ≈ 28.9
|
|
9
|
+
└─ interpolate between snapshot T28 and T29 at t=0.9`;
|
|
10
|
+
|
|
11
|
+
/** Two independently labelled tracks plus an explicit cross-track branch. */
|
|
12
|
+
export const MULTI_TRACK_BRANCH_TIMELINE = [
|
|
13
|
+
'Kernel: ● T28 :: snapshot {#t28} ──────────● T29 :: snapshot {#t29} ──────────►',
|
|
14
|
+
'Client: ● F28 :: snapshot {#f28} ──────────● F29 :: snapshot {#f29} ──────────►',
|
|
15
|
+
'branch: t29 -> f29 : interpolation path',
|
|
16
|
+
].join('\n');
|
|
17
|
+
|
|
18
|
+
/** Sparse ASCII form: only an explicit `timeline` fence should claim it. */
|
|
19
|
+
export const SINGLE_POINT_ASCII_TIMELINE = 'Release: *---- Alpha {#alpha} ---->';
|
|
20
|
+
|
|
21
|
+
/** Multi-lane AI-authored flow with a right-edge error return. */
|
|
22
|
+
export const WRAPPED_CLIENT_KERNEL_TIMELINE = ` CLIENT (main thread) KERNEL (Web Worker / Node)
|
|
23
|
+
──────────────────── ──────────────────────────
|
|
24
|
+
input events ──► InputMap ──► command ───────► validate (schema)
|
|
25
|
+
├─ invalid → command-rejected event ─┐
|
|
26
|
+
└─ valid → queue at tick T │
|
|
27
|
+
│
|
|
28
|
+
tick T: phases │
|
|
29
|
+
commands → update → physics → late │
|
|
30
|
+
│
|
|
31
|
+
interpolation buffer ◄── delta {tick T} ◄────── dirty-tracked per-tick delta │
|
|
32
|
+
(render ~1.5 ticks │
|
|
33
|
+
behind, lerp/slerp) ◄── keyframe ◄─────────── every 60 ticks + on demand │
|
|
34
|
+
│
|
|
35
|
+
error surfaced to user/agent ◄───────────────────────────────────────────────────────┘`;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Battle-test corpus for the ASCII treeview codec: a broad set of AI-style
|
|
3
|
+
* trees (project scaffolds, monorepos, dependency trees, category/decision
|
|
4
|
+
* outlines, forests) with their intended flat semantics. Every fixture is
|
|
5
|
+
* verified to detect + parse to exactly this shape + round-trip byte-stably.
|
|
6
|
+
*
|
|
7
|
+
* GENERATED by scratchpad/gen-tree-fixtures.mjs — edit there and re-run.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface TreeFixture {
|
|
11
|
+
name: string;
|
|
12
|
+
category: string;
|
|
13
|
+
art: string;
|
|
14
|
+
/** Flat "depth:label[ #comment]" lines, depth-first. */
|
|
15
|
+
expect: string[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const TREE_FIXTURES: TreeFixture[] = [
|
|
19
|
+
{
|
|
20
|
+
name: 'reactApp',
|
|
21
|
+
category: 'scaffold',
|
|
22
|
+
art: `my-app/
|
|
23
|
+
├── public/
|
|
24
|
+
│ └── index.html
|
|
25
|
+
├── src/
|
|
26
|
+
│ ├── App.tsx
|
|
27
|
+
│ ├── index.tsx
|
|
28
|
+
│ └── components/
|
|
29
|
+
│ ├── Header.tsx
|
|
30
|
+
│ └── Footer.tsx
|
|
31
|
+
├── package.json
|
|
32
|
+
└── tsconfig.json`,
|
|
33
|
+
expect: [
|
|
34
|
+
'0:my-app/',
|
|
35
|
+
'1:public/',
|
|
36
|
+
'2:index.html',
|
|
37
|
+
'1:src/',
|
|
38
|
+
'2:App.tsx',
|
|
39
|
+
'2:index.tsx',
|
|
40
|
+
'2:components/',
|
|
41
|
+
'3:Header.tsx',
|
|
42
|
+
'3:Footer.tsx',
|
|
43
|
+
'1:package.json',
|
|
44
|
+
'1:tsconfig.json',
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'pythonPkg',
|
|
49
|
+
category: 'scaffold',
|
|
50
|
+
art: `mypackage/
|
|
51
|
+
├── __init__.py
|
|
52
|
+
├── core.py
|
|
53
|
+
├── utils/
|
|
54
|
+
│ ├── __init__.py
|
|
55
|
+
│ └── helpers.py
|
|
56
|
+
└── tests/
|
|
57
|
+
└── test_core.py`,
|
|
58
|
+
expect: [
|
|
59
|
+
'0:mypackage/',
|
|
60
|
+
'1:__init__.py',
|
|
61
|
+
'1:core.py',
|
|
62
|
+
'1:utils/',
|
|
63
|
+
'2:__init__.py',
|
|
64
|
+
'2:helpers.py',
|
|
65
|
+
'1:tests/',
|
|
66
|
+
'2:test_core.py',
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'monorepo',
|
|
71
|
+
category: 'scaffold',
|
|
72
|
+
art: `workspace/
|
|
73
|
+
├── packages/
|
|
74
|
+
│ ├── core/
|
|
75
|
+
│ ├── ui/
|
|
76
|
+
│ └── cli/
|
|
77
|
+
├── apps/
|
|
78
|
+
│ └── web/
|
|
79
|
+
└── package.json`,
|
|
80
|
+
expect: [
|
|
81
|
+
'0:workspace/',
|
|
82
|
+
'1:packages/',
|
|
83
|
+
'2:core/',
|
|
84
|
+
'2:ui/',
|
|
85
|
+
'2:cli/',
|
|
86
|
+
'1:apps/',
|
|
87
|
+
'2:web/',
|
|
88
|
+
'1:package.json',
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'asciiStyle',
|
|
93
|
+
category: 'style',
|
|
94
|
+
art: `docs/
|
|
95
|
+
|-- guide.md
|
|
96
|
+
|-- api/
|
|
97
|
+
| |-- rest.md
|
|
98
|
+
| \`-- graphql.md
|
|
99
|
+
\`-- README.md`,
|
|
100
|
+
expect: ['0:docs/', '1:guide.md', '1:api/', '2:rest.md', '2:graphql.md', '1:README.md'],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'plusStyle',
|
|
104
|
+
category: 'style',
|
|
105
|
+
art: `root
|
|
106
|
+
+-- moduleA
|
|
107
|
+
| +-- fileA1
|
|
108
|
+
| +-- fileA2
|
|
109
|
+
+-- moduleB
|
|
110
|
+
+-- fileB1`,
|
|
111
|
+
expect: ['0:root', '1:moduleA', '2:fileA1', '2:fileA2', '1:moduleB', '2:fileB1'],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'withComments',
|
|
115
|
+
category: 'comments',
|
|
116
|
+
art: `service/
|
|
117
|
+
├── main.go # entrypoint
|
|
118
|
+
├── config.yaml # runtime config
|
|
119
|
+
├── handlers/ # HTTP handlers
|
|
120
|
+
│ └── users.go
|
|
121
|
+
└── go.mod`,
|
|
122
|
+
expect: [
|
|
123
|
+
'0:service/',
|
|
124
|
+
'1:main.go #entrypoint',
|
|
125
|
+
'1:config.yaml #runtime config',
|
|
126
|
+
'1:handlers/ #HTTP handlers',
|
|
127
|
+
'2:users.go',
|
|
128
|
+
'1:go.mod',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'depTree',
|
|
133
|
+
category: 'outline',
|
|
134
|
+
art: `express@4.18.2
|
|
135
|
+
├── body-parser@1.20.1
|
|
136
|
+
│ ├── bytes@3.1.2
|
|
137
|
+
│ └── qs@6.11.0
|
|
138
|
+
├── cookie@0.5.0
|
|
139
|
+
└── debug@2.6.9
|
|
140
|
+
└── ms@2.0.0`,
|
|
141
|
+
expect: [
|
|
142
|
+
'0:express@4.18.2',
|
|
143
|
+
'1:body-parser@1.20.1',
|
|
144
|
+
'2:bytes@3.1.2',
|
|
145
|
+
'2:qs@6.11.0',
|
|
146
|
+
'1:cookie@0.5.0',
|
|
147
|
+
'1:debug@2.6.9',
|
|
148
|
+
'2:ms@2.0.0',
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'categoryOutline',
|
|
153
|
+
category: 'outline',
|
|
154
|
+
art: `Animals
|
|
155
|
+
├── Mammals
|
|
156
|
+
│ ├── Dogs
|
|
157
|
+
│ └── Cats
|
|
158
|
+
├── Birds
|
|
159
|
+
│ ├── Eagles
|
|
160
|
+
│ └── Sparrows
|
|
161
|
+
└── Reptiles
|
|
162
|
+
└── Snakes`,
|
|
163
|
+
expect: [
|
|
164
|
+
'0:Animals',
|
|
165
|
+
'1:Mammals',
|
|
166
|
+
'2:Dogs',
|
|
167
|
+
'2:Cats',
|
|
168
|
+
'1:Birds',
|
|
169
|
+
'2:Eagles',
|
|
170
|
+
'2:Sparrows',
|
|
171
|
+
'1:Reptiles',
|
|
172
|
+
'2:Snakes',
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'decisionOutline',
|
|
177
|
+
category: 'outline',
|
|
178
|
+
art: `Deploy?
|
|
179
|
+
├── Tests pass
|
|
180
|
+
│ ├── Deploy to staging
|
|
181
|
+
│ └── Run smoke tests
|
|
182
|
+
└── Tests fail
|
|
183
|
+
└── Notify team`,
|
|
184
|
+
expect: [
|
|
185
|
+
'0:Deploy?',
|
|
186
|
+
'1:Tests pass',
|
|
187
|
+
'2:Deploy to staging',
|
|
188
|
+
'2:Run smoke tests',
|
|
189
|
+
'1:Tests fail',
|
|
190
|
+
'2:Notify team',
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: 'forest',
|
|
195
|
+
category: 'shape',
|
|
196
|
+
art: `frontend/
|
|
197
|
+
├── index.html
|
|
198
|
+
└── app.js
|
|
199
|
+
backend/
|
|
200
|
+
├── server.py
|
|
201
|
+
└── models.py
|
|
202
|
+
shared/
|
|
203
|
+
└── types.ts`,
|
|
204
|
+
expect: [
|
|
205
|
+
'0:frontend/',
|
|
206
|
+
'1:index.html',
|
|
207
|
+
'1:app.js',
|
|
208
|
+
'0:backend/',
|
|
209
|
+
'1:server.py',
|
|
210
|
+
'1:models.py',
|
|
211
|
+
'0:shared/',
|
|
212
|
+
'1:types.ts',
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'deepChain',
|
|
217
|
+
category: 'shape',
|
|
218
|
+
art: `a/
|
|
219
|
+
└── b/
|
|
220
|
+
└── c/
|
|
221
|
+
└── d/
|
|
222
|
+
└── e.txt`,
|
|
223
|
+
expect: ['0:a/', '1:b/', '2:c/', '3:d/', '4:e.txt'],
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: 'wideFlat',
|
|
227
|
+
category: 'shape',
|
|
228
|
+
art: `config/
|
|
229
|
+
├── dev.json
|
|
230
|
+
├── staging.json
|
|
231
|
+
├── prod.json
|
|
232
|
+
├── test.json
|
|
233
|
+
└── local.json`,
|
|
234
|
+
expect: [
|
|
235
|
+
'0:config/',
|
|
236
|
+
'1:dev.json',
|
|
237
|
+
'1:staging.json',
|
|
238
|
+
'1:prod.json',
|
|
239
|
+
'1:test.json',
|
|
240
|
+
'1:local.json',
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
];
|