argustack 0.1.19 → 0.1.21

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 (90) hide show
  1. package/dist/adapters/jira/provider.d.ts +4 -1
  2. package/dist/adapters/jira/provider.d.ts.map +1 -1
  3. package/dist/adapters/jira/provider.js +43 -9
  4. package/dist/adapters/jira/provider.js.map +1 -1
  5. package/dist/adapters/jira-proxy/client.d.ts +11 -0
  6. package/dist/adapters/jira-proxy/client.d.ts.map +1 -0
  7. package/dist/adapters/jira-proxy/client.js +87 -0
  8. package/dist/adapters/jira-proxy/client.js.map +1 -0
  9. package/dist/adapters/jira-proxy/config-loader.d.ts +5 -0
  10. package/dist/adapters/jira-proxy/config-loader.d.ts.map +1 -0
  11. package/dist/adapters/jira-proxy/config-loader.js +133 -0
  12. package/dist/adapters/jira-proxy/config-loader.js.map +1 -0
  13. package/dist/adapters/jira-proxy/index.d.ts +5 -0
  14. package/dist/adapters/jira-proxy/index.d.ts.map +1 -0
  15. package/dist/adapters/jira-proxy/index.js +5 -0
  16. package/dist/adapters/jira-proxy/index.js.map +1 -0
  17. package/dist/adapters/jira-proxy/mapper.d.ts +5 -0
  18. package/dist/adapters/jira-proxy/mapper.d.ts.map +1 -0
  19. package/dist/adapters/jira-proxy/mapper.js +115 -0
  20. package/dist/adapters/jira-proxy/mapper.js.map +1 -0
  21. package/dist/adapters/jira-proxy/provider.d.ts +17 -0
  22. package/dist/adapters/jira-proxy/provider.d.ts.map +1 -0
  23. package/dist/adapters/jira-proxy/provider.js +150 -0
  24. package/dist/adapters/jira-proxy/provider.js.map +1 -0
  25. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  26. package/dist/adapters/postgres/schema.js +3 -0
  27. package/dist/adapters/postgres/schema.js.map +1 -1
  28. package/dist/adapters/postgres/storage.d.ts +4 -0
  29. package/dist/adapters/postgres/storage.d.ts.map +1 -1
  30. package/dist/adapters/postgres/storage.js +85 -32
  31. package/dist/adapters/postgres/storage.js.map +1 -1
  32. package/dist/cli/index.js +2 -0
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/init/generators.d.ts +4 -4
  35. package/dist/cli/init/generators.d.ts.map +1 -1
  36. package/dist/cli/init/generators.js +26 -9
  37. package/dist/cli/init/generators.js.map +1 -1
  38. package/dist/cli/init/index.d.ts.map +1 -1
  39. package/dist/cli/init/index.js +13 -9
  40. package/dist/cli/init/index.js.map +1 -1
  41. package/dist/cli/init/setup-jira.d.ts +6 -2
  42. package/dist/cli/init/setup-jira.d.ts.map +1 -1
  43. package/dist/cli/init/setup-jira.js +188 -3
  44. package/dist/cli/init/setup-jira.js.map +1 -1
  45. package/dist/cli/init/types.d.ts +9 -0
  46. package/dist/cli/init/types.d.ts.map +1 -1
  47. package/dist/cli/init/types.js.map +1 -1
  48. package/dist/cli/push.d.ts.map +1 -1
  49. package/dist/cli/push.js +25 -2
  50. package/dist/cli/push.js.map +1 -1
  51. package/dist/cli/sync.d.ts.map +1 -1
  52. package/dist/cli/sync.js +26 -12
  53. package/dist/cli/sync.js.map +1 -1
  54. package/dist/cli/workspaces.d.ts +3 -0
  55. package/dist/cli/workspaces.d.ts.map +1 -0
  56. package/dist/cli/workspaces.js +34 -0
  57. package/dist/cli/workspaces.js.map +1 -0
  58. package/dist/core/ports/source-provider.d.ts +2 -0
  59. package/dist/core/ports/source-provider.d.ts.map +1 -1
  60. package/dist/core/ports/storage.d.ts +6 -0
  61. package/dist/core/ports/storage.d.ts.map +1 -1
  62. package/dist/core/types/config.d.ts +1 -0
  63. package/dist/core/types/config.d.ts.map +1 -1
  64. package/dist/core/types/config.js.map +1 -1
  65. package/dist/core/types/index.d.ts +1 -0
  66. package/dist/core/types/index.d.ts.map +1 -1
  67. package/dist/core/types/proxy-config.d.ts +28 -0
  68. package/dist/core/types/proxy-config.d.ts.map +1 -0
  69. package/dist/core/types/proxy-config.js +2 -0
  70. package/dist/core/types/proxy-config.js.map +1 -0
  71. package/dist/mcp/helpers.d.ts.map +1 -1
  72. package/dist/mcp/helpers.js +32 -7
  73. package/dist/mcp/helpers.js.map +1 -1
  74. package/dist/mcp/tools/push.d.ts.map +1 -1
  75. package/dist/mcp/tools/push.js +57 -0
  76. package/dist/mcp/tools/push.js.map +1 -1
  77. package/dist/mcp/tools/workspace.d.ts.map +1 -1
  78. package/dist/mcp/tools/workspace.js +9 -4
  79. package/dist/mcp/tools/workspace.js.map +1 -1
  80. package/dist/use-cases/push.d.ts +10 -0
  81. package/dist/use-cases/push.d.ts.map +1 -1
  82. package/dist/use-cases/push.js +25 -0
  83. package/dist/use-cases/push.js.map +1 -1
  84. package/dist/workspace/registry.d.ts +11 -0
  85. package/dist/workspace/registry.d.ts.map +1 -0
  86. package/dist/workspace/registry.js +80 -0
  87. package/dist/workspace/registry.js.map +1 -0
  88. package/package.json +1 -1
  89. package/templates/env.example +3 -0
  90. package/templates/proxy-config-example.json +61 -0
