orbitmap 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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/dist/api-client.d.ts +234 -0
  4. package/dist/api-client.js +401 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/commands/agents.d.ts +3 -0
  7. package/dist/commands/agents.js +44 -0
  8. package/dist/commands/agents.js.map +1 -0
  9. package/dist/commands/assign.d.ts +5 -0
  10. package/dist/commands/assign.js +44 -0
  11. package/dist/commands/assign.js.map +1 -0
  12. package/dist/commands/context.d.ts +4 -0
  13. package/dist/commands/context.js +37 -0
  14. package/dist/commands/context.js.map +1 -0
  15. package/dist/commands/create.d.ts +12 -0
  16. package/dist/commands/create.js +54 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/dep.d.ts +11 -0
  19. package/dist/commands/dep.js +56 -0
  20. package/dist/commands/dep.js.map +1 -0
  21. package/dist/commands/doc-import.d.ts +9 -0
  22. package/dist/commands/doc-import.js +97 -0
  23. package/dist/commands/doc-import.js.map +1 -0
  24. package/dist/commands/doc-patch.d.ts +16 -0
  25. package/dist/commands/doc-patch.js +142 -0
  26. package/dist/commands/doc-patch.js.map +1 -0
  27. package/dist/commands/doc-share.d.ts +14 -0
  28. package/dist/commands/doc-share.js +60 -0
  29. package/dist/commands/doc-share.js.map +1 -0
  30. package/dist/commands/doc-update.d.ts +6 -0
  31. package/dist/commands/doc-update.js +64 -0
  32. package/dist/commands/doc-update.js.map +1 -0
  33. package/dist/commands/doc.d.ts +6 -0
  34. package/dist/commands/doc.js +108 -0
  35. package/dist/commands/doc.js.map +1 -0
  36. package/dist/commands/docs-cache.d.ts +11 -0
  37. package/dist/commands/docs-cache.js +119 -0
  38. package/dist/commands/docs-cache.js.map +1 -0
  39. package/dist/commands/docs.d.ts +6 -0
  40. package/dist/commands/docs.js +35 -0
  41. package/dist/commands/docs.js.map +1 -0
  42. package/dist/commands/get.d.ts +8 -0
  43. package/dist/commands/get.js +102 -0
  44. package/dist/commands/get.js.map +1 -0
  45. package/dist/commands/ideas.d.ts +23 -0
  46. package/dist/commands/ideas.js +155 -0
  47. package/dist/commands/ideas.js.map +1 -0
  48. package/dist/commands/init.d.ts +7 -0
  49. package/dist/commands/init.js +175 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/issues.d.ts +32 -0
  52. package/dist/commands/issues.js +206 -0
  53. package/dist/commands/issues.js.map +1 -0
  54. package/dist/commands/log.d.ts +6 -0
  55. package/dist/commands/log.js +47 -0
  56. package/dist/commands/log.js.map +1 -0
  57. package/dist/commands/login.d.ts +3 -0
  58. package/dist/commands/login.js +48 -0
  59. package/dist/commands/login.js.map +1 -0
  60. package/dist/commands/logout.d.ts +1 -0
  61. package/dist/commands/logout.js +13 -0
  62. package/dist/commands/logout.js.map +1 -0
  63. package/dist/commands/orbit.d.ts +18 -0
  64. package/dist/commands/orbit.js +159 -0
  65. package/dist/commands/orbit.js.map +1 -0
  66. package/dist/commands/overview.d.ts +4 -0
  67. package/dist/commands/overview.js +56 -0
  68. package/dist/commands/overview.js.map +1 -0
  69. package/dist/commands/projects.d.ts +3 -0
  70. package/dist/commands/projects.js +28 -0
  71. package/dist/commands/projects.js.map +1 -0
  72. package/dist/commands/setup-agent.d.ts +3 -0
  73. package/dist/commands/setup-agent.js +178 -0
  74. package/dist/commands/setup-agent.js.map +1 -0
  75. package/dist/commands/start.d.ts +4 -0
  76. package/dist/commands/start.js +38 -0
  77. package/dist/commands/start.js.map +1 -0
  78. package/dist/commands/status.d.ts +5 -0
  79. package/dist/commands/status.js +54 -0
  80. package/dist/commands/status.js.map +1 -0
  81. package/dist/commands/subtask.d.ts +7 -0
  82. package/dist/commands/subtask.js +26 -0
  83. package/dist/commands/subtask.js.map +1 -0
  84. package/dist/commands/task-edit-content.d.ts +7 -0
  85. package/dist/commands/task-edit-content.js +45 -0
  86. package/dist/commands/task-edit-content.js.map +1 -0
  87. package/dist/commands/task.d.ts +66 -0
  88. package/dist/commands/task.js +92 -0
  89. package/dist/commands/task.js.map +1 -0
  90. package/dist/commands/tasks.d.ts +7 -0
  91. package/dist/commands/tasks.js +35 -0
  92. package/dist/commands/tasks.js.map +1 -0
  93. package/dist/commands/vibes.d.ts +27 -0
  94. package/dist/commands/vibes.js +142 -0
  95. package/dist/commands/vibes.js.map +1 -0
  96. package/dist/config.d.ts +14 -0
  97. package/dist/config.js +34 -0
  98. package/dist/config.js.map +1 -0
  99. package/dist/doc-cache.d.ts +24 -0
  100. package/dist/doc-cache.js +116 -0
  101. package/dist/doc-cache.js.map +1 -0
  102. package/dist/errors.d.ts +16 -0
  103. package/dist/errors.js +26 -0
  104. package/dist/errors.js.map +1 -0
  105. package/dist/index.d.ts +2 -0
  106. package/dist/index.js +705 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/oauth.d.ts +42 -0
  109. package/dist/oauth.js +207 -0
  110. package/dist/oauth.js.map +1 -0
  111. package/dist/output.d.ts +4 -0
  112. package/dist/output.js +66 -0
  113. package/dist/output.js.map +1 -0
  114. package/package.json +50 -0
