specweave 0.22.0 → 0.22.3

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 (220) hide show
  1. package/CLAUDE.md +373 -13
  2. package/README.md +5 -5
  3. package/bin/specweave.js +5 -8
  4. package/dist/plugins/specweave-github/lib/CodeValidator.d.ts +1 -1
  5. package/dist/plugins/specweave-github/lib/CodeValidator.js +1 -1
  6. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +10 -0
  7. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  8. package/dist/plugins/specweave-github/lib/github-client-v2.js +26 -0
  9. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  10. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
  11. package/dist/plugins/specweave-github/lib/task-sync.js +7 -0
  12. package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
  13. package/dist/src/cli/commands/migrate-to-profiles.d.ts +1 -0
  14. package/dist/src/cli/commands/migrate-to-profiles.d.ts.map +1 -1
  15. package/dist/src/cli/commands/migrate-to-profiles.js +12 -1
  16. package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
  17. package/dist/src/cli/commands/next-command.d.ts +52 -0
  18. package/dist/src/cli/commands/next-command.d.ts.map +1 -0
  19. package/dist/src/cli/commands/next-command.js +204 -0
  20. package/dist/src/cli/commands/next-command.js.map +1 -0
  21. package/dist/src/cli/commands/repair-status-desync.d.ts +69 -0
  22. package/dist/src/cli/commands/repair-status-desync.d.ts.map +1 -0
  23. package/dist/src/cli/commands/repair-status-desync.js +221 -0
  24. package/dist/src/cli/commands/repair-status-desync.js.map +1 -0
  25. package/dist/src/cli/commands/sync-specs.d.ts +16 -0
  26. package/dist/src/cli/commands/sync-specs.d.ts.map +1 -0
  27. package/dist/src/cli/commands/sync-specs.js +130 -0
  28. package/dist/src/cli/commands/sync-specs.js.map +1 -0
  29. package/dist/src/cli/commands/validate-status-sync.d.ts +52 -0
  30. package/dist/src/cli/commands/validate-status-sync.d.ts.map +1 -0
  31. package/dist/src/cli/commands/validate-status-sync.js +176 -0
  32. package/dist/src/cli/commands/validate-status-sync.js.map +1 -0
  33. package/dist/src/cli/count-tasks.d.ts +20 -0
  34. package/dist/src/cli/count-tasks.d.ts.map +1 -0
  35. package/dist/src/cli/count-tasks.js +50 -0
  36. package/dist/src/cli/count-tasks.js.map +1 -0
  37. package/dist/src/cli/update-status-line.d.ts +16 -0
  38. package/dist/src/cli/update-status-line.d.ts.map +1 -0
  39. package/dist/src/cli/update-status-line.js +44 -0
  40. package/dist/src/cli/update-status-line.js.map +1 -0
  41. package/dist/src/config/ConfigManager.d.ts.map +1 -1
  42. package/dist/src/config/ConfigManager.js +2 -1
  43. package/dist/src/config/ConfigManager.js.map +1 -1
  44. package/dist/src/config/types.d.ts +50 -50
  45. package/dist/src/core/cicd/state-manager.d.ts +8 -0
  46. package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
  47. package/dist/src/core/cicd/state-manager.js +60 -15
  48. package/dist/src/core/cicd/state-manager.js.map +1 -1
  49. package/dist/src/core/cost-tracker.d.ts.map +1 -1
  50. package/dist/src/core/cost-tracker.js +2 -1
  51. package/dist/src/core/cost-tracker.js.map +1 -1
  52. package/dist/src/core/iac/template-engine.d.ts.map +1 -1
  53. package/dist/src/core/iac/template-engine.js +28 -0
  54. package/dist/src/core/iac/template-engine.js.map +1 -1
  55. package/dist/src/core/iac/template-generator.d.ts +53 -0
  56. package/dist/src/core/iac/template-generator.d.ts.map +1 -0
  57. package/dist/src/core/iac/template-generator.js +125 -0
  58. package/dist/src/core/iac/template-generator.js.map +1 -0
  59. package/dist/src/core/increment/completion-validator.d.ts +56 -0
  60. package/dist/src/core/increment/completion-validator.d.ts.map +1 -0
  61. package/dist/src/core/increment/completion-validator.js +102 -0
  62. package/dist/src/core/increment/completion-validator.js.map +1 -0
  63. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
  64. package/dist/src/core/increment/metadata-manager.js +10 -0
  65. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  66. package/dist/src/core/increment/spec-frontmatter-updater.d.ts +78 -0
  67. package/dist/src/core/increment/spec-frontmatter-updater.d.ts.map +1 -0
  68. package/dist/src/core/increment/spec-frontmatter-updater.js +152 -0
  69. package/dist/src/core/increment/spec-frontmatter-updater.js.map +1 -0
  70. package/dist/src/core/increment/status-auto-transition.js +3 -3
  71. package/dist/src/core/increment/status-auto-transition.js.map +1 -1
  72. package/dist/src/core/living-docs/CodeValidator.js +1 -1
  73. package/dist/src/core/living-docs/CodeValidator.js.map +1 -1
  74. package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -1
  75. package/dist/src/core/living-docs/content-distributor.js +11 -1
  76. package/dist/src/core/living-docs/content-distributor.js.map +1 -1
  77. package/dist/src/core/living-docs/living-docs-sync.d.ts +166 -0
  78. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -0
  79. package/dist/src/core/living-docs/living-docs-sync.js +727 -0
  80. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -0
  81. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +7 -3
  82. package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -1
  83. package/dist/src/core/living-docs/task-project-specific-generator.js +40 -24
  84. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
  85. package/dist/src/core/plugin-loader.d.ts +7 -0
  86. package/dist/src/core/plugin-loader.d.ts.map +1 -1
  87. package/dist/src/core/plugin-loader.js +18 -1
  88. package/dist/src/core/plugin-loader.js.map +1 -1
  89. package/dist/src/core/serverless/platform-data-loader.d.ts +8 -0
  90. package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -1
  91. package/dist/src/core/serverless/platform-data-loader.js +14 -0
  92. package/dist/src/core/serverless/platform-data-loader.js.map +1 -1
  93. package/dist/src/core/serverless/types.d.ts +1 -1
  94. package/dist/src/core/serverless/types.d.ts.map +1 -1
  95. package/dist/src/core/status-line/status-line-manager.d.ts +7 -2
  96. package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
  97. package/dist/src/core/status-line/status-line-manager.js +47 -18
  98. package/dist/src/core/status-line/status-line-manager.js.map +1 -1
  99. package/dist/src/core/status-line/status-line-updater.d.ts +67 -0
  100. package/dist/src/core/status-line/status-line-updater.d.ts.map +1 -0
  101. package/dist/src/core/status-line/status-line-updater.js +203 -0
  102. package/dist/src/core/status-line/status-line-updater.js.map +1 -0
  103. package/dist/src/core/status-line/task-counter.d.ts +69 -0
  104. package/dist/src/core/status-line/task-counter.d.ts.map +1 -0
  105. package/dist/src/core/status-line/task-counter.js +107 -0
  106. package/dist/src/core/status-line/task-counter.js.map +1 -0
  107. package/dist/src/core/status-line/types.d.ts +19 -5
  108. package/dist/src/core/status-line/types.d.ts.map +1 -1
  109. package/dist/src/core/status-line/types.js +3 -3
  110. package/dist/src/core/status-line/types.js.map +1 -1
  111. package/dist/src/core/workflow/autonomous-executor.d.ts +111 -0
  112. package/dist/src/core/workflow/autonomous-executor.d.ts.map +1 -0
  113. package/dist/src/core/workflow/autonomous-executor.js +275 -0
  114. package/dist/src/core/workflow/autonomous-executor.js.map +1 -0
  115. package/dist/src/core/workflow/backlog-scanner.d.ts +94 -0
  116. package/dist/src/core/workflow/backlog-scanner.d.ts.map +1 -0
  117. package/dist/src/core/workflow/backlog-scanner.js +170 -0
  118. package/dist/src/core/workflow/backlog-scanner.js.map +1 -0
  119. package/dist/src/core/workflow/command-invoker.d.ts +86 -0
  120. package/dist/src/core/workflow/command-invoker.d.ts.map +1 -0
  121. package/dist/src/core/workflow/command-invoker.js +131 -0
  122. package/dist/src/core/workflow/command-invoker.js.map +1 -0
  123. package/dist/src/core/workflow/cost-estimator.d.ts +120 -0
  124. package/dist/src/core/workflow/cost-estimator.d.ts.map +1 -0
  125. package/dist/src/core/workflow/cost-estimator.js +222 -0
  126. package/dist/src/core/workflow/cost-estimator.js.map +1 -0
  127. package/dist/src/core/workflow/index.d.ts +20 -0
  128. package/dist/src/core/workflow/index.d.ts.map +1 -0
  129. package/dist/src/core/workflow/index.js +24 -0
  130. package/dist/src/core/workflow/index.js.map +1 -0
  131. package/dist/src/core/workflow/state-manager.d.ts +107 -0
  132. package/dist/src/core/workflow/state-manager.d.ts.map +1 -0
  133. package/dist/src/core/workflow/state-manager.js +126 -0
  134. package/dist/src/core/workflow/state-manager.js.map +1 -0
  135. package/dist/src/core/workflow/workflow-orchestrator.d.ts +93 -0
  136. package/dist/src/core/workflow/workflow-orchestrator.d.ts.map +1 -0
  137. package/dist/src/core/workflow/workflow-orchestrator.js +195 -0
  138. package/dist/src/core/workflow/workflow-orchestrator.js.map +1 -0
  139. package/dist/src/init/architecture/types.d.ts +10 -10
  140. package/dist/src/metrics/dora-calculator.js +2 -2
  141. package/dist/src/metrics/dora-calculator.js.map +1 -1
  142. package/dist/src/utils/pricing-constants.d.ts +5 -2
  143. package/dist/src/utils/pricing-constants.d.ts.map +1 -1
  144. package/dist/src/utils/pricing-constants.js +3 -2
  145. package/dist/src/utils/pricing-constants.js.map +1 -1
  146. package/package.json +4 -4
  147. package/plugins/specweave/agents/infrastructure/AGENT.md +88 -46
  148. package/plugins/specweave/agents/pm/AGENT.md +58 -1
  149. package/plugins/specweave/commands/specweave-archive-features.md +1 -1
  150. package/plugins/specweave/commands/specweave-archive-increments.md +1 -1
  151. package/plugins/specweave/commands/specweave-check-hooks.md +5 -0
  152. package/plugins/specweave/commands/specweave-done.md +72 -4
  153. package/plugins/specweave/commands/specweave-plan.md +1 -1
  154. package/plugins/specweave/commands/specweave-progress.md +108 -379
  155. package/plugins/specweave/commands/specweave-reopen.md +30 -3
  156. package/plugins/specweave/commands/specweave-restore-feature.md +1 -1
  157. package/plugins/specweave/commands/specweave-sync-docs.md +71 -4
  158. package/plugins/specweave/commands/specweave-sync-specs.md +20 -48
  159. package/plugins/specweave/commands/specweave-update-status.md +151 -0
  160. package/plugins/specweave/hooks/lib/update-status-line.sh +78 -41
  161. package/plugins/specweave/hooks/lib/validate-spec-status.sh +163 -0
  162. package/plugins/specweave/hooks/user-prompt-submit.sh +38 -35
  163. package/plugins/specweave/hooks/validate-increment-completion.sh +113 -0
  164. package/plugins/specweave/lib/hooks/update-tasks-md.js +52 -9
  165. package/plugins/specweave/lib/hooks/update-tasks-md.ts +77 -16
  166. package/plugins/specweave/templates/iac/aws-lambda/defaults.json +24 -0
  167. package/plugins/specweave/templates/iac/aws-lambda/templates/README.md.hbs +260 -0
  168. package/plugins/specweave/templates/iac/aws-lambda/templates/environments/dev.tfvars.hbs +34 -0
  169. package/plugins/specweave/templates/iac/aws-lambda/templates/environments/prod.tfvars.hbs +37 -0
  170. package/plugins/specweave/templates/iac/aws-lambda/templates/environments/staging.tfvars.hbs +35 -0
  171. package/plugins/specweave/templates/iac/aws-lambda/templates/outputs.tf.hbs +77 -0
  172. package/plugins/specweave/templates/iac/aws-lambda/templates/providers.tf.hbs +36 -0
  173. package/plugins/specweave/templates/iac/aws-lambda/templates/variables.tf.hbs +115 -0
  174. package/plugins/specweave/templates/iac/azure-functions/defaults.json +25 -0
  175. package/plugins/specweave/templates/iac/azure-functions/templates/README.md.hbs +268 -0
  176. package/plugins/specweave/templates/iac/azure-functions/templates/environments/dev.tfvars.hbs +34 -0
  177. package/plugins/specweave/templates/iac/azure-functions/templates/environments/prod.tfvars.hbs +46 -0
  178. package/plugins/specweave/templates/iac/azure-functions/templates/environments/staging.tfvars.hbs +34 -0
  179. package/plugins/specweave/templates/iac/azure-functions/templates/main.tf.hbs +225 -0
  180. package/plugins/specweave/templates/iac/azure-functions/templates/outputs.tf.hbs +89 -0
  181. package/plugins/specweave/templates/iac/azure-functions/templates/provider.tf.hbs +27 -0
  182. package/plugins/specweave/templates/iac/azure-functions/templates/providers.tf.hbs +35 -0
  183. package/plugins/specweave/templates/iac/azure-functions/templates/variables.tf.hbs +124 -0
  184. package/plugins/specweave/templates/iac/firebase/defaults.json +29 -0
  185. package/plugins/specweave/templates/iac/firebase/templates/README.md.hbs +35 -0
  186. package/plugins/specweave/templates/iac/firebase/templates/environments/dev.tfvars.hbs +7 -0
  187. package/plugins/specweave/templates/iac/firebase/templates/environments/prod.tfvars.hbs +7 -0
  188. package/plugins/specweave/templates/iac/firebase/templates/environments/staging.tfvars.hbs +7 -0
  189. package/plugins/specweave/templates/iac/firebase/templates/main.tf.hbs +90 -0
  190. package/plugins/specweave/templates/iac/firebase/templates/outputs.tf.hbs +15 -0
  191. package/plugins/specweave/templates/iac/firebase/templates/providers.tf.hbs +23 -0
  192. package/plugins/specweave/templates/iac/firebase/templates/variables.tf.hbs +42 -0
  193. package/plugins/specweave/templates/iac/gcp-cloud-functions/defaults.json +26 -0
  194. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/README.md.hbs +299 -0
  195. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/dev.tfvars.hbs +36 -0
  196. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/prod.tfvars.hbs +48 -0
  197. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/staging.tfvars.hbs +41 -0
  198. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/main.tf.hbs +192 -0
  199. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/outputs.tf.hbs +66 -0
  200. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/providers.tf.hbs +25 -0
  201. package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/variables.tf.hbs +119 -0
  202. package/plugins/specweave/templates/iac/supabase/defaults.json +15 -0
  203. package/plugins/specweave/templates/iac/supabase/templates/README.md.hbs +46 -0
  204. package/plugins/specweave/templates/iac/supabase/templates/main.tf.hbs +50 -0
  205. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  206. package/plugins/specweave-github/agents/github-manager/AGENT.md +39 -7
  207. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +21 -0
  208. package/plugins/specweave-github/commands/specweave-github-create-issue.md +5 -5
  209. package/plugins/specweave-github/lib/CodeValidator.ts +1 -1
  210. package/plugins/specweave-github/lib/github-client-v2.js +29 -0
  211. package/plugins/specweave-github/lib/github-client-v2.ts +30 -0
  212. package/plugins/specweave-github/lib/task-sync.js +4 -0
  213. package/plugins/specweave-github/lib/task-sync.ts +7 -0
  214. package/src/templates/CLAUDE.md.template +31 -0
  215. package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +0 -116
  216. package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +0 -1
  217. package/dist/src/core/living-docs/ThreeLayerSyncManager.js +0 -356
  218. package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +0 -1
  219. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  220. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -1200
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Status Line Updater
3
+ *
4
+ * Synchronously updates status line cache by scanning spec.md files.
5
+ * Equivalent to update-status-line.sh but runs SYNCHRONOUSLY.
6
+ *
7
+ * Purpose: Force-refresh status line when it appears stale
8
+ *
9
+ * Architecture:
10
+ * 1. Scan all spec.md files for open increments (status = active/planning/in-progress)
11
+ * 2. Sort by creation date (oldest first)
12
+ * 3. Select first as current increment
13
+ * 4. Parse tasks.md for progress (use TaskCounter for accuracy)
14
+ * 5. Write cache atomically (.specweave/state/status-line.json)
15
+ *
16
+ * Performance: ~50-100ms (acceptable for user-facing commands)
17
+ */
18
+ import { StatusLineCache } from './types.js';
19
+ /**
20
+ * Status Line Updater
21
+ *
22
+ * Provides synchronous status line cache updates.
23
+ */
24
+ export declare class StatusLineUpdater {
25
+ private rootDir;
26
+ constructor(rootDir?: string);
27
+ /**
28
+ * Update status line cache synchronously
29
+ *
30
+ * This is the main entry point for force-refreshing the status line.
31
+ * NOW supports up to 2 active increments (aligned with ActiveIncrementManager).
32
+ */
33
+ update(): Promise<void>;
34
+ /**
35
+ * Find all open increments by scanning spec.md files
36
+ *
37
+ * Logic:
38
+ * - Scan .specweave/increments/[id]/spec.md
39
+ * - Parse YAML frontmatter for status field
40
+ * - Filter: status === 'active' || 'planning' || 'in-progress'
41
+ * - Extract: {id, created, status}
42
+ */
43
+ private findOpenIncrements;
44
+ /**
45
+ * Parse spec.md YAML frontmatter
46
+ *
47
+ * Extracts: status, created
48
+ */
49
+ private parseSpecMetadata;
50
+ /**
51
+ * Parse tasks.md for progress
52
+ *
53
+ * Uses TaskCounter for accurate counting (fixes overcounting bug)
54
+ */
55
+ private parseTaskProgress;
56
+ /**
57
+ * Write cache atomically
58
+ *
59
+ * Uses temp file → rename pattern to prevent corruption
60
+ */
61
+ private writeCache;
62
+ /**
63
+ * Get current cache (for testing)
64
+ */
65
+ getCurrentCache(): Promise<StatusLineCache | null>;
66
+ }
67
+ //# sourceMappingURL=status-line-updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-line-updater.d.ts","sourceRoot":"","sources":["../../../../src/core/status-line/status-line-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AA2B/D;;;;GAIG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,MAAsB;IAEnD;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C7B;;;;;;;;OAQG;YACW,kBAAkB;IAyChC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;OAIG;YACW,iBAAiB;IAuB/B;;;;OAIG;YACW,UAAU;IAaxB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAczD"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Status Line Updater
3
+ *
4
+ * Synchronously updates status line cache by scanning spec.md files.
5
+ * Equivalent to update-status-line.sh but runs SYNCHRONOUSLY.
6
+ *
7
+ * Purpose: Force-refresh status line when it appears stale
8
+ *
9
+ * Architecture:
10
+ * 1. Scan all spec.md files for open increments (status = active/planning/in-progress)
11
+ * 2. Sort by creation date (oldest first)
12
+ * 3. Select first as current increment
13
+ * 4. Parse tasks.md for progress (use TaskCounter for accuracy)
14
+ * 5. Write cache atomically (.specweave/state/status-line.json)
15
+ *
16
+ * Performance: ~50-100ms (acceptable for user-facing commands)
17
+ */
18
+ import fs from 'fs-extra';
19
+ import * as path from 'path';
20
+ import { TaskCounter } from './task-counter.js';
21
+ /**
22
+ * Maximum number of active increments to display in status line
23
+ * Aligned with ActiveIncrementManager maximum
24
+ */
25
+ const MAX_ACTIVE_INCREMENTS_DISPLAY = 2;
26
+ /**
27
+ * Status Line Updater
28
+ *
29
+ * Provides synchronous status line cache updates.
30
+ */
31
+ export class StatusLineUpdater {
32
+ constructor(rootDir = process.cwd()) {
33
+ this.rootDir = rootDir;
34
+ }
35
+ /**
36
+ * Update status line cache synchronously
37
+ *
38
+ * This is the main entry point for force-refreshing the status line.
39
+ * NOW supports up to 2 active increments (aligned with ActiveIncrementManager).
40
+ */
41
+ async update() {
42
+ // Step 1: Find all open increments (scan spec.md)
43
+ const openIncrements = await this.findOpenIncrements();
44
+ // Step 2: Sort by creation date (oldest first)
45
+ const sorted = openIncrements.sort((a, b) => {
46
+ const aTime = new Date(a.created).getTime();
47
+ const bTime = new Date(b.created).getTime();
48
+ return aTime - bTime; // Ascending (oldest first)
49
+ });
50
+ // Step 3: Take up to MAX_ACTIVE_INCREMENTS_DISPLAY active increments
51
+ const activeIds = sorted.slice(0, MAX_ACTIVE_INCREMENTS_DISPLAY);
52
+ // Step 4: Parse tasks.md for EACH active increment
53
+ const activeIncrements = await Promise.all(activeIds.map(async (inc) => {
54
+ const progress = await this.parseTaskProgress(inc.id);
55
+ return {
56
+ id: inc.id,
57
+ name: inc.id, // Format: "0043-spec-md-desync-fix"
58
+ completed: progress.completed,
59
+ total: progress.total,
60
+ percentage: progress.percentage
61
+ };
62
+ }));
63
+ // Step 5: Build cache object
64
+ const cache = {
65
+ activeIncrements,
66
+ openCount: openIncrements.length,
67
+ lastUpdate: new Date().toISOString(),
68
+ // BACKWARD COMPATIBILITY: Set 'current' to first active increment
69
+ current: activeIncrements[0] || null,
70
+ // Add default state message when no active increments
71
+ message: openIncrements.length === 0
72
+ ? 'No active increments. Start with /specweave:increment "feature name"'
73
+ : undefined
74
+ };
75
+ // Step 6: Write cache atomically
76
+ await this.writeCache(cache);
77
+ }
78
+ /**
79
+ * Find all open increments by scanning spec.md files
80
+ *
81
+ * Logic:
82
+ * - Scan .specweave/increments/[id]/spec.md
83
+ * - Parse YAML frontmatter for status field
84
+ * - Filter: status === 'active' || 'planning' || 'in-progress'
85
+ * - Extract: {id, created, status}
86
+ */
87
+ async findOpenIncrements() {
88
+ const incrementsDir = path.join(this.rootDir, '.specweave/increments');
89
+ if (!await fs.pathExists(incrementsDir)) {
90
+ return [];
91
+ }
92
+ const entries = await fs.readdir(incrementsDir);
93
+ const openIncrements = [];
94
+ for (const entry of entries) {
95
+ // Skip special directories (_archive, etc.)
96
+ if (entry.startsWith('_')) {
97
+ continue;
98
+ }
99
+ const specPath = path.join(incrementsDir, entry, 'spec.md');
100
+ if (await fs.pathExists(specPath)) {
101
+ const specContent = await fs.readFile(specPath, 'utf-8');
102
+ const metadata = this.parseSpecMetadata(specContent);
103
+ // Check if increment is open (active, planning, or in-progress)
104
+ // ONLY accepts official IncrementStatus enum values
105
+ if (metadata.status === 'active' ||
106
+ metadata.status === 'planning' ||
107
+ metadata.status === 'in-progress') {
108
+ openIncrements.push({
109
+ id: entry,
110
+ created: metadata.created || '1970-01-01',
111
+ status: metadata.status
112
+ });
113
+ }
114
+ }
115
+ }
116
+ return openIncrements;
117
+ }
118
+ /**
119
+ * Parse spec.md YAML frontmatter
120
+ *
121
+ * Extracts: status, created
122
+ */
123
+ parseSpecMetadata(content) {
124
+ const metadata = {
125
+ status: '',
126
+ created: '1970-01-01'
127
+ };
128
+ // Extract YAML frontmatter (between --- markers)
129
+ const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
130
+ if (!frontmatterMatch) {
131
+ return metadata;
132
+ }
133
+ const frontmatter = frontmatterMatch[1];
134
+ // Parse status field
135
+ const statusMatch = frontmatter.match(/^status:\s*(.+)$/m);
136
+ if (statusMatch) {
137
+ metadata.status = statusMatch[1].trim();
138
+ }
139
+ // Parse created field
140
+ const createdMatch = frontmatter.match(/^created:\s*(.+)$/m);
141
+ if (createdMatch) {
142
+ metadata.created = createdMatch[1].trim();
143
+ }
144
+ return metadata;
145
+ }
146
+ /**
147
+ * Parse tasks.md for progress
148
+ *
149
+ * Uses TaskCounter for accurate counting (fixes overcounting bug)
150
+ */
151
+ async parseTaskProgress(incrementId) {
152
+ const tasksPath = path.join(this.rootDir, '.specweave/increments', incrementId, 'tasks.md');
153
+ if (!await fs.pathExists(tasksPath)) {
154
+ return { completed: 0, total: 0, percentage: 0 };
155
+ }
156
+ try {
157
+ const tasksContent = await fs.readFile(tasksPath, 'utf-8');
158
+ const counts = TaskCounter.countTasks(tasksContent);
159
+ return {
160
+ completed: counts.completed,
161
+ total: counts.total,
162
+ percentage: counts.percentage
163
+ };
164
+ }
165
+ catch (error) {
166
+ // Graceful degradation: If TaskCounter fails, return zeros
167
+ console.warn(`⚠️ Failed to parse tasks.md for ${incrementId}:`, error);
168
+ return { completed: 0, total: 0, percentage: 0 };
169
+ }
170
+ }
171
+ /**
172
+ * Write cache atomically
173
+ *
174
+ * Uses temp file → rename pattern to prevent corruption
175
+ */
176
+ async writeCache(cache) {
177
+ const cacheFile = path.join(this.rootDir, '.specweave/state/status-line.json');
178
+ const cacheDir = path.dirname(cacheFile);
179
+ // Ensure state directory exists
180
+ await fs.ensureDir(cacheDir);
181
+ // Atomic write: temp file → rename
182
+ const tempFile = `${cacheFile}.tmp`;
183
+ await fs.writeFile(tempFile, JSON.stringify(cache, null, 2), 'utf-8');
184
+ await fs.rename(tempFile, cacheFile);
185
+ }
186
+ /**
187
+ * Get current cache (for testing)
188
+ */
189
+ async getCurrentCache() {
190
+ const cacheFile = path.join(this.rootDir, '.specweave/state/status-line.json');
191
+ if (!await fs.pathExists(cacheFile)) {
192
+ return null;
193
+ }
194
+ try {
195
+ const content = await fs.readFile(cacheFile, 'utf-8');
196
+ return JSON.parse(content);
197
+ }
198
+ catch {
199
+ return null;
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=status-line-updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-line-updater.js","sourceRoot":"","sources":["../../../../src/core/status-line/status-line-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Task Counter Utility
3
+ *
4
+ * Accurately counts tasks in tasks.md by parsing task headings
5
+ * and checking for completion markers within each task's section.
6
+ *
7
+ * Fixes overcounting bug where multiple completion markers in same task
8
+ * were counted separately.
9
+ *
10
+ * Algorithm:
11
+ * 1. Split content by ## T- or ### T- headings (task markers)
12
+ * 2. For each task section, check if it contains ANY completion marker
13
+ * 3. Count task ONCE regardless of how many markers it has
14
+ *
15
+ * Supported completion markers:
16
+ * - [x] at line start (legacy checkbox format)
17
+ * - **Status**: [x] inline (legacy status format)
18
+ * - **Completed**: <date> (current format)
19
+ */
20
+ export interface TaskCount {
21
+ total: number;
22
+ completed: number;
23
+ percentage: number;
24
+ }
25
+ export interface Task {
26
+ id: string;
27
+ title: string;
28
+ completed: boolean;
29
+ section: string;
30
+ }
31
+ export declare class TaskCounter {
32
+ /**
33
+ * Count tasks in tasks.md content
34
+ *
35
+ * @param content - Raw tasks.md file content
36
+ * @returns Task counts with total, completed, and percentage
37
+ */
38
+ static countTasks(content: string): TaskCount;
39
+ /**
40
+ * Parse tasks from tasks.md content
41
+ *
42
+ * Splits content into task sections and determines completion status
43
+ * for each task based on presence of completion markers.
44
+ *
45
+ * @param content - Raw tasks.md file content
46
+ * @returns Array of parsed tasks
47
+ */
48
+ static parseTasks(content: string): Task[];
49
+ /**
50
+ * Check if task section contains ANY completion marker
51
+ *
52
+ * Checks for:
53
+ * - [x] at line start (legacy)
54
+ * - **Status**: [x] inline (legacy)
55
+ * - **Completed**: <date> (current)
56
+ *
57
+ * @param sectionContent - Content of task section
58
+ * @returns true if task is completed
59
+ */
60
+ static isTaskCompleted(sectionContent: string): boolean;
61
+ /**
62
+ * Get detailed task breakdown (for debugging)
63
+ *
64
+ * @param content - Raw tasks.md file content
65
+ * @returns Array of tasks with details
66
+ */
67
+ static getTaskDetails(content: string): Task[];
68
+ }
69
+ //# sourceMappingURL=task-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-counter.d.ts","sourceRoot":"","sources":["../../../../src/core/status-line/task-counter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAU7C;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE;IAsD1C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAUvD;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE;CAG/C"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Task Counter Utility
3
+ *
4
+ * Accurately counts tasks in tasks.md by parsing task headings
5
+ * and checking for completion markers within each task's section.
6
+ *
7
+ * Fixes overcounting bug where multiple completion markers in same task
8
+ * were counted separately.
9
+ *
10
+ * Algorithm:
11
+ * 1. Split content by ## T- or ### T- headings (task markers)
12
+ * 2. For each task section, check if it contains ANY completion marker
13
+ * 3. Count task ONCE regardless of how many markers it has
14
+ *
15
+ * Supported completion markers:
16
+ * - [x] at line start (legacy checkbox format)
17
+ * - **Status**: [x] inline (legacy status format)
18
+ * - **Completed**: <date> (current format)
19
+ */
20
+ export class TaskCounter {
21
+ /**
22
+ * Count tasks in tasks.md content
23
+ *
24
+ * @param content - Raw tasks.md file content
25
+ * @returns Task counts with total, completed, and percentage
26
+ */
27
+ static countTasks(content) {
28
+ const tasks = this.parseTasks(content);
29
+ const total = tasks.length;
30
+ const completed = tasks.filter((t) => t.completed).length;
31
+ const percentage = total > 0 ? Math.floor((completed / total) * 100) : 0;
32
+ return { total, completed, percentage };
33
+ }
34
+ /**
35
+ * Parse tasks from tasks.md content
36
+ *
37
+ * Splits content into task sections and determines completion status
38
+ * for each task based on presence of completion markers.
39
+ *
40
+ * @param content - Raw tasks.md file content
41
+ * @returns Array of parsed tasks
42
+ */
43
+ static parseTasks(content) {
44
+ const tasks = [];
45
+ // Split by task headings (## T- or ### T-)
46
+ // Use regex to match heading pattern
47
+ const taskHeadingRegex = /^##+ (T-\d+[^:\n]*):?\s*(.*)$/gm;
48
+ let match;
49
+ const sections = [];
50
+ // Find all task headings and their positions
51
+ while ((match = taskHeadingRegex.exec(content)) !== null) {
52
+ const id = match[1].trim();
53
+ const title = match[2].trim();
54
+ const start = match.index;
55
+ // Close previous section
56
+ if (sections.length > 0) {
57
+ sections[sections.length - 1].end = start;
58
+ }
59
+ sections.push({ id, title, start });
60
+ }
61
+ // Close last section
62
+ if (sections.length > 0) {
63
+ sections[sections.length - 1].end = content.length;
64
+ }
65
+ // Parse each section
66
+ for (const section of sections) {
67
+ const sectionContent = content.substring(section.start, section.end ?? content.length);
68
+ const completed = this.isTaskCompleted(sectionContent);
69
+ tasks.push({
70
+ id: section.id,
71
+ title: section.title,
72
+ completed,
73
+ section: sectionContent,
74
+ });
75
+ }
76
+ return tasks;
77
+ }
78
+ /**
79
+ * Check if task section contains ANY completion marker
80
+ *
81
+ * Checks for:
82
+ * - [x] at line start (legacy)
83
+ * - **Status**: [x] inline (legacy)
84
+ * - **Completed**: <date> (current)
85
+ *
86
+ * @param sectionContent - Content of task section
87
+ * @returns true if task is completed
88
+ */
89
+ static isTaskCompleted(sectionContent) {
90
+ const completionPatterns = [
91
+ /^\[x\]/m, // [x] at line start
92
+ /\*\*Status\*\*:\s*\[x\]/i, // **Status**: [x]
93
+ /\*\*Completed\*\*:\s*\S/i, // **Completed**: <something>
94
+ ];
95
+ return completionPatterns.some((pattern) => pattern.test(sectionContent));
96
+ }
97
+ /**
98
+ * Get detailed task breakdown (for debugging)
99
+ *
100
+ * @param content - Raw tasks.md file content
101
+ * @returns Array of tasks with details
102
+ */
103
+ static getTaskDetails(content) {
104
+ return this.parseTasks(content);
105
+ }
106
+ }
107
+ //# sourceMappingURL=task-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-counter.js","sourceRoot":"","sources":["../../../../src/core/status-line/task-counter.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,26 @@
1
1
  /**
2
- * Status Line Types (Simplified)
2
+ * Status Line Types
3
3
  *
4
- * Ultra-simple status line with cached progress.
5
- * Shows: [increment-name] ████░░░░ X/Y tasks (Z open)
4
+ * Supports displaying multiple active increments (up to 2).
5
+ * Shows: [inc-1] ████░░░░ X/Y | [inc-2] ██████░░ A/B (Z open)
6
6
  */
7
7
  export interface StatusLineCache {
8
- /** Current active/in-progress increment (null if none) */
9
- current: CurrentIncrement | null;
8
+ /** NEW: Array of active increments (up to 2) */
9
+ activeIncrements: CurrentIncrement[];
10
10
  /** Total number of open increments (active/in-progress/planning) */
11
11
  openCount: number;
12
12
  /** ISO timestamp of last cache update */
13
13
  lastUpdate: string;
14
+ /**
15
+ * DEPRECATED: Use activeIncrements[0] instead
16
+ * Kept for backward compatibility with old code
17
+ */
18
+ current?: CurrentIncrement | null;
19
+ /**
20
+ * Optional message to display when no active increments
21
+ * Used for user guidance when openCount === 0
22
+ */
23
+ message?: string;
14
24
  }
15
25
  export interface CurrentIncrement {
16
26
  /** Increment ID (e.g., "0031-external-tool-status-sync") */
@@ -23,6 +33,10 @@ export interface CurrentIncrement {
23
33
  total: number;
24
34
  /** Completion percentage (0-100) */
25
35
  percentage: number;
36
+ /** Number of completed acceptance criteria (NEW) */
37
+ acsCompleted?: number;
38
+ /** Total number of acceptance criteria (NEW) */
39
+ acsTotal?: number;
26
40
  }
27
41
  export interface StatusLineConfig {
28
42
  /** Enable status line rendering */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/status-line/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAEjC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAElB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IAEX,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IAEd,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IAEjB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IAEpB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAKxC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/status-line/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IAErC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAElB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAElC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IAEX,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IAEd,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IAEnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IAEjB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IAEpB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAKxC,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Status Line Types (Simplified)
2
+ * Status Line Types
3
3
  *
4
- * Ultra-simple status line with cached progress.
5
- * Shows: [increment-name] ████░░░░ X/Y tasks (Z open)
4
+ * Supports displaying multiple active increments (up to 2).
5
+ * Shows: [inc-1] ████░░░░ X/Y | [inc-2] ██████░░ A/B (Z open)
6
6
  */
7
7
  export const DEFAULT_STATUS_LINE_CONFIG = {
8
8
  enabled: true,
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/status-line/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4CH,MAAM,CAAC,MAAM,0BAA0B,GAAqB;IAC1D,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,KAAK,EAAE,oCAAoC;IACxD,gBAAgB,EAAE,CAAC;IACnB,aAAa,EAAE,EAAE;CAClB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/status-line/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8DH,MAAM,CAAC,MAAM,0BAA0B,GAAqB;IAC1D,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,KAAK,EAAE,oCAAoC;IACxD,gBAAgB,EAAE,CAAC;IACnB,aAAa,EAAE,EAAE;CAClB,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Autonomous Executor - Fully autonomous workflow execution
3
+ *
4
+ * Executes complete workflows without human intervention, with safety guardrails:
5
+ * - Max iteration limits
6
+ * - Infinite loop detection
7
+ * - Cost threshold enforcement
8
+ * - Checkpoint/recovery system
9
+ *
10
+ * Part of increment 0039: Ultra-Smart Next Command
11
+ *
12
+ * @module core/workflow/autonomous-executor
13
+ * @since v0.22.0
14
+ */
15
+ import { WorkflowPhase } from './types.js';
16
+ /**
17
+ * Autonomous execution configuration
18
+ */
19
+ export interface AutonomousConfig {
20
+ /** Maximum iterations before stopping (default: 50) */
21
+ maxIterations?: number;
22
+ /** Cost threshold in USD (default: $20) */
23
+ costThreshold?: number;
24
+ /** Enable checkpoint saving (default: true) */
25
+ enableCheckpoints?: boolean;
26
+ /** Maximum retries per command (default: 3) */
27
+ maxRetries?: number;
28
+ /** Stop on first error (default: false) */
29
+ stopOnError?: boolean;
30
+ /** Verbose logging (default: false) */
31
+ verbose?: boolean;
32
+ }
33
+ /**
34
+ * Autonomous execution result
35
+ */
36
+ export interface AutonomousResult {
37
+ /** Execution succeeded */
38
+ success: boolean;
39
+ /** Increment ID */
40
+ incrementId: string;
41
+ /** Total iterations */
42
+ iterations: number;
43
+ /** Commands executed */
44
+ commandsExecuted: string[];
45
+ /** Total cost (USD) */
46
+ totalCost: number;
47
+ /** Final phase */
48
+ finalPhase: WorkflowPhase;
49
+ /** Completion reason */
50
+ reason: string;
51
+ /** Error message if failed */
52
+ error?: string;
53
+ /** Checkpoint ID (for resume) */
54
+ checkpointId?: string;
55
+ }
56
+ /**
57
+ * Autonomous Executor - Fully autonomous workflow execution with safety guardrails
58
+ */
59
+ export declare class AutonomousExecutor {
60
+ private config;
61
+ private orchestrator;
62
+ private stateManager;
63
+ private costEstimator;
64
+ private commandInvoker;
65
+ constructor(config?: AutonomousConfig);
66
+ /**
67
+ * Execute workflow autonomously
68
+ *
69
+ * @param incrementId - Increment ID to execute
70
+ * @param resumeCheckpointId - Optional checkpoint to resume from
71
+ * @returns Autonomous execution result
72
+ */
73
+ execute(incrementId: string, resumeCheckpointId?: string): Promise<AutonomousResult>;
74
+ /**
75
+ * Execute single step in workflow
76
+ */
77
+ private executeStep;
78
+ /**
79
+ * Preflight check before execution
80
+ */
81
+ private preflightCheck;
82
+ /**
83
+ * Safety checks during execution
84
+ */
85
+ private checkSafety;
86
+ /**
87
+ * Check if workflow is complete
88
+ */
89
+ private isComplete;
90
+ /**
91
+ * Initialize execution state
92
+ */
93
+ private initializeState;
94
+ /**
95
+ * Resume from checkpoint
96
+ */
97
+ private resumeFromCheckpoint;
98
+ /**
99
+ * Save execution checkpoint
100
+ */
101
+ private saveCheckpoint;
102
+ /**
103
+ * Terminate execution and return result
104
+ */
105
+ private terminateExecution;
106
+ /**
107
+ * Log message (if verbose enabled)
108
+ */
109
+ private log;
110
+ }
111
+ //# sourceMappingURL=autonomous-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous-executor.d.ts","sourceRoot":"","sources":["../../../../src/core/workflow/autonomous-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,UAAU,EAAE,aAAa,CAAC;IAC1B,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD;;GAEG;AACH,qBAAa,kBAAkB;IAO3B,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;gBAG7B,MAAM,GAAE,gBAAqB;IAgBvC;;;;;;OAMG;IACG,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAqF5B;;OAEG;YACW,WAAW;IAuCzB;;OAEG;YACW,cAAc;IA0B5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;YACW,oBAAoB;IAqBlC;;OAEG;YACW,cAAc;IAW5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ"}