aios-core 3.7.0 → 3.9.1

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 (53) hide show
  1. package/.aios-core/core/session/context-detector.js +3 -0
  2. package/.aios-core/core/session/context-loader.js +154 -0
  3. package/.aios-core/data/learned-patterns.yaml +3 -0
  4. package/.aios-core/data/workflow-patterns.yaml +347 -3
  5. package/.aios-core/development/agents/dev.md +6 -0
  6. package/.aios-core/development/agents/squad-creator.md +30 -0
  7. package/.aios-core/development/scripts/squad/squad-analyzer.js +638 -0
  8. package/.aios-core/development/scripts/squad/squad-extender.js +871 -0
  9. package/.aios-core/development/scripts/squad/squad-generator.js +107 -19
  10. package/.aios-core/development/scripts/squad/squad-migrator.js +3 -5
  11. package/.aios-core/development/scripts/squad/squad-validator.js +98 -0
  12. package/.aios-core/development/tasks/next.md +294 -0
  13. package/.aios-core/development/tasks/patterns.md +334 -0
  14. package/.aios-core/development/tasks/squad-creator-analyze.md +315 -0
  15. package/.aios-core/development/tasks/squad-creator-create.md +26 -3
  16. package/.aios-core/development/tasks/squad-creator-extend.md +411 -0
  17. package/.aios-core/development/tasks/squad-creator-validate.md +9 -1
  18. package/.aios-core/development/tasks/waves.md +205 -0
  19. package/.aios-core/development/templates/squad/agent-template.md +69 -0
  20. package/.aios-core/development/templates/squad/checklist-template.md +82 -0
  21. package/.aios-core/development/templates/squad/data-template.yaml +105 -0
  22. package/.aios-core/development/templates/squad/script-template.js +179 -0
  23. package/.aios-core/development/templates/squad/task-template.md +125 -0
  24. package/.aios-core/development/templates/squad/template-template.md +97 -0
  25. package/.aios-core/development/templates/squad/tool-template.js +103 -0
  26. package/.aios-core/development/templates/squad/workflow-template.yaml +108 -0
  27. package/.aios-core/infrastructure/scripts/test-generator.js +8 -8
  28. package/.aios-core/infrastructure/scripts/test-quality-assessment.js +5 -5
  29. package/.aios-core/infrastructure/scripts/test-utilities.js +3 -3
  30. package/.aios-core/install-manifest.yaml +97 -33
  31. package/.aios-core/quality/metrics-collector.js +27 -0
  32. package/.aios-core/scripts/session-context-loader.js +13 -254
  33. package/.aios-core/scripts/test-template-system.js +6 -6
  34. package/.aios-core/utils/aios-validator.js +25 -0
  35. package/.aios-core/workflow-intelligence/__tests__/confidence-scorer.test.js +334 -0
  36. package/.aios-core/workflow-intelligence/__tests__/integration.test.js +337 -0
  37. package/.aios-core/workflow-intelligence/__tests__/suggestion-engine.test.js +431 -0
  38. package/.aios-core/workflow-intelligence/__tests__/wave-analyzer.test.js +458 -0
  39. package/.aios-core/workflow-intelligence/__tests__/workflow-registry.test.js +302 -0
  40. package/.aios-core/workflow-intelligence/engine/confidence-scorer.js +305 -0
  41. package/.aios-core/workflow-intelligence/engine/output-formatter.js +285 -0
  42. package/.aios-core/workflow-intelligence/engine/suggestion-engine.js +603 -0
  43. package/.aios-core/workflow-intelligence/engine/wave-analyzer.js +676 -0
  44. package/.aios-core/workflow-intelligence/index.js +327 -0
  45. package/.aios-core/workflow-intelligence/learning/capture-hook.js +147 -0
  46. package/.aios-core/workflow-intelligence/learning/index.js +230 -0
  47. package/.aios-core/workflow-intelligence/learning/pattern-capture.js +340 -0
  48. package/.aios-core/workflow-intelligence/learning/pattern-store.js +498 -0
  49. package/.aios-core/workflow-intelligence/learning/pattern-validator.js +309 -0
  50. package/.aios-core/workflow-intelligence/registry/workflow-registry.js +358 -0
  51. package/package.json +1 -1
  52. package/src/installer/brownfield-upgrader.js +1 -1
  53. package/bin/aios-init.backup-v1.1.4.js +0 -352
