@hassangameryt/freeflow 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) 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/README.md +28 -23
  6. package/capabilities/cognitive-routing/SKILL.md +94 -311
  7. package/command-surface.json +7 -1
  8. package/gemini-extension.json +1 -1
  9. package/package.json +4 -4
  10. package/pi-extension/dist/cognitive-routing-v2/budget.js +42 -0
  11. package/pi-extension/dist/cognitive-routing-v2/config.js +120 -0
  12. package/pi-extension/dist/cognitive-routing-v2/projection.js +321 -0
  13. package/pi-extension/dist/cognitive-routing-v2/render.js +231 -0
  14. package/pi-extension/dist/cognitive-routing-v2/runtime.js +1585 -0
  15. package/pi-extension/dist/cognitive-routing-v2/schemas.js +107 -0
  16. package/pi-extension/dist/cognitive-routing-v2/state.js +612 -0
  17. package/pi-extension/dist/cognitive-routing-v2/tools.js +91 -0
  18. package/pi-extension/dist/cognitive-routing-v2/types.js +44 -0
  19. package/pi-extension/dist/freeflow-context/tool.js +5 -0
  20. package/pi-extension/dist/index.js +279 -624
  21. package/pi-extension/dist/runtime/runtime-context.js +63 -13
  22. package/pi-extension/dist/session-sources/events.js +195 -0
  23. package/pi-extension/dist/session-sources/read-only-session.js +148 -0
  24. package/pi-extension/dist/session-sources/sources.js +233 -0
  25. package/pi-extension/dist/settings/settings-ui.js +44 -117
  26. package/pi-extension/src/cognitive-routing-v2/budget.ts +42 -0
  27. package/pi-extension/src/cognitive-routing-v2/config.ts +143 -0
  28. package/pi-extension/src/cognitive-routing-v2/projection.ts +365 -0
  29. package/pi-extension/src/cognitive-routing-v2/render.ts +256 -0
  30. package/pi-extension/src/cognitive-routing-v2/runtime.ts +1634 -0
  31. package/pi-extension/src/cognitive-routing-v2/schemas.ts +109 -0
  32. package/pi-extension/src/cognitive-routing-v2/state.ts +622 -0
  33. package/pi-extension/src/cognitive-routing-v2/tools.ts +93 -0
  34. package/pi-extension/src/cognitive-routing-v2/types.ts +222 -0
  35. package/pi-extension/src/freeflow-context/tool.ts +5 -0
  36. package/pi-extension/src/index.ts +285 -674
  37. package/pi-extension/src/runtime/runtime-context.ts +75 -14
  38. package/pi-extension/src/session-sources/events.ts +208 -0
  39. package/pi-extension/src/session-sources/read-only-session.ts +170 -0
  40. package/pi-extension/src/session-sources/sources.ts +263 -0
  41. package/pi-extension/src/settings/settings-ui.ts +54 -131
  42. package/pi-extension/tests/cognitive-routing-v2/communication.test.js +484 -0
  43. package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +183 -0
  44. package/pi-extension/tests/cognitive-routing-v2/native.test.js +441 -0
  45. package/pi-extension/tests/cognitive-routing-v2/performance.test.js +87 -0
  46. package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +245 -0
  47. package/pi-extension/tests/cognitive-routing-v2/projection.test.js +241 -0
  48. package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +236 -0
  49. package/pi-extension/tests/cognitive-routing-v2/render.test.js +230 -0
  50. package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +153 -0
  51. package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +521 -0
  52. package/pi-extension/tests/cognitive-routing-v2/state.test.js +275 -0
  53. package/pi-extension/tests/context-virtualization/extension.test.js +16 -0
  54. package/pi-extension/tests/fixtures/routing-native.js +188 -0
  55. package/pi-extension/tests/integration/mode-free-core.test.js +3 -2
  56. package/pi-extension/tests/integration/pi-extension.test.js +154 -37
  57. package/pi-extension/tests/integration/prompt-architecture.test.js +87 -6
  58. package/pi-extension/tests/integration/unaffected-regressions.test.js +77 -10
  59. package/plugin.json +1 -1
  60. package/runtime/prompts/cognitive-routing.md +4 -5
  61. package/runtime/prompts/core.md +51 -45
  62. package/runtime/prompts/interaction-contract.md +5 -5
  63. package/skills/action-selection/SKILL.md +57 -97
  64. package/skills/design-for-depth/SKILL.md +58 -193
  65. package/skills/design-for-depth/references/implementation-decisions.md +76 -0
  66. package/skills/diagnose-failure/SKILL.md +64 -196
  67. package/skills/discuss/SKILL.md +64 -123
  68. package/skills/discuss/references/discussion-continuity.md +7 -3
  69. package/skills/execute-work/SKILL.md +69 -88
  70. package/skills/execute-work/references/execute-work-edges.md +9 -3
  71. package/skills/handoff/SKILL.md +44 -54
  72. package/skills/handoff/references/handoff-templates.md +15 -6
  73. package/skills/review-artifact/SKILL.md +80 -127
  74. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +1 -1
  75. package/skills/review-work/SKILL.md +65 -115
  76. package/skills/review-work/references/independent-work-reviewer-contract.md +1 -1
  77. package/skills/simplify-code/SKILL.md +47 -100
  78. package/skills/track-work/SKILL.md +128 -119
  79. package/skills/track-work/references/working-record-format.md +14 -2
  80. package/skills/verify-work/SKILL.md +58 -62
  81. package/skills/verify-work/references/integration-evidence.md +4 -2
  82. package/skills/verify-work/references/test-design.md +89 -0
  83. package/skills/workflow/SKILL.md +73 -119
  84. package/skills/write-plan/SKILL.md +46 -77
  85. package/skills/write-plan/references/plan-shapes.md +5 -5
  86. package/skills/write-spec/SKILL.md +51 -63
  87. package/skills/write-spec/references/artifact-standards.md +2 -2
  88. package/skills/write-spec/references/decision-records.md +3 -2
  89. package/skills/write-spec/references/spec-shapes.md +15 -0
  90. package/pi-extension/dist/cognitive-routing/commands.js +0 -96
  91. package/pi-extension/dist/cognitive-routing/config.js +0 -232
  92. package/pi-extension/dist/cognitive-routing/controller.js +0 -1292
  93. package/pi-extension/dist/cognitive-routing/history.js +0 -451
  94. package/pi-extension/dist/cognitive-routing/host.js +0 -188
  95. package/pi-extension/dist/cognitive-routing/pi-routing-session.js +0 -414
  96. package/pi-extension/dist/cognitive-routing/pi-session-control.js +0 -320
  97. package/pi-extension/dist/cognitive-routing/runtime.js +0 -43
  98. package/pi-extension/dist/cognitive-routing/tool.js +0 -212
  99. package/pi-extension/dist/cognitive-routing/types.js +0 -6
  100. package/pi-extension/src/cognitive-routing/commands.ts +0 -129
  101. package/pi-extension/src/cognitive-routing/config.ts +0 -303
  102. package/pi-extension/src/cognitive-routing/controller.ts +0 -1628
  103. package/pi-extension/src/cognitive-routing/history.ts +0 -650
  104. package/pi-extension/src/cognitive-routing/host.ts +0 -266
  105. package/pi-extension/src/cognitive-routing/pi-routing-session.ts +0 -538
  106. package/pi-extension/src/cognitive-routing/pi-session-control.ts +0 -444
  107. package/pi-extension/src/cognitive-routing/runtime.ts +0 -57
  108. package/pi-extension/src/cognitive-routing/tool.ts +0 -273
  109. package/pi-extension/src/cognitive-routing/types.ts +0 -89
  110. package/pi-extension/tests/cognitive-routing/commands.test.js +0 -134
  111. package/pi-extension/tests/cognitive-routing/controller.test.js +0 -1128
  112. package/pi-extension/tests/cognitive-routing/extension-lifecycle.test.js +0 -1142
  113. package/pi-extension/tests/cognitive-routing/history.test.js +0 -274
  114. package/pi-extension/tests/cognitive-routing/host-identity.test.js +0 -63
  115. package/pi-extension/tests/cognitive-routing/pi-normal-lifecycle.test.js +0 -434
  116. package/pi-extension/tests/cognitive-routing/pi-session-control.test.js +0 -174
  117. package/pi-extension/tests/cognitive-routing/pi-session-history.test.js +0 -91
  118. package/pi-extension/tests/cognitive-routing/profile-resolution.test.js +0 -279
  119. package/pi-extension/tests/cognitive-routing/tool.test.js +0 -230
  120. package/skills/tdd/SKILL.md +0 -143
  121. package/skills/tdd/references/test-design.md +0 -96
  122. /package/pi-extension/tests/{cognitive-routing/host-fixture.js → fixtures/pi-host.js} +0 -0
