@crouton-kit/crouter 0.3.16 → 0.3.18

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 (104) hide show
  1. package/dist/builtin-personas/design/{base.md → PERSONA.md} +4 -0
  2. package/dist/builtin-personas/developer/{base.md → PERSONA.md} +4 -0
  3. package/dist/builtin-personas/explore/{base.md → PERSONA.md} +4 -0
  4. package/dist/builtin-personas/general/{base.md → PERSONA.md} +4 -0
  5. package/dist/builtin-personas/orchestration-kernel.md +6 -6
  6. package/dist/builtin-personas/plan/{base.md → PERSONA.md} +5 -1
  7. package/dist/builtin-personas/plan/reviewers/architecture-fit/{base.md → PERSONA.md} +1 -1
  8. package/dist/builtin-personas/plan/reviewers/code-smells/{base.md → PERSONA.md} +1 -1
  9. package/dist/builtin-personas/plan/reviewers/pattern-consistency/{base.md → PERSONA.md} +1 -1
  10. package/dist/builtin-personas/plan/reviewers/requirements-coverage/{base.md → PERSONA.md} +1 -1
  11. package/dist/builtin-personas/plan/reviewers/security/{base.md → PERSONA.md} +1 -1
  12. package/dist/builtin-personas/review/{base.md → PERSONA.md} +4 -0
  13. package/dist/builtin-personas/spec/{base.md → PERSONA.md} +5 -1
  14. package/dist/builtin-skills/skills/crouter-development/personas/SKILL.md +24 -14
  15. package/dist/builtin-skills/skills/crouter-development/personas/base-prompt/SKILL.md +4 -4
  16. package/dist/commands/canvas-browse.d.ts +2 -0
  17. package/dist/commands/canvas-browse.js +45 -0
  18. package/dist/commands/canvas-prune.js +11 -2
  19. package/dist/commands/canvas.js +3 -2
  20. package/dist/commands/daemon.js +1 -1
  21. package/dist/commands/human/prompts.js +3 -9
  22. package/dist/commands/human/shared.d.ts +26 -1
  23. package/dist/commands/human/shared.js +48 -10
  24. package/dist/commands/node.js +66 -4
  25. package/dist/commands/skill/author.js +2 -2
  26. package/dist/core/__tests__/cascade-close.test.js +199 -0
  27. package/dist/core/__tests__/daemon-boot.test.js +7 -0
  28. package/dist/core/__tests__/daemon-liveness.test.js +59 -4
  29. package/dist/core/__tests__/dead-pane-regression.test.js +151 -0
  30. package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +2 -0
  31. package/dist/core/__tests__/fixtures/fake-pi-host.js +301 -0
  32. package/dist/core/__tests__/flagship-lifecycle.test.js +273 -0
  33. package/dist/core/__tests__/grace-clock.test.d.ts +1 -0
  34. package/dist/core/__tests__/grace-clock.test.js +115 -0
  35. package/dist/core/__tests__/helpers/harness.d.ts +78 -0
  36. package/dist/core/__tests__/helpers/harness.js +406 -0
  37. package/dist/core/__tests__/human-surface-target.test.d.ts +1 -0
  38. package/dist/core/__tests__/human-surface-target.test.js +98 -0
  39. package/dist/core/__tests__/lifecycle.test.js +6 -13
  40. package/dist/core/__tests__/live-mutation.test.d.ts +1 -0
  41. package/dist/core/__tests__/live-mutation.test.js +341 -0
  42. package/dist/core/__tests__/persona-subkind.test.js +18 -15
  43. package/dist/core/__tests__/placement-focus.test.js +53 -15
  44. package/dist/core/__tests__/relaunch.test.js +12 -12
  45. package/dist/core/__tests__/reset.test.js +11 -6
  46. package/dist/core/__tests__/spike-harness.test.d.ts +1 -0
  47. package/dist/core/__tests__/spike-harness.test.js +241 -0
  48. package/dist/core/__tests__/subscription-delivery.test.d.ts +1 -0
  49. package/dist/core/__tests__/subscription-delivery.test.js +233 -0
  50. package/dist/core/canvas/browse/__tests__/model.test.d.ts +1 -0
  51. package/dist/core/canvas/browse/__tests__/model.test.js +142 -0
  52. package/dist/core/canvas/browse/__tests__/render.test.d.ts +1 -0
  53. package/dist/core/canvas/browse/__tests__/render.test.js +102 -0
  54. package/dist/core/canvas/browse/app.d.ts +4 -0
  55. package/dist/core/canvas/browse/app.js +349 -0
  56. package/dist/core/canvas/browse/model.d.ts +97 -0
  57. package/dist/core/canvas/browse/model.js +258 -0
  58. package/dist/core/canvas/browse/render.d.ts +41 -0
  59. package/dist/core/canvas/browse/render.js +387 -0
  60. package/dist/core/canvas/browse/terminal.d.ts +23 -0
  61. package/dist/core/canvas/browse/terminal.js +100 -0
  62. package/dist/core/canvas/canvas.d.ts +9 -2
  63. package/dist/core/canvas/canvas.js +41 -3
  64. package/dist/core/canvas/paths.d.ts +4 -1
  65. package/dist/core/canvas/paths.js +10 -4
  66. package/dist/core/canvas/render.d.ts +10 -0
  67. package/dist/core/canvas/render.js +25 -1
  68. package/dist/core/canvas/types.js +2 -2
  69. package/dist/core/feed/inbox.d.ts +0 -3
  70. package/dist/core/feed/inbox.js +1 -5
  71. package/dist/core/help.d.ts +6 -0
  72. package/dist/core/help.js +7 -0
  73. package/dist/core/personas/index.d.ts +4 -3
  74. package/dist/core/personas/index.js +3 -2
  75. package/dist/core/personas/loader.d.ts +34 -16
  76. package/dist/core/personas/loader.js +102 -29
  77. package/dist/core/personas/resolve.d.ts +4 -4
  78. package/dist/core/personas/resolve.js +16 -14
  79. package/dist/core/runtime/busy.d.ts +8 -0
  80. package/dist/core/runtime/busy.js +46 -0
  81. package/dist/core/runtime/lifecycle.d.ts +1 -1
  82. package/dist/core/runtime/lifecycle.js +12 -4
  83. package/dist/core/runtime/naming.d.ts +3 -3
  84. package/dist/core/runtime/naming.js +6 -6
  85. package/dist/core/runtime/placement.d.ts +32 -5
  86. package/dist/core/runtime/placement.js +81 -14
  87. package/dist/core/runtime/reset.d.ts +11 -8
  88. package/dist/core/runtime/reset.js +23 -18
  89. package/dist/core/spawn.d.ts +20 -1
  90. package/dist/core/spawn.js +52 -5
  91. package/dist/daemon/crtrd.js +43 -21
  92. package/dist/pi-extensions/canvas-nav.js +106 -55
  93. package/dist/pi-extensions/canvas-resume.d.ts +0 -1
  94. package/dist/pi-extensions/canvas-resume.js +35 -126
  95. package/dist/pi-extensions/canvas-stophook.d.ts +1 -1
  96. package/dist/pi-extensions/canvas-stophook.js +16 -0
  97. package/dist/prompts/skill.js +6 -1
  98. package/package.json +1 -1
  99. package/dist/commands/__tests__/skill.test.js +0 -290
  100. package/dist/core/__tests__/pkg.test.js +0 -218
  101. package/dist/core/__tests__/sys.test.js +0 -208
  102. /package/dist/{commands/__tests__/skill.test.d.ts → core/__tests__/cascade-close.test.d.ts} +0 -0
  103. /package/dist/core/__tests__/{pkg.test.d.ts → dead-pane-regression.test.d.ts} +0 -0
  104. /package/dist/core/__tests__/{sys.test.d.ts → flagship-lifecycle.test.d.ts} +0 -0