@@ -0,0 +1,108 @@
1
+ # {{COMPONENTNAME}} Workflow
2
+ #
3
+ # {{DESCRIPTION}}
4
+ #
5
+ # Created: {{CREATEDAT}}
6
+ # Story: {{STORYID}}
7
+
8
+ name: {{COMPONENTNAME}}
9
+ version: 1.0.0
10
+ description: {{DESCRIPTION}}
11
+ squad: {{SQUADNAME}}
12
+
13
+ # Metadata
14
+ metadata:
15
+ created: {{CREATEDAT}}
16
+ author: squad-creator
17
+ tags:
18
+ - workflow
19
+ - {{SQUADNAME}}
20
+
21
+ # Trigger conditions
22
+ triggers:
23
+ - type: manual
24
+ command: "*{{COMPONENTNAME}}"
25
+ # - type: event
26
+ # event: some-event-name
27
+ # - type: schedule
28
+ # cron: "0 0 * * *"
29
+
30
+ # Input parameters
31
+ inputs:
32
+ - name: param1
33
+ type: string
34
+ required: true
35
+ description: "Description of parameter 1"
36
+ - name: param2
37
+ type: string
38
+ required: false
39
+ default: "default-value"
40
+ description: "Description of parameter 2"
41
+
42
+ # Workflow steps
43
+ steps:
44
+ - id: step-1
45
+ name: "Step 1: Initialize"
46
+ description: "Initialize the workflow"
47
+ action: task
48
+ task: task-name-1
49
+ inputs:
50
+ param: "{{inputs.param1}}"
51
+ on_error: abort
52
+
53
+ - id: step-2
54
+ name: "Step 2: Process"
55
+ description: "Main processing step"
56
+ action: task
57
+ task: task-name-2
58
+ depends_on:
59
+ - step-1
60
+ inputs:
61
+ data: "{{steps.step-1.output}}"
62
+ on_error: retry
63
+ retry:
64
+ max_attempts: 3
65
+ delay: 1000
66
+
67
+ - id: step-3
68
+ name: "Step 3: Finalize"
69
+ description: "Finalize the workflow"
70
+ action: task
71
+ task: task-name-3
72
+ depends_on:
73
+ - step-2
74
+ condition: "{{steps.step-2.success}}"
75
+
76
+ # Conditional branches (optional)
77
+ # branches:
78
+ # - condition: "{{steps.step-2.output.type == 'a'}}"
79
+ # steps:
80
+ # - id: branch-a-step
81
+ # name: "Branch A Step"
82
+ # action: task
83
+ # task: branch-a-task
84
+
85
+ # Output definition
86
+ outputs:
87
+ - name: result
88
+ from: "{{steps.step-3.output}}"
89
+ description: "Final workflow result"
90
+
91
+ # Completion handlers
92
+ completion:
93
+ on_success:
94
+ message: "Workflow '{{COMPONENTNAME}}' completed successfully"
95
+ notify: false
96
+ on_failure:
97
+ message: "Workflow '{{COMPONENTNAME}}' failed"
98
+ notify: true
99
+ rollback: true
100
+
101
+ # Validation
102
+ validation:
103
+ pre_run:
104
+ - "Check all required inputs are provided"
105
+ - "Validate input formats"
106
+ post_run:
107
+ - "Verify output is valid"
108
+ - "Log completion metrics"
@@ -36,7 +36,7 @@ class TestGenerator {
36
36
  console.log(chalk.green('✅ Test generator initialized'));
37
37
  return true;
38
38
 
39
- } catch (_error) {
39
+ } catch (error) {
40
40
  console.error(chalk.red(`Failed to initialize test generator: ${error.message}`));
41
41
  throw error;
42
42
  }
