@planu/cli 0.81.1 → 0.83.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 (86) hide show
  1. package/dist/config/workers-registry.json +13 -0
  2. package/dist/engine/bdd-formatter.d.ts +22 -0
  3. package/dist/engine/bdd-formatter.d.ts.map +1 -0
  4. package/dist/engine/bdd-formatter.js +182 -0
  5. package/dist/engine/bdd-formatter.js.map +1 -0
  6. package/dist/engine/validator/dor-dod.d.ts.map +1 -1
  7. package/dist/engine/validator/dor-dod.js +33 -0
  8. package/dist/engine/validator/dor-dod.js.map +1 -1
  9. package/dist/engine/worker-config-loader.d.ts +48 -0
  10. package/dist/engine/worker-config-loader.d.ts.map +1 -0
  11. package/dist/engine/worker-config-loader.js +167 -0
  12. package/dist/engine/worker-config-loader.js.map +1 -0
  13. package/dist/engine/workers/handlers/auto-drift.d.ts +13 -0
  14. package/dist/engine/workers/handlers/auto-drift.d.ts.map +1 -0
  15. package/dist/engine/workers/handlers/auto-drift.js +178 -0
  16. package/dist/engine/workers/handlers/auto-drift.js.map +1 -0
  17. package/dist/engine/workers/index.d.ts +4 -0
  18. package/dist/engine/workers/index.d.ts.map +1 -1
  19. package/dist/engine/workers/index.js +3 -0
  20. package/dist/engine/workers/index.js.map +1 -1
  21. package/dist/engine/workers/worker-crash-recovery.d.ts +30 -0
  22. package/dist/engine/workers/worker-crash-recovery.d.ts.map +1 -0
  23. package/dist/engine/workers/worker-crash-recovery.js +115 -0
  24. package/dist/engine/workers/worker-crash-recovery.js.map +1 -0
  25. package/dist/engine/workers/worker-engine.d.ts +1 -1
  26. package/dist/engine/workers/worker-engine.d.ts.map +1 -1
  27. package/dist/engine/workers/worker-engine.js +13 -1
  28. package/dist/engine/workers/worker-engine.js.map +1 -1
  29. package/dist/engine/workers/worker-heartbeat.d.ts +34 -0
  30. package/dist/engine/workers/worker-heartbeat.d.ts.map +1 -0
  31. package/dist/engine/workers/worker-heartbeat.js +84 -0
  32. package/dist/engine/workers/worker-heartbeat.js.map +1 -0
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/storage/drift-cache-store.d.ts +40 -0
  36. package/dist/storage/drift-cache-store.d.ts.map +1 -0
  37. package/dist/storage/drift-cache-store.js +103 -0
  38. package/dist/storage/drift-cache-store.js.map +1 -0
  39. package/dist/storage/worker-metrics-store.d.ts +20 -0
  40. package/dist/storage/worker-metrics-store.d.ts.map +1 -0
  41. package/dist/storage/worker-metrics-store.js +103 -0
  42. package/dist/storage/worker-metrics-store.js.map +1 -0
  43. package/dist/tools/create-spec-hu/hu-body-generators.d.ts +2 -1
  44. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  45. package/dist/tools/create-spec-hu/hu-body-generators.js +16 -8
  46. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  47. package/dist/tools/create-spec-hu.d.ts +2 -1
  48. package/dist/tools/create-spec-hu.d.ts.map +1 -1
  49. package/dist/tools/create-spec-hu.js +3 -2
  50. package/dist/tools/create-spec-hu.js.map +1 -1
  51. package/dist/tools/create-spec.js +2 -2
  52. package/dist/tools/create-spec.js.map +1 -1
  53. package/dist/tools/git/github-issues-ops.d.ts +29 -0
  54. package/dist/tools/git/github-issues-ops.d.ts.map +1 -0
  55. package/dist/tools/git/github-issues-ops.js +349 -0
  56. package/dist/tools/git/github-issues-ops.js.map +1 -0
  57. package/dist/tools/manage-git.d.ts.map +1 -1
  58. package/dist/tools/manage-git.js +20 -0
  59. package/dist/tools/manage-git.js.map +1 -1
  60. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  61. package/dist/tools/register-spec-tools/core-spec-tools.js +6 -0
  62. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  63. package/dist/tools/safe-handler.d.ts.map +1 -1
  64. package/dist/tools/safe-handler.js +73 -2
  65. package/dist/tools/safe-handler.js.map +1 -1
  66. package/dist/tools/schemas/github.d.ts +1 -1
  67. package/dist/tools/schemas/lifecycle.d.ts +3 -0
  68. package/dist/tools/schemas/lifecycle.d.ts.map +1 -1
  69. package/dist/tools/schemas/lifecycle.js +4 -1
  70. package/dist/tools/schemas/lifecycle.js.map +1 -1
  71. package/dist/tools/update-status.d.ts.map +1 -1
  72. package/dist/tools/update-status.js +4 -2
  73. package/dist/tools/update-status.js.map +1 -1
  74. package/dist/types/common/tech-enums.d.ts +1 -1
  75. package/dist/types/common/tech-enums.d.ts.map +1 -1
  76. package/dist/types/git.d.ts +48 -0
  77. package/dist/types/git.d.ts.map +1 -1
  78. package/dist/types/spec/inputs.d.ts +2 -0
  79. package/dist/types/spec/inputs.d.ts.map +1 -1
  80. package/dist/types/workers.d.ts +36 -0
  81. package/dist/types/workers.d.ts.map +1 -1
  82. package/package.json +1 -1
  83. package/src/config/workers-registry.json +13 -0
  84. package/src/i18n/messages/en.json +14 -0
  85. package/src/i18n/messages/es.json +14 -0
  86. package/src/i18n/messages/pt.json +14 -0
