argustack 0.1.0

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +433 -0
  3. package/dist/adapters/csv/index.d.ts +4 -0
  4. package/dist/adapters/csv/index.d.ts.map +1 -0
  5. package/dist/adapters/csv/index.js +4 -0
  6. package/dist/adapters/csv/index.js.map +1 -0
  7. package/dist/adapters/csv/mapper.d.ts +10 -0
  8. package/dist/adapters/csv/mapper.d.ts.map +1 -0
  9. package/dist/adapters/csv/mapper.js +179 -0
  10. package/dist/adapters/csv/mapper.js.map +1 -0
  11. package/dist/adapters/csv/parser.d.ts +22 -0
  12. package/dist/adapters/csv/parser.d.ts.map +1 -0
  13. package/dist/adapters/csv/parser.js +96 -0
  14. package/dist/adapters/csv/parser.js.map +1 -0
  15. package/dist/adapters/csv/provider.d.ts +11 -0
  16. package/dist/adapters/csv/provider.d.ts.map +1 -0
  17. package/dist/adapters/csv/provider.js +98 -0
  18. package/dist/adapters/csv/provider.js.map +1 -0
  19. package/dist/adapters/git/index.d.ts +3 -0
  20. package/dist/adapters/git/index.d.ts.map +1 -0
  21. package/dist/adapters/git/index.js +3 -0
  22. package/dist/adapters/git/index.js.map +1 -0
  23. package/dist/adapters/git/mapper.d.ts +11 -0
  24. package/dist/adapters/git/mapper.d.ts.map +1 -0
  25. package/dist/adapters/git/mapper.js +47 -0
  26. package/dist/adapters/git/mapper.js.map +1 -0
  27. package/dist/adapters/git/provider.d.ts +12 -0
  28. package/dist/adapters/git/provider.d.ts.map +1 -0
  29. package/dist/adapters/git/provider.js +115 -0
  30. package/dist/adapters/git/provider.js.map +1 -0
  31. package/dist/adapters/github/client.d.ts +8 -0
  32. package/dist/adapters/github/client.d.ts.map +1 -0
  33. package/dist/adapters/github/client.js +5 -0
  34. package/dist/adapters/github/client.js.map +1 -0
  35. package/dist/adapters/github/index.d.ts +4 -0
  36. package/dist/adapters/github/index.d.ts.map +1 -0
  37. package/dist/adapters/github/index.js +4 -0
  38. package/dist/adapters/github/index.js.map +1 -0
  39. package/dist/adapters/github/mapper.d.ts +12 -0
  40. package/dist/adapters/github/mapper.d.ts.map +1 -0
  41. package/dist/adapters/github/mapper.js +117 -0
  42. package/dist/adapters/github/mapper.js.map +1 -0
  43. package/dist/adapters/github/provider.d.ts +18 -0
  44. package/dist/adapters/github/provider.d.ts.map +1 -0
  45. package/dist/adapters/github/provider.js +95 -0
  46. package/dist/adapters/github/provider.js.map +1 -0
  47. package/dist/adapters/jira/client.d.ts +11 -0
  48. package/dist/adapters/jira/client.d.ts.map +1 -0
  49. package/dist/adapters/jira/client.js +16 -0
  50. package/dist/adapters/jira/client.js.map +1 -0
  51. package/dist/adapters/jira/index.d.ts +3 -0
  52. package/dist/adapters/jira/index.d.ts.map +1 -0
  53. package/dist/adapters/jira/index.js +3 -0
  54. package/dist/adapters/jira/index.js.map +1 -0
  55. package/dist/adapters/jira/mapper.d.ts +14 -0
  56. package/dist/adapters/jira/mapper.d.ts.map +1 -0
  57. package/dist/adapters/jira/mapper.js +169 -0
  58. package/dist/adapters/jira/mapper.js.map +1 -0
  59. package/dist/adapters/jira/provider.d.ts +21 -0
  60. package/dist/adapters/jira/provider.d.ts.map +1 -0
  61. package/dist/adapters/jira/provider.js +79 -0
  62. package/dist/adapters/jira/provider.js.map +1 -0
  63. package/dist/adapters/openai/embedding-provider.d.ts +16 -0
  64. package/dist/adapters/openai/embedding-provider.d.ts.map +1 -0
  65. package/dist/adapters/openai/embedding-provider.js +34 -0
  66. package/dist/adapters/openai/embedding-provider.js.map +1 -0
  67. package/dist/adapters/openai/index.d.ts +2 -0
  68. package/dist/adapters/openai/index.d.ts.map +1 -0
  69. package/dist/adapters/openai/index.js +2 -0
  70. package/dist/adapters/openai/index.js.map +1 -0
  71. package/dist/adapters/postgres/connection.d.ts +13 -0
  72. package/dist/adapters/postgres/connection.d.ts.map +1 -0
  73. package/dist/adapters/postgres/connection.js +16 -0
  74. package/dist/adapters/postgres/connection.js.map +1 -0
  75. package/dist/adapters/postgres/index.d.ts +3 -0
  76. package/dist/adapters/postgres/index.d.ts.map +1 -0
  77. package/dist/adapters/postgres/index.js +3 -0
  78. package/dist/adapters/postgres/index.js.map +1 -0
  79. package/dist/adapters/postgres/schema.d.ts +6 -0
  80. package/dist/adapters/postgres/schema.d.ts.map +1 -0
  81. package/dist/adapters/postgres/schema.js +246 -0
  82. package/dist/adapters/postgres/schema.js.map +1 -0
  83. package/dist/adapters/postgres/storage.d.ts +32 -0
  84. package/dist/adapters/postgres/storage.d.ts.map +1 -0
  85. package/dist/adapters/postgres/storage.js +322 -0
  86. package/dist/adapters/postgres/storage.js.map +1 -0
  87. package/dist/cli/embed.d.ts +3 -0
  88. package/dist/cli/embed.d.ts.map +1 -0
  89. package/dist/cli/embed.js +52 -0
  90. package/dist/cli/embed.js.map +1 -0
  91. package/dist/cli/index.d.ts +3 -0
  92. package/dist/cli/index.d.ts.map +1 -0
  93. package/dist/cli/index.js +64 -0
  94. package/dist/cli/index.js.map +1 -0
  95. package/dist/cli/init.d.ts +24 -0
  96. package/dist/cli/init.d.ts.map +1 -0
  97. package/dist/cli/init.js +966 -0
  98. package/dist/cli/init.js.map +1 -0
  99. package/dist/cli/jira.d.ts +3 -0
  100. package/dist/cli/jira.d.ts.map +1 -0
  101. package/dist/cli/jira.js +78 -0
  102. package/dist/cli/jira.js.map +1 -0
  103. package/dist/cli/mcp-install.d.ts +10 -0
  104. package/dist/cli/mcp-install.d.ts.map +1 -0
  105. package/dist/cli/mcp-install.js +207 -0
  106. package/dist/cli/mcp-install.js.map +1 -0
  107. package/dist/cli/sources.d.ts +10 -0
  108. package/dist/cli/sources.d.ts.map +1 -0
  109. package/dist/cli/sources.js +132 -0
  110. package/dist/cli/sources.js.map +1 -0
  111. package/dist/cli/status.d.ts +6 -0
  112. package/dist/cli/status.d.ts.map +1 -0
  113. package/dist/cli/status.js +93 -0
  114. package/dist/cli/status.js.map +1 -0
  115. package/dist/cli/sync.d.ts +21 -0
  116. package/dist/cli/sync.d.ts.map +1 -0
  117. package/dist/cli/sync.js +321 -0
  118. package/dist/cli/sync.js.map +1 -0
  119. package/dist/core/ports/embedding-provider.d.ts +15 -0
  120. package/dist/core/ports/embedding-provider.d.ts.map +1 -0
  121. package/dist/core/ports/embedding-provider.js +2 -0
  122. package/dist/core/ports/embedding-provider.js.map +1 -0
  123. package/dist/core/ports/git-provider.d.ts +30 -0
  124. package/dist/core/ports/git-provider.d.ts.map +1 -0
  125. package/dist/core/ports/git-provider.js +2 -0
  126. package/dist/core/ports/git-provider.js.map +1 -0
  127. package/dist/core/ports/github-provider.d.ts +30 -0
  128. package/dist/core/ports/github-provider.d.ts.map +1 -0
  129. package/dist/core/ports/github-provider.js +2 -0
  130. package/dist/core/ports/github-provider.js.map +1 -0
  131. package/dist/core/ports/index.d.ts +6 -0
  132. package/dist/core/ports/index.d.ts.map +1 -0
  133. package/dist/core/ports/index.js +2 -0
  134. package/dist/core/ports/index.js.map +1 -0
  135. package/dist/core/ports/source-provider.d.ts +27 -0
  136. package/dist/core/ports/source-provider.d.ts.map +1 -0
  137. package/dist/core/ports/source-provider.js +2 -0
  138. package/dist/core/ports/source-provider.js.map +1 -0
  139. package/dist/core/ports/storage.d.ts +47 -0
  140. package/dist/core/ports/storage.d.ts.map +1 -0
  141. package/dist/core/ports/storage.js +2 -0
  142. package/dist/core/ports/storage.js.map +1 -0
  143. package/dist/core/types/config.d.ts +26 -0
  144. package/dist/core/types/config.d.ts.map +1 -0
  145. package/dist/core/types/config.js +41 -0
  146. package/dist/core/types/config.js.map +1 -0
  147. package/dist/core/types/git.d.ts +35 -0
  148. package/dist/core/types/git.d.ts.map +1 -0
  149. package/dist/core/types/git.js +6 -0
  150. package/dist/core/types/git.js.map +1 -0
  151. package/dist/core/types/github.d.ts +75 -0
  152. package/dist/core/types/github.d.ts.map +1 -0
  153. package/dist/core/types/github.js +2 -0
  154. package/dist/core/types/github.js.map +1 -0
  155. package/dist/core/types/index.d.ts +7 -0
  156. package/dist/core/types/index.d.ts.map +1 -0
  157. package/dist/core/types/index.js +2 -0
  158. package/dist/core/types/index.js.map +1 -0
  159. package/dist/core/types/issue.d.ts +74 -0
  160. package/dist/core/types/issue.d.ts.map +1 -0
  161. package/dist/core/types/issue.js +7 -0
  162. package/dist/core/types/issue.js.map +1 -0
  163. package/dist/core/types/project.d.ts +9 -0
  164. package/dist/core/types/project.d.ts.map +1 -0
  165. package/dist/core/types/project.js +5 -0
  166. package/dist/core/types/project.js.map +1 -0
  167. package/dist/db/connection.d.ts +2 -0
  168. package/dist/db/connection.d.ts.map +1 -0
  169. package/dist/db/connection.js +4 -0
  170. package/dist/db/connection.js.map +1 -0
  171. package/dist/db/import.d.ts +2 -0
  172. package/dist/db/import.d.ts.map +1 -0
  173. package/dist/db/import.js +4 -0
  174. package/dist/db/import.js.map +1 -0
  175. package/dist/db/schema.d.ts +2 -0
  176. package/dist/db/schema.d.ts.map +1 -0
  177. package/dist/db/schema.js +4 -0
  178. package/dist/db/schema.js.map +1 -0
  179. package/dist/jira/client.d.ts +2 -0
  180. package/dist/jira/client.d.ts.map +1 -0
  181. package/dist/jira/client.js +4 -0
  182. package/dist/jira/client.js.map +1 -0
  183. package/dist/jira/pull.d.ts +2 -0
  184. package/dist/jira/pull.d.ts.map +1 -0
  185. package/dist/jira/pull.js +5 -0
  186. package/dist/jira/pull.js.map +1 -0
  187. package/dist/mcp/server.d.ts +16 -0
  188. package/dist/mcp/server.d.ts.map +1 -0
  189. package/dist/mcp/server.js +1463 -0
  190. package/dist/mcp/server.js.map +1 -0
  191. package/dist/use-cases/embed.d.ts +23 -0
  192. package/dist/use-cases/embed.d.ts.map +1 -0
  193. package/dist/use-cases/embed.js +63 -0
  194. package/dist/use-cases/embed.js.map +1 -0
  195. package/dist/use-cases/pull-git.d.ts +25 -0
  196. package/dist/use-cases/pull-git.d.ts.map +1 -0
  197. package/dist/use-cases/pull-git.js +59 -0
  198. package/dist/use-cases/pull-git.js.map +1 -0
  199. package/dist/use-cases/pull-github.d.ts +28 -0
  200. package/dist/use-cases/pull-github.d.ts.map +1 -0
  201. package/dist/use-cases/pull-github.js +67 -0
  202. package/dist/use-cases/pull-github.js.map +1 -0
  203. package/dist/use-cases/pull.d.ts +32 -0
  204. package/dist/use-cases/pull.d.ts.map +1 -0
  205. package/dist/use-cases/pull.js +82 -0
  206. package/dist/use-cases/pull.js.map +1 -0
  207. package/dist/workspace/config.d.ts +36 -0
  208. package/dist/workspace/config.d.ts.map +1 -0
  209. package/dist/workspace/config.js +91 -0
  210. package/dist/workspace/config.js.map +1 -0
  211. package/dist/workspace/resolver.d.ts +19 -0
  212. package/dist/workspace/resolver.d.ts.map +1 -0
  213. package/dist/workspace/resolver.js +47 -0
  214. package/dist/workspace/resolver.js.map +1 -0
  215. package/package.json +71 -0
  216. package/templates/docker-compose.yml +26 -0
  217. package/templates/env.example +14 -0
  218. package/templates/gitignore +6 -0
  219. package/templates/init.sql +236 -0