@@ -67,7 +67,7 @@ class TestGenerator {
67
67
 
68
68
  return processedContent;
69
69
 
70
- } catch (_error) {
70
+ } catch (error) {
71
71
  this.updateGenerationStats(false, Date.now() - startTime);
72
72
  console.error(chalk.red(`Failed to generate test for ${component.name}: ${error.message}`));
73
73
  throw error;
@@ -95,7 +95,7 @@ class TestGenerator {
95
95
  test_count: testFile.test_count,
96
96
  });
97
97
 
98
- } catch (_error) {
98
+ } catch (error) {
99
99
  errors.push({
100
100
  file_path: testFile.file_path,
101
101
  test_type: testFile.test_type,
@@ -167,7 +167,7 @@ class TestGenerator {
167
167
  enhancedContent = this.injectSetupTeardown(enhancedContent, setupTeardown);
168
168
  }
169
169
 
170
- } catch (_error) {
170
+ } catch (error) {
171
171
  console.warn(chalk.yellow(`Failed to enhance test content: ${error.message}`));
172
172
  // Return base content if enhancement fails
173
173
  }
@@ -221,7 +221,7 @@ class TestGenerator {
221
221
  analysis.configuration = this.extractTaskConfig(content);
222
222
  }
223
223
 
224
- } catch (_error) {
224
+ } catch (error) {
225
225
  console.warn(chalk.yellow(`Failed to analyze component ${component.id}: ${error.message}`));
226
226
  }
227
227
 
@@ -547,7 +547,7 @@ ${content}`;
547
547
  throw new Error('Unbalanced brackets in generated test');
548
548
  }
549
549
 
550
- } catch (_error) {
550
+ } catch (error) {
551
551
  console.warn(chalk.yellow(`Test syntax validation warning: ${error.message}`));
552
552
  }
553
553
  }
@@ -723,7 +723,7 @@ ${content}`;
723
723
  try {
724
724
  const yaml = require('js-yaml');
725
725
  return yaml.load(yamlMatch[1]);
726
- } catch (_error) {
726
+ } catch {
727
727
  return null;
728
728
  }
729
729
  }