@@ -0,0 +1,175 @@
1
+ import readline from 'node:readline';
2
+ import { OrbitMapClient } from '../api-client.js';
3
+ import { saveConfig } from '../config.js';
4
+ import { loadCredentials, validateProfile, profileToPath } from '../oauth.js';
5
+ async function prompt(question, defaultValue) {
6
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
7
+ return new Promise((resolve) => {
8
+ const suffix = defaultValue ? ` [${defaultValue}]` : '';
9
+ rl.question(`${question}${suffix}: `, (answer) => {
10
+ rl.close();
11
+ resolve(answer.trim() || defaultValue || '');
12
+ });
13
+ });
14
+ }
15
+ async function promptSecret(question) {
16
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
17
+ return new Promise((resolve) => {
18
+ rl.question(`${question}: `, (answer) => {
19
+ rl.close();
20
+ resolve(answer.trim());
21
+ });
22
+ // Hide input on supported terminals
23
+ if (process.stdin.isTTY) {
24
+ const origWrite = process.stdout.write.bind(process.stdout);
25
+ process.stdout.write = ((chunk, encodingOrCb, cb) => {
26
+ // Suppress echoed characters while typing the secret
27
+ if (typeof chunk === 'string' && chunk !== `${question}: ` && chunk !== '\n' && chunk !== '\r\n') {
28
+ return true;
29
+ }
30
+ if (typeof encodingOrCb === 'function') {
31
+ return origWrite(chunk, encodingOrCb);
32
+ }
33
+ return origWrite(chunk, encodingOrCb, cb);
34
+ });
35
+ rl.once('close', () => {
36
+ process.stdout.write = origWrite;
37
+ process.stdout.write('\n');
38
+ });
39
+ }
40
+ });
41
+ }
42
+ export async function initCommand(options = {}) {
43
+ const apiKeyInput = options.key || options.token;
44
+ const nonInteractive = !!apiKeyInput;
45
+ let profile = 'full';
46
+ if (options.profile) {
47
+ try {
48
+ profile = validateProfile(options.profile);
49
+ }
50
+ catch (error) {
51
+ console.error(error.message);
52
+ process.exitCode = 1;
53
+ return;
54
+ }
55
+ }
56
+ let fullApiUrl = 'https://orbitmap-main-x5n6qz.laravel.cloud/api/agent';
57
+ if (nonInteractive) {
58
+ // Non-interactive mode: --key or --token provided
59
+ const apiKey = apiKeyInput;
60
+ const projectId = options.project || '';
61
+ console.log('Validating credentials...');
62
+ const client = new OrbitMapClient(apiKey, projectId || undefined, fullApiUrl);
63
+ try {
64
+ const response = (await client.getContext(projectId || undefined));
65
+ await saveConfig({
66
+ api_url: fullApiUrl,
67
+ api_key: apiKey,
68
+ ...(projectId ? { project_id: projectId } : {}),
69
+ });
70
+ const agentName = response.data.agent.name;
71
+ const projectName = response.data.project?.name;
72
+ if (projectName) {
73
+ console.log(`✓ Connected as ${agentName} on project ${projectName}`);
74
+ }
75
+ else {
76
+ console.log(`✓ Connected as ${agentName}`);
77
+ }
78
+ console.log('Configuration saved to ~/.orbitmap/config.json');
79
+ printMcpConfig(profile, apiKey, response.data.project?.id || projectId);
80
+ }
81
+ catch (error) {
82
+ if (error instanceof Error) {
83
+ console.error(`Validation failed: ${error.message}`);
84
+ }
85
+ else {
86
+ console.error('Validation failed: could not connect to API.');
87
+ }
88
+ process.exitCode = 1;
89
+ }
90
+ return;
91
+ }
92
+ // Interactive mode
93
+ console.log('OrbitMap CLI Setup\n');
94
+ if (options.advanced) {
95
+ const apiUrl = await prompt('API URL', 'https://orbitmap-main-x5n6qz.laravel.cloud');
96
+ fullApiUrl = apiUrl.replace(/\/+$/, '') + '/api/agent';
97
+ }
98
+ const apiKey = await promptSecret('Agent API Key');
99
+ if (!apiKey) {
100
+ console.error('Error: Agent API Key is required.');
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ const projectId = options.project || await prompt('Default Project ID (optional, press Enter to skip)');
105
+ console.log('\nValidating credentials...');
106
+ const client = new OrbitMapClient(apiKey, projectId || undefined, fullApiUrl);
107
+ try {
108
+ const response = (await client.getContext(projectId || undefined));
109
+ await saveConfig({
110
+ api_url: fullApiUrl,
111
+ api_key: apiKey,
112
+ ...(projectId ? { project_id: projectId } : {}),
113
+ });
114
+ const agentName = response.data.agent.name;
115
+ const projectName = response.data.project?.name;
116
+ if (projectName) {
117
+ console.log(`\n✓ Connected as ${agentName} on project ${projectName}`);
118
+ }
119
+ else {
120
+ console.log(`\n✓ Connected as ${agentName}`);
121
+ }
122
+ console.log('Configuration saved to ~/.orbitmap/config.json');
123
+ printMcpConfig(profile, apiKey, response.data.project?.id || projectId);
124
+ }
125
+ catch (error) {
126
+ if (error instanceof Error) {
127
+ console.error(`\nValidation failed: ${error.message}`);
128
+ }
129
+ else {
130
+ console.error('\nValidation failed: could not connect to API.');
131
+ }
132
+ process.exitCode = 1;
133
+ }
134
+ }
135
+ // ── MCP config generation ──
136
+ const MCP_BASE_URL = 'https://mcp.orbitmap.ai';
137
+ async function printMcpConfig(profile, apiKey, projectId) {
138
+ const profilePath = profileToPath(profile);
139
+ const mcpUrl = profilePath === '/' ? MCP_BASE_URL + '/' : MCP_BASE_URL + profilePath;
140
+ const oauthCreds = await loadCredentials();
141
+ let config;
142
+ if (oauthCreds && !apiKey) {
143
+ // OAuth credentials exist and no explicit API key — clean config
144
+ config = {
145
+ type: 'http',
146
+ url: mcpUrl,
147
+ };
148
+ }
149
+ else if (apiKey) {
150
+ // Explicit API key — Bearer token config
151
+ config = {
152
+ type: 'http',
153
+ url: mcpUrl,
154
+ headers: {
155
+ Authorization: `Bearer ${apiKey}`,
156
+ ...(projectId ? { 'X-OrbitMap-Project': projectId } : {}),
157
+ },
158
+ };
159
+ }
160
+ else if (oauthCreds) {
161
+ // OAuth credentials — clean config
162
+ config = {
163
+ type: 'http',
164
+ url: mcpUrl,
165
+ };
166
+ }
167
+ else {
168
+ return; // No credentials to generate config for
169
+ }
170
+ console.log('\n── MCP Server Config ──');
171
+ console.log(`Profile: ${profile} | URL: ${mcpUrl}`);
172
+ console.log('\nAdd this to your MCP client config (e.g. claude_desktop_config.json):\n');
173
+ console.log(`"orbitmap": ${JSON.stringify(config, null, 2)}`);
174
+ }
175
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAE5F,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,YAAqB;IAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CACtB,KAA0B,EAC1B,YAA8D,EAC9D,EAAiC,EACxB,EAAE;gBACX,qDAAqD;gBACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,QAAQ,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACjG,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;oBACvC,OAAO,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAgC,CAAC;YAElC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;gBACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAoG,EAAE;IACtI,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;IACjD,MAAM,cAAc,GAAG,CAAC,CAAC,WAAW,CAAC;IAErC,IAAI,OAAO,GAAY,MAAM,CAAC;IAC9B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAG,sDAAsD,CAAC;IAExE,IAAI,cAAc,EAAE,CAAC;QACnB,kDAAkD;QAClD,MAAM,MAAM,GAAG,WAAY,CAAC;QAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,SAAS,IAAI,SAAS,EAAE,UAAU,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,IAAI,SAAS,CAAC,CAKhE,CAAC;YAEF,MAAM,UAAU,CAAC;gBACf,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,MAAM;gBACf,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;YAEhD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,eAAe,WAAW,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAE9D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC,CAAC;QACrF,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,MAAM,CAAC,oDAAoD,CAAC,CAAC;IAExG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,SAAS,IAAI,SAAS,EAAE,UAAU,CAAC,CAAC;IAE9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,IAAI,SAAS,CAAC,CAKhE,CAAC;QAEF,MAAM,UAAU,CAAC;YACf,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,MAAM;YACf,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;QAEhD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,eAAe,WAAW,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAE9D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,8BAA8B;AAE9B,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAE/C,KAAK,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAe,EAAE,SAAkB;IACjF,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC;IAErF,MAAM,UAAU,GAAG,MAAM,eAAe,EAAE,CAAC;IAE3C,IAAI,MAA+B,CAAC;IAEpC,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,iEAAiE;QACjE,MAAM,GAAG;YACP,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,MAAM;SACZ,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,yCAAyC;QACzC,MAAM,GAAG;YACP,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,MAAM;YACX,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D;SACF,CAAC;IACJ,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,mCAAmC;QACnC,MAAM,GAAG;YACP,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,MAAM;SACZ,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,wCAAwC;IAClD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,WAAW,MAAM,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare function issueRegisterCommand(options: {
2
+ json: boolean;
3
+ project?: string;
4
+ title: string;
5
+ description: string;
6
+ severity?: string;
7
+ relatedTask?: string;
8
+ }): Promise<void>;
9
+ export declare function issueListCommand(options: {
10
+ json: boolean;
11
+ project?: string;
12
+ status?: string;
13
+ severity?: string;
14
+ limit?: string;
15
+ }): Promise<void>;
16
+ export declare function issueShowCommand(idOrNumber: string, options: {
17
+ json: boolean;
18
+ project?: string;
19
+ }): Promise<void>;
20
+ export declare function issueResolveCommand(idOrNumber: string, options: {
21
+ json: boolean;
22
+ project?: string;
23
+ status: string;
24
+ resolution?: string;
25
+ resolvedTask?: string;
26
+ }): Promise<void>;
27
+ export declare function issueStatusCommand(idOrNumber: string, status: string, options: {
28
+ json: boolean;
29
+ project?: string;
30
+ resolution?: string;
31
+ resolvedTask?: string;
32
+ }): Promise<void>;
@@ -0,0 +1,206 @@
1
+ import { createClient } from '../api-client.js';
2
+ import { formatOutput, printError, printSuccess, formatTable } from '../output.js';
3
+ const VALID_SEVERITIES = ['critical', 'high', 'medium', 'low'];
4
+ const VALID_RESOLVE_STATUSES = ['resolved', 'wont_fix', 'duplicate'];
5
+ const VALID_ISSUE_STATUSES = ['open', 'investigating', 'backlog', 'resolved', 'wont_fix', 'duplicate'];
6
+ const RESOLVE_TYPE_STATUSES = ['resolved', 'wont_fix', 'duplicate'];
7
+ function isObjectNumber(id) {
8
+ return /^([A-Z]{2}-)?[a-z0-9]{6}$/.test(id);
9
+ }
10
+ function stripPrefix(id) {
11
+ return id.replace(/^[A-Z]{2}-/, '');
12
+ }
13
+ // ── Commands ──
14
+ export async function issueRegisterCommand(options) {
15
+ if (options.severity && !VALID_SEVERITIES.includes(options.severity)) {
16
+ const msg = `Invalid severity "${options.severity}". Valid: ${VALID_SEVERITIES.join(', ')}`;
17
+ if (options.json) {
18
+ console.error(JSON.stringify({ error: { message: msg } }));
19
+ }
20
+ else {
21
+ console.error(`Error: ${msg}`);
22
+ }
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ try {
27
+ const client = await createClient(options.project);
28
+ const response = (await client.registerIssue({
29
+ title: options.title,
30
+ description: options.description,
31
+ severity: options.severity,
32
+ related_task_id: options.relatedTask,
33
+ }));
34
+ if (options.json) {
35
+ console.log(formatOutput(response, true));
36
+ return;
37
+ }
38
+ printSuccess(`Created issue ${response.data.display_number ?? `IS-${response.data.issue_number}`} (${response.data.status}).`, false);
39
+ }
40
+ catch (error) {
41
+ printError(error, options.json);
42
+ process.exitCode = 1;
43
+ }
44
+ }
45
+ export async function issueListCommand(options) {
46
+ try {
47
+ const client = await createClient(options.project);
48
+ const response = (await client.listIssues({
49
+ status: options.status,
50
+ severity: options.severity,
51
+ limit: options.limit,
52
+ }));
53
+ if (options.json) {
54
+ console.log(formatOutput(response, true));
55
+ return;
56
+ }
57
+ const issues = response.data;
58
+ if (issues.length === 0) {
59
+ console.log('No issues found.');
60
+ return;
61
+ }
62
+ console.log(`Issues (${response.meta.count}):\n`);
63
+ console.log(formatTable(['Number', 'Title', 'Severity', 'Status', 'Created'], issues.map((i) => [
64
+ i.display_number ?? `IS-${i.issue_number}`,
65
+ i.title,
66
+ i.severity,
67
+ i.status,
68
+ i.created_at.replace('T', ' ').replace(/\+.*$/, ''),
69
+ ])));
70
+ }
71
+ catch (error) {
72
+ printError(error, options.json);
73
+ process.exitCode = 1;
74
+ }
75
+ }
76
+ export async function issueShowCommand(idOrNumber, options) {
77
+ try {
78
+ const client = await createClient(options.project);
79
+ let response;
80
+ if (isObjectNumber(idOrNumber)) {
81
+ response = (await client.getIssueByNumber(stripPrefix(idOrNumber)));
82
+ }
83
+ else {
84
+ response = (await client.getIssue(idOrNumber));
85
+ }
86
+ if (options.json) {
87
+ console.log(formatOutput(response, true));
88
+ return;
89
+ }
90
+ const issue = response.data;
91
+ const displayNum = issue.display_number ?? `IS-${issue.issue_number}`;
92
+ console.log(`Issue: ${issue.title} [${displayNum}]`);
93
+ console.log(`Severity: ${issue.severity} Status: ${issue.status}`);
94
+ if (issue.related_task_id)
95
+ console.log(`Related Task: ${issue.related_task_id}`);
96
+ if (issue.resolved_by_task_id)
97
+ console.log(`Resolved By Task: ${issue.resolved_by_task_id}`);
98
+ console.log(`\nDescription:\n${issue.description}`);
99
+ if (issue.resolution) {
100
+ console.log(`\nResolution:\n${issue.resolution}`);
101
+ }
102
+ console.log(`\nCreated: ${issue.created_at.replace('T', ' ').replace(/\+.*$/, '')}`);
103
+ console.log(`Updated: ${issue.updated_at.replace('T', ' ').replace(/\+.*$/, '')}`);
104
+ }
105
+ catch (error) {
106
+ printError(error, options.json);
107
+ process.exitCode = 1;
108
+ }
109
+ }
110
+ export async function issueResolveCommand(idOrNumber, options) {
111
+ if (!VALID_RESOLVE_STATUSES.includes(options.status)) {
112
+ const msg = `Invalid resolve status "${options.status}". Valid: ${VALID_RESOLVE_STATUSES.join(', ')}`;
113
+ if (options.json) {
114
+ console.error(JSON.stringify({ error: { message: msg } }));
115
+ }
116
+ else {
117
+ console.error(`Error: ${msg}`);
118
+ }
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ if ((options.status === 'resolved' || options.status === 'wont_fix') && !options.resolution) {
123
+ const msg = `--resolution is required when status is "${options.status}"`;
124
+ if (options.json) {
125
+ console.error(JSON.stringify({ error: { message: msg } }));
126
+ }
127
+ else {
128
+ console.error(`Error: ${msg}`);
129
+ }
130
+ process.exitCode = 1;
131
+ return;
132
+ }
133
+ try {
134
+ const client = await createClient(options.project);
135
+ const resolveData = {
136
+ status: options.status,
137
+ resolution: options.resolution,
138
+ resolved_by_task_id: options.resolvedTask,
139
+ };
140
+ let response;
141
+ if (isObjectNumber(idOrNumber)) {
142
+ response = (await client.resolveIssueByNumber(stripPrefix(idOrNumber), resolveData));
143
+ }
144
+ else {
145
+ response = (await client.resolveIssue(idOrNumber, resolveData));
146
+ }
147
+ if (options.json) {
148
+ console.log(formatOutput(response, true));
149
+ return;
150
+ }
151
+ printSuccess(`Issue ${response.data.display_number ?? `IS-${response.data.issue_number}`} marked as ${response.data.status}.`, false);
152
+ }
153
+ catch (error) {
154
+ printError(error, options.json);
155
+ process.exitCode = 1;
156
+ }
157
+ }
158
+ export async function issueStatusCommand(idOrNumber, status, options) {
159
+ if (!VALID_ISSUE_STATUSES.includes(status)) {
160
+ const msg = `Invalid status "${status}". Valid: ${VALID_ISSUE_STATUSES.join(', ')}`;
161
+ if (options.json) {
162
+ console.error(JSON.stringify({ error: { message: msg } }));
163
+ }
164
+ else {
165
+ console.error(`Error: ${msg}`);
166
+ }
167
+ process.exitCode = 1;
168
+ return;
169
+ }
170
+ if (RESOLVE_TYPE_STATUSES.includes(status) && status !== 'duplicate' && !options.resolution) {
171
+ const msg = `--resolution is required when status is "${status}"`;
172
+ if (options.json) {
173
+ console.error(JSON.stringify({ error: { message: msg } }));
174
+ }
175
+ else {
176
+ console.error(`Error: ${msg}`);
177
+ }
178
+ process.exitCode = 1;
179
+ return;
180
+ }
181
+ try {
182
+ const client = await createClient(options.project);
183
+ const statusData = { status };
184
+ if (options.resolution)
185
+ statusData.resolution = options.resolution;
186
+ if (options.resolvedTask)
187
+ statusData.resolved_task_id = options.resolvedTask;
188
+ let response;
189
+ if (isObjectNumber(idOrNumber)) {
190
+ response = (await client.updateIssueStatusByNumber(stripPrefix(idOrNumber), statusData));
191
+ }
192
+ else {
193
+ response = (await client.updateIssueStatus(idOrNumber, statusData));
194
+ }
195
+ if (options.json) {
196
+ console.log(formatOutput(response, true));
197
+ return;
198
+ }
199
+ printSuccess(`Issue ${response.data.display_number ?? `IS-${response.data.issue_number}`} status updated to "${response.data.status}".`, false);
200
+ }
201
+ catch (error) {
202
+ printError(error, options.json);
203
+ process.exitCode = 1;
204
+ }
205
+ }
206
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/commands/issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function logCommand(taskId: string, message: string, options: {
2
+ json: boolean;
3
+ project?: string;
4
+ type: string;
5
+ meta?: string;
6
+ }): Promise<void>;
@@ -0,0 +1,47 @@
1
+ import { createClient } from '../api-client.js';
2
+ import { formatOutput, printError, printSuccess } from '../output.js';
3
+ const VALID_LOG_TYPES = ['note', 'code_change', 'decision', 'blocker', 'discovery', 'exploration', 'fix'];
4
+ export async function logCommand(taskId, message, options) {
5
+ if (!VALID_LOG_TYPES.includes(options.type)) {
6
+ const msg = `Invalid log type "${options.type}". Valid: ${VALID_LOG_TYPES.join(', ')}`;
7
+ if (options.json) {
8
+ console.error(JSON.stringify({ error: { message: msg } }));
9
+ }
10
+ else {
11
+ console.error(`Error: ${msg}`);
12
+ }
13
+ process.exitCode = 1;
14
+ return;
15
+ }
16
+ let metadata;
17
+ if (options.meta) {
18
+ try {
19
+ metadata = JSON.parse(options.meta);
20
+ }
21
+ catch {
22
+ const msg = 'Invalid JSON in --meta option';
23
+ if (options.json) {
24
+ console.error(JSON.stringify({ error: { message: msg } }));
25
+ }
26
+ else {
27
+ console.error(`Error: ${msg}`);
28
+ }
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ }
33
+ try {
34
+ const client = await createClient(options.project);
35
+ const response = (await client.logWork(taskId, options.type, message, metadata));
36
+ if (options.json) {
37
+ console.log(formatOutput(response, true));
38
+ return;
39
+ }
40
+ printSuccess(`Logged ${response.data.type} on task ${taskId}.`, false);
41
+ }
42
+ catch (error) {
43
+ printError(error, options.json);
44
+ process.exitCode = 1;
45
+ }
46
+ }
47
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtE,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AAW1G,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,OAAe,EACf,OAAyE;IAEzE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,qBAAqB,OAAO,CAAC,IAAI,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,QAA6C,CAAC;IAClD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,GAAG,+BAA+B,CAAC;YAC5C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CACpC,MAAM,EACN,OAAO,CAAC,IAAI,EACZ,OAAO,EACP,QAAQ,CACT,CAAgB,CAAC;QAElB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,YAAY,CAAC,UAAU,QAAQ,CAAC,IAAI,CAAC,IAAI,YAAY,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function loginCommand(options?: {
2
+ profile?: string;
3
+ }): Promise<void>;
@@ -0,0 +1,48 @@
1
+ import { validateProfile, generatePKCE, buildAuthorizeUrl, startCallbackServer, openBrowser, exchangeCodeForTokens, saveCredentials, } from '../oauth.js';
2
+ export async function loginCommand(options = {}) {
3
+ let profile;
4
+ try {
5
+ profile = validateProfile(options.profile || 'full');
6
+ }
7
+ catch (error) {
8
+ console.error(error.message);
9
+ process.exitCode = 1;
10
+ return;
11
+ }
12
+ const { codeVerifier, codeChallenge } = generatePKCE();
13
+ const authorizeUrl = buildAuthorizeUrl(profile, codeChallenge);
14
+ // Start the callback server before opening the browser
15
+ const codePromise = startCallbackServer();
16
+ console.log('Opening browser for login...');
17
+ openBrowser(authorizeUrl);
18
+ console.log('Waiting for authorization callback...\n');
19
+ console.log(`If the browser didn't open, visit:\n${authorizeUrl}\n`);
20
+ let code;
21
+ try {
22
+ code = await codePromise;
23
+ }
24
+ catch (error) {
25
+ console.error(`Login failed: ${error.message}`);
26
+ process.exitCode = 1;
27
+ return;
28
+ }
29
+ console.log('Authorization received. Exchanging code for tokens...');
30
+ try {
31
+ const tokens = await exchangeCodeForTokens(code, codeVerifier);
32
+ await saveCredentials({
33
+ access_token: tokens.access_token,
34
+ refresh_token: tokens.refresh_token,
35
+ expires_at: Date.now() + tokens.expires_in * 1000,
36
+ scope: tokens.scope || `mcp:${profile}`,
37
+ profile,
38
+ });
39
+ console.log(`\nLogged in successfully! Profile: ${profile}`);
40
+ console.log('Credentials saved to ~/.orbitmap/credentials.json');
41
+ console.log('\nRun `orbitmap init --profile ' + profile + '` to generate your MCP config.');
42
+ }
43
+ catch (error) {
44
+ console.error(`Token exchange failed: ${error.message}`);
45
+ process.exitCode = 1;
46
+ }
47
+ }
48
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,qBAAqB,EACrB,eAAe,GAEhB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAgC,EAAE;IACnE,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC;IACvD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAE/D,uDAAuD;IACvD,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uCAAuC,YAAY,IAAI,CAAC,CAAC;IAErE,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,WAAW,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iBAAkB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAE/D,MAAM,eAAe,CAAC;YACpB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI;YACjD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,OAAO,EAAE;YACvC,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,iCAAiC,GAAG,OAAO,GAAG,gCAAgC,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function logoutCommand(): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { loadCredentials, deleteCredentials, revokeToken } from '../oauth.js';
2
+ export async function logoutCommand() {
3
+ const creds = await loadCredentials();
4
+ if (!creds) {
5
+ console.log('No OAuth credentials found. Already logged out.');
6
+ return;
7
+ }
8
+ console.log('Revoking tokens...');
9
+ await revokeToken(creds.refresh_token);
10
+ await deleteCredentials();
11
+ console.log('Logged out successfully. Credentials removed.');
12
+ }
13
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,MAAM,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAEvC,MAAM,iBAAiB,EAAE,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare function orbitItemsCommand(orbitIdOrSlug: string, options: {
2
+ json: boolean;
3
+ project?: string;
4
+ type?: string;
5
+ }): Promise<void>;
6
+ export declare function orbitAttachCommand(orbitIdOrSlug: string, options: {
7
+ json: boolean;
8
+ project?: string;
9
+ type: string;
10
+ id: string;
11
+ note?: string;
12
+ }): Promise<void>;
13
+ export declare function orbitDetachCommand(orbitIdOrSlug: string, options: {
14
+ json: boolean;
15
+ project?: string;
16
+ type: string;
17
+ id: string;
18
+ }): Promise<void>;