@codedeck/codedeck 2026.3.1-4.63

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 (239) hide show
  1. package/README.md +38 -0
  2. package/config/default.yaml +51 -0
  3. package/dist/agent/brain-dispatcher.d.ts +67 -0
  4. package/dist/agent/brain-dispatcher.d.ts.map +1 -0
  5. package/dist/agent/brain-dispatcher.js +136 -0
  6. package/dist/agent/brain-dispatcher.js.map +1 -0
  7. package/dist/agent/detect.d.ts +20 -0
  8. package/dist/agent/detect.d.ts.map +1 -0
  9. package/dist/agent/detect.js +187 -0
  10. package/dist/agent/detect.js.map +1 -0
  11. package/dist/agent/drivers/base.d.ts +57 -0
  12. package/dist/agent/drivers/base.d.ts.map +1 -0
  13. package/dist/agent/drivers/base.js +3 -0
  14. package/dist/agent/drivers/base.js.map +1 -0
  15. package/dist/agent/drivers/claude-code.d.ts +14 -0
  16. package/dist/agent/drivers/claude-code.d.ts.map +1 -0
  17. package/dist/agent/drivers/claude-code.js +112 -0
  18. package/dist/agent/drivers/claude-code.js.map +1 -0
  19. package/dist/agent/drivers/codex.d.ts +14 -0
  20. package/dist/agent/drivers/codex.d.ts.map +1 -0
  21. package/dist/agent/drivers/codex.js +77 -0
  22. package/dist/agent/drivers/codex.js.map +1 -0
  23. package/dist/agent/drivers/gemini.d.ts +24 -0
  24. package/dist/agent/drivers/gemini.d.ts.map +1 -0
  25. package/dist/agent/drivers/gemini.js +142 -0
  26. package/dist/agent/drivers/gemini.js.map +1 -0
  27. package/dist/agent/drivers/opencode.d.ts +18 -0
  28. package/dist/agent/drivers/opencode.d.ts.map +1 -0
  29. package/dist/agent/drivers/opencode.js +50 -0
  30. package/dist/agent/drivers/opencode.js.map +1 -0
  31. package/dist/agent/drivers/shell.d.ts +13 -0
  32. package/dist/agent/drivers/shell.d.ts.map +1 -0
  33. package/dist/agent/drivers/shell.js +30 -0
  34. package/dist/agent/drivers/shell.js.map +1 -0
  35. package/dist/agent/env-isolation.d.ts +26 -0
  36. package/dist/agent/env-isolation.d.ts.map +1 -0
  37. package/dist/agent/env-isolation.js +103 -0
  38. package/dist/agent/env-isolation.js.map +1 -0
  39. package/dist/agent/notify-setup.d.ts +18 -0
  40. package/dist/agent/notify-setup.d.ts.map +1 -0
  41. package/dist/agent/notify-setup.js +68 -0
  42. package/dist/agent/notify-setup.js.map +1 -0
  43. package/dist/agent/session-manager.d.ts +75 -0
  44. package/dist/agent/session-manager.d.ts.map +1 -0
  45. package/dist/agent/session-manager.js +407 -0
  46. package/dist/agent/session-manager.js.map +1 -0
  47. package/dist/agent/signal.d.ts +32 -0
  48. package/dist/agent/signal.d.ts.map +1 -0
  49. package/dist/agent/signal.js +199 -0
  50. package/dist/agent/signal.js.map +1 -0
  51. package/dist/agent/status-poller.d.ts +27 -0
  52. package/dist/agent/status-poller.d.ts.map +1 -0
  53. package/dist/agent/status-poller.js +76 -0
  54. package/dist/agent/status-poller.js.map +1 -0
  55. package/dist/agent/templates/brain-prompt.d.ts +14 -0
  56. package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
  57. package/dist/agent/templates/brain-prompt.js +57 -0
  58. package/dist/agent/templates/brain-prompt.js.map +1 -0
  59. package/dist/agent/templates/identity.d.ts +19 -0
  60. package/dist/agent/templates/identity.d.ts.map +1 -0
  61. package/dist/agent/templates/identity.js +97 -0
  62. package/dist/agent/templates/identity.js.map +1 -0
  63. package/dist/agent/tmux.d.ts +90 -0
  64. package/dist/agent/tmux.d.ts.map +1 -0
  65. package/dist/agent/tmux.js +386 -0
  66. package/dist/agent/tmux.js.map +1 -0
  67. package/dist/autofix/audit-engine.d.ts +35 -0
  68. package/dist/autofix/audit-engine.d.ts.map +1 -0
  69. package/dist/autofix/audit-engine.js +144 -0
  70. package/dist/autofix/audit-engine.js.map +1 -0
  71. package/dist/autofix/branch-manager.d.ts +44 -0
  72. package/dist/autofix/branch-manager.d.ts.map +1 -0
  73. package/dist/autofix/branch-manager.js +97 -0
  74. package/dist/autofix/branch-manager.js.map +1 -0
  75. package/dist/autofix/decision-engine.d.ts +38 -0
  76. package/dist/autofix/decision-engine.d.ts.map +1 -0
  77. package/dist/autofix/decision-engine.js +115 -0
  78. package/dist/autofix/decision-engine.js.map +1 -0
  79. package/dist/autofix/index.d.ts +23 -0
  80. package/dist/autofix/index.d.ts.map +1 -0
  81. package/dist/autofix/index.js +192 -0
  82. package/dist/autofix/index.js.map +1 -0
  83. package/dist/autofix/prompt-builder.d.ts +25 -0
  84. package/dist/autofix/prompt-builder.d.ts.map +1 -0
  85. package/dist/autofix/prompt-builder.js +137 -0
  86. package/dist/autofix/prompt-builder.js.map +1 -0
  87. package/dist/autofix/report-parser.d.ts +18 -0
  88. package/dist/autofix/report-parser.d.ts.map +1 -0
  89. package/dist/autofix/report-parser.js +74 -0
  90. package/dist/autofix/report-parser.js.map +1 -0
  91. package/dist/autofix/state-machine.d.ts +40 -0
  92. package/dist/autofix/state-machine.d.ts.map +1 -0
  93. package/dist/autofix/state-machine.js +76 -0
  94. package/dist/autofix/state-machine.js.map +1 -0
  95. package/dist/bind/bind-flow.d.ts +15 -0
  96. package/dist/bind/bind-flow.d.ts.map +1 -0
  97. package/dist/bind/bind-flow.js +198 -0
  98. package/dist/bind/bind-flow.js.map +1 -0
  99. package/dist/config.d.ts +53 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +89 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/daemon/codex-watcher.d.ts +46 -0
  104. package/dist/daemon/codex-watcher.d.ts.map +1 -0
  105. package/dist/daemon/codex-watcher.js +533 -0
  106. package/dist/daemon/codex-watcher.js.map +1 -0
  107. package/dist/daemon/command-handler.d.ts +6 -0
  108. package/dist/daemon/command-handler.d.ts.map +1 -0
  109. package/dist/daemon/command-handler.js +770 -0
  110. package/dist/daemon/command-handler.js.map +1 -0
  111. package/dist/daemon/discussion-orchestrator.d.ts +63 -0
  112. package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
  113. package/dist/daemon/discussion-orchestrator.js +482 -0
  114. package/dist/daemon/discussion-orchestrator.js.map +1 -0
  115. package/dist/daemon/gemini-watcher.d.ts +42 -0
  116. package/dist/daemon/gemini-watcher.d.ts.map +1 -0
  117. package/dist/daemon/gemini-watcher.js +463 -0
  118. package/dist/daemon/gemini-watcher.js.map +1 -0
  119. package/dist/daemon/hook-server.d.ts +42 -0
  120. package/dist/daemon/hook-server.d.ts.map +1 -0
  121. package/dist/daemon/hook-server.js +160 -0
  122. package/dist/daemon/hook-server.js.map +1 -0
  123. package/dist/daemon/jsonl-watcher.d.ts +35 -0
  124. package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
  125. package/dist/daemon/jsonl-watcher.js +635 -0
  126. package/dist/daemon/jsonl-watcher.js.map +1 -0
  127. package/dist/daemon/lifecycle.d.ts +20 -0
  128. package/dist/daemon/lifecycle.d.ts.map +1 -0
  129. package/dist/daemon/lifecycle.js +331 -0
  130. package/dist/daemon/lifecycle.js.map +1 -0
  131. package/dist/daemon/server-link.d.ts +44 -0
  132. package/dist/daemon/server-link.d.ts.map +1 -0
  133. package/dist/daemon/server-link.js +232 -0
  134. package/dist/daemon/server-link.js.map +1 -0
  135. package/dist/daemon/subsession-manager.d.ts +37 -0
  136. package/dist/daemon/subsession-manager.d.ts.map +1 -0
  137. package/dist/daemon/subsession-manager.js +240 -0
  138. package/dist/daemon/subsession-manager.js.map +1 -0
  139. package/dist/daemon/terminal-parser.d.ts +42 -0
  140. package/dist/daemon/terminal-parser.d.ts.map +1 -0
  141. package/dist/daemon/terminal-parser.js +278 -0
  142. package/dist/daemon/terminal-parser.js.map +1 -0
  143. package/dist/daemon/terminal-streamer.d.ts +93 -0
  144. package/dist/daemon/terminal-streamer.d.ts.map +1 -0
  145. package/dist/daemon/terminal-streamer.js +451 -0
  146. package/dist/daemon/terminal-streamer.js.map +1 -0
  147. package/dist/daemon/timeline-emitter.d.ts +32 -0
  148. package/dist/daemon/timeline-emitter.d.ts.map +1 -0
  149. package/dist/daemon/timeline-emitter.js +97 -0
  150. package/dist/daemon/timeline-emitter.js.map +1 -0
  151. package/dist/daemon/timeline-event.d.ts +23 -0
  152. package/dist/daemon/timeline-event.d.ts.map +1 -0
  153. package/dist/daemon/timeline-event.js +7 -0
  154. package/dist/daemon/timeline-event.js.map +1 -0
  155. package/dist/daemon/timeline-store.d.ts +40 -0
  156. package/dist/daemon/timeline-store.d.ts.map +1 -0
  157. package/dist/daemon/timeline-store.js +153 -0
  158. package/dist/daemon/timeline-store.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +149 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/memory/claude-mem.d.ts +9 -0
  164. package/dist/memory/claude-mem.d.ts.map +1 -0
  165. package/dist/memory/claude-mem.js +58 -0
  166. package/dist/memory/claude-mem.js.map +1 -0
  167. package/dist/memory/context-builder.d.ts +4 -0
  168. package/dist/memory/context-builder.d.ts.map +1 -0
  169. package/dist/memory/context-builder.js +35 -0
  170. package/dist/memory/context-builder.js.map +1 -0
  171. package/dist/memory/detector.d.ts +7 -0
  172. package/dist/memory/detector.d.ts.map +1 -0
  173. package/dist/memory/detector.js +17 -0
  174. package/dist/memory/detector.js.map +1 -0
  175. package/dist/memory/extractor.d.ts +21 -0
  176. package/dist/memory/extractor.d.ts.map +1 -0
  177. package/dist/memory/extractor.js +83 -0
  178. package/dist/memory/extractor.js.map +1 -0
  179. package/dist/memory/injector.d.ts +7 -0
  180. package/dist/memory/injector.d.ts.map +1 -0
  181. package/dist/memory/injector.js +18 -0
  182. package/dist/memory/injector.js.map +1 -0
  183. package/dist/memory/interface.d.ts +25 -0
  184. package/dist/memory/interface.d.ts.map +1 -0
  185. package/dist/memory/interface.js +3 -0
  186. package/dist/memory/interface.js.map +1 -0
  187. package/dist/memory/mem0.d.ts +12 -0
  188. package/dist/memory/mem0.d.ts.map +1 -0
  189. package/dist/memory/mem0.js +93 -0
  190. package/dist/memory/mem0.js.map +1 -0
  191. package/dist/router/command-parser.d.ts +33 -0
  192. package/dist/router/command-parser.d.ts.map +1 -0
  193. package/dist/router/command-parser.js +66 -0
  194. package/dist/router/command-parser.js.map +1 -0
  195. package/dist/router/message-router.d.ts +42 -0
  196. package/dist/router/message-router.d.ts.map +1 -0
  197. package/dist/router/message-router.js +222 -0
  198. package/dist/router/message-router.js.map +1 -0
  199. package/dist/router/response-collector.d.ts +28 -0
  200. package/dist/router/response-collector.d.ts.map +1 -0
  201. package/dist/router/response-collector.js +164 -0
  202. package/dist/router/response-collector.js.map +1 -0
  203. package/dist/store/project-store.d.ts +37 -0
  204. package/dist/store/project-store.d.ts.map +1 -0
  205. package/dist/store/project-store.js +70 -0
  206. package/dist/store/project-store.js.map +1 -0
  207. package/dist/store/session-store.d.ts +32 -0
  208. package/dist/store/session-store.d.ts.map +1 -0
  209. package/dist/store/session-store.js +67 -0
  210. package/dist/store/session-store.js.map +1 -0
  211. package/dist/tracker/branch.d.ts +24 -0
  212. package/dist/tracker/branch.d.ts.map +1 -0
  213. package/dist/tracker/branch.js +55 -0
  214. package/dist/tracker/branch.js.map +1 -0
  215. package/dist/tracker/github.d.ts +31 -0
  216. package/dist/tracker/github.d.ts.map +1 -0
  217. package/dist/tracker/github.js +117 -0
  218. package/dist/tracker/github.js.map +1 -0
  219. package/dist/tracker/gitlab.d.ts +31 -0
  220. package/dist/tracker/gitlab.d.ts.map +1 -0
  221. package/dist/tracker/gitlab.js +116 -0
  222. package/dist/tracker/gitlab.js.map +1 -0
  223. package/dist/tracker/index.d.ts +9 -0
  224. package/dist/tracker/index.d.ts.map +1 -0
  225. package/dist/tracker/index.js +28 -0
  226. package/dist/tracker/index.js.map +1 -0
  227. package/dist/tracker/interface.d.ts +39 -0
  228. package/dist/tracker/interface.d.ts.map +1 -0
  229. package/dist/tracker/interface.js +7 -0
  230. package/dist/tracker/interface.js.map +1 -0
  231. package/dist/tracker/priority.d.ts +19 -0
  232. package/dist/tracker/priority.d.ts.map +1 -0
  233. package/dist/tracker/priority.js +40 -0
  234. package/dist/tracker/priority.js.map +1 -0
  235. package/dist/util/logger.d.ts +4 -0
  236. package/dist/util/logger.d.ts.map +1 -0
  237. package/dist/util/logger.js +14 -0
  238. package/dist/util/logger.js.map +1 -0
  239. package/package.json +65 -0
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadStore = loadStore;
4
+ exports.getSession = getSession;
5
+ exports.upsertSession = upsertSession;
6
+ exports.removeSession = removeSession;
7
+ exports.listSessions = listSessions;
8
+ exports.updateSessionState = updateSessionState;
9
+ exports.flushStore = flushStore;
10
+ const promises_1 = require("fs/promises");
11
+ const path_1 = require("path");
12
+ const os_1 = require("os");
13
+ const STORE_DIR = (0, path_1.join)((0, os_1.homedir)(), '.codedeck');
14
+ const STORE_PATH = (0, path_1.join)(STORE_DIR, 'sessions.json');
15
+ const DEBOUNCE_MS = 500;
16
+ let writeTimer = null;
17
+ let store = { sessions: {} };
18
+ async function loadStore() {
19
+ await (0, promises_1.mkdir)(STORE_DIR, { recursive: true });
20
+ try {
21
+ const raw = await (0, promises_1.readFile)(STORE_PATH, 'utf8');
22
+ store = JSON.parse(raw);
23
+ }
24
+ catch {
25
+ store = { sessions: {} };
26
+ }
27
+ return store;
28
+ }
29
+ function scheduleWrite() {
30
+ if (writeTimer)
31
+ clearTimeout(writeTimer);
32
+ writeTimer = setTimeout(async () => {
33
+ await (0, promises_1.writeFile)(STORE_PATH, JSON.stringify(store, null, 2), 'utf8');
34
+ writeTimer = null;
35
+ }, DEBOUNCE_MS);
36
+ }
37
+ function getSession(name) {
38
+ return store.sessions[name];
39
+ }
40
+ function upsertSession(record) {
41
+ store.sessions[record.name] = { ...record, updatedAt: Date.now() };
42
+ scheduleWrite();
43
+ }
44
+ function removeSession(name) {
45
+ delete store.sessions[name];
46
+ scheduleWrite();
47
+ }
48
+ function listSessions(projectName) {
49
+ const all = Object.values(store.sessions);
50
+ return projectName ? all.filter((s) => s.projectName === projectName) : all;
51
+ }
52
+ function updateSessionState(name, state) {
53
+ const s = store.sessions[name];
54
+ if (!s)
55
+ return;
56
+ s.state = state;
57
+ s.updatedAt = Date.now();
58
+ scheduleWrite();
59
+ }
60
+ async function flushStore() {
61
+ if (writeTimer) {
62
+ clearTimeout(writeTimer);
63
+ writeTimer = null;
64
+ }
65
+ await (0, promises_1.writeFile)(STORE_PATH, JSON.stringify(store, null, 2), 'utf8');
66
+ }
67
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Branch naming utilities for issue tracker integration.
3
+ * Format: fix/<issue-id>-<slug>
4
+ * Slug: lowercase, special chars → hyphens, max 50 chars total
5
+ */
6
+ /**
7
+ * Build a git branch name from an issue ID and title.
8
+ * fix/<issue-id>-<slug>
9
+ */
10
+ export declare function buildBranchName(issueId: string, title: string): string;
11
+ /**
12
+ * Sanitize a string to be a valid git branch name component.
13
+ * - Lowercase
14
+ * - Special chars → hyphens
15
+ * - Leading/trailing hyphens removed
16
+ * - Consecutive hyphens collapsed
17
+ * - Truncated to maxLength
18
+ */
19
+ export declare function slugify(text: string, maxLength?: number): string;
20
+ /**
21
+ * Check if a branch name is valid for use in git.
22
+ */
23
+ export declare function isValidBranchName(name: string): boolean;
24
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/tracker/branch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAQ5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWvD"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Branch naming utilities for issue tracker integration.
4
+ * Format: fix/<issue-id>-<slug>
5
+ * Slug: lowercase, special chars → hyphens, max 50 chars total
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildBranchName = buildBranchName;
9
+ exports.slugify = slugify;
10
+ exports.isValidBranchName = isValidBranchName;
11
+ /**
12
+ * Build a git branch name from an issue ID and title.
13
+ * fix/<issue-id>-<slug>
14
+ */
15
+ function buildBranchName(issueId, title) {
16
+ const slug = slugify(title, 50);
17
+ return `fix/${issueId}-${slug}`;
18
+ }
19
+ /**
20
+ * Sanitize a string to be a valid git branch name component.
21
+ * - Lowercase
22
+ * - Special chars → hyphens
23
+ * - Leading/trailing hyphens removed
24
+ * - Consecutive hyphens collapsed
25
+ * - Truncated to maxLength
26
+ */
27
+ function slugify(text, maxLength = 50) {
28
+ return text
29
+ .toLowerCase()
30
+ .replace(/[^a-z0-9]+/g, '-') // non-alphanumeric → hyphen
31
+ .replace(/^-+|-+$/g, '') // trim leading/trailing hyphens
32
+ .replace(/-{2,}/g, '-') // collapse consecutive hyphens
33
+ .slice(0, maxLength)
34
+ .replace(/-+$/, ''); // trim trailing hyphen after slice
35
+ }
36
+ /**
37
+ * Check if a branch name is valid for use in git.
38
+ */
39
+ function isValidBranchName(name) {
40
+ // git branch name rules (simplified):
41
+ // - No spaces, no ~, ^, :, ?, *, [, \, ..
42
+ // - Cannot begin or end with /
43
+ // - Cannot have consecutive /
44
+ // - Cannot end with .lock
45
+ if (!name)
46
+ return false;
47
+ if (/[\s~^:?*[\\]|\.\./.test(name))
48
+ return false;
49
+ if (name.startsWith('/') || name.endsWith('/'))
50
+ return false;
51
+ if (name.endsWith('.lock'))
52
+ return false;
53
+ return true;
54
+ }
55
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/tracker/branch.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAMH,0CAGC;AAUD,0BAQC;AAKD,8CAWC;AAzCD;;;GAGG;AACH,SAAgB,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO,OAAO,OAAO,IAAI,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CAAC,IAAY,EAAE,SAAS,GAAG,EAAE;IAClD,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAG,4BAA4B;SAC1D,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAQ,gCAAgC;SAC/D,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAS,+BAA+B;SAC9D,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAY,mCAAmC;AACvE,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,sCAAsC;IACtC,0CAA0C;IAC1C,+BAA+B;IAC/B,8BAA8B;IAC9B,0BAA0B;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * GitHub issue tracker adapter.
3
+ * Uses octokit — supports github.com + GitHub Enterprise (custom apiUrl).
4
+ */
5
+ import type { IssueTracker, TrackerIssue, FetchIssueOptions } from './interface.js';
6
+ export interface GitHubTrackerConfig {
7
+ /** API URL — defaults to https://api.github.com for github.com */
8
+ apiUrl?: string;
9
+ /** Personal access token or App token */
10
+ token: string;
11
+ /** Owner/repo e.g. "myorg/myrepo" */
12
+ repo: string;
13
+ }
14
+ export declare class GitHubTracker implements IssueTracker {
15
+ private apiBase;
16
+ private headers;
17
+ private owner;
18
+ private repo;
19
+ constructor(config: GitHubTrackerConfig);
20
+ fetchIssues(opts?: FetchIssueOptions): Promise<TrackerIssue[]>;
21
+ claimIssue(issueId: string): Promise<void>;
22
+ updateStatus(issueId: string, status: 'in-progress' | 'review' | 'open' | 'done'): Promise<void>;
23
+ postComment(issueId: string, body: string): Promise<void>;
24
+ closeIssue(issueId: string, resolution?: string): Promise<void>;
25
+ createBranch(issueId: string, branchName: string, fromBranch?: string): Promise<void>;
26
+ private get;
27
+ private post;
28
+ private patch;
29
+ private addLabel;
30
+ }
31
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/tracker/github.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGpF,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,EAAE,mBAAmB;IAajC,WAAW,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA4BlE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/D,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAa7E,GAAG;YAMH,IAAI;YAUJ,KAAK;YAUL,QAAQ;CAKvB"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubTracker = void 0;
4
+ const priority_js_1 = require("./priority.js");
5
+ class GitHubTracker {
6
+ apiBase;
7
+ headers;
8
+ owner;
9
+ repo;
10
+ constructor(config) {
11
+ this.apiBase = (config.apiUrl ?? 'https://api.github.com').replace(/\/$/, '');
12
+ this.headers = {
13
+ 'Authorization': `Bearer ${config.token}`,
14
+ 'Accept': 'application/vnd.github.v3+json',
15
+ 'Content-Type': 'application/json',
16
+ 'X-GitHub-Api-Version': '2022-11-28',
17
+ };
18
+ const [owner, repo] = config.repo.split('/');
19
+ this.owner = owner;
20
+ this.repo = repo;
21
+ }
22
+ async fetchIssues(opts = {}) {
23
+ const params = new URLSearchParams({
24
+ state: opts.status === 'closed' ? 'closed' : 'open',
25
+ per_page: String(opts.limit ?? 50),
26
+ });
27
+ if (opts.labels?.length)
28
+ params.set('labels', opts.labels.join(','));
29
+ if (opts.milestone)
30
+ params.set('milestone', opts.milestone);
31
+ if (opts.assignedToMe)
32
+ params.set('assignee', '@me');
33
+ const res = await this.get(`/repos/${this.owner}/${this.repo}/issues?${params}`);
34
+ const issues = res;
35
+ const mapped = issues.map((i) => ({
36
+ id: String(i.number),
37
+ title: i.title,
38
+ body: i.body ?? '',
39
+ priority: (0, priority_js_1.extractPriority)(i.labels.map((l) => l.name)),
40
+ labels: i.labels.map((l) => l.name),
41
+ url: i.html_url,
42
+ assignee: i.assignee?.login,
43
+ state: i.state === 'open' ? 'open' : 'closed',
44
+ createdAt: new Date(i.created_at).getTime(),
45
+ updatedAt: new Date(i.updated_at).getTime(),
46
+ }));
47
+ return (0, priority_js_1.sortByPriority)(mapped);
48
+ }
49
+ async claimIssue(issueId) {
50
+ await this.addLabel(issueId, 'in-progress');
51
+ }
52
+ async updateStatus(issueId, status) {
53
+ const labelMap = {
54
+ 'in-progress': 'in-progress',
55
+ 'review': 'review',
56
+ 'done': 'done',
57
+ };
58
+ const label = labelMap[status];
59
+ if (label)
60
+ await this.addLabel(issueId, label);
61
+ }
62
+ async postComment(issueId, body) {
63
+ await this.post(`/repos/${this.owner}/${this.repo}/issues/${issueId}/comments`, { body });
64
+ }
65
+ async closeIssue(issueId, resolution) {
66
+ if (resolution) {
67
+ await this.postComment(issueId, resolution);
68
+ }
69
+ await this.patch(`/repos/${this.owner}/${this.repo}/issues/${issueId}`, {
70
+ state: 'closed',
71
+ state_reason: 'completed',
72
+ });
73
+ }
74
+ async createBranch(issueId, branchName, fromBranch = 'main') {
75
+ // Get base branch SHA
76
+ const ref = await this.get(`/repos/${this.owner}/${this.repo}/git/ref/heads/${fromBranch}`);
77
+ const sha = ref.object.sha;
78
+ await this.post(`/repos/${this.owner}/${this.repo}/git/refs`, {
79
+ ref: `refs/heads/${branchName}`,
80
+ sha,
81
+ });
82
+ }
83
+ // ── HTTP helpers ────────────────────────────────────────────────────────────
84
+ async get(path) {
85
+ const res = await fetch(`${this.apiBase}${path}`, { headers: this.headers });
86
+ if (!res.ok)
87
+ throw new Error(`GitHub API GET ${path}: ${res.status}`);
88
+ return res.json();
89
+ }
90
+ async post(path, body) {
91
+ const res = await fetch(`${this.apiBase}${path}`, {
92
+ method: 'POST',
93
+ headers: this.headers,
94
+ body: JSON.stringify(body),
95
+ });
96
+ if (!res.ok)
97
+ throw new Error(`GitHub API POST ${path}: ${res.status}`);
98
+ return res.json();
99
+ }
100
+ async patch(path, body) {
101
+ const res = await fetch(`${this.apiBase}${path}`, {
102
+ method: 'PATCH',
103
+ headers: this.headers,
104
+ body: JSON.stringify(body),
105
+ });
106
+ if (!res.ok)
107
+ throw new Error(`GitHub API PATCH ${path}: ${res.status}`);
108
+ return res.json();
109
+ }
110
+ async addLabel(issueId, label) {
111
+ await this.post(`/repos/${this.owner}/${this.repo}/issues/${issueId}/labels`, {
112
+ labels: [label],
113
+ });
114
+ }
115
+ }
116
+ exports.GitHubTracker = GitHubTracker;
117
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/tracker/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * GitLab issue tracker adapter.
3
+ * Uses REST API — supports gitlab.com + self-hosted (custom apiUrl).
4
+ */
5
+ import type { IssueTracker, TrackerIssue, FetchIssueOptions } from './interface.js';
6
+ export interface GitLabTrackerConfig {
7
+ /** API URL — defaults to https://gitlab.com for gitlab.com */
8
+ apiUrl?: string;
9
+ /** Personal access token */
10
+ token: string;
11
+ /** Project ID or "namespace/project-path" */
12
+ projectId: string | number;
13
+ }
14
+ export declare class GitLabTracker implements IssueTracker {
15
+ private apiBase;
16
+ private headers;
17
+ private projectId;
18
+ constructor(config: GitLabTrackerConfig);
19
+ private get encodedProjectId();
20
+ fetchIssues(opts?: FetchIssueOptions): Promise<TrackerIssue[]>;
21
+ claimIssue(issueId: string): Promise<void>;
22
+ updateStatus(issueId: string, status: 'in-progress' | 'review' | 'open' | 'done'): Promise<void>;
23
+ postComment(issueId: string, body: string): Promise<void>;
24
+ closeIssue(issueId: string, resolution?: string): Promise<void>;
25
+ createBranch(issueId: string, branchName: string, fromBranch?: string): Promise<void>;
26
+ private get;
27
+ private post;
28
+ private put;
29
+ private addLabel;
30
+ }
31
+ //# sourceMappingURL=gitlab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../src/tracker/gitlab.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGpF,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,mBAAmB;IASvC,OAAO,KAAK,gBAAgB,GAE3B;IAEK,WAAW,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2BlE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/D,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAS7E,GAAG;YAMH,IAAI;YAUJ,GAAG;YAUH,QAAQ;CAKvB"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLabTracker = void 0;
4
+ const priority_js_1 = require("./priority.js");
5
+ class GitLabTracker {
6
+ apiBase;
7
+ headers;
8
+ projectId;
9
+ constructor(config) {
10
+ this.apiBase = `${(config.apiUrl ?? 'https://gitlab.com').replace(/\/$/, '')}/api/v4`;
11
+ this.headers = {
12
+ 'PRIVATE-TOKEN': config.token,
13
+ 'Content-Type': 'application/json',
14
+ };
15
+ this.projectId = config.projectId;
16
+ }
17
+ get encodedProjectId() {
18
+ return encodeURIComponent(String(this.projectId));
19
+ }
20
+ async fetchIssues(opts = {}) {
21
+ const params = new URLSearchParams({
22
+ state: opts.status === 'closed' ? 'closed' : 'opened',
23
+ per_page: String(opts.limit ?? 50),
24
+ });
25
+ if (opts.labels?.length)
26
+ params.set('labels', opts.labels.join(','));
27
+ if (opts.milestone)
28
+ params.set('milestone', opts.milestone);
29
+ if (opts.assignedToMe)
30
+ params.set('assignee_id', 'me');
31
+ const issues = await this.get(`/projects/${this.encodedProjectId}/issues?${params}`);
32
+ const mapped = issues.map((i) => ({
33
+ id: String(i.iid),
34
+ title: i.title,
35
+ body: i.description ?? '',
36
+ priority: (0, priority_js_1.extractPriority)(i.labels),
37
+ labels: i.labels,
38
+ url: i.web_url,
39
+ assignee: i.assignees?.[0]?.username,
40
+ state: i.state === 'opened' ? 'open' : 'closed',
41
+ createdAt: new Date(i.created_at).getTime(),
42
+ updatedAt: new Date(i.updated_at).getTime(),
43
+ }));
44
+ return (0, priority_js_1.sortByPriority)(mapped);
45
+ }
46
+ async claimIssue(issueId) {
47
+ await this.addLabel(issueId, 'in-progress');
48
+ }
49
+ async updateStatus(issueId, status) {
50
+ if (status === 'open') {
51
+ await this.put(`/projects/${this.encodedProjectId}/issues/${issueId}`, {
52
+ state_event: 'reopen',
53
+ });
54
+ return;
55
+ }
56
+ const labelMap = {
57
+ 'in-progress': 'in-progress',
58
+ review: 'review',
59
+ done: 'done',
60
+ };
61
+ const label = labelMap[status];
62
+ if (label)
63
+ await this.addLabel(issueId, label);
64
+ }
65
+ async postComment(issueId, body) {
66
+ await this.post(`/projects/${this.encodedProjectId}/issues/${issueId}/notes`, { body });
67
+ }
68
+ async closeIssue(issueId, resolution) {
69
+ if (resolution) {
70
+ await this.postComment(issueId, resolution);
71
+ }
72
+ await this.put(`/projects/${this.encodedProjectId}/issues/${issueId}`, {
73
+ state_event: 'close',
74
+ });
75
+ }
76
+ async createBranch(issueId, branchName, fromBranch = 'main') {
77
+ await this.post(`/projects/${this.encodedProjectId}/repository/branches`, {
78
+ branch: branchName,
79
+ ref: fromBranch,
80
+ });
81
+ }
82
+ // ── HTTP helpers ────────────────────────────────────────────────────────────
83
+ async get(path) {
84
+ const res = await fetch(`${this.apiBase}${path}`, { headers: this.headers });
85
+ if (!res.ok)
86
+ throw new Error(`GitLab API GET ${path}: ${res.status}`);
87
+ return res.json();
88
+ }
89
+ async post(path, body) {
90
+ const res = await fetch(`${this.apiBase}${path}`, {
91
+ method: 'POST',
92
+ headers: this.headers,
93
+ body: JSON.stringify(body),
94
+ });
95
+ if (!res.ok)
96
+ throw new Error(`GitLab API POST ${path}: ${res.status}`);
97
+ return res.json();
98
+ }
99
+ async put(path, body) {
100
+ const res = await fetch(`${this.apiBase}${path}`, {
101
+ method: 'PUT',
102
+ headers: this.headers,
103
+ body: JSON.stringify(body),
104
+ });
105
+ if (!res.ok)
106
+ throw new Error(`GitLab API PUT ${path}: ${res.status}`);
107
+ return res.json();
108
+ }
109
+ async addLabel(issueId, label) {
110
+ await this.put(`/projects/${this.encodedProjectId}/issues/${issueId}`, {
111
+ add_labels: label,
112
+ });
113
+ }
114
+ }
115
+ exports.GitLabTracker = GitLabTracker;
116
+ //# sourceMappingURL=gitlab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/tracker/gitlab.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tracker factory — creates the right IssueTracker implementation.
3
+ */
4
+ import type { IssueTracker } from './interface.js';
5
+ export type { IssueTracker, TrackerIssue, FetchIssueOptions, Priority } from './interface.js';
6
+ export { extractPriority, priorityName, sortByPriority } from './priority.js';
7
+ export { buildBranchName, slugify, isValidBranchName } from './branch.js';
8
+ export declare function createTracker(type: string, apiUrl?: string): IssueTracker;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracker/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAazE"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidBranchName = exports.slugify = exports.buildBranchName = exports.sortByPriority = exports.priorityName = exports.extractPriority = void 0;
4
+ exports.createTracker = createTracker;
5
+ const github_js_1 = require("./github.js");
6
+ const gitlab_js_1 = require("./gitlab.js");
7
+ var priority_js_1 = require("./priority.js");
8
+ Object.defineProperty(exports, "extractPriority", { enumerable: true, get: function () { return priority_js_1.extractPriority; } });
9
+ Object.defineProperty(exports, "priorityName", { enumerable: true, get: function () { return priority_js_1.priorityName; } });
10
+ Object.defineProperty(exports, "sortByPriority", { enumerable: true, get: function () { return priority_js_1.sortByPriority; } });
11
+ var branch_js_1 = require("./branch.js");
12
+ Object.defineProperty(exports, "buildBranchName", { enumerable: true, get: function () { return branch_js_1.buildBranchName; } });
13
+ Object.defineProperty(exports, "slugify", { enumerable: true, get: function () { return branch_js_1.slugify; } });
14
+ Object.defineProperty(exports, "isValidBranchName", { enumerable: true, get: function () { return branch_js_1.isValidBranchName; } });
15
+ function createTracker(type, apiUrl) {
16
+ const token = process.env.TRACKER_TOKEN ?? process.env.GITHUB_TOKEN ?? process.env.GITLAB_TOKEN ?? '';
17
+ const repo = process.env.TRACKER_REPO ?? process.env.GITHUB_REPO ?? '';
18
+ const projectId = process.env.TRACKER_PROJECT_ID ?? process.env.GITLAB_PROJECT_ID ?? '';
19
+ switch (type) {
20
+ case 'github':
21
+ return new github_js_1.GitHubTracker({ apiUrl, token, repo });
22
+ case 'gitlab':
23
+ return new gitlab_js_1.GitLabTracker({ apiUrl, token, projectId });
24
+ default:
25
+ throw new Error(`Unknown tracker type: ${type}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracker/index.ts"],"names":[],"mappings":";;;AAWA,sCAaC;AApBD,2CAA4C;AAC5C,2CAA4C;AAG5C,6CAA8E;AAArE,8GAAA,eAAe,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtD,yCAA0E;AAAjE,4GAAA,eAAe,OAAA;AAAE,oGAAA,OAAO,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAEpD,SAAgB,aAAa,CAAC,IAAY,EAAE,MAAe;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IACtG,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAExF,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,yBAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,KAAK,QAAQ;YACX,OAAO,IAAI,yBAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * IssueTracker interface — adapter pattern for GitHub and GitLab.
3
+ * Supports self-hosted instances via apiUrl configuration.
4
+ */
5
+ export type Priority = 0 | 1 | 2 | 3;
6
+ export interface TrackerIssue {
7
+ id: string;
8
+ title: string;
9
+ body: string;
10
+ priority: Priority;
11
+ labels: string[];
12
+ url: string;
13
+ assignee?: string;
14
+ state: 'open' | 'closed';
15
+ createdAt: number;
16
+ updatedAt: number;
17
+ }
18
+ export interface FetchIssueOptions {
19
+ status?: 'open' | 'closed' | 'all';
20
+ assignedToMe?: boolean;
21
+ labels?: string[];
22
+ milestone?: string;
23
+ limit?: number;
24
+ }
25
+ export interface IssueTracker {
26
+ /** Fetch issues matching the given filters, sorted by priority. */
27
+ fetchIssues(opts?: FetchIssueOptions): Promise<TrackerIssue[]>;
28
+ /** Claim an issue by assigning it and adding in-progress label. */
29
+ claimIssue(issueId: string): Promise<void>;
30
+ /** Update issue status (add/remove labels, reopen). */
31
+ updateStatus(issueId: string, status: 'in-progress' | 'review' | 'open' | 'done'): Promise<void>;
32
+ /** Post a comment to an issue. */
33
+ postComment(issueId: string, body: string): Promise<void>;
34
+ /** Close an issue with a resolution comment. */
35
+ closeIssue(issueId: string, resolution?: string): Promise<void>;
36
+ /** Create a branch for the issue in the repository. */
37
+ createBranch(issueId: string, branchName: string, fromBranch?: string): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/tracker/interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,WAAW,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAE/D,mEAAmE;IACnE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,uDAAuD;IACvD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjG,kCAAkC;IAClC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,gDAAgD;IAChD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,uDAAuD;IACvD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * IssueTracker interface — adapter pattern for GitHub and GitLab.
4
+ * Supports self-hosted instances via apiUrl configuration.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/tracker/interface.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Priority extraction from issue labels.
3
+ * P0/priority:critical → 0, P1/priority:high → 1,
4
+ * P2/priority:medium → 2, P3/priority:low → 3, default → 3
5
+ */
6
+ import type { Priority } from './interface.js';
7
+ /**
8
+ * Extract priority from a list of labels.
9
+ * Returns the highest priority (lowest number) found.
10
+ * Defaults to 3 (low) if no priority label is found.
11
+ */
12
+ export declare function extractPriority(labels: string[]): Priority;
13
+ /** Human-readable priority name */
14
+ export declare function priorityName(p: Priority): string;
15
+ /** Sort issues by priority (ascending — P0 first) */
16
+ export declare function sortByPriority<T extends {
17
+ priority: Priority;
18
+ }>(issues: T[]): T[];
19
+ //# sourceMappingURL=priority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.d.ts","sourceRoot":"","sources":["../../src/tracker/priority.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAe/C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAY1D;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAEhD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEjF"}