@@ -0,0 +1,91 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const CONFIG_FILE = '.argustack/config.json';
4
+ /**
5
+ * Create a fresh empty workspace config.
6
+ */
7
+ export function createEmptyConfig() {
8
+ return {
9
+ version: 1,
10
+ sources: {},
11
+ order: [],
12
+ createdAt: new Date().toISOString(),
13
+ };
14
+ }
15
+ /**
16
+ * Read config.json from workspace root.
17
+ * Returns null if not found.
18
+ */
19
+ export function readConfig(workspaceRoot) {
20
+ const path = join(workspaceRoot, CONFIG_FILE);
21
+ if (!existsSync(path)) {
22
+ return null;
23
+ }
24
+ const raw = readFileSync(path, 'utf-8');
25
+ return JSON.parse(raw);
26
+ }
27
+ /**
28
+ * Write config.json to workspace root.
29
+ */
30
+ export function writeConfig(workspaceRoot, config) {
31
+ const path = join(workspaceRoot, CONFIG_FILE);
32
+ writeFileSync(path, JSON.stringify(config, null, 2) + '\n');
33
+ }
34
+ /**
35
+ * Add a new source to the config (first-time setup).
36
+ */
37
+ export function addSource(config, source) {
38
+ const existing = config.sources[source];
39
+ config.sources[source] = {
40
+ enabled: true,
41
+ addedAt: existing?.addedAt ?? new Date().toISOString(),
42
+ };
43
+ // Add to order if not present
44
+ if (!config.order.includes(source)) {
45
+ config.order.push(source);
46
+ }
47
+ return config;
48
+ }
49
+ /**
50
+ * Re-enable a previously disabled source.
51
+ * Different from addSource — doesn't reset addedAt, just flips enabled.
52
+ */
53
+ export function enableSource(config, source) {
54
+ const existing = config.sources[source];
55
+ if (!existing) {
56
+ // Never been added — delegate to addSource
57
+ return addSource(config, source);
58
+ }
59
+ existing.enabled = true;
60
+ delete existing.disabledAt;
61
+ // Re-add to order if not present
62
+ if (!config.order.includes(source)) {
63
+ config.order.push(source);
64
+ }
65
+ return config;
66
+ }
67
+ /**
68
+ * Disable a source (soft — keeps credentials in .env).
69
+ */
70
+ export function disableSource(config, source) {
71
+ const existing = config.sources[source];
72
+ if (existing) {
73
+ existing.enabled = false;
74
+ existing.disabledAt = new Date().toISOString();
75
+ }
76
+ config.order = config.order.filter((s) => s !== source);
77
+ return config;
78
+ }
79
+ /**
80
+ * Get enabled sources in order.
81
+ */
82
+ export function getEnabledSources(config) {
83
+ return config.order.filter((s) => config.sources[s]?.enabled);
84
+ }
85
+ /**
86
+ * Check if a specific source is enabled.
87
+ */
88
+ export function isSourceEnabled(config, source) {
89
+ return config.sources[source]?.enabled === true;
90
+ }
91
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/workspace/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Find workspace root by walking up from startDir looking for .argustack/
3
+ * Returns the directory that contains .argustack/ (the workspace root), or null.
4
+ *
5
+ * Resolution order:
6
+ * 1. Explicit startDir argument
7
+ * 2. ARGUSTACK_WORKSPACE env var (set by `argustack mcp install`)
8
+ * 3. Walk up from process.cwd()
9
+ */
10
+ export declare function findWorkspaceRoot(startDir?: string): string | null;
11
+ /**
12
+ * Require workspace — throws user-friendly error if not found.
13
+ */
14
+ export declare function requireWorkspace(startDir?: string): string;
15
+ /**
16
+ * Check if a directory is already a workspace.
17
+ */
18
+ export declare function isWorkspace(dir: string): boolean;
19
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/workspace/resolver.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD"}
@@ -0,0 +1,47 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join, dirname, resolve } from 'node:path';
3
+ const WORKSPACE_MARKER = '.argustack';
4
+ /**
5
+ * Find workspace root by walking up from startDir looking for .argustack/
6
+ * Returns the directory that contains .argustack/ (the workspace root), or null.
7
+ *
8
+ * Resolution order:
9
+ * 1. Explicit startDir argument
10
+ * 2. ARGUSTACK_WORKSPACE env var (set by `argustack mcp install`)
11
+ * 3. Walk up from process.cwd()
12
+ */
13
+ export function findWorkspaceRoot(startDir) {
14
+ const envWorkspace = process.env['ARGUSTACK_WORKSPACE'];
15
+ const from = startDir ?? envWorkspace ?? process.cwd();
16
+ let dir = resolve(from);
17
+ while (true) {
18
+ const marker = join(dir, WORKSPACE_MARKER);
19
+ if (existsSync(marker)) {
20
+ return dir;
21
+ }
22
+ const parent = dirname(dir);
23
+ if (parent === dir) {
24
+ // Reached filesystem root
25
+ return null;
26
+ }
27
+ dir = parent;
28
+ }
29
+ }
30
+ /**
31
+ * Require workspace — throws user-friendly error if not found.
32
+ */
33
+ export function requireWorkspace(startDir) {
34
+ const root = findWorkspaceRoot(startDir);
35
+ if (!root) {
36
+ throw new Error('Not inside an Argustack workspace.\n' +
37
+ 'Run "argustack init" to create one.');
38
+ }
39
+ return root;
40
+ }
41
+ /**
42
+ * Check if a directory is already a workspace.
43
+ */
44
+ export function isWorkspace(dir) {
45
+ return existsSync(join(resolve(dir), WORKSPACE_MARKER));
46
+ }
47
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/workspace/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,IAAI,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvD,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,0BAA0B;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,sCAAsC;YACtC,qCAAqC,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC1D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "argustack",
3
+ "version": "0.1.0",
4
+ "description": "Project analysis platform — Jira + Git + DB",
5
+ "type": "module",
6
+ "bin": {
7
+ "argustack": "dist/cli/index.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "templates/"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsx src/cli/index.ts",
16
+ "start": "node dist/cli/index.js",
17
+ "lint": "eslint src/ tests/",
18
+ "lint:fix": "eslint src/ tests/ --fix",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "test:coverage": "vitest run --coverage",
23
+ "test:unit": "vitest run --project unit",
24
+ "test:integration": "vitest run --project integration",
25
+ "test:mcp": "vitest run --project mcp",
26
+ "test:arch": "vitest run --project architecture",
27
+ "check": "npm run typecheck && npm run lint",
28
+ "ci": "npm run check && npm test",
29
+ "prepublishOnly": "npm run ci && npm run build",
30
+ "build:mcpb": "npm run build && bash scripts/build-mcpb.sh",
31
+ "prepare": "husky"
32
+ },
33
+ "keywords": [
34
+ "jira",
35
+ "git",
36
+ "analysis",
37
+ "cli",
38
+ "devtools"
39
+ ],
40
+ "license": "MIT",
41
+ "engines": {
42
+ "node": ">=20"
43
+ },
44
+ "dependencies": {
45
+ "@inquirer/prompts": "^8.3.0",
46
+ "@modelcontextprotocol/sdk": "^1.27.1",
47
+ "chalk": "^5.4.1",
48
+ "commander": "^14.0.3",
49
+ "csv-parse": "^6.2.1",
50
+ "dotenv": "^17.3.1",
51
+ "es-git": "^0.6.0",
52
+ "jira.js": "^5.3.1",
53
+ "octokit": "^5.0.5",
54
+ "ora": "^9.3.0",
55
+ "pg": "^8.13.1"
56
+ },
57
+ "devDependencies": {
58
+ "@eslint/js": "^10.0.1",
59
+ "@types/eslint__js": "^8.42.3",
60
+ "@types/node": "^24.12.0",
61
+ "@types/pg": "^8.11.10",
62
+ "@vitest/coverage-v8": "^4.0.18",
63
+ "eslint": "^10.0.3",
64
+ "husky": "^9.1.7",
65
+ "lint-staged": "^16.3.3",
66
+ "tsx": "^4.19.2",
67
+ "typescript": "^5.7.2",
68
+ "typescript-eslint": "^8.57.0",
69
+ "vitest": "^4.0.18"
70
+ }
71
+ }
@@ -0,0 +1,26 @@
1
+ services:
2
+ db:
3
+ image: pgvector/pgvector:pg16
4
+ container_name: argustack-db
5
+ ports:
6
+ - "5434:5432"
7
+ environment:
8
+ POSTGRES_USER: argustack
9
+ POSTGRES_PASSWORD: argustack_local
10
+ POSTGRES_DB: argustack
11
+ volumes:
12
+ - argustack-data:/var/lib/postgresql/data
13
+ - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
14
+
15
+ pgweb:
16
+ image: sosedoff/pgweb
17
+ container_name: argustack-pgweb
18
+ ports:
19
+ - "8086:8081"
20
+ environment:
21
+ DATABASE_URL: postgres://argustack:argustack_local@db:5432/argustack?sslmode=disable
22
+ depends_on:
23
+ - db
24
+
25
+ volumes:
26
+ argustack-data:
@@ -0,0 +1,14 @@
1
+ # === Jira (required) ===
2
+ JIRA_URL=https://your-instance.atlassian.net
3
+ JIRA_EMAIL=your@email.com
4
+ JIRA_API_TOKEN=your_jira_api_token
5
+
6
+ # Projects to pull (comma-separated)
7
+ JIRA_PROJECTS=PROJ,ANOTHER
8
+
9
+ # === PostgreSQL (defaults — no need to change) ===
10
+ DB_HOST=localhost
11
+ DB_PORT=5434
12
+ DB_USER=argustack
13
+ DB_PASSWORD=argustack_local
14
+ DB_NAME=argustack
@@ -0,0 +1,6 @@
1
+ # Argustack workspace
2
+ .env
3
+ .mcp.json
4
+ data/
5
+ node_modules/
6
+ .DS_Store
@@ -0,0 +1,236 @@
1
+ -- Argustack — PostgreSQL schema
2
+ -- All Jira data stored as-is, no field renaming or mapping
3
+
4
+ CREATE EXTENSION IF NOT EXISTS vector;
5
+
6
+ -- Main issues table
7
+ CREATE TABLE issues (
8
+ id SERIAL PRIMARY KEY,
9
+ issue_key TEXT UNIQUE NOT NULL,
10
+ issue_id TEXT,
11
+ project_key TEXT,
12
+ summary TEXT NOT NULL,
13
+ description TEXT,
14
+ issue_type VARCHAR(50),
15
+ status VARCHAR(50),
16
+ status_category VARCHAR(50),
17
+ priority TEXT,
18
+ resolution VARCHAR(50),
19
+ assignee VARCHAR(100),
20
+ reporter VARCHAR(100),
21
+ created TIMESTAMP,
22
+ updated TIMESTAMP,
23
+ resolved TIMESTAMP,
24
+ due_date DATE,
25
+ labels TEXT[],
26
+ components TEXT[],
27
+ fix_versions TEXT[],
28
+ parent_key TEXT,
29
+ sprint VARCHAR(200),
30
+ story_points NUMERIC,
31
+ custom_fields JSONB, -- all custom fields as JSON
32
+ raw_json JSONB, -- full raw API response, as-is
33
+ embedding vector(1536), -- pgvector for semantic search
34
+ search_vector tsvector, -- full-text search
35
+ pulled_at TIMESTAMP DEFAULT NOW()
36
+ );
37
+
38
+ -- Comments
39
+ CREATE TABLE issue_comments (
40
+ id SERIAL PRIMARY KEY,
41
+ issue_key TEXT NOT NULL REFERENCES issues(issue_key),
42
+ comment_id TEXT,
43
+ author VARCHAR(100),
44
+ body TEXT,
45
+ created TIMESTAMP,
46
+ updated TIMESTAMP
47
+ );
48
+
49
+ -- Changelog (change history)
50
+ CREATE TABLE issue_changelogs (
51
+ id SERIAL PRIMARY KEY,
52
+ issue_key TEXT NOT NULL REFERENCES issues(issue_key),
53
+ author VARCHAR(100),
54
+ field VARCHAR(100),
55
+ from_value TEXT,
56
+ to_value TEXT,
57
+ changed_at TIMESTAMP
58
+ );
59
+
60
+ -- Worklogs
61
+ CREATE TABLE issue_worklogs (
62
+ id SERIAL PRIMARY KEY,
63
+ issue_key TEXT NOT NULL REFERENCES issues(issue_key),
64
+ author VARCHAR(100),
65
+ time_spent TEXT,
66
+ time_spent_seconds INTEGER,
67
+ comment TEXT,
68
+ started TIMESTAMP
69
+ );
70
+
71
+ -- Links
72
+ CREATE TABLE issue_links (
73
+ id SERIAL PRIMARY KEY,
74
+ source_key TEXT NOT NULL,
75
+ target_key TEXT NOT NULL,
76
+ link_type VARCHAR(50),
77
+ direction VARCHAR(10)
78
+ );
79
+
80
+ -- ─── Git tables ──────────────────────────────────────────────────────
81
+
82
+ CREATE TABLE commits (
83
+ hash VARCHAR(40) PRIMARY KEY,
84
+ message TEXT,
85
+ author VARCHAR(200),
86
+ email VARCHAR(200),
87
+ committed_at TIMESTAMPTZ,
88
+ parents TEXT[],
89
+ repo_path TEXT,
90
+ search_vector tsvector,
91
+ pulled_at TIMESTAMP DEFAULT NOW()
92
+ );
93
+
94
+ CREATE TABLE commit_files (
95
+ id SERIAL PRIMARY KEY,
96
+ commit_hash VARCHAR(40) NOT NULL REFERENCES commits(hash),
97
+ file_path TEXT NOT NULL,
98
+ status TEXT,
99
+ additions INTEGER DEFAULT 0,
100
+ deletions INTEGER DEFAULT 0
101
+ );
102
+
103
+ CREATE TABLE commit_issue_refs (
104
+ commit_hash VARCHAR(40) NOT NULL REFERENCES commits(hash),
105
+ issue_key TEXT NOT NULL,
106
+ PRIMARY KEY (commit_hash, issue_key)
107
+ );
108
+
109
+ -- ─── GitHub tables ──────────────────────────────────────────────────
110
+
111
+ CREATE TABLE pull_requests (
112
+ number INTEGER NOT NULL,
113
+ repo_full_name VARCHAR(200) NOT NULL,
114
+ title TEXT,
115
+ body TEXT,
116
+ state VARCHAR(10),
117
+ author VARCHAR(200),
118
+ created_at TIMESTAMPTZ,
119
+ updated_at TIMESTAMPTZ,
120
+ merged_at TIMESTAMPTZ,
121
+ closed_at TIMESTAMPTZ,
122
+ merge_commit_sha VARCHAR(40),
123
+ head_ref VARCHAR(200),
124
+ base_ref VARCHAR(200),
125
+ labels TEXT[],
126
+ reviewers TEXT[],
127
+ additions INTEGER DEFAULT 0,
128
+ deletions INTEGER DEFAULT 0,
129
+ changed_files INTEGER DEFAULT 0,
130
+ raw_json JSONB,
131
+ search_vector tsvector,
132
+ pulled_at TIMESTAMP DEFAULT NOW(),
133
+ PRIMARY KEY (repo_full_name, number)
134
+ );
135
+
136
+ CREATE TABLE pr_reviews (
137
+ id SERIAL PRIMARY KEY,
138
+ pr_number INTEGER NOT NULL,
139
+ repo_full_name VARCHAR(200) NOT NULL,
140
+ review_id INTEGER NOT NULL,
141
+ reviewer VARCHAR(200),
142
+ state VARCHAR(30),
143
+ body TEXT,
144
+ submitted_at TIMESTAMPTZ
145
+ );
146
+
147
+ CREATE TABLE pr_comments (
148
+ id SERIAL PRIMARY KEY,
149
+ pr_number INTEGER NOT NULL,
150
+ repo_full_name VARCHAR(200) NOT NULL,
151
+ comment_id BIGINT NOT NULL,
152
+ author VARCHAR(200),
153
+ body TEXT,
154
+ path TEXT,
155
+ line INTEGER,
156
+ created_at TIMESTAMPTZ,
157
+ updated_at TIMESTAMPTZ
158
+ );
159
+
160
+ CREATE TABLE pr_files (
161
+ id SERIAL PRIMARY KEY,
162
+ pr_number INTEGER NOT NULL,
163
+ repo_full_name VARCHAR(200) NOT NULL,
164
+ file_path TEXT NOT NULL,
165
+ status TEXT,
166
+ additions INTEGER DEFAULT 0,
167
+ deletions INTEGER DEFAULT 0
168
+ );
169
+
170
+ CREATE TABLE pr_issue_refs (
171
+ pr_number INTEGER NOT NULL,
172
+ repo_full_name VARCHAR(200) NOT NULL,
173
+ issue_key TEXT NOT NULL,
174
+ PRIMARY KEY (repo_full_name, pr_number, issue_key)
175
+ );
176
+
177
+ CREATE TABLE releases (
178
+ id INTEGER NOT NULL,
179
+ repo_full_name VARCHAR(200) NOT NULL,
180
+ tag_name VARCHAR(200),
181
+ name TEXT,
182
+ body TEXT,
183
+ author VARCHAR(200),
184
+ draft BOOLEAN DEFAULT FALSE,
185
+ prerelease BOOLEAN DEFAULT FALSE,
186
+ created_at TIMESTAMPTZ,
187
+ published_at TIMESTAMPTZ,
188
+ raw_json JSONB,
189
+ search_vector tsvector,
190
+ pulled_at TIMESTAMP DEFAULT NOW(),
191
+ PRIMARY KEY (repo_full_name, id)
192
+ );
193
+
194
+ -- ─── Indexes ────────────────────────────────────────────────────────
195
+
196
+ -- Jira indexes
197
+ CREATE INDEX idx_issues_project ON issues(project_key);
198
+ CREATE INDEX idx_issues_status ON issues(status);
199
+ CREATE INDEX idx_issues_type ON issues(issue_type);
200
+ CREATE INDEX idx_issues_assignee ON issues(assignee);
201
+ CREATE INDEX idx_issues_created ON issues(created);
202
+ CREATE INDEX idx_issues_updated ON issues(updated);
203
+ CREATE INDEX idx_issues_search ON issues USING GIN(search_vector);
204
+ CREATE INDEX idx_issues_custom ON issues USING GIN(custom_fields);
205
+ CREATE INDEX idx_issues_raw ON issues USING GIN(raw_json);
206
+ CREATE INDEX idx_comments_key ON issue_comments(issue_key);
207
+ CREATE INDEX idx_changelogs_key ON issue_changelogs(issue_key);
208
+ CREATE INDEX idx_worklogs_key ON issue_worklogs(issue_key);
209
+ CREATE INDEX idx_links_source ON issue_links(source_key);
210
+ CREATE INDEX idx_links_target ON issue_links(target_key);
211
+
212
+ -- Git indexes
213
+ CREATE INDEX idx_commits_author ON commits(author);
214
+ CREATE INDEX idx_commits_date ON commits(committed_at);
215
+ CREATE INDEX idx_commits_repo ON commits(repo_path);
216
+ CREATE INDEX idx_commits_search ON commits USING GIN(search_vector);
217
+ CREATE INDEX idx_commit_files_hash ON commit_files(commit_hash);
218
+ CREATE INDEX idx_commit_files_path ON commit_files(file_path);
219
+ CREATE INDEX idx_commit_refs_issue ON commit_issue_refs(issue_key);
220
+
221
+ -- GitHub indexes
222
+ CREATE INDEX idx_prs_repo ON pull_requests(repo_full_name);
223
+ CREATE INDEX idx_prs_state ON pull_requests(state);
224
+ CREATE INDEX idx_prs_author ON pull_requests(author);
225
+ CREATE INDEX idx_prs_merged ON pull_requests(merged_at);
226
+ CREATE INDEX idx_prs_updated ON pull_requests(updated_at);
227
+ CREATE INDEX idx_prs_merge_sha ON pull_requests(merge_commit_sha);
228
+ CREATE INDEX idx_prs_search ON pull_requests USING GIN(search_vector);
229
+ CREATE INDEX idx_pr_reviews_pr ON pr_reviews(repo_full_name, pr_number);
230
+ CREATE INDEX idx_pr_comments_pr ON pr_comments(repo_full_name, pr_number);
231
+ CREATE INDEX idx_pr_files_pr ON pr_files(repo_full_name, pr_number);
232
+ CREATE INDEX idx_pr_files_path ON pr_files(file_path);
233
+ CREATE INDEX idx_pr_refs_issue ON pr_issue_refs(issue_key);
234
+ CREATE INDEX idx_releases_repo ON releases(repo_full_name);
235
+ CREATE INDEX idx_releases_tag ON releases(tag_name);
236
+ CREATE INDEX idx_releases_search ON releases USING GIN(search_vector);