argustack 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  [**Documentation & Examples →**](https://app.paperlink.online/s/0aa7d2d6/argustack)
11
11
 
12
- Argustack downloads your project data into local PostgreSQL, cross-references everything, and gives Claude direct access via 20 MCP tools. All data stays on your machine.
12
+ Argustack downloads your project data into local PostgreSQL, cross-references everything, and gives Claude direct access via 21 MCP tools. All data stays on your machine.
13
13
 
14
14
  > *Was ticket PROJ-123 implemented as described?*
15
15
  > *Who reviewed the PR and what was the feedback?*
@@ -24,7 +24,7 @@ Argustack downloads your project data into local PostgreSQL, cross-references ev
24
24
  - **Cross-source timeline** — Jira + Git + GitHub events in chronological order
25
25
  - **Semantic search** — find issues by meaning, not just keywords (pgvector)
26
26
  - **Task estimation** — predict duration per developer based on actual history
27
- - **20 MCP tools** — Claude queries your data directly via SQL
27
+ - **21 MCP tools** — Claude queries your data directly via SQL
28
28
  - **IDE Plugin** — kanban board for JetBrains IDEs where columns are Claude Code skills
29
29
  - **100% local** — no cloud, no accounts, no telemetry
30
30
 
@@ -90,6 +90,7 @@ After sync, Claude queries your data through these tools:
90
90
  | `issue_timeline` | Full chronological timeline: Jira + Git + GitHub |
91
91
  | `semantic_search` | Find similar issues by meaning (pgvector) |
92
92
  | `estimate` | Predict task duration per developer |
93
+ | `push` | Push local board tasks to Jira |
93
94
  | `workspace_info` | Current workspace configuration |
94
95
 
95
96
  ## IDE Plugin
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BpE,eAAO,MAAM,MAAM,WAWjB,CAAC;AASH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BpE,eAAO,MAAM,MAAM,WAWjB,CAAC;AAUH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
@@ -20,6 +20,7 @@ import { registerIssueTools } from './tools/issue.js';
20
20
  import { registerSearchTools } from './tools/search.js';
21
21
  import { registerEstimateTools } from './tools/estimate.js';
22
22
  import { registerDatabaseTools } from './tools/database.js';
23
+ import { registerPushTools } from './tools/push.js';
23
24
  const mcpFilename = fileURLToPath(import.meta.url);
24
25
  const mcpPackageRoot = resolve(dirname(mcpFilename), '..', '..');
25
26
  function loadIconDataUri() {
@@ -49,6 +50,7 @@ registerIssueTools(server);
49
50
  registerSearchTools(server);
50
51
  registerEstimateTools(server);
51
52
  registerDatabaseTools(server);
53
+ registerPushTools(server);
52
54
  export async function startMcpServer() {
53
55
  const transport = new StdioServerTransport();
54
56
  await server.connect(transport);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerPushTools(server: McpServer): void;
3
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0DzD"}
@@ -0,0 +1,54 @@
1
+ import dotenv from 'dotenv';
2
+ import { loadWorkspace, textResponse, errorResponse, getErrorMessage, } from '../helpers.js';
3
+ import { JiraProvider } from '../../adapters/jira/index.js';
4
+ import { PostgresStorage } from '../../adapters/postgres/index.js';
5
+ import { PushUseCase } from '../../use-cases/push.js';
6
+ import { updateMdFrontmatter } from '../../adapters/board/md-parser.js';
7
+ export function registerPushTools(server) {
8
+ server.registerTool('push', {
9
+ description: 'Push local board tasks to Jira. Creates Stories for tasks with source=local in the Argustack database. Updates .md frontmatter with the new Jira key.',
10
+ inputSchema: {},
11
+ }, async () => {
12
+ const ws = loadWorkspace();
13
+ if (!ws.ok) {
14
+ return errorResponse(`Workspace not found: ${ws.reason}`);
15
+ }
16
+ dotenv.config({ path: `${ws.root}/.env`, quiet: true });
17
+ const jiraUrl = process.env['JIRA_URL'];
18
+ const jiraEmail = process.env['JIRA_EMAIL'];
19
+ const jiraToken = process.env['JIRA_API_TOKEN'];
20
+ if (!jiraUrl || !jiraEmail || !jiraToken) {
21
+ return errorResponse('Jira credentials not configured. Set JIRA_URL, JIRA_EMAIL, JIRA_API_TOKEN in .env');
22
+ }
23
+ const jira = new JiraProvider({ host: jiraUrl, email: jiraEmail, apiToken: jiraToken });
24
+ const storage = new PostgresStorage({
25
+ host: process.env['DB_HOST'] ?? 'localhost',
26
+ port: parseInt(process.env['DB_PORT'] ?? '5434', 10),
27
+ database: process.env['DB_NAME'] ?? 'argustack',
28
+ user: process.env['DB_USER'] ?? 'argustack',
29
+ password: process.env['DB_PASSWORD'] ?? 'argustack_local',
30
+ });
31
+ try {
32
+ await storage.initialize();
33
+ const useCase = new PushUseCase(jira, storage);
34
+ const result = await useCase.execute();
35
+ for (const item of result.created) {
36
+ if (item.mdPath) {
37
+ updateMdFrontmatter(item.mdPath, { jiraKey: item.newKey });
38
+ }
39
+ }
40
+ await storage.close();
41
+ if (result.created.length === 0) {
42
+ return textResponse('No local issues to push. All issues already synced with Jira.');
43
+ }
44
+ const lines = result.created.map((item) => `${item.newKey} (was ${item.oldKey})`);
45
+ const summary = `Pushed ${String(result.created.length)} issue(s) to Jira:\n${lines.join('\n')}`;
46
+ return textResponse(result.errors > 0 ? `${summary}\n\n${String(result.errors)} error(s) occurred.` : summary);
47
+ }
48
+ catch (err) {
49
+ await storage.close();
50
+ return errorResponse(`Push failed: ${getErrorMessage(err)}`);
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/mcp/tools/push.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,WAAW,EAAE,uJAAuJ;QACpK,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,aAAa,CAAC,wBAAwB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,OAAO,aAAa,CAAC,mFAAmF,CAAC,CAAC;QAC5G,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;YAClC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,WAAW;YAC3C,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC;YACpD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,WAAW;YAC/C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,WAAW;YAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,iBAAiB;SAC1D,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAEvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;YAED,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,YAAY,CAAC,+DAA+D,CAAC,CAAC;YACvF,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAClF,MAAM,OAAO,GAAG,UAAU,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjG,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,aAAa,CAAC,gBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "argustack",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "Project analysis platform — Jira + Git + DB",
5
5
  "type": "module",
6
6
  "bin": {