@@ -95,6 +95,19 @@
95
95
  "cooldownMs": 60000,
96
96
  "enabled": true,
97
97
  "tier": "free"
98
+ },
99
+ {
100
+ "name": "auto-drift",
101
+ "description": "Detect spec-code drift on file changes and cache the result for banner display on next tool call",
102
+ "trigger": {
103
+ "type": "file-change",
104
+ "patterns": ["src/**/*.ts", "lib/**/*", "app/**/*"]
105
+ },
106
+ "handler": "handlers/auto-drift",
107
+ "priority": 6,
108
+ "cooldownMs": 60000,
109
+ "enabled": true,
110
+ "tier": "pro"
98
111
  }
99
112
  ]
100
113
  }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Transform an array of plain-text or checkbox acceptance criteria into
3
+ * Gherkin Given-When-Then scenario blocks.
4
+ *
5
+ * Each non-empty criterion produces a separate scenario block prefixed with
6
+ * `**Scenario N:**`. Empty lines are preserved as separators between blocks.
7
+ *
8
+ * @example
9
+ * formatAcAsBDD(['- [ ] User can create a spec'])
10
+ * // Returns:
11
+ * // '**Scenario 1:**\n' +
12
+ * // 'Given the system is properly initialized\n' +
13
+ * // 'When the user calls create_spec with the required parameters\n' +
14
+ * // 'Then the expected outcome matches the acceptance criterion'
15
+ */
16
+ export declare function formatAcAsBDD(criteria: string[]): string;
17
+ /**
18
+ * Convert an array of Gherkin scenario-block strings into individual lines
19
+ * suitable for spreading into the spec.md body array.
20
+ */
21
+ export declare function formatAcAsBDDLines(criteria: string[]): string[];
22
+ //# sourceMappingURL=bdd-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bdd-formatter.d.ts","sourceRoot":"","sources":["../../src/engine/bdd-formatter.ts"],"names":[],"mappings":"AAuJA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA4BxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAM/D"}
@@ -0,0 +1,182 @@
1
+ // engine/bdd-formatter.ts — Format acceptance criteria as Gherkin Given-When-Then (SPEC-224)
2
+ //
3
+ // Transforms plain-text or checkbox AC lines into BDD Gherkin scenarios.
4
+ // Each input criterion produces one scenario block with Given/When/Then clauses.
5
+ /**
6
+ * Format a single acceptance criterion as a Gherkin scenario block.
7
+ *
8
+ * Strategy:
9
+ * - If the text already starts with "Given", pass it through as-is.
10
+ * - Otherwise, synthesize Given/When/Then from the criterion text.
11
+ *
12
+ * The synthesis uses keyword detection (action verbs, conditional words) to
13
+ * produce plausible clauses without any external dependencies.
14
+ */
15
+ function formatSingleAcAsBDD(criterion) {
16
+ // Strip leading `- [ ]`, `- [x]`, `- `, or `* ` markers
17
+ const clean = criterion.replace(/^-\s*\[[ x]\]\s*|-\s*|\*\s*/i, '').trim();
18
+ if (!clean) {
19
+ return '';
20
+ }
21
+ // Already a Gherkin block — pass through
22
+ if (/^Given\b/i.test(clean)) {
23
+ return clean;
24
+ }
25
+ return buildGherkinScenario(clean);
26
+ }
27
+ /**
28
+ * Derive a Gherkin scenario from a plain-text acceptance criterion.
29
+ *
30
+ * Heuristic rules (in priority order):
31
+ * 1. Criterion starts with "When" → already a partial scenario; wrap it.
32
+ * 2. Criterion starts with "Then" → already a partial scenario; wrap it.
33
+ * 3. Criterion contains "when" (mid-sentence) → split on "when".
34
+ * 4. Default: generate a generic scenario based on the criterion text.
35
+ */
36
+ function buildGherkinScenario(text) {
37
+ // Case: starts with "When …"
38
+ if (/^When\b/i.test(text)) {
39
+ return `Given the system is in a valid state\n${text}\nThen the expected outcome is achieved`;
40
+ }
41
+ // Case: starts with "Then …"
42
+ if (/^Then\b/i.test(text)) {
43
+ return `Given the preconditions are met\nWhen the action is performed\n${text}`;
44
+ }
45
+ // Case: sentence contains " when " — split into context + action
46
+ const whenIdx = text.search(/\bwhen\b/i);
47
+ if (whenIdx !== -1) {
48
+ const context = text.slice(0, whenIdx).trim();
49
+ const action = text.slice(whenIdx).trim();
50
+ const given = deriveGivenFromContext(context);
51
+ const then = deriveOutcome(context);
52
+ return `Given ${given}\n${capitalizeFirst(action)}\nThen ${then}`;
53
+ }
54
+ // Default: use the criterion as the "Then" assertion
55
+ const given = 'the system is properly initialized';
56
+ const when = deriveActionFromText(text);
57
+ const then = deriveOutcome(text);
58
+ return `Given ${given}\nWhen ${when}\nThen ${then}`;
59
+ }
60
+ /** Extract a "Given" clause from a context phrase (text before "when"). */
61
+ function deriveGivenFromContext(context) {
62
+ const lower = context.toLowerCase();
63
+ // Patterns like "the user is logged in", "a spec exists", etc.
64
+ if (/\buser\b/.test(lower)) {
65
+ return 'the user has an active session';
66
+ }
67
+ if (/\bspec\b|\bproject\b/.test(lower)) {
68
+ return 'the project has been initialized with init_project';
69
+ }
70
+ if (/\btoken\b|\bauth\b|\bpermission\b/.test(lower)) {
71
+ return 'the user has valid authentication credentials';
72
+ }
73
+ return context.length > 0 ? context : 'the system is in a valid state';
74
+ }
75
+ /** Derive a "When" action clause from the criterion text. */
76
+ function deriveActionFromText(text) {
77
+ const lower = text.toLowerCase();
78
+ if (/\bcreate\b|\bcreating\b/.test(lower)) {
79
+ return 'the user calls create_spec with the required parameters';
80
+ }
81
+ if (/\bupdate\b|\bupdating\b|\bmodif/.test(lower)) {
82
+ return 'the user updates the relevant resource';
83
+ }
84
+ if (/\bdelete\b|\bremov/.test(lower)) {
85
+ return 'the user deletes the resource';
86
+ }
87
+ if (/\bvalidat/.test(lower)) {
88
+ return 'validation is triggered on the input';
89
+ }
90
+ if (/\bgenerat/.test(lower)) {
91
+ return 'the generation process is invoked';
92
+ }
93
+ if (/\blist\b|\bview\b|\bshow\b|\bdisplay\b/.test(lower)) {
94
+ return 'the user requests the resource listing';
95
+ }
96
+ if (/\bcall\b|\binvok/.test(lower)) {
97
+ return 'the operation is called with valid parameters';
98
+ }
99
+ // Generic fallback
100
+ return 'the operation is performed';
101
+ }
102
+ /** Derive a "Then" outcome clause from the criterion text. */
103
+ function deriveOutcome(text) {
104
+ const lower = text.toLowerCase();
105
+ if (/\berror\b|\bfail\b/.test(lower)) {
106
+ return 'a descriptive error is returned without crashing';
107
+ }
108
+ if (/\bsuccessful\b|\bsuccess\b|\bcomplete/.test(lower)) {
109
+ return 'the operation completes successfully and returns the expected result';
110
+ }
111
+ if (/\bsaved\b|\bpersist\b|\bstored\b/.test(lower)) {
112
+ return 'the data is persisted correctly and retrievable';
113
+ }
114
+ if (/\bvisible\b|\bdisplay\b|\brender\b|\bshow\b/.test(lower)) {
115
+ return 'the correct data is rendered in the UI';
116
+ }
117
+ if (/\btest\b|\bcoverage\b/.test(lower)) {
118
+ return 'all tests pass with the required coverage threshold';
119
+ }
120
+ /* v8 ignore next 3 -- "no error/zero error" always matches \berror\b on line 121 first */
121
+ if (/\bno\s+error\b|\bzero\s+error/.test(lower)) {
122
+ return 'the operation completes with zero errors or warnings';
123
+ }
124
+ return 'the expected outcome matches the acceptance criterion';
125
+ }
126
+ function capitalizeFirst(s) {
127
+ return s.charAt(0).toUpperCase() + s.slice(1);
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Public API
131
+ // ---------------------------------------------------------------------------
132
+ /**
133
+ * Transform an array of plain-text or checkbox acceptance criteria into
134
+ * Gherkin Given-When-Then scenario blocks.
135
+ *
136
+ * Each non-empty criterion produces a separate scenario block prefixed with
137
+ * `**Scenario N:**`. Empty lines are preserved as separators between blocks.
138
+ *
139
+ * @example
140
+ * formatAcAsBDD(['- [ ] User can create a spec'])
141
+ * // Returns:
142
+ * // '**Scenario 1:**\n' +
143
+ * // 'Given the system is properly initialized\n' +
144
+ * // 'When the user calls create_spec with the required parameters\n' +
145
+ * // 'Then the expected outcome matches the acceptance criterion'
146
+ */
147
+ export function formatAcAsBDD(criteria) {
148
+ if (criteria.length === 0) {
149
+ return '';
150
+ }
151
+ const scenarios = [];
152
+ let scenarioIndex = 0;
153
+ for (const criterion of criteria) {
154
+ const trimmed = criterion.trim();
155
+ if (!trimmed) {
156
+ // Preserve blank separators
157
+ scenarios.push('');
158
+ continue;
159
+ }
160
+ const gherkin = formatSingleAcAsBDD(trimmed);
161
+ if (!gherkin) {
162
+ continue;
163
+ }
164
+ scenarioIndex += 1;
165
+ scenarios.push(`**Scenario ${String(scenarioIndex)}:**`);
166
+ scenarios.push(gherkin);
167
+ scenarios.push('');
168
+ }
169
+ return scenarios.join('\n').trimEnd();
170
+ }
171
+ /**
172
+ * Convert an array of Gherkin scenario-block strings into individual lines
173
+ * suitable for spreading into the spec.md body array.
174
+ */
175
+ export function formatAcAsBDDLines(criteria) {
176
+ const block = formatAcAsBDD(criteria);
177
+ if (!block) {
178
+ return [];
179
+ }
180
+ return block.split('\n');
181
+ }
182
+ //# sourceMappingURL=bdd-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bdd-formatter.js","sourceRoot":"","sources":["../../src/engine/bdd-formatter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dor-dod.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/dor-dod.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAGhB,SAAS,EACV,MAAM,sBAAsB,CAAC;AAoG9B;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,CAezD;AA+ID;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,gBAAgB,CAAC,EAAE,cAAc,EACjC,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA+B3B"}
1
+ {"version":3,"file":"dor-dod.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/dor-dod.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAGhB,SAAS,EACV,MAAM,sBAAsB,CAAC;AAoG9B;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,CAezD;AA8KD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,gBAAgB,CAAC,EAAE,cAAc,EACjC,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA+B3B"}
@@ -1,6 +1,8 @@
1
1
  // Planu — Validator: Definition of Ready and Definition of Done generators
2
2
  import { readFile, readdir } from 'node:fs/promises';
3
3
  import { join, dirname, basename } from 'node:path';
4
+ /** Minimum test file count that auto-passes test gates (batch-implementation heuristic). */
5
+ const BATCH_TEST_THRESHOLD = 5;
4
6
  import { parseProgressActuals } from '../actuals/progress-parser.js';
5
7
  function buildDoRSpecItems(spec) {
6
8
  // Adapt description to actual file name (modern: spec.md, legacy: HU.md)
@@ -191,9 +193,11 @@ function buildDoDItems(spec, score, hasBlockingQualityIssues, hasTestFiles) {
191
193
  * Check if actuals exist either in spec object or in progress.md file.
192
194
  */
193
195
  async function hasActuals(spec) {
196
+ /* v8 ignore start -- spec.actuals is always null here (dod-8 is 'pending' only when actuals=null) */
194
197
  if (spec.actuals) {
195
198
  return true;
196
199
  }
200
+ /* v8 ignore stop */
197
201
  // Try reading progress.md from the spec directory
198
202
  try {
199
203
  const specDir = dirname(spec.specPath);
@@ -206,8 +210,28 @@ async function hasActuals(spec) {
206
210
  return false;
207
211
  } /* v8 ignore stop */
208
212
  }
213
+ /**
214
+ * Count test files under `<projectDir>/tests/` recursively.
215
+ * Returns 0 if the directory does not exist or cannot be read.
216
+ */
217
+ async function countProjectTestFiles(projectDir) {
218
+ /* v8 ignore start -- filesystem path, covered by integration */
219
+ try {
220
+ const testsDir = join(projectDir, 'tests');
221
+ const entries = await readdir(testsDir, { recursive: true });
222
+ return entries.filter((f) => f.includes('.test.')).length;
223
+ }
224
+ catch {
225
+ return 0;
226
+ }
227
+ /* v8 ignore stop */
228
+ }
209
229
  /**
210
230
  * Detect if test files exist for the spec's affected code files.
231
+ *
232
+ * Batch-implementation heuristic: if the project already has more than
233
+ * BATCH_TEST_THRESHOLD test files, a single test file covering multiple specs
234
+ * is sufficient evidence — return true without per-spec file matching.
211
235
  */
212
236
  async function detectTestFiles(spec, codeState) {
213
237
  // Collect affected files from codeState or impactAnalysis
@@ -220,6 +244,15 @@ async function detectTestFiles(spec, codeState) {
220
244
  }
221
245
  /* v8 ignore start -- filesystem heuristic, tested via integration */
222
246
  if (affectedFiles.length === 0) {
247
+ // Batch heuristic: resolve project dir from specPath and count test files
248
+ if (spec.specPath) {
249
+ const specDir = dirname(spec.specPath);
250
+ const projectDir = join(specDir, '..', '..', '..');
251
+ const count = await countProjectTestFiles(projectDir);
252
+ if (count > BATCH_TEST_THRESHOLD) {
253
+ return true;
254
+ }
255
+ }
223
256
  return false;
224
257
  }
225
258
  // Check if any affected file IS a test file
@@ -1 +1 @@
1
- {"version":3,"file":"dor-dod.js","sourceRoot":"","sources":["../../../src/engine/validator/dor-dod.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dor-dod.js","sourceRoot":"","sources":["../../../src/engine/validator/dor-dod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { WorkerOverride } from '../types/index.js';
2
+ export type { WorkerOverride } from '../types/index.js';
3
+ /**
4
+ * 3-layer configuration loader specific to workers.
5
+ *
6
+ * Layer 1: registry defaults (passed via load() calls externally)
7
+ * Layer 2: planu/workers.json (project-level overrides)
8
+ * Layer 3: PLANU_WORKER_<NAME>_<SETTING> environment variables
9
+ *
10
+ * Higher-precedence layers win field by field.
11
+ */
12
+ export declare class WorkerConfigLoader {
13
+ private readonly projectPath;
14
+ constructor(projectPath: string);
15
+ /**
16
+ * Load and merge all 3 layers. Returns final resolved override per worker.
17
+ * The returned Map contains only workers that have at least one override.
18
+ * Workers with no overrides in any layer are not present (use defaults as-is).
19
+ *
20
+ * @param workerNames - names of all known workers (to scan env for each)
21
+ */
22
+ load(workerNames?: string[]): Promise<Map<string, WorkerOverride>>;
23
+ /**
24
+ * Get the merged override for a specific worker (layers 2 + 3 only).
25
+ * Returns an empty object if no override is defined anywhere.
26
+ */
27
+ getOverride(workerName: string): Promise<WorkerOverride>;
28
+ /** Load planu/workers.json. Returns empty object if file doesn't exist. */
29
+ private loadProjectFile;
30
+ /** Coerce raw file content to Record<string, WorkerOverride>, ignoring unknown keys. */
31
+ private coerceFileContent;
32
+ /** Coerce a raw object to WorkerOverride, ignoring unknown keys. */
33
+ private coerceOverride;
34
+ /**
35
+ * Parse environment variables for a specific worker.
36
+ *
37
+ * Slug-to-env: 'test-gaps' → 'TEST_GAPS'
38
+ * Full pattern: PLANU_WORKER_{WORKER_ENV}_{SETTING}
39
+ * Known settings: ENABLED (bool), COOLDOWNMS (number), PRIORITY (number), TIER (string)
40
+ */
41
+ parseEnvOverride(workerName: string): WorkerOverride;
42
+ /**
43
+ * Merge two override objects. Right-hand side wins for defined fields.
44
+ * Returns a new object — zero mutation guarantee.
45
+ */
46
+ private merge;
47
+ }
48
+ //# sourceMappingURL=worker-config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-config-loader.d.ts","sourceRoot":"","sources":["../../src/engine/worker-config-loader.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B;;;;;;OAMG;IACG,IAAI,CAAC,WAAW,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAqB5E;;;OAGG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAW9D,2EAA2E;YAC7D,eAAe;IAe7B,wFAAwF;IACxF,OAAO,CAAC,iBAAiB;IAUzB,oEAAoE;IACpE,OAAO,CAAC,cAAc;IAiBtB;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc;IAkCpD;;;OAGG;IACH,OAAO,CAAC,KAAK;CAgBd"}
@@ -0,0 +1,167 @@
1
+ // engine/worker-config-loader.ts — 3-layer configuration merge for workers (SPEC-138)
2
+ //
3
+ // THE PATTERN (specific to workers):
4
+ // Layer 1 (lowest): defaults from workers-registry.json (loaded separately, passed in)
5
+ // Layer 2: planu/workers.json — project-level overrides (optional, graceful if missing)
6
+ // Layer 3 (highest): PLANU_WORKER_<NAME>_<SETTING> env vars
7
+ //
8
+ // Env var format:
9
+ // PLANU_WORKER_TEST_GAPS_ENABLED=false
10
+ // PLANU_WORKER_SECURITY_AUDIT_COOLDOWNMS=60000
11
+ // PLANU_WORKER_OPTIMIZATION_PRIORITY=3
12
+ //
13
+ // Slug-to-env conversion: 'test-gaps' → 'TEST_GAPS' (hyphens → underscores, uppercase)
14
+ //
15
+ // Zero mutation guarantee: all returned values are new objects.
16
+ import { readFile } from 'node:fs/promises';
17
+ import { join } from 'node:path';
18
+ /**
19
+ * 3-layer configuration loader specific to workers.
20
+ *
21
+ * Layer 1: registry defaults (passed via load() calls externally)
22
+ * Layer 2: planu/workers.json (project-level overrides)
23
+ * Layer 3: PLANU_WORKER_<NAME>_<SETTING> environment variables
24
+ *
25
+ * Higher-precedence layers win field by field.
26
+ */
27
+ export class WorkerConfigLoader {
28
+ projectPath;
29
+ constructor(projectPath) {
30
+ this.projectPath = projectPath;
31
+ }
32
+ /**
33
+ * Load and merge all 3 layers. Returns final resolved override per worker.
34
+ * The returned Map contains only workers that have at least one override.
35
+ * Workers with no overrides in any layer are not present (use defaults as-is).
36
+ *
37
+ * @param workerNames - names of all known workers (to scan env for each)
38
+ */
39
+ async load(workerNames = []) {
40
+ const fileOverrides = await this.loadProjectFile();
41
+ const result = new Map();
42
+ // Collect all relevant worker names (from file + provided list)
43
+ const allNames = new Set([...Object.keys(fileOverrides), ...workerNames]);
44
+ for (const name of allNames) {
45
+ const fileLayer = fileOverrides[name] ?? {};
46
+ const envLayer = this.parseEnvOverride(name);
47
+ const merged = this.merge(fileLayer, envLayer);
48
+ // Only include if there is at least one defined field
49
+ if (Object.keys(merged).length > 0) {
50
+ result.set(name, merged);
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ /**
56
+ * Get the merged override for a specific worker (layers 2 + 3 only).
57
+ * Returns an empty object if no override is defined anywhere.
58
+ */
59
+ async getOverride(workerName) {
60
+ const fileOverrides = await this.loadProjectFile();
61
+ const fileLayer = fileOverrides[workerName] ?? {};
62
+ const envLayer = this.parseEnvOverride(workerName);
63
+ return this.merge(fileLayer, envLayer);
64
+ }
65
+ // -------------------------------------------------------------------------
66
+ // Private helpers
67
+ // -------------------------------------------------------------------------
68
+ /** Load planu/workers.json. Returns empty object if file doesn't exist. */
69
+ async loadProjectFile() {
70
+ const filePath = join(this.projectPath, 'planu', 'workers.json');
71
+ try {
72
+ const content = await readFile(filePath, 'utf-8');
73
+ const parsed = JSON.parse(content);
74
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
75
+ return {};
76
+ }
77
+ return this.coerceFileContent(parsed);
78
+ }
79
+ catch {
80
+ // File does not exist or is unreadable — graceful fallback
81
+ return {};
82
+ }
83
+ }
84
+ /** Coerce raw file content to Record<string, WorkerOverride>, ignoring unknown keys. */
85
+ coerceFileContent(raw) {
86
+ const result = {};
87
+ for (const [name, value] of Object.entries(raw)) {
88
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
89
+ result[name] = this.coerceOverride(value);
90
+ }
91
+ }
92
+ return result;
93
+ }
94
+ /** Coerce a raw object to WorkerOverride, ignoring unknown keys. */
95
+ coerceOverride(raw) {
96
+ const override = {};
97
+ if (typeof raw.enabled === 'boolean') {
98
+ override.enabled = raw.enabled;
99
+ }
100
+ if (typeof raw.cooldownMs === 'number') {
101
+ override.cooldownMs = raw.cooldownMs;
102
+ }
103
+ if (typeof raw.priority === 'number') {
104
+ override.priority = raw.priority;
105
+ }
106
+ if (raw.tier === 'free' || raw.tier === 'pro') {
107
+ override.tier = raw.tier;
108
+ }
109
+ return override;
110
+ }
111
+ /**
112
+ * Parse environment variables for a specific worker.
113
+ *
114
+ * Slug-to-env: 'test-gaps' → 'TEST_GAPS'
115
+ * Full pattern: PLANU_WORKER_{WORKER_ENV}_{SETTING}
116
+ * Known settings: ENABLED (bool), COOLDOWNMS (number), PRIORITY (number), TIER (string)
117
+ */
118
+ parseEnvOverride(workerName) {
119
+ const envName = workerName.toUpperCase().replace(/-/g, '_');
120
+ const prefix = `PLANU_WORKER_${envName}_`;
121
+ const override = {};
122
+ const enabledRaw = process.env[`${prefix}ENABLED`];
123
+ if (enabledRaw !== undefined) {
124
+ override.enabled = enabledRaw.toLowerCase() === 'true';
125
+ }
126
+ const cooldownRaw = process.env[`${prefix}COOLDOWNMS`];
127
+ if (cooldownRaw !== undefined) {
128
+ const parsed = Number(cooldownRaw);
129
+ if (!Number.isNaN(parsed)) {
130
+ override.cooldownMs = parsed;
131
+ }
132
+ }
133
+ const priorityRaw = process.env[`${prefix}PRIORITY`];
134
+ if (priorityRaw !== undefined) {
135
+ const parsed = Number(priorityRaw);
136
+ if (!Number.isNaN(parsed)) {
137
+ override.priority = parsed;
138
+ }
139
+ }
140
+ const tierRaw = process.env[`${prefix}TIER`];
141
+ if (tierRaw === 'free' || tierRaw === 'pro') {
142
+ override.tier = tierRaw;
143
+ }
144
+ return override;
145
+ }
146
+ /**
147
+ * Merge two override objects. Right-hand side wins for defined fields.
148
+ * Returns a new object — zero mutation guarantee.
149
+ */
150
+ merge(base, override) {
151
+ const result = { ...base };
152
+ if (override.enabled !== undefined) {
153
+ result.enabled = override.enabled;
154
+ }
155
+ if (override.cooldownMs !== undefined) {
156
+ result.cooldownMs = override.cooldownMs;
157
+ }
158
+ if (override.priority !== undefined) {
159
+ result.priority = override.priority;
160
+ }
161
+ if (override.tier !== undefined) {
162
+ result.tier = override.tier;
163
+ }
164
+ return result;
165
+ }
166
+ }
167
+ //# sourceMappingURL=worker-config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-config-loader.js","sourceRoot":"","sources":["../../src/engine/worker-config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { WorkerRunResult } from '../../../types/index.js';
2
+ /**
3
+ * Worker handler for auto-drift detection.
4
+ *
5
+ * Triggered on source file changes. For each spec in 'implementing' or 'done'
6
+ * state, computes a lightweight drift score. If score >= PLANU_DRIFT_THRESHOLD,
7
+ * persists the result to DriftCacheStore with shown=false so the next tool call
8
+ * can display a banner warning.
9
+ *
10
+ * Respects PLANU_AUTO_DRIFT=false to disable entirely.
11
+ */
12
+ export declare function runAutoDrift(projectDir: string, changedFiles?: string[]): Promise<WorkerRunResult>;
13
+ //# sourceMappingURL=auto-drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-drift.d.ts","sourceRoot":"","sources":["../../../../src/engine/workers/handlers/auto-drift.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA0G9E;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,eAAe,CAAC,CA2B1B"}