@@ -1,274 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import { projectCognitiveRoutingHistory } from "../../dist/cognitive-routing/history.js";
4
-
5
- const standard = { provider: "faux", modelId: "standard", thinkingLevel: "high" };
6
- const reasoning = { provider: "faux", modelId: "reasoning", thinkingLevel: "max" };
7
-
8
- function intent(overrides = {}) {
9
- return {
10
- version: 2,
11
- phase: "prepared",
12
- kind: "profile",
13
- control: "automatic",
14
- source: "agent",
15
- mechanism: "agent-tool",
16
- decisionCorrelationId: "correlation-1",
17
- fromPair: standard,
18
- fromProfile: "standard",
19
- epoch: "epoch-1",
20
- correlationId: "correlation-1",
21
- profile: "reasoning",
22
- target: reasoning,
23
- returnTarget: { provider: "faux", modelId: "return", thinkingLevel: "medium" },
24
- reason: "Need deeper analysis.",
25
- ...overrides,
26
- };
27
- }
28
-
29
- function hostEntry(overrides = {}) {
30
- return {
31
- type: "model_state_change",
32
- id: "state-1",
33
- parentId: "intent-1",
34
- timestamp: "2026-08-23T11:00:00.000Z",
35
- provider: reasoning.provider,
36
- modelId: reasoning.modelId,
37
- thinkingLevel: reasoning.thinkingLevel,
38
- correlationId: "correlation-1",
39
- origin: { source: "piflow", operation: "model-state-control" },
40
- ...overrides,
41
- };
42
- }
43
-
44
- function current(profile = "reasoning", control = "automatic") {
45
- return { profile, control };
46
- }
47
-
48
- test("projects a completed switch from the host representative and captured baseline", () => {
49
- const entries = [
50
- { id: "root", type: "message", parentId: null, timestamp: "2026-08-23T10:59:00.000Z" },
51
- {
52
- id: "intent-1",
53
- type: "custom",
54
- parentId: "root",
55
- timestamp: "2026-08-23T10:59:01.000Z",
56
- customType: "freeflow-cognitive-routing-intent",
57
- data: intent(),
58
- },
59
- hostEntry(),
60
- ];
61
-
62
- const result = projectCognitiveRoutingHistory(entries, {
63
- branchEntries: entries,
64
- current: current(),
65
- });
66
-
67
- assert.deepEqual(result.current, current());
68
- assert.deepEqual(result.summary, {
69
- latestSemanticEventId: "intent:intent-1",
70
- latestCompletedEventId: "intent:intent-1",
71
- unresolvedCount: 0,
72
- anomalyCount: 0,
73
- });
74
- assert.deepEqual(result.events, [
75
- {
76
- id: "intent:intent-1",
77
- timestamp: "2026-08-23T11:00:00.000Z",
78
- jsonlPosition: 2,
79
- entryId: "state-1",
80
- parentId: "intent-1",
81
- branchAnchor: "state-1",
82
- classification: "semantic-switch",
83
- decisionSource: "agent",
84
- mechanism: "agent-tool",
85
- outcome: "completed",
86
- changed: true,
87
- integrity: "valid",
88
- from: "standard",
89
- to: "reasoning",
90
- control: "automatic",
91
- reason: "Need deeper analysis.",
92
- epoch: "epoch-1",
93
- correlationId: "correlation-1",
94
- decisionCorrelationId: "correlation-1",
95
- hostOrigin: { source: "piflow", operation: "model-state-control" },
96
- },
97
- ]);
98
- });
99
-
100
- test("orders completed events by JSONL position and preserves tri-state change semantics", () => {
101
- const entries = [
102
- {
103
- id: "intent-a",
104
- type: "custom",
105
- customType: "freeflow-cognitive-routing-intent",
106
- data: intent({ correlationId: "correlation-a", decisionCorrelationId: "correlation-a" }),
107
- },
108
- hostEntry({ id: "state-a", correlationId: "correlation-a", timestamp: "2026-08-23T11:01:00.000Z" }),
109
- {
110
- id: "intent-b",
111
- type: "custom",
112
- customType: "freeflow-cognitive-routing-intent",
113
- data: intent({
114
- correlationId: "correlation-b",
115
- decisionCorrelationId: "correlation-b",
116
- fromPair: standard,
117
- fromProfile: "standard",
118
- profile: "standard",
119
- target: standard,
120
- }),
121
- },
122
- hostEntry({
123
- id: "state-b",
124
- correlationId: "correlation-b",
125
- timestamp: "not-a-timestamp",
126
- provider: standard.provider,
127
- modelId: standard.modelId,
128
- thinkingLevel: standard.thinkingLevel,
129
- }),
130
- {
131
- id: "intent-c",
132
- type: "custom",
133
- customType: "freeflow-cognitive-routing-intent",
134
- data: intent({
135
- version: 1,
136
- correlationId: "correlation-c",
137
- decisionCorrelationId: undefined,
138
- fromPair: undefined,
139
- fromProfile: undefined,
140
- }),
141
- },
142
- hostEntry({ id: "state-c", correlationId: "correlation-c", timestamp: undefined }),
143
- ];
144
-
145
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
146
-
147
- assert.deepEqual(
148
- result.events.map(({ id, jsonlPosition, changed, timestamp }) => ({ id, jsonlPosition, changed, timestamp })),
149
- [
150
- { id: "intent:intent-c", jsonlPosition: 5, changed: "unknown", timestamp: undefined },
151
- { id: "intent:intent-b", jsonlPosition: 3, changed: false, timestamp: undefined },
152
- { id: "intent:intent-a", jsonlPosition: 1, changed: true, timestamp: "2026-08-23T11:01:00.000Z" },
153
- ],
154
- );
155
- assert.equal(result.summary.latestCompletedEventId, "intent:intent-c");
156
- });
157
-
158
- test("keeps unresolved and anomalous evidence distinct from the anomalies view", () => {
159
- const entries = [
160
- {
161
- id: "intent-unresolved",
162
- type: "custom",
163
- customType: "freeflow-cognitive-routing-intent",
164
- data: intent({ correlationId: "correlation-unresolved", decisionCorrelationId: "correlation-unresolved" }),
165
- },
166
- {
167
- id: "intent-mismatch",
168
- type: "custom",
169
- customType: "freeflow-cognitive-routing-intent",
170
- data: intent({ correlationId: "correlation-mismatch", decisionCorrelationId: "correlation-mismatch" }),
171
- },
172
- hostEntry({
173
- id: "state-mismatch",
174
- correlationId: "correlation-mismatch",
175
- provider: standard.provider,
176
- modelId: standard.modelId,
177
- thinkingLevel: standard.thinkingLevel,
178
- }),
179
- ];
180
-
181
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
182
- assert.equal(result.summary.unresolvedCount, 2);
183
- assert.equal(result.summary.anomalyCount, 1);
184
- assert.deepEqual(
185
- result.events.map(({ id, outcome, integrity, anomalyReason }) => ({ id, outcome, integrity, anomalyReason })),
186
- [
187
- {
188
- id: "intent:intent-mismatch",
189
- outcome: "unresolved",
190
- integrity: "anomaly",
191
- anomalyReason: "host_target_mismatch",
192
- },
193
- { id: "intent:intent-unresolved", outcome: "unresolved", integrity: "unknown", anomalyReason: undefined },
194
- ],
195
- );
196
-
197
- const anomalies = projectCognitiveRoutingHistory(entries, { current: current(), anomaliesOnly: true });
198
- assert.equal(anomalies.summary.unresolvedCount, 2);
199
- assert.equal(anomalies.summary.anomalyCount, 1);
200
- assert.deepEqual(
201
- anomalies.events.map(({ id }) => id),
202
- ["intent:intent-mismatch"],
203
- );
204
- });
205
-
206
- test("projects control-only entries without fabricating a profile transition", () => {
207
- const entries = [
208
- {
209
- id: "control-1",
210
- type: "custom",
211
- customType: "freeflow-cognitive-routing-control",
212
- data: {
213
- version: 2,
214
- control: "automatic",
215
- source: "user",
216
- mechanism: "profile-command",
217
- epoch: "epoch-1",
218
- reason: "manual hold release",
219
- },
220
- },
221
- ];
222
-
223
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
224
-
225
- assert.deepEqual(result.summary, {
226
- unresolvedCount: 0,
227
- anomalyCount: 0,
228
- });
229
- assert.deepEqual(result.events, [
230
- {
231
- id: "control:control-1",
232
- jsonlPosition: 0,
233
- entryId: "control-1",
234
- branchAnchor: "control-1",
235
- classification: "control-only",
236
- decisionSource: "user",
237
- mechanism: "profile-command",
238
- outcome: "completed",
239
- changed: false,
240
- integrity: "valid",
241
- control: "automatic",
242
- reason: "manual hold release",
243
- epoch: "epoch-1",
244
- },
245
- ]);
246
- });
247
-
248
- test("latest completed transition ignores later control-only entries", () => {
249
- const entries = [
250
- {
251
- id: "intent-completed",
252
- type: "custom",
253
- customType: "freeflow-cognitive-routing-intent",
254
- data: intent(),
255
- },
256
- hostEntry({ id: "state-completed" }),
257
- {
258
- id: "control-later",
259
- type: "custom",
260
- customType: "freeflow-cognitive-routing-control",
261
- data: {
262
- version: 2,
263
- control: "automatic",
264
- source: "user",
265
- mechanism: "profile-command",
266
- epoch: "epoch-1",
267
- },
268
- },
269
- ];
270
-
271
- const result = projectCognitiveRoutingHistory(entries, { current: current() });
272
-
273
- assert.equal(result.summary.latestCompletedEventId, "intent:intent-completed");
274
- });
@@ -1,63 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import freeflowExtension from "../../dist/index.js";
4
-
5
- const PIFLOW_HOST = Object.freeze({
6
- distribution: Object.freeze({ id: "piflow", version: "test" }),
7
- capabilities: Object.freeze({ sessionModelStateControl: 1 }),
8
- });
9
-
10
- function loadExtension(host) {
11
- const tools = [];
12
- const commands = [];
13
- const handlers = new Map();
14
- const pi = {
15
- host,
16
- registerTool(tool) {
17
- tools.push(tool);
18
- },
19
- registerCommand(name, definition) {
20
- commands.push({ name, definition });
21
- },
22
- on(event, handler) {
23
- handlers.set(event, handler);
24
- },
25
- };
26
- freeflowExtension(pi);
27
- return { tools, commands, handlers };
28
- }
29
-
30
- test("does not activate PiFlow behavior from FREEFLOW_RUNTIME without host metadata", () => {
31
- const previousRuntime = process.env.FREEFLOW_RUNTIME;
32
- process.env.FREEFLOW_RUNTIME = "piflow";
33
- try {
34
- const { tools, commands } = loadExtension(undefined);
35
- assert.equal(
36
- tools.some((tool) => tool.name === "freeflow_switch_profile"),
37
- false,
38
- );
39
- const freeflowCommand = commands.find((command) => command.name === "freeflow");
40
- assert.ok(freeflowCommand);
41
- assert.equal(
42
- freeflowCommand.definition.getArgumentCompletions("").some((item) => item.value === "profile"),
43
- false,
44
- );
45
- } finally {
46
- if (previousRuntime === undefined) delete process.env.FREEFLOW_RUNTIME;
47
- else process.env.FREEFLOW_RUNTIME = previousRuntime;
48
- }
49
- });
50
-
51
- test("activates PiFlow behavior only with the complete host descriptor", () => {
52
- const { tools, commands } = loadExtension(PIFLOW_HOST);
53
- assert.equal(
54
- tools.some((tool) => tool.name === "freeflow_switch_profile"),
55
- true,
56
- );
57
- const freeflowCommand = commands.find((command) => command.name === "freeflow");
58
- assert.ok(freeflowCommand);
59
- assert.equal(
60
- freeflowCommand.definition.getArgumentCompletions("").some((item) => item.value === "profile"),
61
- true,
62
- );
63
- });