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.
- package/CLAUDE.md +373 -13
- package/README.md +5 -5
- package/bin/specweave.js +5 -8
- package/dist/plugins/specweave-github/lib/CodeValidator.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/CodeValidator.js +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +10 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +26 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.js +7 -0
- package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.d.ts +1 -0
- package/dist/src/cli/commands/migrate-to-profiles.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js +12 -1
- package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
- package/dist/src/cli/commands/next-command.d.ts +52 -0
- package/dist/src/cli/commands/next-command.d.ts.map +1 -0
- package/dist/src/cli/commands/next-command.js +204 -0
- package/dist/src/cli/commands/next-command.js.map +1 -0
- package/dist/src/cli/commands/repair-status-desync.d.ts +69 -0
- package/dist/src/cli/commands/repair-status-desync.d.ts.map +1 -0
- package/dist/src/cli/commands/repair-status-desync.js +221 -0
- package/dist/src/cli/commands/repair-status-desync.js.map +1 -0
- package/dist/src/cli/commands/sync-specs.d.ts +16 -0
- package/dist/src/cli/commands/sync-specs.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-specs.js +130 -0
- package/dist/src/cli/commands/sync-specs.js.map +1 -0
- package/dist/src/cli/commands/validate-status-sync.d.ts +52 -0
- package/dist/src/cli/commands/validate-status-sync.d.ts.map +1 -0
- package/dist/src/cli/commands/validate-status-sync.js +176 -0
- package/dist/src/cli/commands/validate-status-sync.js.map +1 -0
- package/dist/src/cli/count-tasks.d.ts +20 -0
- package/dist/src/cli/count-tasks.d.ts.map +1 -0
- package/dist/src/cli/count-tasks.js +50 -0
- package/dist/src/cli/count-tasks.js.map +1 -0
- package/dist/src/cli/update-status-line.d.ts +16 -0
- package/dist/src/cli/update-status-line.d.ts.map +1 -0
- package/dist/src/cli/update-status-line.js +44 -0
- package/dist/src/cli/update-status-line.js.map +1 -0
- package/dist/src/config/ConfigManager.d.ts.map +1 -1
- package/dist/src/config/ConfigManager.js +2 -1
- package/dist/src/config/ConfigManager.js.map +1 -1
- package/dist/src/config/types.d.ts +50 -50
- package/dist/src/core/cicd/state-manager.d.ts +8 -0
- package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.js +60 -15
- package/dist/src/core/cicd/state-manager.js.map +1 -1
- package/dist/src/core/cost-tracker.d.ts.map +1 -1
- package/dist/src/core/cost-tracker.js +2 -1
- package/dist/src/core/cost-tracker.js.map +1 -1
- package/dist/src/core/iac/template-engine.d.ts.map +1 -1
- package/dist/src/core/iac/template-engine.js +28 -0
- package/dist/src/core/iac/template-engine.js.map +1 -1
- package/dist/src/core/iac/template-generator.d.ts +53 -0
- package/dist/src/core/iac/template-generator.d.ts.map +1 -0
- package/dist/src/core/iac/template-generator.js +125 -0
- package/dist/src/core/iac/template-generator.js.map +1 -0
- package/dist/src/core/increment/completion-validator.d.ts +56 -0
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -0
- package/dist/src/core/increment/completion-validator.js +102 -0
- package/dist/src/core/increment/completion-validator.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +10 -0
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/spec-frontmatter-updater.d.ts +78 -0
- package/dist/src/core/increment/spec-frontmatter-updater.d.ts.map +1 -0
- package/dist/src/core/increment/spec-frontmatter-updater.js +152 -0
- package/dist/src/core/increment/spec-frontmatter-updater.js.map +1 -0
- package/dist/src/core/increment/status-auto-transition.js +3 -3
- package/dist/src/core/increment/status-auto-transition.js.map +1 -1
- package/dist/src/core/living-docs/CodeValidator.js +1 -1
- package/dist/src/core/living-docs/CodeValidator.js.map +1 -1
- package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/content-distributor.js +11 -1
- package/dist/src/core/living-docs/content-distributor.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +166 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.js +727 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +7 -3
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.js +40 -24
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
- package/dist/src/core/plugin-loader.d.ts +7 -0
- package/dist/src/core/plugin-loader.d.ts.map +1 -1
- package/dist/src/core/plugin-loader.js +18 -1
- package/dist/src/core/plugin-loader.js.map +1 -1
- package/dist/src/core/serverless/platform-data-loader.d.ts +8 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -1
- package/dist/src/core/serverless/platform-data-loader.js +14 -0
- package/dist/src/core/serverless/platform-data-loader.js.map +1 -1
- package/dist/src/core/serverless/types.d.ts +1 -1
- package/dist/src/core/serverless/types.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.d.ts +7 -2
- package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.js +47 -18
- package/dist/src/core/status-line/status-line-manager.js.map +1 -1
- package/dist/src/core/status-line/status-line-updater.d.ts +67 -0
- package/dist/src/core/status-line/status-line-updater.d.ts.map +1 -0
- package/dist/src/core/status-line/status-line-updater.js +203 -0
- package/dist/src/core/status-line/status-line-updater.js.map +1 -0
- package/dist/src/core/status-line/task-counter.d.ts +69 -0
- package/dist/src/core/status-line/task-counter.d.ts.map +1 -0
- package/dist/src/core/status-line/task-counter.js +107 -0
- package/dist/src/core/status-line/task-counter.js.map +1 -0
- package/dist/src/core/status-line/types.d.ts +19 -5
- package/dist/src/core/status-line/types.d.ts.map +1 -1
- package/dist/src/core/status-line/types.js +3 -3
- package/dist/src/core/status-line/types.js.map +1 -1
- package/dist/src/core/workflow/autonomous-executor.d.ts +111 -0
- package/dist/src/core/workflow/autonomous-executor.d.ts.map +1 -0
- package/dist/src/core/workflow/autonomous-executor.js +275 -0
- package/dist/src/core/workflow/autonomous-executor.js.map +1 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts +94 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts.map +1 -0
- package/dist/src/core/workflow/backlog-scanner.js +170 -0
- package/dist/src/core/workflow/backlog-scanner.js.map +1 -0
- package/dist/src/core/workflow/command-invoker.d.ts +86 -0
- package/dist/src/core/workflow/command-invoker.d.ts.map +1 -0
- package/dist/src/core/workflow/command-invoker.js +131 -0
- package/dist/src/core/workflow/command-invoker.js.map +1 -0
- package/dist/src/core/workflow/cost-estimator.d.ts +120 -0
- package/dist/src/core/workflow/cost-estimator.d.ts.map +1 -0
- package/dist/src/core/workflow/cost-estimator.js +222 -0
- package/dist/src/core/workflow/cost-estimator.js.map +1 -0
- package/dist/src/core/workflow/index.d.ts +20 -0
- package/dist/src/core/workflow/index.d.ts.map +1 -0
- package/dist/src/core/workflow/index.js +24 -0
- package/dist/src/core/workflow/index.js.map +1 -0
- package/dist/src/core/workflow/state-manager.d.ts +107 -0
- package/dist/src/core/workflow/state-manager.d.ts.map +1 -0
- package/dist/src/core/workflow/state-manager.js +126 -0
- package/dist/src/core/workflow/state-manager.js.map +1 -0
- package/dist/src/core/workflow/workflow-orchestrator.d.ts +93 -0
- package/dist/src/core/workflow/workflow-orchestrator.d.ts.map +1 -0
- package/dist/src/core/workflow/workflow-orchestrator.js +195 -0
- package/dist/src/core/workflow/workflow-orchestrator.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +10 -10
- package/dist/src/metrics/dora-calculator.js +2 -2
- package/dist/src/metrics/dora-calculator.js.map +1 -1
- package/dist/src/utils/pricing-constants.d.ts +5 -2
- package/dist/src/utils/pricing-constants.d.ts.map +1 -1
- package/dist/src/utils/pricing-constants.js +3 -2
- package/dist/src/utils/pricing-constants.js.map +1 -1
- package/package.json +4 -4
- package/plugins/specweave/agents/infrastructure/AGENT.md +88 -46
- package/plugins/specweave/agents/pm/AGENT.md +58 -1
- package/plugins/specweave/commands/specweave-archive-features.md +1 -1
- package/plugins/specweave/commands/specweave-archive-increments.md +1 -1
- package/plugins/specweave/commands/specweave-check-hooks.md +5 -0
- package/plugins/specweave/commands/specweave-done.md +72 -4
- package/plugins/specweave/commands/specweave-plan.md +1 -1
- package/plugins/specweave/commands/specweave-progress.md +108 -379
- package/plugins/specweave/commands/specweave-reopen.md +30 -3
- package/plugins/specweave/commands/specweave-restore-feature.md +1 -1
- package/plugins/specweave/commands/specweave-sync-docs.md +71 -4
- package/plugins/specweave/commands/specweave-sync-specs.md +20 -48
- package/plugins/specweave/commands/specweave-update-status.md +151 -0
- package/plugins/specweave/hooks/lib/update-status-line.sh +78 -41
- package/plugins/specweave/hooks/lib/validate-spec-status.sh +163 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +38 -35
- package/plugins/specweave/hooks/validate-increment-completion.sh +113 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.js +52 -9
- package/plugins/specweave/lib/hooks/update-tasks-md.ts +77 -16
- package/plugins/specweave/templates/iac/aws-lambda/defaults.json +24 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/README.md.hbs +260 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/dev.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/prod.tfvars.hbs +37 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/staging.tfvars.hbs +35 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/outputs.tf.hbs +77 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/providers.tf.hbs +36 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/variables.tf.hbs +115 -0
- package/plugins/specweave/templates/iac/azure-functions/defaults.json +25 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/README.md.hbs +268 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/dev.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/prod.tfvars.hbs +46 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/staging.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/main.tf.hbs +225 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/outputs.tf.hbs +89 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/provider.tf.hbs +27 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/providers.tf.hbs +35 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/variables.tf.hbs +124 -0
- package/plugins/specweave/templates/iac/firebase/defaults.json +29 -0
- package/plugins/specweave/templates/iac/firebase/templates/README.md.hbs +35 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/dev.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/prod.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/staging.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/main.tf.hbs +90 -0
- package/plugins/specweave/templates/iac/firebase/templates/outputs.tf.hbs +15 -0
- package/plugins/specweave/templates/iac/firebase/templates/providers.tf.hbs +23 -0
- package/plugins/specweave/templates/iac/firebase/templates/variables.tf.hbs +42 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/defaults.json +26 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/README.md.hbs +299 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/dev.tfvars.hbs +36 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/prod.tfvars.hbs +48 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/staging.tfvars.hbs +41 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/main.tf.hbs +192 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/outputs.tf.hbs +66 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/providers.tf.hbs +25 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/variables.tf.hbs +119 -0
- package/plugins/specweave/templates/iac/supabase/defaults.json +15 -0
- package/plugins/specweave/templates/iac/supabase/templates/README.md.hbs +46 -0
- package/plugins/specweave/templates/iac/supabase/templates/main.tf.hbs +50 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
- package/plugins/specweave-github/agents/github-manager/AGENT.md +39 -7
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +21 -0
- package/plugins/specweave-github/commands/specweave-github-create-issue.md +5 -5
- package/plugins/specweave-github/lib/CodeValidator.ts +1 -1
- package/plugins/specweave-github/lib/github-client-v2.js +29 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +30 -0
- package/plugins/specweave-github/lib/task-sync.js +4 -0
- package/plugins/specweave-github/lib/task-sync.ts +7 -0
- package/src/templates/CLAUDE.md.template +31 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +0 -116
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +0 -1
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js +0 -356
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +0 -1
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
- 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
|
|
2
|
+
* Status Line Types
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Shows: [
|
|
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
|
-
/**
|
|
9
|
-
|
|
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,
|
|
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
|
|
2
|
+
* Status Line Types
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Shows: [
|
|
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;
|
|
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"}
|