@hassangameryt/freeflow 0.7.3 → 0.8.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.
Files changed (276) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.cursor-plugin/plugin.json +1 -1
  5. package/NOTICE +14 -0
  6. package/README.md +26 -31
  7. package/capabilities/cognitive-routing/SKILL.md +106 -161
  8. package/capabilities/cognitive-routing/references/both-mode.md +36 -0
  9. package/capabilities/cognitive-routing/references/executor-mode.md +48 -0
  10. package/capabilities/cognitive-routing/references/helper-mode.md +47 -0
  11. package/capabilities/compaction/SKILL.md +49 -0
  12. package/capabilities/compaction/references/summary-format.md +239 -0
  13. package/command-surface.json +4 -0
  14. package/gemini-extension.json +1 -1
  15. package/hooks/shared/runtime-context.mjs +28 -30
  16. package/licenses/Apache-2.0.txt +55 -0
  17. package/package.json +22 -9
  18. package/pi-extension/README.md +41 -0
  19. package/pi-extension/dist/cognitive-routing/assembler.js +393 -0
  20. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/config.js +5 -2
  21. package/pi-extension/dist/cognitive-routing/economics.js +45 -0
  22. package/pi-extension/dist/cognitive-routing/event-schema.js +388 -0
  23. package/pi-extension/dist/{session-sources/events.js → cognitive-routing/event-store.js} +103 -40
  24. package/pi-extension/dist/cognitive-routing/gate.js +241 -0
  25. package/pi-extension/dist/cognitive-routing/handlers.js +899 -0
  26. package/pi-extension/dist/cognitive-routing/handoffs.js +350 -0
  27. package/pi-extension/dist/cognitive-routing/model-control.js +467 -0
  28. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/projection.js +229 -56
  29. package/pi-extension/dist/cognitive-routing/provenance.js +81 -0
  30. package/pi-extension/dist/cognitive-routing/runtime.js +396 -0
  31. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/schemas.js +43 -7
  32. package/pi-extension/dist/cognitive-routing/session.js +221 -0
  33. package/pi-extension/dist/{session-sources → cognitive-routing}/sources.js +99 -85
  34. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/state.js +37 -378
  35. package/pi-extension/dist/cognitive-routing/status.js +80 -0
  36. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/tools.js +12 -12
  37. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/types.js +5 -11
  38. package/pi-extension/dist/compaction/carry.js +191 -0
  39. package/pi-extension/dist/compaction/config.js +22 -0
  40. package/pi-extension/dist/compaction/controller.js +471 -0
  41. package/pi-extension/dist/compaction/harness.js +77 -0
  42. package/pi-extension/dist/compaction/results.js +158 -0
  43. package/pi-extension/dist/compaction/thresholds.js +35 -0
  44. package/pi-extension/dist/compaction/tool.js +57 -0
  45. package/pi-extension/dist/host/branch.js +13 -0
  46. package/pi-extension/dist/host/canonical.js +12 -0
  47. package/pi-extension/dist/host/catalog.js +77 -0
  48. package/pi-extension/dist/host/config.js +374 -0
  49. package/pi-extension/dist/host/projection-tags.js +60 -0
  50. package/pi-extension/dist/host/prompts.js +82 -0
  51. package/pi-extension/dist/{session-sources → host}/read-only-session.js +112 -1
  52. package/pi-extension/dist/{runtime → host}/request-history.js +121 -39
  53. package/pi-extension/dist/host/runtime-state.js +189 -0
  54. package/pi-extension/dist/{settings/settings-ui.js → host/settings/freeflow-command.js} +620 -410
  55. package/pi-extension/dist/{settings/settings-tui.js → host/settings/settings-view.js} +186 -73
  56. package/pi-extension/dist/host/staging.js +28 -0
  57. package/pi-extension/dist/host/status.js +101 -0
  58. package/pi-extension/dist/index.js +423 -173
  59. package/pi-extension/dist/provider-support/cache/anchor.js +21 -0
  60. package/pi-extension/dist/provider-support/cache/anthropic.js +102 -0
  61. package/pi-extension/dist/provider-support/cache/health.js +73 -0
  62. package/pi-extension/dist/provider-support/cache/index.js +58 -0
  63. package/pi-extension/dist/provider-support/cache/keepalive.js +210 -0
  64. package/pi-extension/dist/provider-support/cache/monitor.js +17 -0
  65. package/pi-extension/dist/provider-support/cache/openai-responses.js +48 -0
  66. package/pi-extension/dist/provider-support/effort.js +13 -0
  67. package/pi-extension/dist/provider-support/index.js +44 -3
  68. package/pi-extension/dist/provider-support/{astra → openai}/adapter.js +46 -29
  69. package/pi-extension/dist/provider-support/{astra → openai}/history.js +10 -8
  70. package/pi-extension/dist/provider-support/{astra → openai}/index.js +8 -4
  71. package/pi-extension/dist/provider-support/{astra → openai}/session-state.js +29 -38
  72. package/pi-extension/dist/provider-support/routes.js +17 -0
  73. package/pi-extension/dist/tool-execution/apply-patch/grammar.js +23 -0
  74. package/pi-extension/dist/tool-execution/apply-patch/match.js +38 -0
  75. package/pi-extension/dist/tool-execution/apply-patch/parser.js +177 -0
  76. package/pi-extension/dist/tool-execution/apply-patch/plan.js +201 -0
  77. package/pi-extension/dist/tool-execution/apply-patch/tool.js +84 -0
  78. package/pi-extension/dist/tool-execution/background.js +238 -0
  79. package/pi-extension/dist/tool-execution/bash-guard.js +23 -0
  80. package/pi-extension/dist/tool-execution/config.js +22 -0
  81. package/pi-extension/dist/tool-execution/edit-messages.js +120 -0
  82. package/pi-extension/dist/tool-execution/file-state.js +138 -0
  83. package/pi-extension/dist/tool-execution/file-tracking.js +143 -0
  84. package/pi-extension/dist/tool-execution/prompt.js +54 -0
  85. package/pi-extension/dist/tool-execution/tools.js +16 -0
  86. package/pi-extension/freeflow/README.md +9 -0
  87. package/plugin.json +1 -1
  88. package/runtime/prompts/cognitive-routing.md +4 -4
  89. package/runtime/prompts/core.md +22 -75
  90. package/runtime/prompts/interaction-contract.md +15 -8
  91. package/runtime/prompts/tool-execution.md +38 -0
  92. package/runtime/prompts/working-method.md +108 -0
  93. package/skills/action-selection/SKILL.md +39 -47
  94. package/skills/action-selection/references/trajectory-stalls.md +2 -0
  95. package/skills/bypass/SKILL.md +2 -2
  96. package/skills/commit-work/SKILL.md +31 -83
  97. package/skills/commit-work/references/git-state-edges.md +1 -1
  98. package/skills/commit-work/references/simple-push.md +2 -0
  99. package/skills/commit-work/references/staging-decisions.md +1 -1
  100. package/skills/decision-gate/SKILL.md +31 -50
  101. package/skills/design-for-depth/SKILL.md +44 -53
  102. package/skills/design-for-depth/references/design-pressure-signals.md +46 -144
  103. package/skills/design-for-depth/references/implementation-decisions.md +1 -1
  104. package/skills/design-for-depth/references/interface-design-loop.md +5 -36
  105. package/skills/design-for-depth/references/module-and-dependency-design.md +2 -32
  106. package/skills/design-for-depth/references/state-and-failure-boundaries.md +2 -13
  107. package/skills/diagnose-failure/SKILL.md +39 -24
  108. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +2 -0
  109. package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +2 -2
  110. package/skills/discuss/SKILL.md +35 -11
  111. package/skills/discuss/references/discussion-continuity.md +7 -27
  112. package/skills/evaluate-skill/SKILL.md +49 -80
  113. package/skills/evaluate-skill/references/evaluation-definition-schema.md +35 -5
  114. package/skills/evaluate-skill/references/evaluation-design.md +14 -14
  115. package/skills/evaluate-skill/references/execution-and-evidence.md +26 -5
  116. package/skills/evaluate-skill/references/review-and-revision.md +3 -1
  117. package/skills/evaluate-skill/scripts/lib/definitions.mjs +49 -8
  118. package/skills/evaluate-skill/scripts/lib/pi.mjs +14 -7
  119. package/skills/evaluate-skill/scripts/lib/review.mjs +196 -0
  120. package/skills/evaluate-skill/scripts/lib/runner.mjs +45 -8
  121. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +2 -0
  122. package/skills/evaluate-skill/scripts/lib/trials.mjs +103 -0
  123. package/skills/evaluate-skill/scripts/lib/view.mjs +67 -1
  124. package/skills/evaluate-skill/scripts/pi-command-tool.mjs +144 -0
  125. package/skills/evaluate-skill/scripts/pi-guard.mjs +30 -13
  126. package/skills/evaluate-skill/scripts/skill-eval.mjs +114 -34
  127. package/skills/execute-work/SKILL.md +41 -9
  128. package/skills/execute-work/references/code-practices.md +2 -0
  129. package/skills/execute-work/references/execute-work-edges.md +11 -1
  130. package/skills/handoff/SKILL.md +1 -1
  131. package/skills/handoff/references/handoff-templates.md +1 -1
  132. package/skills/review-artifact/SKILL.md +42 -41
  133. package/skills/review-artifact/references/adjudicate-artifact-review.md +1 -1
  134. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +1 -1
  135. package/skills/review-work/SKILL.md +38 -32
  136. package/skills/review-work/references/adjudicate-work-review.md +1 -1
  137. package/skills/review-work/references/independent-work-reviewer-contract.md +1 -1
  138. package/skills/review-work/references/security-risk-lens.md +2 -4
  139. package/skills/setup-freeflow/SKILL.md +3 -1
  140. package/skills/setup-freeflow/references/activation-contract.md +7 -13
  141. package/skills/setup-freeflow/references/host-setup.md +3 -3
  142. package/skills/track-work/SKILL.md +113 -161
  143. package/skills/track-work/references/working-record-format.md +189 -350
  144. package/skills/track-work/scripts/lib/document.mjs +62 -6
  145. package/skills/track-work/scripts/lib/format.mjs +16 -1
  146. package/skills/track-work/scripts/lib/store.mjs +9 -8
  147. package/skills/track-work/scripts/lib/transitions.mjs +79 -4
  148. package/skills/track-work/scripts/working-record.mjs +34 -12
  149. package/skills/verify-work/SKILL.md +29 -20
  150. package/skills/verify-work/references/browser-runtime-evidence.md +1 -5
  151. package/skills/verify-work/references/integration-evidence.md +2 -0
  152. package/skills/verify-work/references/performance-evidence.md +3 -1
  153. package/skills/verify-work/references/test-design.md +3 -1
  154. package/skills/workflow/SKILL.md +65 -21
  155. package/skills/workflow/references/domain-skill-composition.md +5 -3
  156. package/skills/write-docs/SKILL.md +83 -0
  157. package/skills/write-docs/references/documentation-shapes.md +119 -0
  158. package/skills/write-docs/scripts/docs-check.mjs +139 -0
  159. package/skills/write-plan/SKILL.md +40 -40
  160. package/skills/write-plan/references/plan-shapes.md +1 -1
  161. package/skills/write-skill/SKILL.md +107 -147
  162. package/skills/write-skill/references/activation-boundaries.md +2 -0
  163. package/skills/write-skill/references/agent-first-instructions.md +22 -10
  164. package/skills/write-skill/references/progressive-disclosure.md +4 -2
  165. package/skills/write-skill/references/skill-dependency-graphs.md +2 -0
  166. package/skills/write-skill/scripts/lib/similarity.mjs +56 -0
  167. package/skills/write-skill/scripts/skill-author.mjs +18 -2
  168. package/skills/write-spec/SKILL.md +34 -41
  169. package/skills/write-spec/references/artifact-standards.md +1 -1
  170. package/skills/write-spec/references/decision-records.md +2 -0
  171. package/skills/write-spec/references/spec-shapes.md +1 -1
  172. package/capabilities/context-virtualization/SKILL.md +0 -103
  173. package/capabilities/conversation-history/SKILL.md +0 -53
  174. package/hooks/tests/check-host-adapters.test.mjs +0 -82
  175. package/hooks/tests/check-runtime-context-hook.sh +0 -212
  176. package/pi-extension/dist/cognitive-routing-v2/runtime.js +0 -2181
  177. package/pi-extension/dist/context-virtualization/commands.js +0 -89
  178. package/pi-extension/dist/context-virtualization/projector.js +0 -42
  179. package/pi-extension/dist/context-virtualization/runtime.js +0 -378
  180. package/pi-extension/dist/context-virtualization/state.js +0 -57
  181. package/pi-extension/dist/context-virtualization/types.js +0 -10
  182. package/pi-extension/dist/conversation-history/passages.js +0 -66
  183. package/pi-extension/dist/conversation-history/ranking.js +0 -105
  184. package/pi-extension/dist/conversation-history/runtime.js +0 -226
  185. package/pi-extension/dist/conversation-history/search.js +0 -56
  186. package/pi-extension/dist/conversation-history/types.js +0 -1
  187. package/pi-extension/dist/freeflow-context/resolver.js +0 -120
  188. package/pi-extension/dist/freeflow-context/runtime.js +0 -80
  189. package/pi-extension/dist/freeflow-context/source-projector.js +0 -95
  190. package/pi-extension/dist/freeflow-context/tool.js +0 -314
  191. package/pi-extension/dist/freeflow-context/types.js +0 -12
  192. package/pi-extension/dist/freeflow-context/visibility.js +0 -28
  193. package/pi-extension/dist/integrations/mcp-config.js +0 -29
  194. package/pi-extension/dist/runtime/runtime-context.js +0 -754
  195. package/pi-extension/dist/runtime/runtime-identity.js +0 -5
  196. package/pi-extension/dist/session-sources/provenance.js +0 -32
  197. package/pi-extension/dist/ui/text-component.js +0 -57
  198. package/pi-extension/src/cognitive-routing-v2/budget.ts +0 -42
  199. package/pi-extension/src/cognitive-routing-v2/config.ts +0 -173
  200. package/pi-extension/src/cognitive-routing-v2/projection.ts +0 -375
  201. package/pi-extension/src/cognitive-routing-v2/render.ts +0 -277
  202. package/pi-extension/src/cognitive-routing-v2/runtime.ts +0 -2241
  203. package/pi-extension/src/cognitive-routing-v2/schemas.ts +0 -180
  204. package/pi-extension/src/cognitive-routing-v2/state.ts +0 -839
  205. package/pi-extension/src/cognitive-routing-v2/tools.ts +0 -62
  206. package/pi-extension/src/cognitive-routing-v2/types.ts +0 -254
  207. package/pi-extension/src/context-virtualization/commands.ts +0 -111
  208. package/pi-extension/src/context-virtualization/projector.ts +0 -62
  209. package/pi-extension/src/context-virtualization/runtime.ts +0 -428
  210. package/pi-extension/src/context-virtualization/state.ts +0 -79
  211. package/pi-extension/src/context-virtualization/types.ts +0 -92
  212. package/pi-extension/src/conversation-history/passages.ts +0 -81
  213. package/pi-extension/src/conversation-history/ranking.ts +0 -155
  214. package/pi-extension/src/conversation-history/runtime.ts +0 -250
  215. package/pi-extension/src/conversation-history/search.ts +0 -79
  216. package/pi-extension/src/conversation-history/types.ts +0 -31
  217. package/pi-extension/src/freeflow-context/resolver.ts +0 -139
  218. package/pi-extension/src/freeflow-context/runtime.ts +0 -100
  219. package/pi-extension/src/freeflow-context/source-projector.ts +0 -106
  220. package/pi-extension/src/freeflow-context/tool.ts +0 -366
  221. package/pi-extension/src/freeflow-context/types.ts +0 -70
  222. package/pi-extension/src/freeflow-context/visibility.ts +0 -53
  223. package/pi-extension/src/index.ts +0 -390
  224. package/pi-extension/src/integrations/mcp-config.ts +0 -32
  225. package/pi-extension/src/provider-support/astra/adapter.ts +0 -108
  226. package/pi-extension/src/provider-support/astra/history.ts +0 -145
  227. package/pi-extension/src/provider-support/astra/index.ts +0 -12
  228. package/pi-extension/src/provider-support/astra/session-state.ts +0 -113
  229. package/pi-extension/src/provider-support/index.ts +0 -5
  230. package/pi-extension/src/runtime/request-history.ts +0 -243
  231. package/pi-extension/src/runtime/runtime-context.ts +0 -860
  232. package/pi-extension/src/runtime/runtime-identity.ts +0 -8
  233. package/pi-extension/src/session-sources/events.ts +0 -230
  234. package/pi-extension/src/session-sources/provenance.ts +0 -39
  235. package/pi-extension/src/session-sources/read-only-session.ts +0 -170
  236. package/pi-extension/src/session-sources/sources.ts +0 -334
  237. package/pi-extension/src/settings/settings-tui.ts +0 -501
  238. package/pi-extension/src/settings/settings-ui.ts +0 -1652
  239. package/pi-extension/src/ui/text-component.ts +0 -66
  240. package/pi-extension/tests/cache-reuse/history.test.js +0 -117
  241. package/pi-extension/tests/cache-reuse/native.test.js +0 -91
  242. package/pi-extension/tests/cache-reuse/settings.test.js +0 -211
  243. package/pi-extension/tests/cognitive-routing-v2/communication.test.js +0 -577
  244. package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +0 -183
  245. package/pi-extension/tests/cognitive-routing-v2/delegation.test.js +0 -557
  246. package/pi-extension/tests/cognitive-routing-v2/native.test.js +0 -474
  247. package/pi-extension/tests/cognitive-routing-v2/performance.test.js +0 -87
  248. package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +0 -300
  249. package/pi-extension/tests/cognitive-routing-v2/projection.test.js +0 -241
  250. package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +0 -1034
  251. package/pi-extension/tests/cognitive-routing-v2/render.test.js +0 -244
  252. package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +0 -423
  253. package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +0 -521
  254. package/pi-extension/tests/cognitive-routing-v2/state.test.js +0 -586
  255. package/pi-extension/tests/context-virtualization/extension.test.js +0 -775
  256. package/pi-extension/tests/context-virtualization/projector.test.js +0 -110
  257. package/pi-extension/tests/context-virtualization/runtime.test.js +0 -230
  258. package/pi-extension/tests/conversation-history/runtime.test.js +0 -98
  259. package/pi-extension/tests/conversation-history/search.test.js +0 -97
  260. package/pi-extension/tests/fixtures/pi-host.js +0 -4
  261. package/pi-extension/tests/fixtures/routing-native.js +0 -191
  262. package/pi-extension/tests/integration/mode-free-core.test.js +0 -220
  263. package/pi-extension/tests/integration/pi-extension.test.js +0 -1447
  264. package/pi-extension/tests/integration/prompt-architecture.test.js +0 -447
  265. package/pi-extension/tests/integration/unaffected-regressions.test.js +0 -478
  266. package/pi-extension/tests/provider-support/astra-boundaries.test.js +0 -75
  267. package/pi-extension/tests/provider-support/astra.test.js +0 -306
  268. package/pi-extension/tests/provider-support/cli.test.js +0 -92
  269. package/pi-extension/tests/provider-support/native.test.js +0 -183
  270. package/pi-extension/tests/settings/settings-tui.test.js +0 -243
  271. package/pi-extension/tsconfig.json +0 -16
  272. package/runtime/prompts/context-virtualization.md +0 -3
  273. package/runtime/prompts/conversation-history.md +0 -3
  274. package/skills/design-for-depth/references/software-design-philosophy.md +0 -202
  275. /package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/budget.js +0 -0
  276. /package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/render.js +0 -0