@@ -734,7 +734,7 @@ ${content}`;
734
734
  try {
735
735
  const yaml = require('js-yaml');
736
736
  return yaml.load(content);
737
- } catch (_error) {
737
+ } catch {
738
738
  return null;
739
739
  }
740
740
  }
@@ -29,7 +29,7 @@ class TestQualityAssessment {
29
29
  console.log(chalk.green('✅ Test quality assessment initialized'));
30
30
  return true;
31
31
 
32
- } catch (_error) {
32
+ } catch (error) {
33
33
  console.error(chalk.red(`Failed to initialize test quality assessment: ${error.message}`));
34
34
  throw error;
35
35
  }
@@ -81,7 +81,7 @@ class TestQualityAssessment {
81
81
 
82
82
  return assessment;
83
83
 
84
- } catch (_error) {
84
+ } catch (error) {
85
85
  console.error(chalk.red(`Failed to assess test quality for ${testFilePath}: ${error.message}`));
86
86
  throw error;
87
87
  }
@@ -117,7 +117,7 @@ class TestQualityAssessment {
117
117
  allIssues.push(...assessment.issues);
118
118
  qualityRatings[assessment.quality_rating]++;
119
119
 
120
- } catch (_error) {
120
+ } catch (error) {
121
121
  console.warn(chalk.yellow(`Failed to assess ${testFile}: ${error.message}`));
122
122
  }
123
123
  }
@@ -985,7 +985,7 @@ class TestQualityAssessment {
985
985
  const data = JSON.parse(await fs.readFile(historyFile, 'utf-8'));
986
986
  this.qualityHistory = data.quality_history || [];
987
987
  }
988
- } catch (_error) {
988
+ } catch {
989
989
  // No existing data, start fresh
990
990
  }
991
991
  }
@@ -1015,7 +1015,7 @@ class TestQualityAssessment {
1015
1015
 
1016
1016
  console.log(chalk.gray(`Quality assessment saved: ${assessmentFile}`));
1017
1017
 
1018
- } catch (_error) {
1018
+ } catch (error) {
1019
1019
  console.warn(chalk.yellow(`Failed to save quality assessment: ${error.message}`));
1020
1020
  }
1021
1021
  }
@@ -41,7 +41,7 @@ async function countIntegrationReferences(utilityName) {
41
41
  { shell: '/bin/bash' },
42
42
  );
43
43
  totalCount += parseInt(stdout.trim()) || 0;
44
- } catch (_error) {
44
+ } catch {
45
45
  // Directory doesn't exist or grep failed - not a problem
46
46
  }
47
47
  }
@@ -98,7 +98,7 @@ async function testUtility(utilityFile) {
98
98
  : 'Keep but document usage';
99
99
  }
100
100
 
101
- } catch (_error) {
101
+ } catch (error) {
102
102
  result.errors.push(error.message);
103
103
 
104
104
  // Classify error type
@@ -119,7 +119,7 @@ async function testUtility(utilityFile) {
119
119
  // Count integration even if broken
120
120
  try {
121
121
  result.integrationCount = await countIntegrationReferences(utilityFile);
122
- } catch (_e) {
122
+ } catch {
123
123
  // Ignore counting errors
124
124
  }
125
125
  }
@@ -7,10 +7,10 @@
7
7
  # - SHA256 hashes for change detection
8
8
  # - File types for categorization
9
9
  #
10
- version: 3.7.0
11
- generated_at: "2025-12-24T14:42:11.316Z"
10
+ version: 3.9.1
11
+ generated_at: "2025-12-26T23:36:47.885Z"
12
12
  generator: scripts/generate-install-manifest.js
13
- file_count: 579
13
+ file_count: 595
14
14
  files:
15
15
  - path: cli/commands/generate/index.js
16
16
  hash: sha256:36f8e38ab767fa5478d8dabac548c66dc2c0fc521c216e954ac33fcea0ba597b
@@ -329,13 +329,13 @@ files:
329
329
  type: core
330
330
  size: 9178
331
331
  - path: core/session/context-detector.js
332
- hash: sha256:cd77730a0608269bea82d1d794466de538706cbf45e26beef716061b4edeb2bb
332
+ hash: sha256:e76b2a1ae649b2780bfe94259d1f35e9bdd4a3dbde3a4e6f5c610cb1cb553ecb
333
333
  type: core
334
- size: 7069
334
+ size: 7217
335
335
  - path: core/session/context-loader.js
336
- hash: sha256:280345c1a2e1925b75830534eff172a6e28e8850c9831fc1b2fdc1406ff43e68
336
+ hash: sha256:eaef1e3a11feb2d355c5dc8fc2813ae095e27911cdf1261e5d003b22be16d8f0
337
337
  type: core
338
- size: 8216
338
+ size: 13729
339
339
  - path: core/utils/output-formatter.js
340
340
  hash: sha256:9c386d8b0232f92887dc6f8d32671444a5857b6c848c84b561eedef27a178470
341
341
  type: core
@@ -356,14 +356,18 @@ files:
356
356
  hash: sha256:21138a86582b713c2106973907bbf4a5ce4e3192dadd832122ac9c6294d0efb1
357
357
  type: data
358
358
  size: 34868
359
+ - path: data/learned-patterns.yaml
360
+ hash: sha256:24ac0b160615583a0ff783d3da8af80b7f94191575d6db2054ec8e10a3f945dc
361
+ type: data
362
+ size: 68
359
363
  - path: data/technical-preferences.md
360
364
  hash: sha256:6d1111823aefaca138dfaa3661139ae57db0ec9841046617e5024a24e532f570
361
365
  type: data
362
366
  size: 64
363
367
  - path: data/workflow-patterns.yaml
364
- hash: sha256:a84b99984dcf1930705d82cbf771716bc0a6b909b3c854251ba178385b209f49
368
+ hash: sha256:e43d4622473a9a7ffa119c17f154d37ae5b1c4a07335826514d6694e200f2d11
365
369
  type: data
366
- size: 8239
370
+ size: 19713
367
371
  - path: development/agent-teams/team-all.yaml
368
372
  hash: sha256:368efa25930f89d33ee4178c7b77871ad2ca1437ca56376233b0c375a2cb311c
369
373
  type: development
@@ -401,9 +405,9 @@ files:
401
405
  type: agent
402
406
  size: 20268
403
407
  - path: development/agents/dev.md
404
- hash: sha256:69a342848917c90bcd91517d226c0b0e55e06abf0871ecf2e7a1eb6f7ea67026
408
+ hash: sha256:b2fc2c28bb871f710546b8e7c6d29cb38966e518be15970fb5073fe39c13f3d5
405
409
  type: agent
406
- size: 17964
410
+ size: 18222
407
411
  - path: development/agents/devops.md
408
412
  hash: sha256:0c7ea6fb80b5758d978003f17aa6c5ba8ca1a5433ac0c53b1dd131e7ecae18a5
409
413
  type: agent
@@ -425,9 +429,9 @@ files:
425
429
  type: agent
426
430
  size: 9866
427
431
  - path: development/agents/squad-creator.md
428
- hash: sha256:b2d40ad818043acd04cb00eb2e5ff778498c65dc91bf81eb6675467fcd60c514
432
+ hash: sha256:51f829162b81693bf34e010718a81f3aa484336f6488e2c7655d2cf5798e79fc
429
433
  type: agent
430
- size: 10367
434
+ size: 11770
431
435
  - path: development/agents/ux-design-expert.md
432
436
  hash: sha256:ce2f28bbd7350f1ca7d1b01ae26924928e496314afb551cafb55604233117954
433
437
  type: agent
@@ -512,6 +516,10 @@ files:
512
516
  hash: sha256:55e0226c3baffe16fd24f3d19179326c43e8dc525697c0b5c972cf15825f7c14
513
517
  type: script
514
518
  size: 3244
519
+ - path: development/scripts/squad/squad-analyzer.js
520
+ hash: sha256:30100571f7d46705b60432fc9e56a19852786d1b3b5a77354e247519b8ca8682
521
+ type: script
522
+ size: 18148
515
523
  - path: development/scripts/squad/squad-designer.js
516
524
  hash: sha256:101cbb7d6ded0d6f991b29ac63dfee2c7bb86cbc8c4fefef728b7d12c3352829
517
525
  type: script
@@ -520,26 +528,30 @@ files:
520
528
  hash: sha256:a62dd5d40ef24426ffdabdcbe0a0a3a7e7e2b1757eba9749a41d3fd4c0e690f8
521
529
  type: script
522
530
  size: 15335
531
+ - path: development/scripts/squad/squad-extender.js
532
+ hash: sha256:ceab4df7d9708449aff28eb2b5cbf57f11b2c93196280c814bf02787e7db22f3
533
+ type: script
534
+ size: 20638
523
535
  - path: development/scripts/squad/squad-generator.js
524
- hash: sha256:6d47ee7e0c662ffd7a8c5975ceca3e71addb54f59fb771d55402d0d57ce3d7d8
536
+ hash: sha256:fa83979eeeac361713e8f99bfec6ac9f9dc9d8d4107ecf809cd3b7370a4de79c
525
537
  type: script
526
- size: 40312
538
+ size: 44048
527
539
  - path: development/scripts/squad/squad-loader.js
528
540
  hash: sha256:7093b9457c93da6845722bf7eac660164963d5007c459afae2149340a7979f1f
529
541
  type: script
530
542
  size: 10549
531
543
  - path: development/scripts/squad/squad-migrator.js
532
- hash: sha256:883899cb84117b66074004fb683ba5f9cefebc57eeb9758f79784e0a92afcd90
544
+ hash: sha256:7aa7c77f252853faa3230898f37f987713c02a21937da69bf0f0da4074884b4a
533
545
  type: script
534
- size: 19520
546
+ size: 19517
535
547
  - path: development/scripts/squad/squad-publisher.js
536
548
  hash: sha256:329c00fb9d1085675a319e8314a5be9e1ee92c617691c47041f58d994982e029
537
549
  type: script
538
550
  size: 18724
539
551
  - path: development/scripts/squad/squad-validator.js
540
- hash: sha256:a19af336adf8caaa79f98e52ab78aee57a9a0a0041f3c4b6c9663a321c0a7f64
552
+ hash: sha256:90f7b1d6f9b072718a7029afe5c238b66c6b880ee18d6c416244dca5d9a6bfa1
541
553
  type: script
542
- size: 19470
554
+ size: 23034
543
555
  - path: development/scripts/story-index-generator.js
544
556
  hash: sha256:5c9bf1339857e25b20875193c6dd42ac6c829491c0f46ba26bf07652aff6ed8b
545
557
  type: script
@@ -908,6 +920,14 @@ files:
908
920
  hash: sha256:091a4236aaf2ef93f6f394b99dc43cbedccbd9a864d55f4992a50dd4684bc97f
909
921
  type: task
910
922
  size: 11422
923
+ - path: development/tasks/next.md
924
+ hash: sha256:53f4311ff6797342701c870b9552884815537dde8cb4936a0b3b5bf53b820f32
925
+ type: task
926
+ size: 6550
927
+ - path: development/tasks/patterns.md
928
+ hash: sha256:447ea50e9c7483d4dd9f88750aee95d459a20385c1c6baea41d93ac3090aa1f8
929
+ type: task
930
+ size: 7372
911
931
  - path: development/tasks/po-backlog-add.md
912
932
  hash: sha256:6d13427b0f323cd27a612ac1504807f66e9aad88ec2ff417ba09ecb0b5b6b850
913
933
  type: task
@@ -1032,10 +1052,14 @@ files:
1032
1052
  hash: sha256:f2a2f314a11af481d48991112c871d65e1def7bb3c9a283b661b67a1f939ac9b
1033
1053
  type: task
1034
1054
  size: 18062
1055
+ - path: development/tasks/squad-creator-analyze.md
1056
+ hash: sha256:5e1c24c1474e77a517b266c862a915d4b5c632340bb7ea426b5ac50ee53273e0
1057
+ type: task
1058
+ size: 7040
1035
1059
  - path: development/tasks/squad-creator-create.md
1036
- hash: sha256:b4c87391c3348ac875d0da966cf28098b5a8d61c67e64360deb7d4c6807db2f9
1060
+ hash: sha256:65f50ac890b671b9321ff18156de02d45b4b5075d3037fa847a5bfe304e7e662
1037
1061
  type: task
1038
- size: 7503
1062
+ size: 8447
1039
1063
  - path: development/tasks/squad-creator-design.md
1040
1064
  hash: sha256:47bcc27f3d3bfa81e567d009b50ac278db386fda48e5a60a3cce7643ef2362bc
1041
1065
  type: task
@@ -1044,6 +1068,10 @@ files:
1044
1068
  hash: sha256:909088d7b585fbb8b465e0b0238ab49546c51876a6752a30f7bf7bf1bf22ef24
1045
1069
  type: task
1046
1070
  size: 3856
1071
+ - path: development/tasks/squad-creator-extend.md
1072
+ hash: sha256:ba5fbc0d4c1512f22790e80efc0660f2af2673a243d3c6d6568bbc76c54d1eef
1073
+ type: task
1074
+ size: 10219
1047
1075
  - path: development/tasks/squad-creator-list.md
1048
1076
  hash: sha256:c0b52c5a8a79b3ed757789e633f42a5458bac18bbcf1aa544fc1f5295151b446
1049
1077
  type: task
@@ -1061,9 +1089,9 @@ files:
1061
1089
  type: task
1062
1090
  size: 8633
1063
1091
  - path: development/tasks/squad-creator-validate.md
1064
- hash: sha256:c07c44217e882cae387d849658e091046e32735a62f6d28e496b4eb042121b98
1092
+ hash: sha256:e4dc8af3ac29ca91998f1db3c70a8ae5a2380f4131dcd635a34eb7ffa24d3b0a
1065
1093
  type: task
1066
- size: 4607
1094
+ size: 5065
1067
1095
  - path: development/tasks/sync-documentation.md
1068
1096
  hash: sha256:caa2077e7a5bbbba9269b04e878b7772a71422ed6fd138447fe5cfb7345f96fb
1069
1097
  type: task
@@ -1104,6 +1132,10 @@ files:
1104
1132
  hash: sha256:7ff03b62614edeb2a9c2bab9681a56ce97cffc59af3bd51054b9dafb1c99701f
1105
1133
  type: task
1106
1134
  size: 14320
1135
+ - path: development/tasks/waves.md
1136
+ hash: sha256:364b955b3315f1621a27ea26ff1459467a19c87781ac714e387fb616aeb336e6
1137
+ type: task
1138
+ size: 4686
1107
1139
  - path: development/templates/service-template/__tests__/index.test.ts.hbs
1108
1140
  hash: sha256:04090b95bc0b606448c161d8e698fcf4d5c7da2517a5ac65663554a54c5acf91
1109
1141
  type: template
@@ -1140,6 +1172,38 @@ files:
1140
1172
  hash: sha256:2338ab2e1ade619bf33a2c8f22b149402b513c05a6d1d8a805c5273c7233d151
1141
1173
  type: template
1142
1174
  size: 2516
1175
+ - path: development/templates/squad/agent-template.md
1176
+ hash: sha256:b8ba4621f0bf03bf3612a683cebaa52e246cba19fb81197493ec4d682a1db14b
1177
+ type: template
1178
+ size: 1432
1179
+ - path: development/templates/squad/checklist-template.md
1180
+ hash: sha256:5c962f20d7d56ef8800f60dc32f8105b2669311664cfd330301f812dc67934af
1181
+ type: template
1182
+ size: 1317
1183
+ - path: development/templates/squad/data-template.yaml
1184
+ hash: sha256:d228821b39c7135e19f49405c10cae7ac43f5ffcd946d6363f053420a3a3019f
1185
+ type: template
1186
+ size: 2121
1187
+ - path: development/templates/squad/script-template.js
1188
+ hash: sha256:2d568171ef0c7ed2822d2b1d81a5f0d02c16bd2a2fb11665c8608dd7da7fc323
1189
+ type: template
1190
+ size: 3375
1191
+ - path: development/templates/squad/task-template.md
1192
+ hash: sha256:3f337082a14cd33dd4876d5dc487d0ec069dad5f54aeaac9853b2a13051a70db
1193
+ type: template
1194
+ size: 1882
1195
+ - path: development/templates/squad/template-template.md
1196
+ hash: sha256:b3f13da1cd377d18d3202bd8998fd9f26ad56b5da4b63e316cd01578998b7f55
1197
+ type: template
1198
+ size: 1497
1199
+ - path: development/templates/squad/tool-template.js
1200
+ hash: sha256:31e026003459be51451d0ca6905847bab2d9e397d92dc9b521b563516d27b5cf
1201
+ type: template
1202
+ size: 1796
1203
+ - path: development/templates/squad/workflow-template.yaml
1204
+ hash: sha256:837991039c9dcb77ad4ded82035da96eac70ac2c4fd208833ace470a3ec32c0e
1205
+ type: template
1206
+ size: 2199
1143
1207
  - path: development/workflows/brownfield-fullstack.yaml
1144
1208
  hash: sha256:e54b5ecf6fffd1351bad125c91be89b262773361785d1f0ee19a7dc2fcdf8822
1145
1209
  type: workflow
@@ -1593,21 +1657,21 @@ files:
1593
1657
  type: script
1594
1658
  size: 8334
1595
1659
  - path: infrastructure/scripts/test-generator.js
1596
- hash: sha256:16ba63b101880bc0689ddebaa7d98e10e2028740a55ea01445bac3048a7986d3
1660
+ hash: sha256:90485b00c0b9e490f2394ff0fb456ea5a5614ca2431d9df55d95b54213b15184
1597
1661
  type: script
1598
- size: 24969
1662
+ size: 24945
1599
1663
  - path: infrastructure/scripts/test-quality-assessment.js
1600
- hash: sha256:d2f9e322dbe255c733e8a257955ffb78b147a9d0e1f598650fa11e7dcec181f6
1664
+ hash: sha256:300699a7a5003ef1f18b4e865f761a8e76d0b82e001f0ba17317ef05d41c79db
1601
1665
  type: script
1602
- size: 36911
1666
+ size: 36898
1603
1667
  - path: infrastructure/scripts/test-utilities-fast.js
1604
1668
  hash: sha256:70d87a74dac153c65d622afa4d62816e41d8d81eee6d42e1c0e498999bec7c40
1605
1669
  type: script
1606
1670
  size: 3743
1607
1671
  - path: infrastructure/scripts/test-utilities.js
1608
- hash: sha256:7af31c9ff42b8fe6fae8e74e403ca2d5165c33b30438d39d408031e330333d60
1672
+ hash: sha256:da7c868b105892e3995ed6e6517188a79b8f62a079a61d4d38242c4f357c9d75
1609
1673
  type: script
1610
- size: 5885
1674
+ size: 5870
1611
1675
  - path: infrastructure/scripts/tool-resolver.js
1612
1676
  hash: sha256:94a5ab46dc1939d87fbb741619d8013ce17c5eae1e18ccdc78707eac2c4c927b
1613
1677
  type: script
@@ -2305,13 +2369,13 @@ files:
2305
2369
  type: script
2306
2370
  size: 4527
2307
2371
  - path: scripts/session-context-loader.js
2308
- hash: sha256:f24c6b273bd19a7b25aa60e68f93df3a100bc291291eeb95cab60a2c001415e6
2372
+ hash: sha256:2581477ca682c6788fc57759b7fc697ffbcaab0a2c1c0cd6eb4f9ad228bb1020
2309
2373
  type: script
2310
- size: 8145
2374
+ size: 1583
2311
2375
  - path: scripts/test-template-system.js
2312
- hash: sha256:4e365df5372a8e09abb43f1f92e99d3e654a51b333dde232bad956e534a481db
2376
+ hash: sha256:87465ac02b079166479b9d50fe6e12a101bcaa81d47f1aace9b346e264c04712
2313
2377
  type: script
2314
- size: 26051
2378
+ size: 26029
2315
2379
  - path: scripts/validate-phase1.ps1
2316
2380
  hash: sha256:2f694151ae90af1a9cb8fe890037a51e60115ff8edf636704e8f11e7ac23b23a
2317
2381
  type: script
@@ -279,6 +279,10 @@ class MetricsCollector {
279
279
 
280
280
  const metrics = await this.load();
281
281
 
282
+ // Enforce retention policy before adding new entries (Story SQS-10 nitpick)
283
+ // This prevents unbounded growth of history array
284
+ await this._enforceRetentionPolicy(metrics);
285
+
282
286
  const runRecord = {
283
287
  timestamp: new Date().toISOString(),
284
288
  layer,
@@ -519,6 +523,29 @@ class MetricsCollector {
519
523
  return removedCount;
520
524
  }
521
525
 
526
+ /**
527
+ * Enforce retention policy inline (called before adding new entries)
528
+ * This prevents unbounded growth of the history array.
529
+ * @private
530
+ * @param {Object} metrics - Metrics object to clean
531
+ * @returns {Promise<void>}
532
+ * @see CodeRabbit nitpick: Enforce retention policy to prevent unbounded growth
533
+ */
534
+ async _enforceRetentionPolicy(metrics) {
535
+ const retentionMs = (metrics.retentionDays || this.retentionDays) * 24 * 60 * 60 * 1000;
536
+ const cutoffTimestamp = Date.now() - retentionMs;
537
+
538
+ const originalCount = metrics.history.length;
539
+ metrics.history = metrics.history.filter(
540
+ (entry) => new Date(entry.timestamp).getTime() > cutoffTimestamp,
541
+ );
542
+
543
+ const removedCount = originalCount - metrics.history.length;
544
+ if (removedCount > 0) {
545
+ console.log(`[metrics] Retention policy: removed ${removedCount} old entries (> ${metrics.retentionDays || this.retentionDays} days)`);
546
+ }
547
+ }
548
+
522
549
  /**
523
550
  * Get history for a specific layer
524
551
  * @param {number} layer - Layer number