sqlew 3.2.5 → 3.5.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/CHANGELOG.md +815 -13
- package/README.md +53 -2
- package/assets/schema.sql +6 -1
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +151 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +77 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +28 -0
- package/dist/config/types.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +1 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +77 -10
- package/dist/database.js.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +16 -1
- package/dist/migrations/index.js.map +1 -1
- package/dist/tests/git-aware-completion.test.d.ts +6 -0
- package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
- package/dist/tests/git-aware-completion.test.js +141 -0
- package/dist/tests/git-aware-completion.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js +250 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js +274 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js +232 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js +196 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +235 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.js +351 -0
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.js +249 -0
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
- package/dist/tests/two-step-git-completion.test.d.ts +6 -0
- package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
- package/dist/tests/two-step-git-completion.test.js +283 -0
- package/dist/tests/two-step-git-completion.test.js.map +1 -0
- package/dist/tests/vcs-staging.test.d.ts +6 -0
- package/dist/tests/vcs-staging.test.d.ts.map +1 -0
- package/dist/tests/vcs-staging.test.js +137 -0
- package/dist/tests/vcs-staging.test.js.map +1 -0
- package/dist/tools/config.d.ts +4 -2
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +13 -11
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +7 -4
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +19 -16
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +33 -17
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +84 -68
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +9 -5
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +19 -15
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/messaging.d.ts +9 -5
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +20 -16
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +40 -12
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +475 -87
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +11 -6
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +56 -44
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-pruning.d.ts +69 -0
- package/dist/utils/file-pruning.d.ts.map +1 -0
- package/dist/utils/file-pruning.js +185 -0
- package/dist/utils/file-pruning.js.map +1 -0
- package/dist/utils/quality-checks.d.ts +60 -0
- package/dist/utils/quality-checks.d.ts.map +1 -0
- package/dist/utils/quality-checks.js +228 -0
- package/dist/utils/quality-checks.js.map +1 -0
- package/dist/utils/retention.d.ts +8 -0
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +12 -0
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +69 -1
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +494 -17
- package/dist/utils/task-stale-detection.js.map +1 -1
- package/dist/utils/vcs-adapter.d.ts +68 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -0
- package/dist/utils/vcs-adapter.js +187 -0
- package/dist/utils/vcs-adapter.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +54 -4
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +312 -30
- package/dist/watcher/file-watcher.js.map +1 -1
- package/dist/watcher/gitignore-parser.d.ts +70 -0
- package/dist/watcher/gitignore-parser.d.ts.map +1 -0
- package/dist/watcher/gitignore-parser.js +191 -0
- package/dist/watcher/gitignore-parser.js.map +1 -0
- package/dist/watcher/index.d.ts +1 -0
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +1 -0
- package/dist/watcher/index.js.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +1 -1
- package/docs/ARCHITECTURE.md +12 -0
- package/docs/AUTO_FILE_TRACKING.md +486 -82
- package/docs/CONFIGURATION.md +908 -0
- package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
- package/docs/MIGRATION_v3.3.md +602 -0
- package/docs/SHARED_CONCEPTS.md +2 -1
- package/docs/TASK_ACTIONS.md +12 -0
- package/docs/TASK_OVERVIEW.md +124 -23
- package/docs/TASK_PRUNING.md +589 -0
- package/docs/TASK_SYSTEM.md +83 -13
- package/docs/TOOL_REFERENCE.md +94 -6
- package/package.json +8 -6
|
@@ -8,7 +8,6 @@ import { Database } from '../types.js';
|
|
|
8
8
|
*
|
|
9
9
|
* Detection logic:
|
|
10
10
|
* - Tasks in `in_progress` with `updated_ts` older than threshold → move to `waiting_review`
|
|
11
|
-
* - Tasks in `waiting_review` with `updated_ts` older than threshold → move to `todo`
|
|
12
11
|
*
|
|
13
12
|
* @param db - Database instance
|
|
14
13
|
* @returns Count of transitioned tasks
|
|
@@ -25,4 +24,73 @@ export declare function getStaleDetectionConfig(db: Database): {
|
|
|
25
24
|
inProgressThresholdHours: number;
|
|
26
25
|
waitingReviewThresholdHours: number;
|
|
27
26
|
};
|
|
27
|
+
/**
|
|
28
|
+
* Auto-archive old done tasks
|
|
29
|
+
* Archives tasks in 'done' status older than configured threshold
|
|
30
|
+
* Uses weekend-aware retention logic (consistent with messages/files)
|
|
31
|
+
*
|
|
32
|
+
* Default: 48 hours (2 days)
|
|
33
|
+
* Weekend-aware: Task done Friday → archives Tuesday (skip Sat/Sun)
|
|
34
|
+
*
|
|
35
|
+
* @param db - Database instance
|
|
36
|
+
* @returns Count of archived tasks
|
|
37
|
+
*/
|
|
38
|
+
export declare function autoArchiveOldDoneTasks(db: Database): number;
|
|
39
|
+
/**
|
|
40
|
+
* Detect and complete tasks in waiting_review or in_progress when all watched files are committed
|
|
41
|
+
*
|
|
42
|
+
* VCS-aware auto-complete strategy (v3.4.0+):
|
|
43
|
+
* - Find all tasks in `waiting_review` or `in_progress` status with watched files
|
|
44
|
+
* - For each task, check if ALL watched files have been committed since task creation
|
|
45
|
+
* - Query VCS history to determine committed files
|
|
46
|
+
* - If all files committed → transition to `done` (VCS commit = implicit approval)
|
|
47
|
+
* - Supports multiple VCS: Git, Mercurial, SVN
|
|
48
|
+
* - Gracefully handle non-VCS repos (skip auto-complete)
|
|
49
|
+
*
|
|
50
|
+
* @param db - Database instance
|
|
51
|
+
* @returns Count of auto-completed tasks
|
|
52
|
+
*/
|
|
53
|
+
export declare function detectAndCompleteReviewedTasks(db: Database): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Detect and auto-complete tasks in waiting_review when all watched files are staged
|
|
56
|
+
* (v3.5.2 - Two-step Git-aware workflow: staging → done)
|
|
57
|
+
*
|
|
58
|
+
* Logic:
|
|
59
|
+
* - Find all tasks in waiting_review status
|
|
60
|
+
* - Check if ALL watched files are staged (git add)
|
|
61
|
+
* - If yes → transition to done
|
|
62
|
+
* - Respects git_auto_complete_on_stage config
|
|
63
|
+
*
|
|
64
|
+
* @param db - Database instance
|
|
65
|
+
* @returns Count of auto-completed tasks
|
|
66
|
+
*/
|
|
67
|
+
export declare function detectAndCompleteOnStaging(db: Database): Promise<number>;
|
|
68
|
+
/**
|
|
69
|
+
* Detect and auto-archive tasks in done when all watched files are committed
|
|
70
|
+
* (v3.5.2 - Two-step Git-aware workflow: commit → archived)
|
|
71
|
+
*
|
|
72
|
+
* Logic:
|
|
73
|
+
* - Find all tasks in done status
|
|
74
|
+
* - Check if ALL watched files are committed (git commit)
|
|
75
|
+
* - If yes → transition to archived
|
|
76
|
+
* - Respects git_auto_archive_on_commit config
|
|
77
|
+
*
|
|
78
|
+
* @param db - Database instance
|
|
79
|
+
* @returns Count of auto-archived tasks
|
|
80
|
+
*/
|
|
81
|
+
export declare function detectAndArchiveOnCommit(db: Database): Promise<number>;
|
|
82
|
+
/**
|
|
83
|
+
* Detect and transition in_progress tasks to waiting_review based on quality gates
|
|
84
|
+
* Database-backed approach that survives restarts
|
|
85
|
+
*
|
|
86
|
+
* Quality gates:
|
|
87
|
+
* - Task has been idle (no updates) for configured time (default 3 minutes)
|
|
88
|
+
* - All watched files have been modified at least once
|
|
89
|
+
* - TypeScript compiles without errors (if .ts files)
|
|
90
|
+
* - Tests pass (if test files exist)
|
|
91
|
+
*
|
|
92
|
+
* @param db - Database instance
|
|
93
|
+
* @returns Count of transitioned tasks
|
|
94
|
+
*/
|
|
95
|
+
export declare function detectAndTransitionToReview(db: Database): Promise<number>;
|
|
28
96
|
//# sourceMappingURL=task-stale-detection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-stale-detection.d.ts","sourceRoot":"","sources":["../../src/utils/task-stale-detection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"task-stale-detection.d.ts","sourceRoot":"","sources":["../../src/utils/task-stale-detection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8CvC;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAsDlE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,GAAG;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAkBA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAkB5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAqGlF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAkG9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAgG5E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAgK/E"}
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
* Automatically transitions abandoned tasks based on time thresholds
|
|
4
4
|
*/
|
|
5
5
|
import { getConfigBool, getConfigInt } from '../database.js';
|
|
6
|
+
import { calculateTaskArchiveCutoff } from './retention.js';
|
|
7
|
+
import { checkReadyForReview } from './quality-checks.js';
|
|
8
|
+
import { pruneNonExistentFiles } from './file-pruning.js';
|
|
9
|
+
import { statSync, existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { detectVCS } from './vcs-adapter.js';
|
|
6
12
|
/**
|
|
7
13
|
* Task status IDs (matching schema)
|
|
8
14
|
*/
|
|
@@ -10,14 +16,24 @@ const TASK_STATUS = {
|
|
|
10
16
|
TODO: 1,
|
|
11
17
|
IN_PROGRESS: 2,
|
|
12
18
|
WAITING_REVIEW: 3,
|
|
19
|
+
BLOCKED: 4,
|
|
20
|
+
DONE: 5,
|
|
21
|
+
ARCHIVED: 6,
|
|
13
22
|
};
|
|
14
23
|
/**
|
|
15
|
-
* Configuration keys for task stale detection
|
|
24
|
+
* Configuration keys for task stale detection and review
|
|
16
25
|
*/
|
|
17
26
|
const CONFIG_KEYS = {
|
|
18
27
|
TASK_STALE_HOURS_IN_PROGRESS: 'task_stale_hours_in_progress',
|
|
19
28
|
TASK_STALE_HOURS_WAITING_REVIEW: 'task_stale_hours_waiting_review',
|
|
20
29
|
TASK_AUTO_STALE_ENABLED: 'task_auto_stale_enabled',
|
|
30
|
+
REVIEW_IDLE_MINUTES: 'review_idle_minutes',
|
|
31
|
+
REVIEW_REQUIRE_ALL_FILES_MODIFIED: 'review_require_all_files_modified',
|
|
32
|
+
REVIEW_REQUIRE_TESTS_PASS: 'review_require_tests_pass',
|
|
33
|
+
REVIEW_REQUIRE_COMPILE: 'review_require_compile',
|
|
34
|
+
GIT_AUTO_COMPLETE_ENABLED: 'git_auto_complete_enabled',
|
|
35
|
+
REQUIRE_ALL_FILES_COMMITTED: 'require_all_files_committed',
|
|
36
|
+
STALE_REVIEW_NOTIFICATION_HOURS: 'stale_review_notification_hours',
|
|
21
37
|
};
|
|
22
38
|
/**
|
|
23
39
|
* Default configuration values
|
|
@@ -32,7 +48,6 @@ const DEFAULTS = {
|
|
|
32
48
|
*
|
|
33
49
|
* Detection logic:
|
|
34
50
|
* - Tasks in `in_progress` with `updated_ts` older than threshold → move to `waiting_review`
|
|
35
|
-
* - Tasks in `waiting_review` with `updated_ts` older than threshold → move to `todo`
|
|
36
51
|
*
|
|
37
52
|
* @param db - Database instance
|
|
38
53
|
* @returns Count of transitioned tasks
|
|
@@ -53,23 +68,14 @@ export function detectAndTransitionStaleTasks(db) {
|
|
|
53
68
|
// 3. Transition stale tasks in a transaction
|
|
54
69
|
const updateStmt = db.transaction(() => {
|
|
55
70
|
// 3a. Find and transition in_progress tasks older than threshold to waiting_review
|
|
56
|
-
const inProgressTransitioned = db.prepare(`
|
|
57
|
-
UPDATE t_tasks
|
|
58
|
-
SET status_id = ?,
|
|
59
|
-
updated_ts = unixepoch()
|
|
60
|
-
WHERE status_id = ?
|
|
61
|
-
AND updated_ts < unixepoch() - ?
|
|
71
|
+
const inProgressTransitioned = db.prepare(`
|
|
72
|
+
UPDATE t_tasks
|
|
73
|
+
SET status_id = ?,
|
|
74
|
+
updated_ts = unixepoch()
|
|
75
|
+
WHERE status_id = ?
|
|
76
|
+
AND updated_ts < unixepoch() - ?
|
|
62
77
|
`).run(TASK_STATUS.WAITING_REVIEW, TASK_STATUS.IN_PROGRESS, inProgressThresholdSeconds);
|
|
63
78
|
totalTransitioned += inProgressTransitioned.changes;
|
|
64
|
-
// 3b. Find and transition waiting_review tasks older than threshold to todo
|
|
65
|
-
const waitingReviewTransitioned = db.prepare(`
|
|
66
|
-
UPDATE t_tasks
|
|
67
|
-
SET status_id = ?,
|
|
68
|
-
updated_ts = unixepoch()
|
|
69
|
-
WHERE status_id = ?
|
|
70
|
-
AND updated_ts < unixepoch() - ?
|
|
71
|
-
`).run(TASK_STATUS.TODO, TASK_STATUS.WAITING_REVIEW, waitingReviewThresholdSeconds);
|
|
72
|
-
totalTransitioned += waitingReviewTransitioned.changes;
|
|
73
79
|
});
|
|
74
80
|
// Execute the transaction
|
|
75
81
|
updateStmt();
|
|
@@ -89,4 +95,475 @@ export function getStaleDetectionConfig(db) {
|
|
|
89
95
|
waitingReviewThresholdHours: getConfigInt(db, CONFIG_KEYS.TASK_STALE_HOURS_WAITING_REVIEW, DEFAULTS.STALE_HOURS_WAITING_REVIEW),
|
|
90
96
|
};
|
|
91
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Auto-archive old done tasks
|
|
100
|
+
* Archives tasks in 'done' status older than configured threshold
|
|
101
|
+
* Uses weekend-aware retention logic (consistent with messages/files)
|
|
102
|
+
*
|
|
103
|
+
* Default: 48 hours (2 days)
|
|
104
|
+
* Weekend-aware: Task done Friday → archives Tuesday (skip Sat/Sun)
|
|
105
|
+
*
|
|
106
|
+
* @param db - Database instance
|
|
107
|
+
* @returns Count of archived tasks
|
|
108
|
+
*/
|
|
109
|
+
export function autoArchiveOldDoneTasks(db) {
|
|
110
|
+
// Calculate cutoff timestamp using weekend-aware retention logic
|
|
111
|
+
const cutoffTimestamp = calculateTaskArchiveCutoff(db);
|
|
112
|
+
// Archive done tasks older than cutoff
|
|
113
|
+
const result = db.prepare(`
|
|
114
|
+
UPDATE t_tasks
|
|
115
|
+
SET status_id = ?,
|
|
116
|
+
updated_ts = unixepoch()
|
|
117
|
+
WHERE status_id = ?
|
|
118
|
+
AND updated_ts < ?
|
|
119
|
+
`).run(TASK_STATUS.ARCHIVED, TASK_STATUS.DONE, cutoffTimestamp);
|
|
120
|
+
return result.changes;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Detect and complete tasks in waiting_review or in_progress when all watched files are committed
|
|
124
|
+
*
|
|
125
|
+
* VCS-aware auto-complete strategy (v3.4.0+):
|
|
126
|
+
* - Find all tasks in `waiting_review` or `in_progress` status with watched files
|
|
127
|
+
* - For each task, check if ALL watched files have been committed since task creation
|
|
128
|
+
* - Query VCS history to determine committed files
|
|
129
|
+
* - If all files committed → transition to `done` (VCS commit = implicit approval)
|
|
130
|
+
* - Supports multiple VCS: Git, Mercurial, SVN
|
|
131
|
+
* - Gracefully handle non-VCS repos (skip auto-complete)
|
|
132
|
+
*
|
|
133
|
+
* @param db - Database instance
|
|
134
|
+
* @returns Count of auto-completed tasks
|
|
135
|
+
*/
|
|
136
|
+
export async function detectAndCompleteReviewedTasks(db) {
|
|
137
|
+
// 1. Check if auto-complete is enabled
|
|
138
|
+
const isEnabled = getConfigBool(db, CONFIG_KEYS.GIT_AUTO_COMPLETE_ENABLED, true);
|
|
139
|
+
if (!isEnabled) {
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
const requireAllFilesCommitted = getConfigBool(db, CONFIG_KEYS.REQUIRE_ALL_FILES_COMMITTED, true);
|
|
143
|
+
// 2. Find all waiting_review and in_progress tasks
|
|
144
|
+
const candidateTasks = db.prepare(`
|
|
145
|
+
SELECT t.id, t.created_ts, s.name as status_name
|
|
146
|
+
FROM t_tasks t
|
|
147
|
+
JOIN m_task_statuses s ON t.status_id = s.id
|
|
148
|
+
WHERE s.name IN ('waiting_review', 'in_progress')
|
|
149
|
+
`).all();
|
|
150
|
+
if (candidateTasks.length === 0) {
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
let completed = 0;
|
|
154
|
+
const projectRoot = process.cwd();
|
|
155
|
+
// 3. Detect VCS type
|
|
156
|
+
const vcsAdapter = await detectVCS(projectRoot);
|
|
157
|
+
if (!vcsAdapter) {
|
|
158
|
+
// Not a VCS repository - skip VCS-aware completion
|
|
159
|
+
console.error(' ℹ Not a VCS repository (Git/Mercurial/SVN) - skipping VCS-aware auto-complete');
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
console.error(` ℹ VCS detected: ${vcsAdapter.getVCSType()}`);
|
|
163
|
+
// 4. For each candidate task, check if all watched files are committed
|
|
164
|
+
for (const task of candidateTasks) {
|
|
165
|
+
try {
|
|
166
|
+
// Get watched files for this task
|
|
167
|
+
const watchedFiles = db.prepare(`
|
|
168
|
+
SELECT f.path
|
|
169
|
+
FROM t_task_file_links tfl
|
|
170
|
+
JOIN m_files f ON tfl.file_id = f.id
|
|
171
|
+
WHERE tfl.task_id = ?
|
|
172
|
+
`).all(task.id);
|
|
173
|
+
if (watchedFiles.length === 0) {
|
|
174
|
+
// No watched files - skip this task
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const filePaths = watchedFiles.map(f => f.path);
|
|
178
|
+
// Query VCS history for commits since task creation
|
|
179
|
+
// Convert Unix timestamp to ISO 8601 format for VCS adapters
|
|
180
|
+
const sinceTimestamp = new Date(task.created_ts * 1000).toISOString();
|
|
181
|
+
let committedFiles;
|
|
182
|
+
try {
|
|
183
|
+
const committedFilesList = await vcsAdapter.getCommittedFilesSince(sinceTimestamp);
|
|
184
|
+
committedFiles = new Set(committedFilesList);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
// VCS query failed - skip this task
|
|
188
|
+
console.error(` ⏸ Task #${task.id}: ${vcsAdapter.getVCSType()} query failed - ${error instanceof Error ? error.message : String(error)}`);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// Check if all watched files are committed
|
|
192
|
+
const uncommittedFiles = [];
|
|
193
|
+
for (const filePath of filePaths) {
|
|
194
|
+
if (!committedFiles.has(filePath)) {
|
|
195
|
+
uncommittedFiles.push(filePath);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Determine if task should auto-complete
|
|
199
|
+
const shouldComplete = requireAllFilesCommitted
|
|
200
|
+
? uncommittedFiles.length === 0 // ALL files must be committed
|
|
201
|
+
: committedFiles.size > 0 && uncommittedFiles.length < filePaths.length; // At least SOME files committed
|
|
202
|
+
if (shouldComplete) {
|
|
203
|
+
// All watched files committed - transition to done
|
|
204
|
+
db.prepare(`
|
|
205
|
+
UPDATE t_tasks
|
|
206
|
+
SET status_id = ?,
|
|
207
|
+
updated_ts = unixepoch()
|
|
208
|
+
WHERE id = ?
|
|
209
|
+
`).run(TASK_STATUS.DONE, task.id);
|
|
210
|
+
completed++;
|
|
211
|
+
console.error(` ✓ Task #${task.id}: ${task.status_name} → done (all ${filePaths.length} watched files committed)`);
|
|
212
|
+
}
|
|
213
|
+
else if (uncommittedFiles.length > 0) {
|
|
214
|
+
console.error(` ⏸ Task #${task.id}: ${uncommittedFiles.length} of ${filePaths.length} files not yet committed`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
console.error(` ✗ Error checking task #${task.id} for git commits:`, error);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return completed;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Detect and auto-complete tasks in waiting_review when all watched files are staged
|
|
226
|
+
* (v3.5.2 - Two-step Git-aware workflow: staging → done)
|
|
227
|
+
*
|
|
228
|
+
* Logic:
|
|
229
|
+
* - Find all tasks in waiting_review status
|
|
230
|
+
* - Check if ALL watched files are staged (git add)
|
|
231
|
+
* - If yes → transition to done
|
|
232
|
+
* - Respects git_auto_complete_on_stage config
|
|
233
|
+
*
|
|
234
|
+
* @param db - Database instance
|
|
235
|
+
* @returns Count of auto-completed tasks
|
|
236
|
+
*/
|
|
237
|
+
export async function detectAndCompleteOnStaging(db) {
|
|
238
|
+
// 1. Check if auto-complete on staging is enabled
|
|
239
|
+
const isEnabled = getConfigBool(db, 'git_auto_complete_on_stage', true);
|
|
240
|
+
if (!isEnabled) {
|
|
241
|
+
return 0;
|
|
242
|
+
}
|
|
243
|
+
const requireAllFilesStaged = getConfigBool(db, 'require_all_files_staged', true);
|
|
244
|
+
// 2. Find all waiting_review tasks
|
|
245
|
+
const candidateTasks = db.prepare(`
|
|
246
|
+
SELECT t.id
|
|
247
|
+
FROM t_tasks t
|
|
248
|
+
JOIN m_task_statuses s ON t.status_id = s.id
|
|
249
|
+
WHERE s.name = 'waiting_review'
|
|
250
|
+
`).all();
|
|
251
|
+
if (candidateTasks.length === 0) {
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
let completed = 0;
|
|
255
|
+
const projectRoot = process.cwd();
|
|
256
|
+
// 3. Detect VCS type
|
|
257
|
+
const vcsAdapter = await detectVCS(projectRoot);
|
|
258
|
+
if (!vcsAdapter) {
|
|
259
|
+
// Not a VCS repository - skip VCS-aware completion
|
|
260
|
+
return 0;
|
|
261
|
+
}
|
|
262
|
+
// 4. Get currently staged files
|
|
263
|
+
let stagedFiles;
|
|
264
|
+
try {
|
|
265
|
+
const stagedFilesList = await vcsAdapter.getStagedFiles();
|
|
266
|
+
stagedFiles = new Set(stagedFilesList);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
// VCS query failed
|
|
270
|
+
console.error(` ⏸ ${vcsAdapter.getVCSType()} staging query failed - ${error instanceof Error ? error.message : String(error)}`);
|
|
271
|
+
return 0;
|
|
272
|
+
}
|
|
273
|
+
if (stagedFiles.size === 0) {
|
|
274
|
+
// No staged files at all
|
|
275
|
+
return 0;
|
|
276
|
+
}
|
|
277
|
+
// 5. For each candidate task, check if all watched files are staged
|
|
278
|
+
for (const task of candidateTasks) {
|
|
279
|
+
try {
|
|
280
|
+
// Get watched files for this task
|
|
281
|
+
const watchedFiles = db.prepare(`
|
|
282
|
+
SELECT f.path
|
|
283
|
+
FROM t_task_file_links tfl
|
|
284
|
+
JOIN m_files f ON tfl.file_id = f.id
|
|
285
|
+
WHERE tfl.task_id = ?
|
|
286
|
+
`).all(task.id);
|
|
287
|
+
if (watchedFiles.length === 0) {
|
|
288
|
+
// No watched files - skip this task
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const filePaths = watchedFiles.map(f => f.path);
|
|
292
|
+
// Check if all watched files are staged
|
|
293
|
+
const unstagedFiles = [];
|
|
294
|
+
for (const filePath of filePaths) {
|
|
295
|
+
if (!stagedFiles.has(filePath)) {
|
|
296
|
+
unstagedFiles.push(filePath);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Determine if task should auto-complete
|
|
300
|
+
const shouldComplete = requireAllFilesStaged
|
|
301
|
+
? unstagedFiles.length === 0 // ALL files must be staged
|
|
302
|
+
: stagedFiles.size > 0 && unstagedFiles.length < filePaths.length; // At least SOME files staged
|
|
303
|
+
if (shouldComplete) {
|
|
304
|
+
// All watched files staged - transition to done
|
|
305
|
+
db.prepare(`
|
|
306
|
+
UPDATE t_tasks
|
|
307
|
+
SET status_id = ?,
|
|
308
|
+
updated_ts = unixepoch()
|
|
309
|
+
WHERE id = ?
|
|
310
|
+
`).run(TASK_STATUS.DONE, task.id);
|
|
311
|
+
completed++;
|
|
312
|
+
console.error(` ✓ Task #${task.id}: waiting_review → done (all ${filePaths.length} watched files staged)`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
console.error(` ✗ Error checking task #${task.id} for staged files:`, error);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return completed;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Detect and auto-archive tasks in done when all watched files are committed
|
|
324
|
+
* (v3.5.2 - Two-step Git-aware workflow: commit → archived)
|
|
325
|
+
*
|
|
326
|
+
* Logic:
|
|
327
|
+
* - Find all tasks in done status
|
|
328
|
+
* - Check if ALL watched files are committed (git commit)
|
|
329
|
+
* - If yes → transition to archived
|
|
330
|
+
* - Respects git_auto_archive_on_commit config
|
|
331
|
+
*
|
|
332
|
+
* @param db - Database instance
|
|
333
|
+
* @returns Count of auto-archived tasks
|
|
334
|
+
*/
|
|
335
|
+
export async function detectAndArchiveOnCommit(db) {
|
|
336
|
+
// 1. Check if auto-archive on commit is enabled
|
|
337
|
+
const isEnabled = getConfigBool(db, 'git_auto_archive_on_commit', true);
|
|
338
|
+
if (!isEnabled) {
|
|
339
|
+
return 0;
|
|
340
|
+
}
|
|
341
|
+
const requireAllFilesCommitted = getConfigBool(db, 'require_all_files_committed_for_archive', true);
|
|
342
|
+
// 2. Find all done tasks
|
|
343
|
+
const candidateTasks = db.prepare(`
|
|
344
|
+
SELECT t.id, t.created_ts
|
|
345
|
+
FROM t_tasks t
|
|
346
|
+
JOIN m_task_statuses s ON t.status_id = s.id
|
|
347
|
+
WHERE s.name = 'done'
|
|
348
|
+
`).all();
|
|
349
|
+
if (candidateTasks.length === 0) {
|
|
350
|
+
return 0;
|
|
351
|
+
}
|
|
352
|
+
let archived = 0;
|
|
353
|
+
const projectRoot = process.cwd();
|
|
354
|
+
// 3. Detect VCS type
|
|
355
|
+
const vcsAdapter = await detectVCS(projectRoot);
|
|
356
|
+
if (!vcsAdapter) {
|
|
357
|
+
// Not a VCS repository - skip VCS-aware archiving
|
|
358
|
+
return 0;
|
|
359
|
+
}
|
|
360
|
+
// 4. For each candidate task, check if all watched files are committed
|
|
361
|
+
for (const task of candidateTasks) {
|
|
362
|
+
try {
|
|
363
|
+
// Get watched files for this task
|
|
364
|
+
const watchedFiles = db.prepare(`
|
|
365
|
+
SELECT f.path
|
|
366
|
+
FROM t_task_file_links tfl
|
|
367
|
+
JOIN m_files f ON tfl.file_id = f.id
|
|
368
|
+
WHERE tfl.task_id = ?
|
|
369
|
+
`).all(task.id);
|
|
370
|
+
if (watchedFiles.length === 0) {
|
|
371
|
+
// No watched files - skip this task
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
const filePaths = watchedFiles.map(f => f.path);
|
|
375
|
+
// Query VCS history for commits since task creation
|
|
376
|
+
// Convert Unix timestamp to ISO 8601 format for VCS adapters
|
|
377
|
+
const sinceTimestamp = new Date(task.created_ts * 1000).toISOString();
|
|
378
|
+
let committedFiles;
|
|
379
|
+
try {
|
|
380
|
+
const committedFilesList = await vcsAdapter.getCommittedFilesSince(sinceTimestamp);
|
|
381
|
+
committedFiles = new Set(committedFilesList);
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
// VCS query failed - skip this task
|
|
385
|
+
console.error(` ⏸ Task #${task.id}: ${vcsAdapter.getVCSType()} commit query failed - ${error instanceof Error ? error.message : String(error)}`);
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
// Check if all watched files are committed
|
|
389
|
+
const uncommittedFiles = [];
|
|
390
|
+
for (const filePath of filePaths) {
|
|
391
|
+
if (!committedFiles.has(filePath)) {
|
|
392
|
+
uncommittedFiles.push(filePath);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Determine if task should auto-archive
|
|
396
|
+
const shouldArchive = requireAllFilesCommitted
|
|
397
|
+
? uncommittedFiles.length === 0 // ALL files must be committed
|
|
398
|
+
: committedFiles.size > 0 && uncommittedFiles.length < filePaths.length; // At least SOME files committed
|
|
399
|
+
if (shouldArchive) {
|
|
400
|
+
// All watched files committed - transition to archived
|
|
401
|
+
db.prepare(`
|
|
402
|
+
UPDATE t_tasks
|
|
403
|
+
SET status_id = ?,
|
|
404
|
+
updated_ts = unixepoch()
|
|
405
|
+
WHERE id = ?
|
|
406
|
+
`).run(TASK_STATUS.ARCHIVED, task.id);
|
|
407
|
+
archived++;
|
|
408
|
+
console.error(` 📦 Task #${task.id}: done → archived (all ${filePaths.length} watched files committed)`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
console.error(` ✗ Error checking task #${task.id} for commits:`, error);
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return archived;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Detect and transition in_progress tasks to waiting_review based on quality gates
|
|
420
|
+
* Database-backed approach that survives restarts
|
|
421
|
+
*
|
|
422
|
+
* Quality gates:
|
|
423
|
+
* - Task has been idle (no updates) for configured time (default 3 minutes)
|
|
424
|
+
* - All watched files have been modified at least once
|
|
425
|
+
* - TypeScript compiles without errors (if .ts files)
|
|
426
|
+
* - Tests pass (if test files exist)
|
|
427
|
+
*
|
|
428
|
+
* @param db - Database instance
|
|
429
|
+
* @returns Count of transitioned tasks
|
|
430
|
+
*/
|
|
431
|
+
export async function detectAndTransitionToReview(db) {
|
|
432
|
+
// 1. Get configuration
|
|
433
|
+
const idleMinutes = getConfigInt(db, CONFIG_KEYS.REVIEW_IDLE_MINUTES, 3);
|
|
434
|
+
const requireAllFilesModified = getConfigBool(db, CONFIG_KEYS.REVIEW_REQUIRE_ALL_FILES_MODIFIED, true);
|
|
435
|
+
const requireTestsPass = getConfigBool(db, CONFIG_KEYS.REVIEW_REQUIRE_TESTS_PASS, true);
|
|
436
|
+
const requireCompile = getConfigBool(db, CONFIG_KEYS.REVIEW_REQUIRE_COMPILE, true);
|
|
437
|
+
// 2. Calculate cutoff timestamp (tasks older than this are candidates)
|
|
438
|
+
const cutoffTimestamp = Math.floor(Date.now() / 1000) - (idleMinutes * 60);
|
|
439
|
+
// 3. Find all in_progress tasks older than cutoff
|
|
440
|
+
const candidateTasks = db.prepare(`
|
|
441
|
+
SELECT t.id, t.created_ts
|
|
442
|
+
FROM t_tasks t
|
|
443
|
+
JOIN m_task_statuses s ON t.status_id = s.id
|
|
444
|
+
WHERE s.name = 'in_progress'
|
|
445
|
+
AND t.updated_ts < ?
|
|
446
|
+
`).all(cutoffTimestamp);
|
|
447
|
+
if (candidateTasks.length === 0) {
|
|
448
|
+
console.error(` ℹ No candidate tasks found (no tasks idle > ${idleMinutes} minutes)`);
|
|
449
|
+
return 0;
|
|
450
|
+
}
|
|
451
|
+
console.error(` ℹ Found ${candidateTasks.length} candidate tasks idle > ${idleMinutes} minutes`);
|
|
452
|
+
let transitioned = 0;
|
|
453
|
+
const projectRoot = process.cwd();
|
|
454
|
+
// 4. For each candidate task, check quality gates
|
|
455
|
+
for (const task of candidateTasks) {
|
|
456
|
+
try {
|
|
457
|
+
// Get watched files for this task
|
|
458
|
+
const watchedFiles = db.prepare(`
|
|
459
|
+
SELECT f.path
|
|
460
|
+
FROM t_task_file_links tfl
|
|
461
|
+
JOIN m_files f ON tfl.file_id = f.id
|
|
462
|
+
WHERE tfl.task_id = ?
|
|
463
|
+
`).all(task.id);
|
|
464
|
+
console.error(` → Task #${task.id}: ${watchedFiles.length} watched files`);
|
|
465
|
+
if (watchedFiles.length === 0) {
|
|
466
|
+
console.error(` ⏸ Skipping (no watched files)`);
|
|
467
|
+
continue; // Skip tasks with no watched files
|
|
468
|
+
}
|
|
469
|
+
// AUTO-PRUNING (v3.5.0): Remove non-existent watched files
|
|
470
|
+
// This happens BEFORE quality gate checks to ensure clean watch lists
|
|
471
|
+
try {
|
|
472
|
+
const pruneResult = pruneNonExistentFiles(db, task.id, projectRoot);
|
|
473
|
+
if (pruneResult.prunedCount > 0) {
|
|
474
|
+
console.error(` 🔧 Auto-pruned ${pruneResult.prunedCount} non-existent files (${pruneResult.remainingCount} remaining)`);
|
|
475
|
+
pruneResult.prunedPaths.forEach(path => {
|
|
476
|
+
console.error(` - ${path}`);
|
|
477
|
+
});
|
|
478
|
+
// If no files remain after pruning, skip this task
|
|
479
|
+
if (pruneResult.remainingCount === 0) {
|
|
480
|
+
console.error(` ⏸ Skipping (no files remaining after auto-prune)`);
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
// Re-fetch watched files after pruning
|
|
484
|
+
const updatedWatchedFiles = db.prepare(`
|
|
485
|
+
SELECT f.path
|
|
486
|
+
FROM t_task_file_links tfl
|
|
487
|
+
JOIN m_files f ON tfl.file_id = f.id
|
|
488
|
+
WHERE tfl.task_id = ?
|
|
489
|
+
`).all(task.id);
|
|
490
|
+
const filePaths = updatedWatchedFiles.map(f => f.path);
|
|
491
|
+
console.error(` → Updated watch list: ${filePaths.length} files`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
// Safety check triggered: ALL files were non-existent
|
|
496
|
+
if (error instanceof Error && error.message.includes('ALL')) {
|
|
497
|
+
console.error(` ✗ ${error.message}`);
|
|
498
|
+
continue; // Skip this task - cannot transition with no work done
|
|
499
|
+
}
|
|
500
|
+
// Other errors - log and continue
|
|
501
|
+
console.error(` ⚠ Auto-prune error: ${error instanceof Error ? error.message : String(error)}`);
|
|
502
|
+
}
|
|
503
|
+
// Get final file paths (after pruning)
|
|
504
|
+
const filePaths = watchedFiles.map(f => f.path).filter(path => {
|
|
505
|
+
// Filter out any paths that were pruned
|
|
506
|
+
const fullPath = join(projectRoot, path);
|
|
507
|
+
return existsSync(fullPath);
|
|
508
|
+
});
|
|
509
|
+
// Determine which files have been modified since task creation
|
|
510
|
+
// by checking file system timestamps
|
|
511
|
+
const modifiedFiles = new Set();
|
|
512
|
+
for (const path of filePaths) {
|
|
513
|
+
try {
|
|
514
|
+
const fullPath = join(projectRoot, path);
|
|
515
|
+
const stats = statSync(fullPath);
|
|
516
|
+
const fileMtimeSeconds = Math.floor(stats.mtimeMs / 1000);
|
|
517
|
+
// If file was modified after task creation, consider it modified
|
|
518
|
+
if (fileMtimeSeconds >= task.created_ts) {
|
|
519
|
+
modifiedFiles.add(path);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
// File doesn't exist or can't be accessed - skip this file
|
|
524
|
+
continue;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// Run quality checks
|
|
528
|
+
const { ready, results } = await checkReadyForReview(db, task.id, filePaths, modifiedFiles, {
|
|
529
|
+
requireAllFilesModified,
|
|
530
|
+
requireTestsPass,
|
|
531
|
+
requireCompile,
|
|
532
|
+
});
|
|
533
|
+
if (ready) {
|
|
534
|
+
// All quality gates passed - transition to waiting_review
|
|
535
|
+
db.prepare(`
|
|
536
|
+
UPDATE t_tasks
|
|
537
|
+
SET status_id = ?,
|
|
538
|
+
updated_ts = unixepoch()
|
|
539
|
+
WHERE id = ?
|
|
540
|
+
`).run(TASK_STATUS.WAITING_REVIEW, task.id);
|
|
541
|
+
transitioned++;
|
|
542
|
+
// Log the transition
|
|
543
|
+
console.error(` ✓ Task #${task.id}: in_progress → waiting_review (quality gates passed)`);
|
|
544
|
+
results.forEach(({ check, result }) => {
|
|
545
|
+
if (result.passed) {
|
|
546
|
+
console.error(` ✓ ${check}: ${result.message}`);
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
// Quality gates not passed - log details for debugging
|
|
552
|
+
console.error(` ⏸ Task #${task.id}: Quality gates not passed (staying in_progress)`);
|
|
553
|
+
results.forEach(({ check, result }) => {
|
|
554
|
+
const icon = result.passed ? '✓' : '✗';
|
|
555
|
+
console.error(` ${icon} ${check}: ${result.message}`);
|
|
556
|
+
if (result.details) {
|
|
557
|
+
console.error(` ${result.details}`);
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
catch (error) {
|
|
563
|
+
console.error(` ✗ Error checking task #${task.id} for review:`, error);
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return transitioned;
|
|
568
|
+
}
|
|
92
569
|
//# sourceMappingURL=task-stale-detection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-stale-detection.js","sourceRoot":"","sources":["../../src/utils/task-stale-detection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC;IACP,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;CACT,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,4BAA4B,EAAE,8BAA8B;IAC5D,+BAA+B,EAAE,iCAAiC;IAClE,uBAAuB,EAAE,yBAAyB;CAC1C,CAAC;AAEX;;GAEG;AACH,MAAM,QAAQ,GAAG;IACf,uBAAuB,EAAE,CAAC;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,kBAAkB,EAAE,IAAI;CAChB,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAAC,EAAY;IACxD,oCAAoC;IACpC,MAAM,SAAS,GAAG,aAAa,CAC7B,EAAE,EACF,WAAW,CAAC,uBAAuB,EACnC,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sCAAsC;IACtC,MAAM,wBAAwB,GAAG,YAAY,CAC3C,EAAE,EACF,WAAW,CAAC,4BAA4B,EACxC,QAAQ,CAAC,uBAAuB,CACjC,CAAC;IAEF,MAAM,2BAA2B,GAAG,YAAY,CAC9C,EAAE,EACF,WAAW,CAAC,+BAA+B,EAC3C,QAAQ,CAAC,0BAA0B,CACpC,CAAC;IAEF,oDAAoD;IACpD,MAAM,0BAA0B,GAAG,wBAAwB,GAAG,IAAI,CAAC;IACnE,MAAM,6BAA6B,GAAG,2BAA2B,GAAG,IAAI,CAAC;IAEzE,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,6CAA6C;IAC7C,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACrC,mFAAmF;QACnF,MAAM,sBAAsB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAMzC,CAAC,CAAC,GAAG,CACJ,WAAW,CAAC,cAAc,EAC1B,WAAW,CAAC,WAAW,EACvB,0BAA0B,CAC3B,CAAC;QAEF,iBAAiB,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAEpD,4EAA4E;QAC5E,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5C,CAAC,CAAC,GAAG,CACJ,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,cAAc,EAC1B,6BAA6B,CAC9B,CAAC;QAEF,iBAAiB,IAAI,yBAAyB,CAAC,OAAO,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,UAAU,EAAE,CAAC;IAEb,wCAAwC;IACxC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAY;IAKlD,OAAO;QACL,OAAO,EAAE,aAAa,CACpB,EAAE,EACF,WAAW,CAAC,uBAAuB,EACnC,QAAQ,CAAC,kBAAkB,CAC5B;QACD,wBAAwB,EAAE,YAAY,CACpC,EAAE,EACF,WAAW,CAAC,4BAA4B,EACxC,QAAQ,CAAC,uBAAuB,CACjC;QACD,2BAA2B,EAAE,YAAY,CACvC,EAAE,EACF,WAAW,CAAC,+BAA+B,EAC3C,QAAQ,CAAC,0BAA0B,CACpC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"task-stale-detection.js","sourceRoot":"","sources":["../../src/utils/task-stale-detection.ts"],"names":[],"mappings":"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"}
|