@@ -1,243 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
-
4
- import { CURSOR_MARKER, visibleWidth } from "@earendil-works/pi-tui";
5
-
6
- import { PiSettingsComponent } from "../../dist/settings/settings-tui.js";
7
-
8
- const theme = {
9
- fg(_color, text) {
10
- return text;
11
- },
12
- bold(text) {
13
- return text;
14
- },
15
- };
16
-
17
- function deferred() {
18
- let resolve;
19
- let reject;
20
- const promise = new Promise((resolvePromise, rejectPromise) => {
21
- resolve = resolvePromise;
22
- reject = rejectPromise;
23
- });
24
- return { promise, resolve, reject };
25
- }
26
-
27
- function createComponent(entries, options = {}) {
28
- const notifications = [];
29
- let closed = false;
30
- const component = new PiSettingsComponent({
31
- title: options.title ?? "Test Settings",
32
- entries,
33
- theme: options.theme ?? theme,
34
- requestRender() {},
35
- notify(message, level) {
36
- notifications.push({ message, level });
37
- },
38
- done() {
39
- closed = true;
40
- },
41
- });
42
- return { component, notifications, isClosed: () => closed };
43
- }
44
-
45
- test("Pi settings publish values only after persistence and block concurrent edits", async () => {
46
- let current = "disabled";
47
- let commits = 0;
48
- const write = deferred();
49
- const entry = {
50
- id: "feature.enabled",
51
- label: "Feature",
52
- description: "Enable the feature.",
53
- currentValue: () => current,
54
- inactive: () => false,
55
- currentChoiceKey: () => (current === "enabled" ? "true" : "false"),
56
- choices: [
57
- { key: "true", value: true, label: "enabled" },
58
- { key: "false", value: false, label: "disabled" },
59
- ],
60
- async commit() {
61
- commits += 1;
62
- await write.promise;
63
- current = "enabled";
64
- return { changed: true, reloadRequired: true };
65
- },
66
- };
67
- const { component } = createComponent([entry]);
68
-
69
- component.handleInput("\r");
70
- component.handleInput("\u001b[A");
71
- component.handleInput("\r");
72
- component.handleInput("\r");
73
-
74
- assert.equal(commits, 1);
75
- assert.equal(current, "disabled");
76
- write.resolve();
77
- await component.waitForWrites();
78
- assert.equal(current, "enabled");
79
- assert.match(component.render(80).join("\n"), /Feature\s+enabled/);
80
- assert.deepEqual(component.sessionResult(), { changed: true, configChanged: true, failed: false });
81
- });
82
-
83
- test("Pi settings retain the persisted value when a write fails", async () => {
84
- const current = "disabled";
85
- const entry = {
86
- id: "feature.enabled",
87
- label: "Feature",
88
- description: "Enable the feature.",
89
- currentValue: () => current,
90
- inactive: () => false,
91
- currentChoiceKey: () => "false",
92
- choices: [
93
- { key: "true", value: true, label: "enabled" },
94
- { key: "false", value: false, label: "disabled" },
95
- ],
96
- async commit() {
97
- throw new Error("disk unavailable");
98
- },
99
- };
100
- const { component, notifications } = createComponent([entry]);
101
-
102
- component.handleInput("\r");
103
- component.handleInput("\u001b[A");
104
- component.handleInput("\r");
105
- await component.waitForWrites();
106
- component.handleInput("\u001b");
107
-
108
- assert.equal(current, "disabled");
109
- assert.match(component.render(80).join("\n"), /Feature\s+disabled/);
110
- assert.deepEqual(component.sessionResult(), { changed: false, configChanged: false, failed: true });
111
- assert.deepEqual(notifications, [{ message: "Write failed: disk unavailable", level: "error" }]);
112
- });
113
-
114
- test("Pi settings delegate paste, cursor, grapheme, and IME behavior to Input", async () => {
115
- let current = "";
116
- const entry = {
117
- id: "feature.label",
118
- label: "Label",
119
- description: "Unicode label.",
120
- currentValue: () => current,
121
- inactive: () => false,
122
- edit: {
123
- initialValue: () => current,
124
- parse: (text) => text,
125
- },
126
- async commit(value) {
127
- current = value;
128
- return { changed: true, reloadRequired: true };
129
- },
130
- };
131
- const { component } = createComponent([entry]);
132
- component.focused = true;
133
-
134
- component.handleInput("\r");
135
- assert.ok(component.render(40).join("\n").includes(CURSOR_MARKER));
136
- component.handleInput("\u001b[200~ab🙂\u001b[201~");
137
- component.handleInput("\u001b[D");
138
- component.handleInput("\u007f");
139
- component.handleInput("界");
140
- component.handleInput("\r");
141
- await component.waitForWrites();
142
-
143
- assert.equal(current, "a界🙂");
144
- });
145
-
146
- test("Pi settings start value editing at the end of the existing value", async () => {
147
- let current = "abc";
148
- const entry = {
149
- id: "feature.label",
150
- label: "Label",
151
- description: "Editable label.",
152
- currentValue: () => current,
153
- inactive: () => false,
154
- edit: {
155
- initialValue: () => current,
156
- parse: (text) => text,
157
- },
158
- async commit(value) {
159
- current = value;
160
- return { changed: true, reloadRequired: true };
161
- },
162
- };
163
- const { component } = createComponent([entry]);
164
-
165
- component.handleInput("\r");
166
- component.handleInput("X");
167
- component.handleInput("\r");
168
- await component.waitForWrites();
169
-
170
- assert.equal(current, "abcX");
171
- });
172
-
173
- test("Pi settings keep typed input open when parsing fails", () => {
174
- let commits = 0;
175
- const entry = {
176
- id: "feature.limit",
177
- label: "Limit",
178
- description: "Positive integer.",
179
- currentValue: () => "1",
180
- inactive: () => false,
181
- edit: {
182
- initialValue: () => "",
183
- parse(text) {
184
- const value = Number(text);
185
- if (!Number.isInteger(value) || value <= 0) throw new Error("expected a positive integer");
186
- return value;
187
- },
188
- },
189
- async commit() {
190
- commits += 1;
191
- return { changed: true, reloadRequired: true };
192
- },
193
- };
194
- const { component } = createComponent([entry]);
195
-
196
- component.handleInput("\r");
197
- component.handleInput("invalid");
198
- component.handleInput("\r");
199
-
200
- assert.equal(commits, 0);
201
- assert.match(component.render(60).join("\n"), /Invalid value: expected a positive integer/);
202
- });
203
-
204
- test("Pi settings search accepts bracketed paste", () => {
205
- const entries = ["Alpha", "Beta"].map((label) => ({
206
- id: label.toLowerCase(),
207
- label,
208
- description: `${label} setting`,
209
- currentValue: () => "off",
210
- inactive: () => true,
211
- }));
212
- const { component } = createComponent(entries);
213
-
214
- component.handleInput("\u001b[200~Beta\u001b[201~");
215
- const rendered = component.render(60).join("\n");
216
- assert.match(rendered, /Beta/);
217
- assert.doesNotMatch(rendered, /Alpha/);
218
- });
219
-
220
- test("Pi settings keep ANSI and Unicode rendering within terminal width", () => {
221
- const ansiTheme = {
222
- fg(_color, text) {
223
- return `\u001b[36m${text}\u001b[0m`;
224
- },
225
- bold(text) {
226
- return `\u001b[1m${text}\u001b[22m`;
227
- },
228
- };
229
- const entry = {
230
- id: "unicode",
231
- label: "設定🙂",
232
- description: "幅の広い Unicode description with several words.",
233
- currentValue: () => "有効界",
234
- inactive: () => true,
235
- };
236
- const { component } = createComponent([entry], { title: "設定パネル", theme: ansiTheme });
237
-
238
- for (const width of [12, 20, 40]) {
239
- for (const line of component.render(width)) {
240
- assert.ok(visibleWidth(line) <= width, `line width ${visibleWidth(line)} exceeds ${width}: ${line}`);
241
- }
242
- }
243
- });
@@ -1,16 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "rootDir": "src",
7
- "outDir": "dist",
8
- "declaration": false,
9
- "sourceMap": false,
10
- "strict": false,
11
- "noEmitOnError": true,
12
- "skipLibCheck": true,
13
- "types": ["node"]
14
- },
15
- "include": ["src/**/*.ts"]
16
- }
@@ -1,3 +0,0 @@
1
- ## Context Virtualization Cue
2
-
3
- After broad or noisy tool evidence has been safely narrowed, exhausted, or crossed a meaningful activity boundary, use Context Virtualization to keep necessary evidence active and archive residue. Do not archive governing context or exact evidence still needed by current work.
@@ -1,3 +0,0 @@
1
- ## Conversation History Cue
2
-
3
- When the next decision requires exact prior conversation evidence absent from active context, use Conversation History instead of reconstructing it from memory.
@@ -1,202 +0,0 @@
1
- # Software Design Philosophy
2
-
3
- Read this when structural pressure is supported but the likely-changing decision or missing information-hiding boundary cannot yet be named.
4
-
5
- Use only the principle that identifies the missing ownership. Do not produce a literature review, pattern catalog, or system-wide redesign.
6
-
7
- ## Complexity Is Coordination
8
-
9
- Complexity is not line count. It appears as:
10
-
11
- - **Change amplification:** one behavior change requires many surrounding edits.
12
- - **Cognitive load:** callers must remember many facts to use the module correctly.
13
- - **Obscurity:** important rules or ownership are difficult to discover.
14
- - **Dependency burden:** safe change requires understanding unrelated modules.
15
- - **Unknown unknowns:** a caller cannot tell what else it must inspect.
16
-
17
- A large implementation can be simple to use. A small helper can be complex when every caller must know its quirks.
18
-
19
- Ask:
20
-
21
- - What must a future caller or maintainer know?
22
- - How many locations must change together?
23
- - Which important facts are difficult to discover?
24
- - Which dependencies must be inspected before a safe change?
25
-
26
- ## Deep Modules
27
-
28
- A deep module provides substantial coherent behavior through a small interface.
29
-
30
- Callers state the outcome they need. The module owns:
31
-
32
- - sequencing;
33
- - likely-changing policy;
34
- - internal state transitions;
35
- - cleanup;
36
- - provider mechanics;
37
- - internal failure handling.
38
-
39
- A wrapper is not deep merely because it hides lines. It is deep when callers stop knowing concepts or coordinating protocol.
40
-
41
- Depth is not breadth. A god module hiding unrelated decisions is not deep.
42
-
43
- ## Strategic And Tactical Design
44
-
45
- A tactical change makes the current patch fit.
46
-
47
- A strategic change spends proportionate effort so that the next likely change remains local and correct use remains simple.
48
-
49
- Do not redesign everything in anticipation of the future. Do stop when the current patch clearly:
50
-
51
- - spreads a likely-changing decision;
52
- - adds caller protocol;
53
- - exposes internal state;
54
- - creates another required workaround;
55
- - makes the next accepted change materially harder.
56
-
57
- Strategic design is proportionate investment, not maximal architecture.
58
-
59
- ## Hide Likely-Changing Decisions
60
-
61
- Organize modules around decisions likely to change, not merely processing steps.
62
-
63
- Instead of exposing:
64
-
65
- ```text
66
- parse -> validate -> retry -> send -> log -> clean up
67
- ```
68
-
69
- look for the decision those steps implement:
70
-
71
- ```text
72
- notification delivery policy
73
- ```
74
-
75
- Ask:
76
-
77
- - What decision would cause the most surrounding edits if it changed?
78
- - Which callers currently know it?
79
- - Who should own it?
80
- - What outcome-level interface would let callers stop knowing it?
81
- - Is the decision accepted or still user-owned?
82
-
83
- Failure and recovery policy are often likely-changing decisions.
84
-
85
- ## Preserve Conceptual Integrity
86
-
87
- A module should express one coherent model of its outcome, state, and failure behavior.
88
-
89
- Pressure exists when:
90
-
91
- - the same concept has different names or rules across callers;
92
- - several modules partially own the same decision;
93
- - one module exposes unrelated mental models;
94
- - callers translate between incompatible representations;
95
- - each feature adds another exception to the shared concept.
96
-
97
- Prefer one clear ownership model over several locally convenient but incompatible ones.
98
-
99
- Conceptual integrity does not mean one module or one abstraction. It means related behavior follows one coherent set of decisions.
100
-
101
- ## Use Seams And Enabling Points For Real Leverage
102
-
103
- A seam allows behavior, dependencies, or observation to change without editing surrounding code.
104
-
105
- An enabling point supplies the variation:
106
-
107
- - adapter;
108
- - provider;
109
- - fake;
110
- - clock;
111
- - probe;
112
- - policy;
113
- - migration implementation.
114
-
115
- Good seams correspond to:
116
-
117
- - demonstrated provider or environment variation;
118
- - known migration;
119
- - dependency control required by tests;
120
- - observation or fault injection;
121
- - policy that changes independently from infrastructure.
122
-
123
- Weak seams:
124
-
125
- - wrap one stable call;
126
- - add factories without ownership;
127
- - expose provider quirks through generic names;
128
- - exist only to mock internals while the caller interface remains awkward.
129
-
130
- ## Separate Policy From Infrastructure
131
-
132
- When infrastructure details leak into product or domain policy, use a boundary where:
133
-
134
- ```text
135
- policy requests outcome
136
- -> adapter performs provider mechanics
137
- ```
138
-
139
- Examples:
140
-
141
- - billing policy should not depend on payment-provider error names;
142
- - notification policy should not be repeated in each provider call;
143
- - permission semantics should not depend on database representation;
144
- - user-flow state should not depend on browser event plumbing.
145
-
146
- Do not add ports and adapters around every stable library call. The boundary is useful only when it hides policy, variation, or mechanics callers should not own.
147
-
148
- ## Treat Observable Facts As Contracts
149
-
150
- Callers may depend on any observable:
151
-
152
- - flag;
153
- - path;
154
- - state;
155
- - error;
156
- - timing rule;
157
- - fallback;
158
- - ordering behavior;
159
- - filename;
160
- - retry count.
161
-
162
- Expose a fact only when:
163
-
164
- - the caller owns the decision;
165
- - correct use requires it;
166
- - it is stable enough to support;
167
- - its compatibility cost is understood.
168
-
169
- Public flexibility has lasting coordination cost. Prefer one outcome-level operation over a toolkit that requires callers to reconstruct the lifecycle.
170
-
171
- ## Separate Required Capability From Speculation
172
-
173
- Classify proposed mechanisms as:
174
-
175
- - **Trust:** required to know the result is valid.
176
- - **Safety:** prevents damage, leakage, or runaway behavior.
177
- - **Efficiency:** saves time, requests, or money.
178
- - **Scale:** supports concurrency or volume.
179
- - **Portability:** supports additional environments or providers.
180
-
181
- Required trust and safety cannot be deferred merely to simplify the design.
182
-
183
- Efficiency, scale, and portability require accepted requirements or observed pressure. Do not turn imagined future variation into present interface cost.
184
-
185
- ## Name The Missing Boundary
186
-
187
- Use supported evidence to state:
188
-
189
- ```text
190
- Outcome:
191
- Coordination currently spread across:
192
- Likely-changing decision:
193
- Current owners:
194
- Proposed owner:
195
- What callers would stop knowing:
196
- Failure unit:
197
- Evidence still missing:
198
- ```
199
-
200
- If the decision cannot yet be named, define one bounded learning question. Do not create a generic abstraction as a substitute for understanding.
201
-
202
- Stop once the missing decision or boundary is named—or evidence shows no worthwhile boundary change is supported.