specweave 0.22.14 → 0.23.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.
- package/CLAUDE.md +178 -1
- package/dist/src/cli/commands/import-external.d.ts +22 -0
- package/dist/src/cli/commands/import-external.d.ts.map +1 -0
- package/dist/src/cli/commands/import-external.js +282 -0
- package/dist/src/cli/commands/import-external.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +46 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
- package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
- package/dist/src/cli/helpers/github-repo-selector.js +265 -0
- package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +5 -17
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/config/types.d.ts +16 -16
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
- package/dist/src/core/increment/ac-status-manager.js +4 -2
- package/dist/src/core/increment/ac-status-manager.js.map +1 -1
- package/dist/src/core/increment/completion-validator.d.ts +30 -1
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
- package/dist/src/core/increment/completion-validator.js +151 -3
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +25 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +130 -3
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +262 -18
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +25 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +46 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/repo-structure/repo-id-generator.d.ts +20 -0
- package/dist/src/core/repo-structure/repo-id-generator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-id-generator.js +44 -0
- package/dist/src/core/repo-structure/repo-id-generator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +5 -2
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
- package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
- package/dist/src/core/sync/sync-event-logger.js +39 -1
- package/dist/src/core/sync/sync-event-logger.js.map +1 -1
- package/dist/src/core/types/sync-config-validator.d.ts +57 -0
- package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
- package/dist/src/core/types/sync-config-validator.js +116 -0
- package/dist/src/core/types/sync-config-validator.js.map +1 -0
- package/dist/src/importers/duplicate-detector.d.ts +107 -0
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
- package/dist/src/importers/duplicate-detector.js +189 -0
- package/dist/src/importers/duplicate-detector.js.map +1 -0
- package/dist/src/importers/import-coordinator.d.ts +15 -0
- package/dist/src/importers/import-coordinator.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.js +43 -1
- package/dist/src/importers/import-coordinator.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +5 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +27 -2
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/rate-limiter.d.ts +128 -0
- package/dist/src/importers/rate-limiter.d.ts.map +1 -0
- package/dist/src/importers/rate-limiter.js +200 -0
- package/dist/src/importers/rate-limiter.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +2 -2
- package/dist/src/integrations/ado/ado-client.d.ts +6 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +23 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-client.d.ts +6 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +38 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/sync/external-item-sync-service.d.ts +150 -0
- package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
- package/dist/src/sync/external-item-sync-service.js +241 -0
- package/dist/src/sync/external-item-sync-service.js.map +1 -0
- package/dist/src/sync/format-preservation-sync.d.ts +90 -0
- package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
- package/dist/src/sync/format-preservation-sync.js +173 -0
- package/dist/src/sync/format-preservation-sync.js.map +1 -0
- package/dist/src/sync/index.d.ts +8 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +6 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/sync-coordinator.d.ts +49 -0
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/src/sync/sync-coordinator.js +248 -0
- package/dist/src/sync/sync-coordinator.js.map +1 -0
- package/dist/src/sync/sync-metadata.d.ts +75 -0
- package/dist/src/sync/sync-metadata.d.ts.map +1 -0
- package/dist/src/sync/sync-metadata.js +100 -0
- package/dist/src/sync/sync-metadata.js.map +1 -0
- package/dist/src/types/living-docs-us-file.d.ts +63 -0
- package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
- package/dist/src/types/living-docs-us-file.js +27 -0
- package/dist/src/types/living-docs-us-file.js.map +1 -0
- package/dist/src/validators/format-preservation-validator.d.ts +127 -0
- package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
- package/dist/src/validators/format-preservation-validator.js +187 -0
- package/dist/src/validators/format-preservation-validator.js.map +1 -0
- package/package.json +3 -2
- package/plugins/specweave/.claude-plugin/plugin.json +20 -0
- package/plugins/specweave/commands/specweave-archive-features.md +11 -1
- package/plugins/specweave/commands/specweave-archive.md +51 -15
- package/plugins/specweave/commands/specweave-import-docs.md +88 -278
- package/plugins/specweave/commands/specweave-import-external.md +407 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +94 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +0 -0
- package/plugins/specweave/hooks/post-spec-update.sh +0 -0
- package/plugins/specweave/hooks/post-task-completion.sh +13 -3
- package/plugins/specweave/hooks/post-write-spec.sh +91 -0
- package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
- package/plugins/specweave/lib/hooks/auto-transition.js.bak +50 -0
- package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
- package/plugins/specweave/lib/hooks/auto-transition.ts.bak +84 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.bak +89 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.js.bak +142 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.ts.bak +269 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.bak +60 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js.bak +155 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts.bak +264 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.bak +42 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.js.bak +110 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.ts.bak +178 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.bak +45 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.js.bak +92 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.ts.bak +156 -0
- package/plugins/specweave/lib/hooks/reflection-parser.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-parser.d.ts.bak +33 -0
- package/plugins/specweave/lib/hooks/reflection-parser.js.bak +301 -0
- package/plugins/specweave/lib/hooks/reflection-parser.ts.bak +484 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.bak +56 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.js.bak +182 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.ts.bak +306 -0
- package/plugins/specweave/lib/hooks/reflection-storage.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-storage.d.ts.bak +64 -0
- package/plugins/specweave/lib/hooks/reflection-storage.js.bak +231 -0
- package/plugins/specweave/lib/hooks/reflection-storage.ts.bak +369 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.d.ts.bak +43 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.js.bak +132 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.ts.bak +258 -0
- package/plugins/specweave/lib/hooks/sync-cache.js.bak +294 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.d.js.bak +1 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.d.ts.bak +27 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js +35 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js.bak +339 -0
- package/plugins/specweave/lib/hooks/sync-us-tasks.js +179 -3
- package/plugins/specweave/lib/hooks/sync-us-tasks.js.bak +476 -0
- package/plugins/specweave/lib/hooks/translate-file.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/translate-file.d.ts.bak +59 -0
- package/plugins/specweave/lib/hooks/translate-file.js +1 -1
- package/plugins/specweave/lib/hooks/translate-file.js.bak +289 -0
- package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
- package/plugins/specweave/lib/hooks/translate-file.ts.bak +428 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.d.ts.bak +13 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.js.bak +119 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.ts.bak +224 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.js.bak +51 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.ts.bak +103 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.d.js.bak +1 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.d.ts.bak +29 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.js.bak +296 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.ts.bak +489 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
- package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
- package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
- package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
- package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +531 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Increment Metadata Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the schema for increment metadata tracking (status, type, timestamps).
|
|
5
|
+
* Part of increment 0007: Smart Status Management
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Increment status enum
|
|
9
|
+
* Tracks the lifecycle state of an increment
|
|
10
|
+
*/
|
|
11
|
+
export declare enum IncrementStatus {
|
|
12
|
+
/** Planning phase - spec/plan/tasks being created (does NOT count towards WIP limits) */
|
|
13
|
+
PLANNING = "planning",
|
|
14
|
+
/** Currently being worked on */
|
|
15
|
+
ACTIVE = "active",
|
|
16
|
+
/** Planned but not ready to start yet (does NOT count towards WIP limits) */
|
|
17
|
+
BACKLOG = "backlog",
|
|
18
|
+
/** Temporarily stopped (blocked by external dependency, deprioritized) */
|
|
19
|
+
PAUSED = "paused",
|
|
20
|
+
/** All tasks complete, increment finished */
|
|
21
|
+
COMPLETED = "completed",
|
|
22
|
+
/** Work abandoned (requirements changed, obsolete, etc.) */
|
|
23
|
+
ABANDONED = "abandoned"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Increment type enum
|
|
27
|
+
* Determines rules and limits applied to the increment
|
|
28
|
+
*/
|
|
29
|
+
export declare enum IncrementType {
|
|
30
|
+
/** Critical production fix (bypasses all limits) */
|
|
31
|
+
HOTFIX = "hotfix",
|
|
32
|
+
/** Standard feature development (limit: 2 active) */
|
|
33
|
+
FEATURE = "feature",
|
|
34
|
+
/** Production bug fix with SRE investigation (unlimited, urgent) */
|
|
35
|
+
BUG = "bug",
|
|
36
|
+
/** Change request from stakeholders (limit: 2 active) */
|
|
37
|
+
CHANGE_REQUEST = "change-request",
|
|
38
|
+
/** Code improvement (limit: 1 active) */
|
|
39
|
+
REFACTOR = "refactor",
|
|
40
|
+
/** POC/spike work (unlimited, auto-abandon after 14 days) */
|
|
41
|
+
EXPERIMENT = "experiment"
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Increment metadata schema
|
|
45
|
+
* Stored in .specweave/increments/{id}/metadata.json
|
|
46
|
+
*/
|
|
47
|
+
export interface IncrementMetadata {
|
|
48
|
+
/** Increment ID (e.g., "0007-smart-increment-discipline") */
|
|
49
|
+
id: string;
|
|
50
|
+
/** Current status */
|
|
51
|
+
status: IncrementStatus;
|
|
52
|
+
/** Increment type */
|
|
53
|
+
type: IncrementType;
|
|
54
|
+
/** Creation timestamp (ISO 8601) */
|
|
55
|
+
created: string;
|
|
56
|
+
/** Last activity timestamp (ISO 8601) */
|
|
57
|
+
lastActivity: string;
|
|
58
|
+
/** Testing mode for this increment (defaults to global config) */
|
|
59
|
+
testMode?: 'TDD' | 'test-after' | 'manual';
|
|
60
|
+
/** Coverage target percentage (70-95, defaults to global config) */
|
|
61
|
+
coverageTarget?: number;
|
|
62
|
+
/** Reason for moving to backlog (only if status = backlog) */
|
|
63
|
+
backlogReason?: string;
|
|
64
|
+
/** Timestamp when moved to backlog (ISO 8601) */
|
|
65
|
+
backlogAt?: string;
|
|
66
|
+
/** Reason for pausing (only if status = paused) */
|
|
67
|
+
pausedReason?: string;
|
|
68
|
+
/** Timestamp when paused (ISO 8601) */
|
|
69
|
+
pausedAt?: string;
|
|
70
|
+
/** Reason for abandoning (only if status = abandoned) */
|
|
71
|
+
abandonedReason?: string;
|
|
72
|
+
/** Timestamp when abandoned (ISO 8601) */
|
|
73
|
+
abandonedAt?: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Increment metadata with additional computed fields
|
|
77
|
+
* Used for rich status displays
|
|
78
|
+
*/
|
|
79
|
+
export interface IncrementMetadataExtended extends IncrementMetadata {
|
|
80
|
+
/** Progress percentage (0-100) */
|
|
81
|
+
progress?: number;
|
|
82
|
+
/** Number of completed tasks */
|
|
83
|
+
completedTasks?: number;
|
|
84
|
+
/** Total number of tasks */
|
|
85
|
+
totalTasks?: number;
|
|
86
|
+
/** Age in days since creation */
|
|
87
|
+
ageInDays?: number;
|
|
88
|
+
/** Days since paused (if paused) */
|
|
89
|
+
daysPaused?: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Valid status transitions
|
|
93
|
+
* Enforces increment lifecycle rules
|
|
94
|
+
*/
|
|
95
|
+
export declare const VALID_TRANSITIONS: Record<IncrementStatus, IncrementStatus[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Type-based limits
|
|
98
|
+
* Maximum active increments per type
|
|
99
|
+
*
|
|
100
|
+
* null = unlimited (no limit enforcement)
|
|
101
|
+
* User can configure per-project in .specweave/config.json
|
|
102
|
+
*/
|
|
103
|
+
export declare const TYPE_LIMITS: Record<IncrementType, number | null>;
|
|
104
|
+
/**
|
|
105
|
+
* Staleness thresholds (days)
|
|
106
|
+
* When to warn about stale increments
|
|
107
|
+
*/
|
|
108
|
+
export declare const STALENESS_THRESHOLDS: {
|
|
109
|
+
/** Warn if paused for more than this many days */
|
|
110
|
+
PAUSED: number;
|
|
111
|
+
/** Warn if active for more than this many days */
|
|
112
|
+
ACTIVE: number;
|
|
113
|
+
/** Auto-abandon experiments after this many days */
|
|
114
|
+
EXPERIMENT: number;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Default metadata for new increments
|
|
118
|
+
*
|
|
119
|
+
* NOTE: New increments start in PLANNING status by default.
|
|
120
|
+
* They auto-transition to ACTIVE when tasks.md is created or first task starts.
|
|
121
|
+
*/
|
|
122
|
+
export declare function createDefaultMetadata(id: string, type?: IncrementType): IncrementMetadata;
|
|
123
|
+
/**
|
|
124
|
+
* Check if status transition is valid
|
|
125
|
+
*/
|
|
126
|
+
export declare function isValidTransition(from: IncrementStatus, to: IncrementStatus): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Check if increment is stale (paused too long or active too long)
|
|
129
|
+
*/
|
|
130
|
+
export declare function isStale(metadata: IncrementMetadata): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Check if increment should be auto-abandoned (experiments only)
|
|
133
|
+
*/
|
|
134
|
+
export declare function shouldAutoAbandon(metadata: IncrementMetadata): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Statuses that count toward WIP (Work In Progress) limits
|
|
137
|
+
*
|
|
138
|
+
* ACTIVE: Currently executing tasks, consumes team capacity
|
|
139
|
+
* PAUSED: Temporarily blocked but still holding resources/context
|
|
140
|
+
*
|
|
141
|
+
* Statuses that do NOT count:
|
|
142
|
+
* - PLANNING: Lightweight spec/planning work, parallel-safe
|
|
143
|
+
* - BACKLOG: Not started yet
|
|
144
|
+
* - COMPLETED: Already done
|
|
145
|
+
* - ABANDONED: Cancelled
|
|
146
|
+
*/
|
|
147
|
+
export declare const WIP_COUNTED_STATUSES: IncrementStatus[];
|
|
148
|
+
/**
|
|
149
|
+
* Check if increment status counts toward WIP (Work In Progress) limits
|
|
150
|
+
*/
|
|
151
|
+
export declare function countsTowardWipLimit(status: IncrementStatus): boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Validate if a status transition is allowed
|
|
154
|
+
* @throws Error if transition is invalid
|
|
155
|
+
*/
|
|
156
|
+
export declare function validateTransition(from: IncrementStatus, to: IncrementStatus): void;
|
|
157
|
+
//# sourceMappingURL=increment-metadata.d.ts.map
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Increment Metadata Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the schema for increment metadata tracking (status, type, timestamps).
|
|
5
|
+
* Part of increment 0007: Smart Status Management
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Increment status enum
|
|
9
|
+
* Tracks the lifecycle state of an increment
|
|
10
|
+
*/
|
|
11
|
+
export var IncrementStatus;
|
|
12
|
+
(function (IncrementStatus) {
|
|
13
|
+
/** Planning phase - spec/plan/tasks being created (does NOT count towards WIP limits) */
|
|
14
|
+
IncrementStatus["PLANNING"] = "planning";
|
|
15
|
+
/** Currently being worked on */
|
|
16
|
+
IncrementStatus["ACTIVE"] = "active";
|
|
17
|
+
/** Planned but not ready to start yet (does NOT count towards WIP limits) */
|
|
18
|
+
IncrementStatus["BACKLOG"] = "backlog";
|
|
19
|
+
/** Temporarily stopped (blocked by external dependency, deprioritized) */
|
|
20
|
+
IncrementStatus["PAUSED"] = "paused";
|
|
21
|
+
/** All tasks complete, increment finished */
|
|
22
|
+
IncrementStatus["COMPLETED"] = "completed";
|
|
23
|
+
/** Work abandoned (requirements changed, obsolete, etc.) */
|
|
24
|
+
IncrementStatus["ABANDONED"] = "abandoned";
|
|
25
|
+
})(IncrementStatus || (IncrementStatus = {}));
|
|
26
|
+
/**
|
|
27
|
+
* Increment type enum
|
|
28
|
+
* Determines rules and limits applied to the increment
|
|
29
|
+
*/
|
|
30
|
+
export var IncrementType;
|
|
31
|
+
(function (IncrementType) {
|
|
32
|
+
/** Critical production fix (bypasses all limits) */
|
|
33
|
+
IncrementType["HOTFIX"] = "hotfix";
|
|
34
|
+
/** Standard feature development (limit: 2 active) */
|
|
35
|
+
IncrementType["FEATURE"] = "feature";
|
|
36
|
+
/** Production bug fix with SRE investigation (unlimited, urgent) */
|
|
37
|
+
IncrementType["BUG"] = "bug";
|
|
38
|
+
/** Change request from stakeholders (limit: 2 active) */
|
|
39
|
+
IncrementType["CHANGE_REQUEST"] = "change-request";
|
|
40
|
+
/** Code improvement (limit: 1 active) */
|
|
41
|
+
IncrementType["REFACTOR"] = "refactor";
|
|
42
|
+
/** POC/spike work (unlimited, auto-abandon after 14 days) */
|
|
43
|
+
IncrementType["EXPERIMENT"] = "experiment";
|
|
44
|
+
})(IncrementType || (IncrementType = {}));
|
|
45
|
+
/**
|
|
46
|
+
* Valid status transitions
|
|
47
|
+
* Enforces increment lifecycle rules
|
|
48
|
+
*/
|
|
49
|
+
export const VALID_TRANSITIONS = {
|
|
50
|
+
[IncrementStatus.PLANNING]: [
|
|
51
|
+
IncrementStatus.ACTIVE, // Move to active when tasks start
|
|
52
|
+
IncrementStatus.BACKLOG, // Move to backlog if deprioritized
|
|
53
|
+
IncrementStatus.ABANDONED // Cancel planning
|
|
54
|
+
],
|
|
55
|
+
[IncrementStatus.ACTIVE]: [
|
|
56
|
+
IncrementStatus.BACKLOG,
|
|
57
|
+
IncrementStatus.PAUSED,
|
|
58
|
+
IncrementStatus.COMPLETED,
|
|
59
|
+
IncrementStatus.ABANDONED
|
|
60
|
+
],
|
|
61
|
+
[IncrementStatus.BACKLOG]: [
|
|
62
|
+
IncrementStatus.PLANNING, // Resume planning
|
|
63
|
+
IncrementStatus.ACTIVE,
|
|
64
|
+
IncrementStatus.ABANDONED
|
|
65
|
+
],
|
|
66
|
+
[IncrementStatus.PAUSED]: [
|
|
67
|
+
IncrementStatus.ACTIVE,
|
|
68
|
+
IncrementStatus.ABANDONED
|
|
69
|
+
],
|
|
70
|
+
[IncrementStatus.COMPLETED]: [
|
|
71
|
+
// NEW: Allow reopening completed increments when issues discovered
|
|
72
|
+
IncrementStatus.ACTIVE, // Reopen for fixes
|
|
73
|
+
IncrementStatus.ABANDONED // Mark as failed (rare)
|
|
74
|
+
],
|
|
75
|
+
[IncrementStatus.ABANDONED]: [
|
|
76
|
+
IncrementStatus.ACTIVE // Can un-abandon if needed (rare)
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Type-based limits
|
|
81
|
+
* Maximum active increments per type
|
|
82
|
+
*
|
|
83
|
+
* null = unlimited (no limit enforcement)
|
|
84
|
+
* User can configure per-project in .specweave/config.json
|
|
85
|
+
*/
|
|
86
|
+
export const TYPE_LIMITS = {
|
|
87
|
+
[IncrementType.HOTFIX]: null, // Unlimited (emergency work)
|
|
88
|
+
[IncrementType.FEATURE]: 2, // Max 2 active (context switching cost)
|
|
89
|
+
[IncrementType.BUG]: null, // Unlimited (production issues)
|
|
90
|
+
[IncrementType.CHANGE_REQUEST]: 2, // Max 2 active (stakeholder-driven)
|
|
91
|
+
[IncrementType.REFACTOR]: 1, // Max 1 active (needs focus)
|
|
92
|
+
[IncrementType.EXPERIMENT]: null // Unlimited (exploratory work)
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Staleness thresholds (days)
|
|
96
|
+
* When to warn about stale increments
|
|
97
|
+
*/
|
|
98
|
+
export const STALENESS_THRESHOLDS = {
|
|
99
|
+
/** Warn if paused for more than this many days */
|
|
100
|
+
PAUSED: 7,
|
|
101
|
+
/** Warn if active for more than this many days */
|
|
102
|
+
ACTIVE: 30,
|
|
103
|
+
/** Auto-abandon experiments after this many days */
|
|
104
|
+
EXPERIMENT: 14
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Default metadata for new increments
|
|
108
|
+
*
|
|
109
|
+
* NOTE: New increments start in PLANNING status by default.
|
|
110
|
+
* They auto-transition to ACTIVE when tasks.md is created or first task starts.
|
|
111
|
+
*/
|
|
112
|
+
export function createDefaultMetadata(id, type = IncrementType.FEATURE) {
|
|
113
|
+
const now = new Date().toISOString();
|
|
114
|
+
return {
|
|
115
|
+
id,
|
|
116
|
+
status: IncrementStatus.PLANNING, // Start in planning phase
|
|
117
|
+
type,
|
|
118
|
+
created: now,
|
|
119
|
+
lastActivity: now
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if status transition is valid
|
|
124
|
+
*/
|
|
125
|
+
export function isValidTransition(from, to) {
|
|
126
|
+
const allowedTransitions = VALID_TRANSITIONS[from];
|
|
127
|
+
return allowedTransitions.includes(to);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if increment is stale (paused too long or active too long)
|
|
131
|
+
*/
|
|
132
|
+
export function isStale(metadata) {
|
|
133
|
+
const now = new Date();
|
|
134
|
+
if (metadata.status === IncrementStatus.PAUSED && metadata.pausedAt) {
|
|
135
|
+
const pausedDate = new Date(metadata.pausedAt);
|
|
136
|
+
const daysPaused = (now.getTime() - pausedDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
137
|
+
return daysPaused > STALENESS_THRESHOLDS.PAUSED;
|
|
138
|
+
}
|
|
139
|
+
if (metadata.status === IncrementStatus.ACTIVE) {
|
|
140
|
+
const createdDate = new Date(metadata.created);
|
|
141
|
+
const daysActive = (now.getTime() - createdDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
142
|
+
return daysActive > STALENESS_THRESHOLDS.ACTIVE;
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if increment should be auto-abandoned (experiments only)
|
|
148
|
+
*/
|
|
149
|
+
export function shouldAutoAbandon(metadata) {
|
|
150
|
+
if (metadata.type !== IncrementType.EXPERIMENT) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const now = new Date();
|
|
154
|
+
const lastActivityDate = new Date(metadata.lastActivity);
|
|
155
|
+
const daysSinceActivity = (now.getTime() - lastActivityDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
156
|
+
return daysSinceActivity > STALENESS_THRESHOLDS.EXPERIMENT;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Statuses that count toward WIP (Work In Progress) limits
|
|
160
|
+
*
|
|
161
|
+
* ACTIVE: Currently executing tasks, consumes team capacity
|
|
162
|
+
* PAUSED: Temporarily blocked but still holding resources/context
|
|
163
|
+
*
|
|
164
|
+
* Statuses that do NOT count:
|
|
165
|
+
* - PLANNING: Lightweight spec/planning work, parallel-safe
|
|
166
|
+
* - BACKLOG: Not started yet
|
|
167
|
+
* - COMPLETED: Already done
|
|
168
|
+
* - ABANDONED: Cancelled
|
|
169
|
+
*/
|
|
170
|
+
export const WIP_COUNTED_STATUSES = [
|
|
171
|
+
IncrementStatus.ACTIVE,
|
|
172
|
+
IncrementStatus.PAUSED // Paused work still blocks team capacity
|
|
173
|
+
];
|
|
174
|
+
/**
|
|
175
|
+
* Check if increment status counts toward WIP (Work In Progress) limits
|
|
176
|
+
*/
|
|
177
|
+
export function countsTowardWipLimit(status) {
|
|
178
|
+
return WIP_COUNTED_STATUSES.includes(status);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Validate if a status transition is allowed
|
|
182
|
+
* @throws Error if transition is invalid
|
|
183
|
+
*/
|
|
184
|
+
export function validateTransition(from, to) {
|
|
185
|
+
if (!isValidTransition(from, to)) {
|
|
186
|
+
const validTransitions = VALID_TRANSITIONS[from];
|
|
187
|
+
throw new Error(`Invalid transition: ${from} → ${to}.\n` +
|
|
188
|
+
`Valid transitions from ${from}: ${validTransitions.join(', ')}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=increment-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"increment-metadata.js","sourceRoot":"","sources":["../../../../src/core/types/increment-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Parser with US-Task Linkage Support
|
|
3
|
+
*
|
|
4
|
+
* Parses tasks.md files to extract task metadata including new US linkage fields:
|
|
5
|
+
* - userStory: US-ID this task implements (e.g., "US-001")
|
|
6
|
+
* - satisfiesACs: List of AC-IDs this task satisfies (e.g., ["AC-US1-01", "AC-US1-02"])
|
|
7
|
+
*
|
|
8
|
+
* Supports hierarchical task structure grouped by User Story.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Task metadata extracted from tasks.md
|
|
12
|
+
*/
|
|
13
|
+
export interface Task {
|
|
14
|
+
/** Task ID (e.g., "T-001") */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Task title */
|
|
17
|
+
title: string;
|
|
18
|
+
/** User Story this task implements (optional for backward compatibility) */
|
|
19
|
+
userStory?: string;
|
|
20
|
+
/** Acceptance Criteria IDs this task satisfies (optional) */
|
|
21
|
+
satisfiesACs?: string[];
|
|
22
|
+
/** Task completion status */
|
|
23
|
+
status: TaskStatus;
|
|
24
|
+
/** Priority level (P0, P1, P2, P3) */
|
|
25
|
+
priority?: string;
|
|
26
|
+
/** Estimated effort (e.g., "4 hours", "2 days") */
|
|
27
|
+
estimatedEffort?: string;
|
|
28
|
+
/** Task dependencies (task IDs this depends on) */
|
|
29
|
+
dependencies?: string[];
|
|
30
|
+
/** Full task description */
|
|
31
|
+
description?: string;
|
|
32
|
+
/** Files affected by this task */
|
|
33
|
+
filesAffected?: string[];
|
|
34
|
+
/** Line number in tasks.md (for error reporting) */
|
|
35
|
+
lineNumber?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Task completion status
|
|
39
|
+
*/
|
|
40
|
+
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'transferred' | 'canceled';
|
|
41
|
+
/**
|
|
42
|
+
* Tasks grouped by User Story
|
|
43
|
+
*/
|
|
44
|
+
export interface TasksByUserStory {
|
|
45
|
+
[usId: string]: Task[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validation error for task linkage
|
|
49
|
+
*/
|
|
50
|
+
export interface TaskLinkageError {
|
|
51
|
+
taskId: string;
|
|
52
|
+
field: 'userStory' | 'satisfiesACs';
|
|
53
|
+
value: string;
|
|
54
|
+
message: string;
|
|
55
|
+
suggestedFix?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse tasks.md and extract all tasks with US linkage
|
|
59
|
+
*
|
|
60
|
+
* @param tasksPath - Path to tasks.md file
|
|
61
|
+
* @returns Map of User Story ID → Tasks
|
|
62
|
+
* @throws Error if tasks.md cannot be read or is malformed
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseTasksWithUSLinks(tasksPath: string): TasksByUserStory;
|
|
65
|
+
/**
|
|
66
|
+
* Validate task US and AC linkage
|
|
67
|
+
*
|
|
68
|
+
* @param task - Task to validate
|
|
69
|
+
* @param validUSIds - List of valid US-IDs from spec.md
|
|
70
|
+
* @param validACIds - List of valid AC-IDs from spec.md
|
|
71
|
+
* @returns Array of validation errors (empty if valid)
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateTaskLinkage(task: Task, validUSIds: string[], validACIds: string[]): TaskLinkageError[];
|
|
74
|
+
/**
|
|
75
|
+
* Get all tasks (flattened, not grouped by US)
|
|
76
|
+
*
|
|
77
|
+
* @param tasksByUS - Tasks grouped by User Story
|
|
78
|
+
* @returns Array of all tasks
|
|
79
|
+
*/
|
|
80
|
+
export declare function getAllTasks(tasksByUS: TasksByUserStory): Task[];
|
|
81
|
+
/**
|
|
82
|
+
* Count tasks by status
|
|
83
|
+
*
|
|
84
|
+
* @param tasksByUS - Tasks grouped by User Story
|
|
85
|
+
* @returns Map of status → count
|
|
86
|
+
*/
|
|
87
|
+
export declare function countTasksByStatus(tasksByUS: TasksByUserStory): Record<TaskStatus, number>;
|
|
88
|
+
/**
|
|
89
|
+
* Calculate completion percentage
|
|
90
|
+
*
|
|
91
|
+
* @param tasksByUS - Tasks grouped by User Story
|
|
92
|
+
* @returns Completion percentage (0-100)
|
|
93
|
+
*/
|
|
94
|
+
export declare function calculateCompletionPercentage(tasksByUS: TasksByUserStory): number;
|
|
95
|
+
//# sourceMappingURL=task-parser.d.ts.map
|