@@ -1,208 +0,0 @@
1
- // Tests for the sys subtree after argv migration.
2
- // Exercises: positional key, --value coercion, enum validation (--scope, --target),
3
- // bool presence flags (--fix, --remote, --check).
4
- // Run with: node --import tsx/esm --test 'src/core/__tests__/**/*.test.ts'
5
- import { test, describe } from 'node:test';
6
- import assert from 'node:assert/strict';
7
- import { parseArgv } from '../command.js';
8
- // ---------------------------------------------------------------------------
9
- // Shared param schemas (mirror sys.ts definitions)
10
- // ---------------------------------------------------------------------------
11
- const configGetParams = [
12
- { kind: 'positional', name: 'key', type: 'string', required: true, constraint: 'Dotted key path.' },
13
- { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project', 'all'], required: false, constraint: 'Scope.' },
14
- ];
15
- const configSetParams = [
16
- { kind: 'positional', name: 'key', type: 'string', required: true, constraint: 'Dotted key path.' },
17
- { kind: 'flag', name: 'value', type: 'string', required: true, constraint: 'Value to write.' },
18
- { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope.' },
19
- ];
20
- const configPathParams = [
21
- { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project', 'all'], required: false, constraint: 'Scope.' },
22
- ];
23
- const sysDoctorParams = [
24
- { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope.' },
25
- { kind: 'flag', name: 'fix', type: 'bool', required: false, constraint: '' },
26
- { kind: 'flag', name: 'remote', type: 'bool', required: false, constraint: '' },
27
- ];
28
- const sysUpdateParams = [
29
- { kind: 'flag', name: 'target', type: 'enum', choices: ['self', 'content', 'all'], required: false, constraint: '' },
30
- { kind: 'flag', name: 'check', type: 'bool', required: false, constraint: '' },
31
- ];
32
- // ---------------------------------------------------------------------------
33
- // sys config get
34
- // ---------------------------------------------------------------------------
35
- describe('sys config get: argv parsing', () => {
36
- test('positional key is required — missing throws', async () => {
37
- await assert.rejects(() => parseArgv(configGetParams, []), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
38
- });
39
- test('positional key is captured', async () => {
40
- const result = await parseArgv(configGetParams, ['auto_update.crtr']);
41
- assert.equal(result['key'], 'auto_update.crtr');
42
- });
43
- test('--scope valid enum passes', async () => {
44
- const result = await parseArgv(configGetParams, ['some.key', '--scope', 'project']);
45
- assert.equal(result['scope'], 'project');
46
- });
47
- test('--scope "all" is valid', async () => {
48
- const result = await parseArgv(configGetParams, ['some.key', '--scope', 'all']);
49
- assert.equal(result['scope'], 'all');
50
- });
51
- test('--scope invalid enum throws', async () => {
52
- await assert.rejects(() => parseArgv(configGetParams, ['some.key', '--scope', 'global']), (err) => { assert.match(err.message, /must be one of/); return true; });
53
- });
54
- test('--scope absent leaves field undefined', async () => {
55
- const result = await parseArgv(configGetParams, ['some.key']);
56
- assert.equal(result['scope'], undefined);
57
- });
58
- });
59
- // ---------------------------------------------------------------------------
60
- // sys config set — value coercion
61
- // ---------------------------------------------------------------------------
62
- describe('sys config set: --value coercion', () => {
63
- test('string value passed through unchanged', async () => {
64
- const result = await parseArgv(configSetParams, ['some.key', '--value', 'hello']);
65
- assert.equal(result['value'], 'hello');
66
- });
67
- test('"true" string arrives as string (handler coerces)', async () => {
68
- const result = await parseArgv(configSetParams, ['some.key', '--value', 'true']);
69
- // The argv layer keeps it as a string; the handler calls parseConfigValue
70
- assert.equal(result['value'], 'true');
71
- });
72
- test('"false" string arrives as string', async () => {
73
- const result = await parseArgv(configSetParams, ['some.key', '--value', 'false']);
74
- assert.equal(result['value'], 'false');
75
- });
76
- test('integer string arrives as string', async () => {
77
- const result = await parseArgv(configSetParams, ['some.key', '--value', '42']);
78
- assert.equal(result['value'], '42');
79
- });
80
- test('--value is required — missing throws', async () => {
81
- await assert.rejects(() => parseArgv(configSetParams, ['some.key']), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
82
- });
83
- test('key positional is required — missing throws', async () => {
84
- await assert.rejects(() => parseArgv(configSetParams, ['--value', 'x']), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
85
- });
86
- test('--scope valid enum passes', async () => {
87
- const result = await parseArgv(configSetParams, ['some.key', '--value', 'x', '--scope', 'user']);
88
- assert.equal(result['scope'], 'user');
89
- });
90
- test('--scope "all" rejected (not in choices)', async () => {
91
- await assert.rejects(() => parseArgv(configSetParams, ['some.key', '--value', 'x', '--scope', 'all']), (err) => { assert.match(err.message, /must be one of/); return true; });
92
- });
93
- });
94
- // ---------------------------------------------------------------------------
95
- // parseConfigValue coercion (via a thin harness)
96
- // ---------------------------------------------------------------------------
97
- // We re-implement parseConfigValue's logic inline here to keep the test
98
- // self-contained (it's a private helper in sys.ts).
99
- function parseConfigValue(raw) {
100
- if (raw === 'true')
101
- return true;
102
- if (raw === 'false')
103
- return false;
104
- if (/^-?\d+$/.test(raw))
105
- return parseInt(raw, 10);
106
- return raw;
107
- }
108
- describe('parseConfigValue coercion', () => {
109
- test('"true" → boolean true', () => { assert.strictEqual(parseConfigValue('true'), true); });
110
- test('"false" → boolean false', () => { assert.strictEqual(parseConfigValue('false'), false); });
111
- test('"42" → number 42', () => { assert.strictEqual(parseConfigValue('42'), 42); });
112
- test('"-1" → number -1', () => { assert.strictEqual(parseConfigValue('-1'), -1); });
113
- test('"notify" → string', () => { assert.strictEqual(parseConfigValue('notify'), 'notify'); });
114
- test('"3.14" → string (non-integer float stays string)', () => { assert.strictEqual(parseConfigValue('3.14'), '3.14'); });
115
- test('empty string → string', () => { assert.strictEqual(parseConfigValue(''), ''); });
116
- });
117
- // ---------------------------------------------------------------------------
118
- // sys config path
119
- // ---------------------------------------------------------------------------
120
- describe('sys config path: argv parsing', () => {
121
- test('no args parses cleanly', async () => {
122
- const result = await parseArgv(configPathParams, []);
123
- assert.equal(result['scope'], undefined);
124
- });
125
- test('--scope user', async () => {
126
- const result = await parseArgv(configPathParams, ['--scope', 'user']);
127
- assert.equal(result['scope'], 'user');
128
- });
129
- test('--scope all', async () => {
130
- const result = await parseArgv(configPathParams, ['--scope', 'all']);
131
- assert.equal(result['scope'], 'all');
132
- });
133
- test('invalid --scope throws', async () => {
134
- await assert.rejects(() => parseArgv(configPathParams, ['--scope', 'bogus']), (err) => { assert.match(err.message, /must be one of/); return true; });
135
- });
136
- });
137
- // ---------------------------------------------------------------------------
138
- // sys doctor — bool presence flags
139
- // ---------------------------------------------------------------------------
140
- describe('sys doctor: bool presence flags', () => {
141
- test('no args: fix=false, remote=false, scope=undefined', async () => {
142
- const result = await parseArgv(sysDoctorParams, []);
143
- assert.equal(result['fix'], false);
144
- assert.equal(result['remote'], false);
145
- assert.equal(result['scope'], undefined);
146
- });
147
- test('--fix sets fix=true', async () => {
148
- const result = await parseArgv(sysDoctorParams, ['--fix']);
149
- assert.equal(result['fix'], true);
150
- });
151
- test('--remote sets remote=true', async () => {
152
- const result = await parseArgv(sysDoctorParams, ['--remote']);
153
- assert.equal(result['remote'], true);
154
- });
155
- test('--fix --remote both set', async () => {
156
- const result = await parseArgv(sysDoctorParams, ['--fix', '--remote']);
157
- assert.equal(result['fix'], true);
158
- assert.equal(result['remote'], true);
159
- });
160
- test('--scope user is valid', async () => {
161
- const result = await parseArgv(sysDoctorParams, ['--scope', 'user']);
162
- assert.equal(result['scope'], 'user');
163
- });
164
- test('--scope project is valid', async () => {
165
- const result = await parseArgv(sysDoctorParams, ['--scope', 'project']);
166
- assert.equal(result['scope'], 'project');
167
- });
168
- test('--scope all rejected (not in choices for doctor)', async () => {
169
- await assert.rejects(() => parseArgv(sysDoctorParams, ['--scope', 'all']), (err) => { assert.match(err.message, /must be one of/); return true; });
170
- });
171
- test('--fix=true rejected (bool takes no value)', async () => {
172
- await assert.rejects(() => parseArgv(sysDoctorParams, ['--fix=true']), (err) => { assert.match(err.message, /takes no value/); return true; });
173
- });
174
- });
175
- // ---------------------------------------------------------------------------
176
- // sys update — enum target + --check bool
177
- // ---------------------------------------------------------------------------
178
- describe('sys update: argv parsing', () => {
179
- test('no args: check=false, target=undefined', async () => {
180
- const result = await parseArgv(sysUpdateParams, []);
181
- assert.equal(result['check'], false);
182
- assert.equal(result['target'], undefined);
183
- });
184
- test('--check sets check=true', async () => {
185
- const result = await parseArgv(sysUpdateParams, ['--check']);
186
- assert.equal(result['check'], true);
187
- });
188
- test('--target self is valid', async () => {
189
- const result = await parseArgv(sysUpdateParams, ['--target', 'self']);
190
- assert.equal(result['target'], 'self');
191
- });
192
- test('--target content is valid', async () => {
193
- const result = await parseArgv(sysUpdateParams, ['--target', 'content']);
194
- assert.equal(result['target'], 'content');
195
- });
196
- test('--target all is valid', async () => {
197
- const result = await parseArgv(sysUpdateParams, ['--target', 'all']);
198
- assert.equal(result['target'], 'all');
199
- });
200
- test('--target bogus throws invalid_type', async () => {
201
- await assert.rejects(() => parseArgv(sysUpdateParams, ['--target', 'bogus']), (err) => { assert.match(err.message, /must be one of/); return true; });
202
- });
203
- test('--check --target self combined', async () => {
204
- const result = await parseArgv(sysUpdateParams, ['--check', '--target', 'self']);
205
- assert.equal(result['check'], true);
206
- assert.equal(result['target'], 'self');
207
- });
208
- });