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.
Files changed (144) hide show
  1. package/CHANGELOG.md +815 -13
  2. package/README.md +53 -2
  3. package/assets/schema.sql +6 -1
  4. package/dist/config/loader.d.ts +46 -0
  5. package/dist/config/loader.d.ts.map +1 -0
  6. package/dist/config/loader.js +151 -0
  7. package/dist/config/loader.js.map +1 -0
  8. package/dist/config/types.d.ts +77 -0
  9. package/dist/config/types.d.ts.map +1 -0
  10. package/dist/config/types.js +28 -0
  11. package/dist/config/types.js.map +1 -0
  12. package/dist/constants.d.ts +9 -0
  13. package/dist/constants.d.ts.map +1 -1
  14. package/dist/constants.js +10 -0
  15. package/dist/constants.js.map +1 -1
  16. package/dist/database.d.ts +1 -1
  17. package/dist/database.d.ts.map +1 -1
  18. package/dist/database.js +77 -10
  19. package/dist/database.js.map +1 -1
  20. package/dist/index.js +21 -3
  21. package/dist/index.js.map +1 -1
  22. package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
  23. package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
  24. package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
  25. package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
  26. package/dist/migrations/index.d.ts +2 -1
  27. package/dist/migrations/index.d.ts.map +1 -1
  28. package/dist/migrations/index.js +16 -1
  29. package/dist/migrations/index.js.map +1 -1
  30. package/dist/tests/git-aware-completion.test.d.ts +6 -0
  31. package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
  32. package/dist/tests/git-aware-completion.test.js +141 -0
  33. package/dist/tests/git-aware-completion.test.js.map +1 -0
  34. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
  35. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
  36. package/dist/tests/tasks.auto-pruning-decision-link.test.js +250 -0
  37. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
  38. package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
  39. package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
  40. package/dist/tests/tasks.auto-pruning-partial.test.js +274 -0
  41. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
  42. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
  43. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
  44. package/dist/tests/tasks.auto-pruning-persistence.test.js +232 -0
  45. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
  46. package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
  47. package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
  48. package/dist/tests/tasks.auto-pruning-safety.test.js +196 -0
  49. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
  50. package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
  51. package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
  52. package/dist/tests/tasks.link-file-backward-compat.test.js +235 -0
  53. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
  54. package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
  55. package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
  56. package/dist/tests/tasks.watch-files-action.test.js +351 -0
  57. package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
  58. package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
  59. package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
  60. package/dist/tests/tasks.watch-files-parameter.test.js +249 -0
  61. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
  62. package/dist/tests/two-step-git-completion.test.d.ts +6 -0
  63. package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
  64. package/dist/tests/two-step-git-completion.test.js +283 -0
  65. package/dist/tests/two-step-git-completion.test.js.map +1 -0
  66. package/dist/tests/vcs-staging.test.d.ts +6 -0
  67. package/dist/tests/vcs-staging.test.d.ts.map +1 -0
  68. package/dist/tests/vcs-staging.test.js +137 -0
  69. package/dist/tests/vcs-staging.test.js.map +1 -0
  70. package/dist/tools/config.d.ts +4 -2
  71. package/dist/tools/config.d.ts.map +1 -1
  72. package/dist/tools/config.js +13 -11
  73. package/dist/tools/config.js.map +1 -1
  74. package/dist/tools/constraints.d.ts +7 -4
  75. package/dist/tools/constraints.d.ts.map +1 -1
  76. package/dist/tools/constraints.js +19 -16
  77. package/dist/tools/constraints.js.map +1 -1
  78. package/dist/tools/context.d.ts +33 -17
  79. package/dist/tools/context.d.ts.map +1 -1
  80. package/dist/tools/context.js +84 -68
  81. package/dist/tools/context.js.map +1 -1
  82. package/dist/tools/files.d.ts +9 -5
  83. package/dist/tools/files.d.ts.map +1 -1
  84. package/dist/tools/files.js +19 -15
  85. package/dist/tools/files.js.map +1 -1
  86. package/dist/tools/messaging.d.ts +9 -5
  87. package/dist/tools/messaging.d.ts.map +1 -1
  88. package/dist/tools/messaging.js +20 -16
  89. package/dist/tools/messaging.js.map +1 -1
  90. package/dist/tools/tasks.d.ts +40 -12
  91. package/dist/tools/tasks.d.ts.map +1 -1
  92. package/dist/tools/tasks.js +475 -87
  93. package/dist/tools/tasks.js.map +1 -1
  94. package/dist/tools/utils.d.ts +11 -6
  95. package/dist/tools/utils.d.ts.map +1 -1
  96. package/dist/tools/utils.js +56 -44
  97. package/dist/tools/utils.js.map +1 -1
  98. package/dist/types.d.ts +4 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/dist/utils/file-pruning.d.ts +69 -0
  101. package/dist/utils/file-pruning.d.ts.map +1 -0
  102. package/dist/utils/file-pruning.js +185 -0
  103. package/dist/utils/file-pruning.js.map +1 -0
  104. package/dist/utils/quality-checks.d.ts +60 -0
  105. package/dist/utils/quality-checks.d.ts.map +1 -0
  106. package/dist/utils/quality-checks.js +228 -0
  107. package/dist/utils/quality-checks.js.map +1 -0
  108. package/dist/utils/retention.d.ts +8 -0
  109. package/dist/utils/retention.d.ts.map +1 -1
  110. package/dist/utils/retention.js +12 -0
  111. package/dist/utils/retention.js.map +1 -1
  112. package/dist/utils/task-stale-detection.d.ts +69 -1
  113. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  114. package/dist/utils/task-stale-detection.js +494 -17
  115. package/dist/utils/task-stale-detection.js.map +1 -1
  116. package/dist/utils/vcs-adapter.d.ts +68 -0
  117. package/dist/utils/vcs-adapter.d.ts.map +1 -0
  118. package/dist/utils/vcs-adapter.js +187 -0
  119. package/dist/utils/vcs-adapter.js.map +1 -0
  120. package/dist/watcher/file-watcher.d.ts +54 -4
  121. package/dist/watcher/file-watcher.d.ts.map +1 -1
  122. package/dist/watcher/file-watcher.js +312 -30
  123. package/dist/watcher/file-watcher.js.map +1 -1
  124. package/dist/watcher/gitignore-parser.d.ts +70 -0
  125. package/dist/watcher/gitignore-parser.d.ts.map +1 -0
  126. package/dist/watcher/gitignore-parser.js +191 -0
  127. package/dist/watcher/gitignore-parser.js.map +1 -0
  128. package/dist/watcher/index.d.ts +1 -0
  129. package/dist/watcher/index.d.ts.map +1 -1
  130. package/dist/watcher/index.js +1 -0
  131. package/dist/watcher/index.js.map +1 -1
  132. package/docs/AI_AGENT_GUIDE.md +1 -1
  133. package/docs/ARCHITECTURE.md +12 -0
  134. package/docs/AUTO_FILE_TRACKING.md +486 -82
  135. package/docs/CONFIGURATION.md +908 -0
  136. package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
  137. package/docs/MIGRATION_v3.3.md +602 -0
  138. package/docs/SHARED_CONCEPTS.md +2 -1
  139. package/docs/TASK_ACTIONS.md +12 -0
  140. package/docs/TASK_OVERVIEW.md +124 -23
  141. package/docs/TASK_PRUNING.md +589 -0
  142. package/docs/TASK_SYSTEM.md +83 -13
  143. package/docs/TOOL_REFERENCE.md +94 -6
  144. 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;AA8BvC;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAqElE;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"}
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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"}