@@ -0,0 +1,11 @@
1
+ import type { SourceType } from '../core/types/index.js';
2
+ export interface WorkspaceInfo {
3
+ name: string;
4
+ path: string;
5
+ sources: SourceType[];
6
+ active: boolean;
7
+ }
8
+ export declare function registerWorkspace(workspacePath: string, name?: string): void;
9
+ export declare function listRegisteredWorkspaces(activeRoot?: string): WorkspaceInfo[];
10
+ export declare function pruneDeadWorkspaces(): void;
11
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/workspace/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAgBzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAkB5E;AAED,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CA4B7E;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C"}
@@ -0,0 +1,80 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { readConfig, getEnabledSources } from './config.js';
5
+ function registryDir() {
6
+ return join(homedir(), '.argustack');
7
+ }
8
+ function registryFile() {
9
+ return join(registryDir(), 'workspaces.json');
10
+ }
11
+ export function registerWorkspace(workspacePath, name) {
12
+ try {
13
+ const entries = readRegistry();
14
+ const existing = entries.find((e) => e.path === workspacePath);
15
+ if (existing) {
16
+ if (name && existing.name !== name) {
17
+ existing.name = name;
18
+ writeRegistry(entries);
19
+ }
20
+ return;
21
+ }
22
+ const wsName = name ?? workspacePath.split('/').pop() ?? 'unknown';
23
+ entries.push({ name: wsName, path: workspacePath, createdAt: new Date().toISOString() });
24
+ writeRegistry(entries);
25
+ }
26
+ catch {
27
+ /* registry is best-effort — don't fail init/sync */
28
+ }
29
+ }
30
+ export function listRegisteredWorkspaces(activeRoot) {
31
+ const entries = readRegistry();
32
+ const live = [];
33
+ const workspaces = [];
34
+ for (const entry of entries) {
35
+ if (!existsSync(join(entry.path, '.argustack'))) {
36
+ continue;
37
+ }
38
+ live.push(entry);
39
+ const config = readConfig(entry.path);
40
+ const sources = config ? getEnabledSources(config) : [];
41
+ const displayName = config?.name ?? entry.name;
42
+ workspaces.push({
43
+ name: displayName,
44
+ path: entry.path,
45
+ sources,
46
+ active: entry.path === activeRoot,
47
+ });
48
+ }
49
+ if (live.length !== entries.length) {
50
+ writeRegistry(live);
51
+ }
52
+ return workspaces;
53
+ }
54
+ export function pruneDeadWorkspaces() {
55
+ const entries = readRegistry();
56
+ const live = entries.filter((e) => existsSync(join(e.path, '.argustack')));
57
+ if (live.length !== entries.length) {
58
+ writeRegistry(live);
59
+ }
60
+ }
61
+ function readRegistry() {
62
+ if (!existsSync(registryFile())) {
63
+ return [];
64
+ }
65
+ try {
66
+ const raw = readFileSync(registryFile(), 'utf-8');
67
+ const parsed = JSON.parse(raw);
68
+ return Array.isArray(parsed) ? parsed : [];
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ function writeRegistry(entries) {
75
+ if (!existsSync(registryDir())) {
76
+ mkdirSync(registryDir(), { recursive: true });
77
+ }
78
+ writeFileSync(registryFile(), JSON.stringify(entries, null, 2) + '\n');
79
+ }
80
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/workspace/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG5D,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAChD,CAAC;AAeD,MAAM,UAAU,iBAAiB,CAAC,aAAqB,EAAE,IAAa;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;gBACrB,aAAa,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACzF,aAAa,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAmB;IAC1D,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAoB,EAAE,CAAC;IAEvC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,WAAW,GAAG,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;QAE/C,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO;YACP,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,UAAU;SAClC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAwB;IAC7C,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC/B,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "argustack",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "Project analysis platform — Jira + Git + DB",
5
5
  "type": "module",
6
6
  "bin": {
@@ -6,6 +6,9 @@ JIRA_API_TOKEN=your_jira_api_token
6
6
  # Projects to pull (comma-separated)
7
7
  JIRA_PROJECTS=PROJ,ANOTHER
8
8
 
9
+ # === Jira Proxy (alternative to direct Jira API) ===
10
+ # JIRA_PROXY_TOKEN=your-service-token
11
+
9
12
  # === PostgreSQL (defaults — no need to change) ===
10
13
  DB_HOST=localhost
11
14
  DB_PORT=5434
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "Example Jira Proxy",
3
+ "description": "Example config for a Jira proxy server that sanitizes responses and enforces read-only access. Customize for your proxy.",
4
+ "base_url": "https://your-proxy.example.com/service/jira",
5
+ "auth": {
6
+ "type": "bearer_exchange",
7
+ "token_endpoint": "/service/auth/exchange",
8
+ "service_token_env": "JIRA_PROXY_TOKEN",
9
+ "ttl_minutes": 15
10
+ },
11
+ "endpoints": {
12
+ "search": {
13
+ "path": "/search",
14
+ "method": "GET",
15
+ "params": ["jql", "fields", "maxResults", "startAt"]
16
+ },
17
+ "issue": {
18
+ "path": "/issue/{key}",
19
+ "method": "GET"
20
+ },
21
+ "projects": {
22
+ "path": "/project/search",
23
+ "method": "GET",
24
+ "params": ["maxResults", "startAt", "query"]
25
+ },
26
+ "fields": {
27
+ "path": "/field",
28
+ "method": "GET"
29
+ }
30
+ },
31
+ "response_mapping": {
32
+ "issue_key": "key",
33
+ "summary": "fields.summary",
34
+ "description": "fields.description",
35
+ "status": "fields.status.name",
36
+ "status_category": "fields.status.statusCategory.name",
37
+ "issue_type": "fields.issuetype.name",
38
+ "priority": "fields.priority.name",
39
+ "resolution": "fields.resolution.name",
40
+ "assignee": "fields.assignee.displayName",
41
+ "assignee_id": "fields.assignee.accountId",
42
+ "reporter": "fields.reporter.displayName",
43
+ "reporter_id": "fields.reporter.accountId",
44
+ "created": "fields.created",
45
+ "updated": "fields.updated",
46
+ "resolved": "fields.resolutiondate",
47
+ "due_date": "fields.duedate",
48
+ "labels": "fields.labels",
49
+ "components": "fields.components[].name",
50
+ "fix_versions": "fields.fixVersions[].name",
51
+ "parent_key": "fields.parent.key",
52
+ "sprint": "fields.sprint.name",
53
+ "story_points": "fields.story_points"
54
+ },
55
+ "notes": {
56
+ "how_to_use": "1. Copy this file to .argustack/proxy.json in your workspace. 2. Set JIRA_PROXY_TOKEN in .env. 3. Update base_url to your proxy. 4. Adjust response_mapping if your proxy returns different field paths.",
57
+ "how_to_generate": "Give your proxy's OpenAPI spec (or API docs) and this template to any LLM. Ask it to generate a proxy.json config that maps your proxy's response format to these fields.",
58
+ "search_note": "Some proxies strip description from search results for performance. Use the issue endpoint to get full descriptions.",
59
+ "auth_types": "bearer = static token from env var. bearer_exchange = exchange long-lived service token for short-lived access token (recommended)."
60
+ }
61
+ }