@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/NOTICE +14 -0
- package/README.md +26 -31
- package/capabilities/cognitive-routing/SKILL.md +106 -161
- package/capabilities/cognitive-routing/references/both-mode.md +36 -0
- package/capabilities/cognitive-routing/references/executor-mode.md +48 -0
- package/capabilities/cognitive-routing/references/helper-mode.md +47 -0
- package/capabilities/compaction/SKILL.md +49 -0
- package/capabilities/compaction/references/summary-format.md +239 -0
- package/command-surface.json +4 -0
- package/gemini-extension.json +1 -1
- package/hooks/shared/runtime-context.mjs +28 -30
- package/licenses/Apache-2.0.txt +55 -0
- package/package.json +22 -9
- package/pi-extension/README.md +41 -0
- package/pi-extension/dist/cognitive-routing/assembler.js +393 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/config.js +5 -2
- package/pi-extension/dist/cognitive-routing/economics.js +45 -0
- package/pi-extension/dist/cognitive-routing/event-schema.js +388 -0
- package/pi-extension/dist/{session-sources/events.js → cognitive-routing/event-store.js} +103 -40
- package/pi-extension/dist/cognitive-routing/gate.js +241 -0
- package/pi-extension/dist/cognitive-routing/handlers.js +899 -0
- package/pi-extension/dist/cognitive-routing/handoffs.js +350 -0
- package/pi-extension/dist/cognitive-routing/model-control.js +467 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/projection.js +229 -56
- package/pi-extension/dist/cognitive-routing/provenance.js +81 -0
- package/pi-extension/dist/cognitive-routing/runtime.js +396 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/schemas.js +43 -7
- package/pi-extension/dist/cognitive-routing/session.js +221 -0
- package/pi-extension/dist/{session-sources → cognitive-routing}/sources.js +99 -85
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/state.js +37 -378
- package/pi-extension/dist/cognitive-routing/status.js +80 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/tools.js +12 -12
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/types.js +5 -11
- package/pi-extension/dist/compaction/carry.js +191 -0
- package/pi-extension/dist/compaction/config.js +22 -0
- package/pi-extension/dist/compaction/controller.js +471 -0
- package/pi-extension/dist/compaction/harness.js +77 -0
- package/pi-extension/dist/compaction/results.js +158 -0
- package/pi-extension/dist/compaction/thresholds.js +35 -0
- package/pi-extension/dist/compaction/tool.js +57 -0
- package/pi-extension/dist/host/branch.js +13 -0
- package/pi-extension/dist/host/canonical.js +12 -0
- package/pi-extension/dist/host/catalog.js +77 -0
- package/pi-extension/dist/host/config.js +374 -0
- package/pi-extension/dist/host/projection-tags.js +60 -0
- package/pi-extension/dist/host/prompts.js +82 -0
- package/pi-extension/dist/{session-sources → host}/read-only-session.js +112 -1
- package/pi-extension/dist/{runtime → host}/request-history.js +121 -39
- package/pi-extension/dist/host/runtime-state.js +189 -0
- package/pi-extension/dist/{settings/settings-ui.js → host/settings/freeflow-command.js} +620 -410
- package/pi-extension/dist/{settings/settings-tui.js → host/settings/settings-view.js} +186 -73
- package/pi-extension/dist/host/staging.js +28 -0
- package/pi-extension/dist/host/status.js +101 -0
- package/pi-extension/dist/index.js +423 -173
- package/pi-extension/dist/provider-support/cache/anchor.js +21 -0
- package/pi-extension/dist/provider-support/cache/anthropic.js +102 -0
- package/pi-extension/dist/provider-support/cache/health.js +73 -0
- package/pi-extension/dist/provider-support/cache/index.js +58 -0
- package/pi-extension/dist/provider-support/cache/keepalive.js +210 -0
- package/pi-extension/dist/provider-support/cache/monitor.js +17 -0
- package/pi-extension/dist/provider-support/cache/openai-responses.js +48 -0
- package/pi-extension/dist/provider-support/effort.js +13 -0
- package/pi-extension/dist/provider-support/index.js +44 -3
- package/pi-extension/dist/provider-support/{astra → openai}/adapter.js +46 -29
- package/pi-extension/dist/provider-support/{astra → openai}/history.js +10 -8
- package/pi-extension/dist/provider-support/{astra → openai}/index.js +8 -4
- package/pi-extension/dist/provider-support/{astra → openai}/session-state.js +29 -38
- package/pi-extension/dist/provider-support/routes.js +17 -0
- package/pi-extension/dist/tool-execution/apply-patch/grammar.js +23 -0
- package/pi-extension/dist/tool-execution/apply-patch/match.js +38 -0
- package/pi-extension/dist/tool-execution/apply-patch/parser.js +177 -0
- package/pi-extension/dist/tool-execution/apply-patch/plan.js +201 -0
- package/pi-extension/dist/tool-execution/apply-patch/tool.js +84 -0
- package/pi-extension/dist/tool-execution/background.js +238 -0
- package/pi-extension/dist/tool-execution/bash-guard.js +23 -0
- package/pi-extension/dist/tool-execution/config.js +22 -0
- package/pi-extension/dist/tool-execution/edit-messages.js +120 -0
- package/pi-extension/dist/tool-execution/file-state.js +138 -0
- package/pi-extension/dist/tool-execution/file-tracking.js +143 -0
- package/pi-extension/dist/tool-execution/prompt.js +54 -0
- package/pi-extension/dist/tool-execution/tools.js +16 -0
- package/pi-extension/freeflow/README.md +9 -0
- package/plugin.json +1 -1
- package/runtime/prompts/cognitive-routing.md +4 -4
- package/runtime/prompts/core.md +22 -75
- package/runtime/prompts/interaction-contract.md +15 -8
- package/runtime/prompts/tool-execution.md +38 -0
- package/runtime/prompts/working-method.md +108 -0
- package/skills/action-selection/SKILL.md +39 -47
- package/skills/action-selection/references/trajectory-stalls.md +2 -0
- package/skills/bypass/SKILL.md +2 -2
- package/skills/commit-work/SKILL.md +31 -83
- package/skills/commit-work/references/git-state-edges.md +1 -1
- package/skills/commit-work/references/simple-push.md +2 -0
- package/skills/commit-work/references/staging-decisions.md +1 -1
- package/skills/decision-gate/SKILL.md +31 -50
- package/skills/design-for-depth/SKILL.md +44 -53
- package/skills/design-for-depth/references/design-pressure-signals.md +46 -144
- package/skills/design-for-depth/references/implementation-decisions.md +1 -1
- package/skills/design-for-depth/references/interface-design-loop.md +5 -36
- package/skills/design-for-depth/references/module-and-dependency-design.md +2 -32
- package/skills/design-for-depth/references/state-and-failure-boundaries.md +2 -13
- package/skills/diagnose-failure/SKILL.md +39 -24
- package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +2 -0
- package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +2 -2
- package/skills/discuss/SKILL.md +35 -11
- package/skills/discuss/references/discussion-continuity.md +7 -27
- package/skills/evaluate-skill/SKILL.md +49 -80
- package/skills/evaluate-skill/references/evaluation-definition-schema.md +35 -5
- package/skills/evaluate-skill/references/evaluation-design.md +14 -14
- package/skills/evaluate-skill/references/execution-and-evidence.md +26 -5
- package/skills/evaluate-skill/references/review-and-revision.md +3 -1
- package/skills/evaluate-skill/scripts/lib/definitions.mjs +49 -8
- package/skills/evaluate-skill/scripts/lib/pi.mjs +14 -7
- package/skills/evaluate-skill/scripts/lib/review.mjs +196 -0
- package/skills/evaluate-skill/scripts/lib/runner.mjs +45 -8
- package/skills/evaluate-skill/scripts/lib/sandbox.mjs +2 -0
- package/skills/evaluate-skill/scripts/lib/trials.mjs +103 -0
- package/skills/evaluate-skill/scripts/lib/view.mjs +67 -1
- package/skills/evaluate-skill/scripts/pi-command-tool.mjs +144 -0
- package/skills/evaluate-skill/scripts/pi-guard.mjs +30 -13
- package/skills/evaluate-skill/scripts/skill-eval.mjs +114 -34
- package/skills/execute-work/SKILL.md +41 -9
- package/skills/execute-work/references/code-practices.md +2 -0
- package/skills/execute-work/references/execute-work-edges.md +11 -1
- package/skills/handoff/SKILL.md +1 -1
- package/skills/handoff/references/handoff-templates.md +1 -1
- package/skills/review-artifact/SKILL.md +42 -41
- package/skills/review-artifact/references/adjudicate-artifact-review.md +1 -1
- package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +1 -1
- package/skills/review-work/SKILL.md +38 -32
- package/skills/review-work/references/adjudicate-work-review.md +1 -1
- package/skills/review-work/references/independent-work-reviewer-contract.md +1 -1
- package/skills/review-work/references/security-risk-lens.md +2 -4
- package/skills/setup-freeflow/SKILL.md +3 -1
- package/skills/setup-freeflow/references/activation-contract.md +7 -13
- package/skills/setup-freeflow/references/host-setup.md +3 -3
- package/skills/track-work/SKILL.md +113 -161
- package/skills/track-work/references/working-record-format.md +189 -350
- package/skills/track-work/scripts/lib/document.mjs +62 -6
- package/skills/track-work/scripts/lib/format.mjs +16 -1
- package/skills/track-work/scripts/lib/store.mjs +9 -8
- package/skills/track-work/scripts/lib/transitions.mjs +79 -4
- package/skills/track-work/scripts/working-record.mjs +34 -12
- package/skills/verify-work/SKILL.md +29 -20
- package/skills/verify-work/references/browser-runtime-evidence.md +1 -5
- package/skills/verify-work/references/integration-evidence.md +2 -0
- package/skills/verify-work/references/performance-evidence.md +3 -1
- package/skills/verify-work/references/test-design.md +3 -1
- package/skills/workflow/SKILL.md +65 -21
- package/skills/workflow/references/domain-skill-composition.md +5 -3
- package/skills/write-docs/SKILL.md +83 -0
- package/skills/write-docs/references/documentation-shapes.md +119 -0
- package/skills/write-docs/scripts/docs-check.mjs +139 -0
- package/skills/write-plan/SKILL.md +40 -40
- package/skills/write-plan/references/plan-shapes.md +1 -1
- package/skills/write-skill/SKILL.md +107 -147
- package/skills/write-skill/references/activation-boundaries.md +2 -0
- package/skills/write-skill/references/agent-first-instructions.md +22 -10
- package/skills/write-skill/references/progressive-disclosure.md +4 -2
- package/skills/write-skill/references/skill-dependency-graphs.md +2 -0
- package/skills/write-skill/scripts/lib/similarity.mjs +56 -0
- package/skills/write-skill/scripts/skill-author.mjs +18 -2
- package/skills/write-spec/SKILL.md +34 -41
- package/skills/write-spec/references/artifact-standards.md +1 -1
- package/skills/write-spec/references/decision-records.md +2 -0
- package/skills/write-spec/references/spec-shapes.md +1 -1
- package/capabilities/context-virtualization/SKILL.md +0 -103
- package/capabilities/conversation-history/SKILL.md +0 -53
- package/hooks/tests/check-host-adapters.test.mjs +0 -82
- package/hooks/tests/check-runtime-context-hook.sh +0 -212
- package/pi-extension/dist/cognitive-routing-v2/runtime.js +0 -2181
- package/pi-extension/dist/context-virtualization/commands.js +0 -89
- package/pi-extension/dist/context-virtualization/projector.js +0 -42
- package/pi-extension/dist/context-virtualization/runtime.js +0 -378
- package/pi-extension/dist/context-virtualization/state.js +0 -57
- package/pi-extension/dist/context-virtualization/types.js +0 -10
- package/pi-extension/dist/conversation-history/passages.js +0 -66
- package/pi-extension/dist/conversation-history/ranking.js +0 -105
- package/pi-extension/dist/conversation-history/runtime.js +0 -226
- package/pi-extension/dist/conversation-history/search.js +0 -56
- package/pi-extension/dist/conversation-history/types.js +0 -1
- package/pi-extension/dist/freeflow-context/resolver.js +0 -120
- package/pi-extension/dist/freeflow-context/runtime.js +0 -80
- package/pi-extension/dist/freeflow-context/source-projector.js +0 -95
- package/pi-extension/dist/freeflow-context/tool.js +0 -314
- package/pi-extension/dist/freeflow-context/types.js +0 -12
- package/pi-extension/dist/freeflow-context/visibility.js +0 -28
- package/pi-extension/dist/integrations/mcp-config.js +0 -29
- package/pi-extension/dist/runtime/runtime-context.js +0 -754
- package/pi-extension/dist/runtime/runtime-identity.js +0 -5
- package/pi-extension/dist/session-sources/provenance.js +0 -32
- package/pi-extension/dist/ui/text-component.js +0 -57
- package/pi-extension/src/cognitive-routing-v2/budget.ts +0 -42
- package/pi-extension/src/cognitive-routing-v2/config.ts +0 -173
- package/pi-extension/src/cognitive-routing-v2/projection.ts +0 -375
- package/pi-extension/src/cognitive-routing-v2/render.ts +0 -277
- package/pi-extension/src/cognitive-routing-v2/runtime.ts +0 -2241
- package/pi-extension/src/cognitive-routing-v2/schemas.ts +0 -180
- package/pi-extension/src/cognitive-routing-v2/state.ts +0 -839
- package/pi-extension/src/cognitive-routing-v2/tools.ts +0 -62
- package/pi-extension/src/cognitive-routing-v2/types.ts +0 -254
- package/pi-extension/src/context-virtualization/commands.ts +0 -111
- package/pi-extension/src/context-virtualization/projector.ts +0 -62
- package/pi-extension/src/context-virtualization/runtime.ts +0 -428
- package/pi-extension/src/context-virtualization/state.ts +0 -79
- package/pi-extension/src/context-virtualization/types.ts +0 -92
- package/pi-extension/src/conversation-history/passages.ts +0 -81
- package/pi-extension/src/conversation-history/ranking.ts +0 -155
- package/pi-extension/src/conversation-history/runtime.ts +0 -250
- package/pi-extension/src/conversation-history/search.ts +0 -79
- package/pi-extension/src/conversation-history/types.ts +0 -31
- package/pi-extension/src/freeflow-context/resolver.ts +0 -139
- package/pi-extension/src/freeflow-context/runtime.ts +0 -100
- package/pi-extension/src/freeflow-context/source-projector.ts +0 -106
- package/pi-extension/src/freeflow-context/tool.ts +0 -366
- package/pi-extension/src/freeflow-context/types.ts +0 -70
- package/pi-extension/src/freeflow-context/visibility.ts +0 -53
- package/pi-extension/src/index.ts +0 -390
- package/pi-extension/src/integrations/mcp-config.ts +0 -32
- package/pi-extension/src/provider-support/astra/adapter.ts +0 -108
- package/pi-extension/src/provider-support/astra/history.ts +0 -145
- package/pi-extension/src/provider-support/astra/index.ts +0 -12
- package/pi-extension/src/provider-support/astra/session-state.ts +0 -113
- package/pi-extension/src/provider-support/index.ts +0 -5
- package/pi-extension/src/runtime/request-history.ts +0 -243
- package/pi-extension/src/runtime/runtime-context.ts +0 -860
- package/pi-extension/src/runtime/runtime-identity.ts +0 -8
- package/pi-extension/src/session-sources/events.ts +0 -230
- package/pi-extension/src/session-sources/provenance.ts +0 -39
- package/pi-extension/src/session-sources/read-only-session.ts +0 -170
- package/pi-extension/src/session-sources/sources.ts +0 -334
- package/pi-extension/src/settings/settings-tui.ts +0 -501
- package/pi-extension/src/settings/settings-ui.ts +0 -1652
- package/pi-extension/src/ui/text-component.ts +0 -66
- package/pi-extension/tests/cache-reuse/history.test.js +0 -117
- package/pi-extension/tests/cache-reuse/native.test.js +0 -91
- package/pi-extension/tests/cache-reuse/settings.test.js +0 -211
- package/pi-extension/tests/cognitive-routing-v2/communication.test.js +0 -577
- package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +0 -183
- package/pi-extension/tests/cognitive-routing-v2/delegation.test.js +0 -557
- package/pi-extension/tests/cognitive-routing-v2/native.test.js +0 -474
- package/pi-extension/tests/cognitive-routing-v2/performance.test.js +0 -87
- package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +0 -300
- package/pi-extension/tests/cognitive-routing-v2/projection.test.js +0 -241
- package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +0 -1034
- package/pi-extension/tests/cognitive-routing-v2/render.test.js +0 -244
- package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +0 -423
- package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +0 -521
- package/pi-extension/tests/cognitive-routing-v2/state.test.js +0 -586
- package/pi-extension/tests/context-virtualization/extension.test.js +0 -775
- package/pi-extension/tests/context-virtualization/projector.test.js +0 -110
- package/pi-extension/tests/context-virtualization/runtime.test.js +0 -230
- package/pi-extension/tests/conversation-history/runtime.test.js +0 -98
- package/pi-extension/tests/conversation-history/search.test.js +0 -97
- package/pi-extension/tests/fixtures/pi-host.js +0 -4
- package/pi-extension/tests/fixtures/routing-native.js +0 -191
- package/pi-extension/tests/integration/mode-free-core.test.js +0 -220
- package/pi-extension/tests/integration/pi-extension.test.js +0 -1447
- package/pi-extension/tests/integration/prompt-architecture.test.js +0 -447
- package/pi-extension/tests/integration/unaffected-regressions.test.js +0 -478
- package/pi-extension/tests/provider-support/astra-boundaries.test.js +0 -75
- package/pi-extension/tests/provider-support/astra.test.js +0 -306
- package/pi-extension/tests/provider-support/cli.test.js +0 -92
- package/pi-extension/tests/provider-support/native.test.js +0 -183
- package/pi-extension/tests/settings/settings-tui.test.js +0 -243
- package/pi-extension/tsconfig.json +0 -16
- package/runtime/prompts/context-virtualization.md +0 -3
- package/runtime/prompts/conversation-history.md +0 -3
- package/skills/design-for-depth/references/software-design-philosophy.md +0 -202
- /package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/budget.js +0 -0
- /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,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.
|
|
File without changes
|
|
File without changes
|