@padua/cli 1.13.1 → 2.0.1
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 +121 -6
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +85 -0
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/doctor/mcp-checks.d.ts +36 -0
- package/dist/commands/doctor/mcp-checks.d.ts.map +1 -0
- package/dist/commands/doctor/mcp-checks.js +235 -0
- package/dist/commands/doctor/mcp-checks.js.map +1 -0
- package/dist/commands/doctor/mcp-service-checks.d.ts +35 -0
- package/dist/commands/doctor/mcp-service-checks.d.ts.map +1 -0
- package/dist/commands/doctor/mcp-service-checks.js +146 -0
- package/dist/commands/doctor/mcp-service-checks.js.map +1 -0
- package/dist/commands/doctor/types.d.ts +4 -1
- package/dist/commands/doctor/types.d.ts.map +1 -1
- package/dist/commands/doctor/types.js +1 -0
- package/dist/commands/doctor/types.js.map +1 -1
- package/dist/commands/login/index.d.ts +1 -1
- package/dist/commands/login/index.d.ts.map +1 -1
- package/dist/commands/login/index.js +44 -185
- package/dist/commands/login/index.js.map +1 -1
- package/dist/commands/login/mcp-steps.d.ts +38 -0
- package/dist/commands/login/mcp-steps.d.ts.map +1 -0
- package/dist/commands/login/mcp-steps.js +176 -0
- package/dist/commands/login/mcp-steps.js.map +1 -0
- package/dist/commands/login/orchestrator.d.ts +9 -0
- package/dist/commands/login/orchestrator.d.ts.map +1 -0
- package/dist/commands/login/orchestrator.js +251 -0
- package/dist/commands/login/orchestrator.js.map +1 -0
- package/dist/commands/login/types.d.ts +11 -0
- package/dist/commands/login/types.d.ts.map +1 -1
- package/dist/commands/login/types.js.map +1 -1
- package/dist/commands/status/aws-checks.d.ts +14 -0
- package/dist/commands/status/aws-checks.d.ts.map +1 -0
- package/dist/commands/status/aws-checks.js +145 -0
- package/dist/commands/status/aws-checks.js.map +1 -0
- package/dist/commands/status/checks.d.ts +9 -25
- package/dist/commands/status/checks.d.ts.map +1 -1
- package/dist/commands/status/checks.js +52 -254
- package/dist/commands/status/checks.js.map +1 -1
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +53 -1
- package/dist/commands/status/index.js.map +1 -1
- package/dist/commands/status/mcp-checks.d.ts +35 -0
- package/dist/commands/status/mcp-checks.d.ts.map +1 -0
- package/dist/commands/status/mcp-checks.js +175 -0
- package/dist/commands/status/mcp-checks.js.map +1 -0
- package/dist/commands/status/types.d.ts +34 -0
- package/dist/commands/status/types.d.ts.map +1 -1
- package/dist/mcp/config/index.d.ts +4 -0
- package/dist/mcp/config/index.d.ts.map +1 -0
- package/dist/mcp/config/index.js +14 -0
- package/dist/mcp/config/index.js.map +1 -0
- package/dist/mcp/config/loaders.d.ts +45 -0
- package/dist/mcp/config/loaders.d.ts.map +1 -0
- package/dist/mcp/config/loaders.js +149 -0
- package/dist/mcp/config/loaders.js.map +1 -0
- package/dist/mcp/config/types.d.ts +234 -0
- package/dist/mcp/config/types.d.ts.map +1 -0
- package/dist/mcp/config/types.js +45 -0
- package/dist/mcp/config/types.js.map +1 -0
- package/dist/mcp/daemon/entry-logic.d.ts +28 -0
- package/dist/mcp/daemon/entry-logic.d.ts.map +1 -0
- package/dist/mcp/daemon/entry-logic.js +82 -0
- package/dist/mcp/daemon/entry-logic.js.map +1 -0
- package/dist/mcp/daemon/entry.d.ts +8 -0
- package/dist/mcp/daemon/entry.d.ts.map +1 -0
- package/dist/mcp/daemon/entry.js +34 -0
- package/dist/mcp/daemon/entry.js.map +1 -0
- package/dist/mcp/daemon/fork.d.ts +21 -0
- package/dist/mcp/daemon/fork.d.ts.map +1 -0
- package/dist/mcp/daemon/fork.js +188 -0
- package/dist/mcp/daemon/fork.js.map +1 -0
- package/dist/mcp/daemon/health.d.ts +8 -0
- package/dist/mcp/daemon/health.d.ts.map +1 -0
- package/dist/mcp/daemon/health.js +50 -0
- package/dist/mcp/daemon/health.js.map +1 -0
- package/dist/mcp/daemon/index.d.ts +6 -0
- package/dist/mcp/daemon/index.d.ts.map +1 -0
- package/dist/mcp/daemon/index.js +22 -0
- package/dist/mcp/daemon/index.js.map +1 -0
- package/dist/mcp/daemon/types.d.ts +63 -0
- package/dist/mcp/daemon/types.d.ts.map +1 -0
- package/dist/mcp/daemon/types.js +18 -0
- package/dist/mcp/daemon/types.js.map +1 -0
- package/dist/mcp/errors/index.d.ts +3 -0
- package/dist/mcp/errors/index.d.ts.map +1 -0
- package/dist/mcp/errors/index.js +13 -0
- package/dist/mcp/errors/index.js.map +1 -0
- package/dist/mcp/errors/types.d.ts +83 -0
- package/dist/mcp/errors/types.d.ts.map +1 -0
- package/dist/mcp/errors/types.js +148 -0
- package/dist/mcp/errors/types.js.map +1 -0
- package/dist/mcp/providers/atlassian/auth.d.ts +34 -0
- package/dist/mcp/providers/atlassian/auth.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/auth.js +107 -0
- package/dist/mcp/providers/atlassian/auth.js.map +1 -0
- package/dist/mcp/providers/atlassian/client.d.ts +15 -0
- package/dist/mcp/providers/atlassian/client.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/client.js +38 -0
- package/dist/mcp/providers/atlassian/client.js.map +1 -0
- package/dist/mcp/providers/atlassian/index.d.ts +6 -0
- package/dist/mcp/providers/atlassian/index.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/index.js +11 -0
- package/dist/mcp/providers/atlassian/index.js.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.d.ts +17 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.js +29 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.js.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.d.ts +43 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.js +101 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.js.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.d.ts +14 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.js +250 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.js.map +1 -0
- package/dist/mcp/providers/atlassian/provider.d.ts +38 -0
- package/dist/mcp/providers/atlassian/provider.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/provider.js +101 -0
- package/dist/mcp/providers/atlassian/provider.js.map +1 -0
- package/dist/mcp/providers/atlassian/resources.d.ts +4 -0
- package/dist/mcp/providers/atlassian/resources.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/resources.js +67 -0
- package/dist/mcp/providers/atlassian/resources.js.map +1 -0
- package/dist/mcp/providers/atlassian/tools/confluence.d.ts +4 -0
- package/dist/mcp/providers/atlassian/tools/confluence.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/tools/confluence.js +169 -0
- package/dist/mcp/providers/atlassian/tools/confluence.js.map +1 -0
- package/dist/mcp/providers/atlassian/tools/jira.d.ts +4 -0
- package/dist/mcp/providers/atlassian/tools/jira.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/tools/jira.js +274 -0
- package/dist/mcp/providers/atlassian/tools/jira.js.map +1 -0
- package/dist/mcp/providers/gitlab/auth.d.ts +10 -0
- package/dist/mcp/providers/gitlab/auth.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/auth.js +23 -0
- package/dist/mcp/providers/gitlab/auth.js.map +1 -0
- package/dist/mcp/providers/gitlab/client.d.ts +23 -0
- package/dist/mcp/providers/gitlab/client.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/client.js +17 -0
- package/dist/mcp/providers/gitlab/client.js.map +1 -0
- package/dist/mcp/providers/gitlab/index.d.ts +5 -0
- package/dist/mcp/providers/gitlab/index.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/index.js +10 -0
- package/dist/mcp/providers/gitlab/index.js.map +1 -0
- package/dist/mcp/providers/gitlab/provider.d.ts +25 -0
- package/dist/mcp/providers/gitlab/provider.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/provider.js +48 -0
- package/dist/mcp/providers/gitlab/provider.js.map +1 -0
- package/dist/mcp/providers/gitlab/resources.d.ts +11 -0
- package/dist/mcp/providers/gitlab/resources.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/resources.js +54 -0
- package/dist/mcp/providers/gitlab/resources.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/issues.d.ts +4 -0
- package/dist/mcp/providers/gitlab/tools/issues.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/issues.js +120 -0
- package/dist/mcp/providers/gitlab/tools/issues.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.d.ts +11 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.js +282 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.d.ts +10 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.js +173 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/repository.d.ts +4 -0
- package/dist/mcp/providers/gitlab/tools/repository.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/repository.js +191 -0
- package/dist/mcp/providers/gitlab/tools/repository.js.map +1 -0
- package/dist/mcp/providers/index.d.ts +4 -0
- package/dist/mcp/providers/index.d.ts.map +1 -0
- package/dist/mcp/providers/index.js +6 -0
- package/dist/mcp/providers/index.js.map +1 -0
- package/dist/mcp/providers/registry.d.ts +90 -0
- package/dist/mcp/providers/registry.d.ts.map +1 -0
- package/dist/mcp/providers/registry.js +128 -0
- package/dist/mcp/providers/registry.js.map +1 -0
- package/dist/mcp/providers/tool-helpers.d.ts +14 -0
- package/dist/mcp/providers/tool-helpers.d.ts.map +1 -0
- package/dist/mcp/providers/tool-helpers.js +12 -0
- package/dist/mcp/providers/tool-helpers.js.map +1 -0
- package/dist/mcp/providers/types.d.ts +80 -0
- package/dist/mcp/providers/types.d.ts.map +1 -0
- package/dist/mcp/providers/types.js +13 -0
- package/dist/mcp/providers/types.js.map +1 -0
- package/dist/mcp/server/auth.d.ts +8 -0
- package/dist/mcp/server/auth.d.ts.map +1 -0
- package/dist/mcp/server/auth.js +36 -0
- package/dist/mcp/server/auth.js.map +1 -0
- package/dist/mcp/server/health.d.ts +24 -0
- package/dist/mcp/server/health.d.ts.map +1 -0
- package/dist/mcp/server/health.js +37 -0
- package/dist/mcp/server/health.js.map +1 -0
- package/dist/mcp/server/index.d.ts +11 -0
- package/dist/mcp/server/index.d.ts.map +1 -0
- package/dist/mcp/server/index.js +27 -0
- package/dist/mcp/server/index.js.map +1 -0
- package/dist/mcp/server/logging.d.ts +46 -0
- package/dist/mcp/server/logging.d.ts.map +1 -0
- package/dist/mcp/server/logging.js +109 -0
- package/dist/mcp/server/logging.js.map +1 -0
- package/dist/mcp/server/ratelimit.d.ts +3 -0
- package/dist/mcp/server/ratelimit.d.ts.map +1 -0
- package/dist/mcp/server/ratelimit.js +70 -0
- package/dist/mcp/server/ratelimit.js.map +1 -0
- package/dist/mcp/server/routes.d.ts +3 -0
- package/dist/mcp/server/routes.d.ts.map +1 -0
- package/dist/mcp/server/routes.js +8 -0
- package/dist/mcp/server/routes.js.map +1 -0
- package/dist/mcp/server/server.d.ts +21 -0
- package/dist/mcp/server/server.d.ts.map +1 -0
- package/dist/mcp/server/server.js +114 -0
- package/dist/mcp/server/server.js.map +1 -0
- package/dist/mcp/server/validation.d.ts +22 -0
- package/dist/mcp/server/validation.d.ts.map +1 -0
- package/dist/mcp/server/validation.js +32 -0
- package/dist/mcp/server/validation.js.map +1 -0
- package/dist/mcp/store/encrypt.d.ts +22 -0
- package/dist/mcp/store/encrypt.d.ts.map +1 -0
- package/dist/mcp/store/encrypt.js +66 -0
- package/dist/mcp/store/encrypt.js.map +1 -0
- package/dist/mcp/store/index.d.ts +12 -0
- package/dist/mcp/store/index.d.ts.map +1 -0
- package/dist/mcp/store/index.js +16 -0
- package/dist/mcp/store/index.js.map +1 -0
- package/dist/mcp/store/migrate.d.ts +70 -0
- package/dist/mcp/store/migrate.d.ts.map +1 -0
- package/dist/mcp/store/migrate.js +211 -0
- package/dist/mcp/store/migrate.js.map +1 -0
- package/dist/mcp/store/null-token-store.d.ts +22 -0
- package/dist/mcp/store/null-token-store.d.ts.map +1 -0
- package/dist/mcp/store/null-token-store.js +40 -0
- package/dist/mcp/store/null-token-store.js.map +1 -0
- package/dist/mcp/store/sqlite.d.ts +27 -0
- package/dist/mcp/store/sqlite.d.ts.map +1 -0
- package/dist/mcp/store/sqlite.js +100 -0
- package/dist/mcp/store/sqlite.js.map +1 -0
- package/dist/mcp/store/types.d.ts +183 -0
- package/dist/mcp/store/types.d.ts.map +1 -0
- package/dist/mcp/store/types.js +13 -0
- package/dist/mcp/store/types.js.map +1 -0
- package/dist/mcp/token/http-client.d.ts +3 -0
- package/dist/mcp/token/http-client.d.ts.map +1 -0
- package/dist/mcp/token/http-client.js +186 -0
- package/dist/mcp/token/http-client.js.map +1 -0
- package/dist/mcp/token/index.d.ts +5 -0
- package/dist/mcp/token/index.d.ts.map +1 -0
- package/dist/mcp/token/index.js +15 -0
- package/dist/mcp/token/index.js.map +1 -0
- package/dist/mcp/token/manager.d.ts +54 -0
- package/dist/mcp/token/manager.d.ts.map +1 -0
- package/dist/mcp/token/manager.js +194 -0
- package/dist/mcp/token/manager.js.map +1 -0
- package/dist/mcp/token/null-token-manager.d.ts +19 -0
- package/dist/mcp/token/null-token-manager.d.ts.map +1 -0
- package/dist/mcp/token/null-token-manager.js +50 -0
- package/dist/mcp/token/null-token-manager.js.map +1 -0
- package/dist/mcp/token/oauth.d.ts +44 -0
- package/dist/mcp/token/oauth.d.ts.map +1 -0
- package/dist/mcp/token/oauth.js +257 -0
- package/dist/mcp/token/oauth.js.map +1 -0
- package/dist/mcp/token/types.d.ts +81 -0
- package/dist/mcp/token/types.d.ts.map +1 -0
- package/dist/mcp/token/types.js +6 -0
- package/dist/mcp/token/types.js.map +1 -0
- package/package.json +10 -3
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP service diagnostic checks for the doctor command.
|
|
4
|
+
*
|
|
5
|
+
* Covers: MCP daemon health, GitLab API token, and Atlassian API token.
|
|
6
|
+
*
|
|
7
|
+
* All checks are read-only and non-destructive. Each returns a DoctorCheck
|
|
8
|
+
* and must never throw — errors are caught and surfaced as fail/warn results.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.checkMcpDaemon = checkMcpDaemon;
|
|
12
|
+
exports.checkGitLabApi = checkGitLabApi;
|
|
13
|
+
exports.checkAtlassianApi = checkAtlassianApi;
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// 6. checkMcpDaemon
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Check if the MCP daemon is running and healthy.
|
|
19
|
+
* Reads the PID/auth file via the fork module, then calls the /health endpoint.
|
|
20
|
+
*/
|
|
21
|
+
async function checkMcpDaemon() {
|
|
22
|
+
try {
|
|
23
|
+
// Dynamic require for testability
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
25
|
+
const { readExistingDaemon } = require('../../mcp/daemon/fork');
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
27
|
+
const { checkHealth } = require('../../mcp/daemon/health');
|
|
28
|
+
const daemon = readExistingDaemon();
|
|
29
|
+
if (!daemon) {
|
|
30
|
+
return {
|
|
31
|
+
name: 'MCP daemon',
|
|
32
|
+
status: 'fail',
|
|
33
|
+
message: 'MCP daemon not running',
|
|
34
|
+
suggestion: "Run 'padua login' to start the MCP server",
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const health = await checkHealth(daemon.port).catch(() => null);
|
|
38
|
+
if (!health || !health.healthy) {
|
|
39
|
+
return {
|
|
40
|
+
name: 'MCP daemon',
|
|
41
|
+
status: 'warn',
|
|
42
|
+
message: `MCP daemon running but unhealthy (PID ${daemon.pid})`,
|
|
43
|
+
suggestion: "Run 'padua login' to restart the MCP server",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
name: 'MCP daemon',
|
|
48
|
+
status: 'pass',
|
|
49
|
+
message: `MCP daemon running (PID ${daemon.pid}, http://127.0.0.1:${daemon.port}/mcp)`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {
|
|
54
|
+
name: 'MCP daemon',
|
|
55
|
+
status: 'fail',
|
|
56
|
+
message: 'MCP daemon status unknown — error reading daemon state',
|
|
57
|
+
suggestion: "Run 'padua login' to start the MCP server",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// 7. checkGitLabApi
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Check if the stored GitLab token exists and is not expired.
|
|
66
|
+
* Accepts a TokenInfo (or null) so the caller can inject token data from
|
|
67
|
+
* the store without this function needing to open the database directly.
|
|
68
|
+
*/
|
|
69
|
+
function checkGitLabApi(token) {
|
|
70
|
+
if (!token) {
|
|
71
|
+
return {
|
|
72
|
+
name: 'GitLab API token',
|
|
73
|
+
status: 'fail',
|
|
74
|
+
message: 'GitLab not configured',
|
|
75
|
+
suggestion: "Run 'padua login' to authenticate GitLab",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
79
|
+
if (token.expiresAt <= nowSeconds) {
|
|
80
|
+
return {
|
|
81
|
+
name: 'GitLab API token',
|
|
82
|
+
status: 'warn',
|
|
83
|
+
message: 'GitLab token expired',
|
|
84
|
+
suggestion: "Run 'padua login' to authenticate GitLab",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const remaining = formatDuration(token.expiresAt - nowSeconds);
|
|
88
|
+
return {
|
|
89
|
+
name: 'GitLab API token',
|
|
90
|
+
status: 'pass',
|
|
91
|
+
message: `GitLab token valid (expires in ${remaining})`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// 8. checkAtlassianApi
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
/**
|
|
98
|
+
* Check if the stored Atlassian token exists and is not expired.
|
|
99
|
+
* Accepts a TokenInfo (or null) so the caller can inject token data from
|
|
100
|
+
* the store without this function needing to open the database directly.
|
|
101
|
+
*/
|
|
102
|
+
function checkAtlassianApi(token) {
|
|
103
|
+
if (!token) {
|
|
104
|
+
return {
|
|
105
|
+
name: 'Atlassian API token',
|
|
106
|
+
status: 'fail',
|
|
107
|
+
message: 'Atlassian not configured',
|
|
108
|
+
suggestion: "Run 'padua login' to authenticate Atlassian",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
112
|
+
if (token.expiresAt <= nowSeconds) {
|
|
113
|
+
return {
|
|
114
|
+
name: 'Atlassian API token',
|
|
115
|
+
status: 'warn',
|
|
116
|
+
message: 'Atlassian token expired',
|
|
117
|
+
suggestion: "Run 'padua login' to authenticate Atlassian",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const remaining = formatDuration(token.expiresAt - nowSeconds);
|
|
121
|
+
return {
|
|
122
|
+
name: 'Atlassian API token',
|
|
123
|
+
status: 'pass',
|
|
124
|
+
message: `Atlassian token valid (expires in ${remaining})`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Private helpers
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
/**
|
|
131
|
+
* Format a duration in seconds as a human-readable string.
|
|
132
|
+
* Examples: "1h 40m", "52m", "30s"
|
|
133
|
+
*/
|
|
134
|
+
function formatDuration(seconds) {
|
|
135
|
+
const h = Math.floor(seconds / 3600);
|
|
136
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
137
|
+
const s = seconds % 60;
|
|
138
|
+
if (h > 0) {
|
|
139
|
+
return m > 0 ? `${h}h ${m}m` : `${h}h`;
|
|
140
|
+
}
|
|
141
|
+
if (m > 0) {
|
|
142
|
+
return s > 0 ? `${m}m ${s}s` : `${m}m`;
|
|
143
|
+
}
|
|
144
|
+
return `${s}s`;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=mcp-service-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-service-checks.js","sourceRoot":"","sources":["../../../src/commands/doctor/mcp-service-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@ export interface DoctorOptions {
|
|
|
41
41
|
verbose?: boolean;
|
|
42
42
|
/** Disable colored output */
|
|
43
43
|
noColor?: boolean;
|
|
44
|
+
/** Migrate tokens from the legacy padua-mcp Go database */
|
|
45
|
+
migrateTokens?: boolean;
|
|
44
46
|
}
|
|
45
47
|
/**
|
|
46
48
|
* Category grouping for checks
|
|
@@ -50,6 +52,7 @@ export declare enum CheckCategory {
|
|
|
50
52
|
PROFILE = "Profile Validation",
|
|
51
53
|
PREREQUISITES = "Prerequisites",
|
|
52
54
|
AUTHENTICATION = "Authentication",
|
|
53
|
-
INSTALLATION = "Installation"
|
|
55
|
+
INSTALLATION = "Installation",
|
|
56
|
+
MCP = "MCP Diagnostics"
|
|
54
57
|
}
|
|
55
58
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,MAAM,sBAAsB;IAC5B,OAAO,uBAAuB;IAC9B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;IAC7B,GAAG,oBAAoB;CACxB"}
|
|
@@ -14,5 +14,6 @@ var CheckCategory;
|
|
|
14
14
|
CheckCategory["PREREQUISITES"] = "Prerequisites";
|
|
15
15
|
CheckCategory["AUTHENTICATION"] = "Authentication";
|
|
16
16
|
CheckCategory["INSTALLATION"] = "Installation";
|
|
17
|
+
CheckCategory["MCP"] = "MCP Diagnostics";
|
|
17
18
|
})(CheckCategory || (exports.CheckCategory = CheckCategory = {}));
|
|
18
19
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiDH;;GAEG;AACH,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,6CAA4B,CAAA;IAC5B,+CAA8B,CAAA;IAC9B,gDAA+B,CAAA;IAC/B,kDAAiC,CAAA;IACjC,8CAA6B,CAAA;IAC7B,wCAAuB,CAAA;AACzB,CAAC,EAPW,aAAa,6BAAb,aAAa,QAOxB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
/**
|
|
3
|
-
* Main login command
|
|
3
|
+
* Main login command — authenticates to AWS SSO, CodeArtifact, ECR, and MCP services
|
|
4
4
|
*/
|
|
5
5
|
export declare const loginCommand: Command;
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,eAAO,MAAM,YAAY,SASH,CAAC"}
|
|
@@ -8,11 +8,10 @@ const commander_1 = require("commander");
|
|
|
8
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
9
9
|
const config_1 = require("./config");
|
|
10
10
|
const sso_1 = require("./sso");
|
|
11
|
-
const codeartifact_1 = require("./codeartifact");
|
|
12
|
-
const ecr_1 = require("./ecr");
|
|
13
11
|
const types_1 = require("./types");
|
|
12
|
+
const orchestrator_1 = require("./orchestrator");
|
|
14
13
|
/**
|
|
15
|
-
* Main login command
|
|
14
|
+
* Main login command — authenticates to AWS SSO, CodeArtifact, ECR, and MCP services
|
|
16
15
|
*/
|
|
17
16
|
exports.loginCommand = new commander_1.Command('login')
|
|
18
17
|
.description('Authenticate to AWS SSO, CodeArtifact (npm), and ECR (Docker)')
|
|
@@ -24,210 +23,70 @@ exports.loginCommand = new commander_1.Command('login')
|
|
|
24
23
|
.option('-q, --quiet', 'Suppress non-error output')
|
|
25
24
|
.option('-v, --verbose', 'Show detailed output')
|
|
26
25
|
.action(handleLogin);
|
|
27
|
-
/**
|
|
28
|
-
* Handle the login command execution
|
|
29
|
-
*/
|
|
30
26
|
async function handleLogin(options) {
|
|
31
27
|
const noColor = options.noColor ?? false;
|
|
32
|
-
// Handle --list-profiles flag
|
|
33
28
|
if (options.listProfiles) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (!noColor) {
|
|
37
|
-
console.log(chalk_1.default.yellow('No AWS SSO profiles found.'));
|
|
38
|
-
console.log(chalk_1.default.gray('Run: padua init'));
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
console.log('No AWS SSO profiles found.');
|
|
42
|
-
console.log('Run: padua init');
|
|
43
|
-
}
|
|
44
|
-
process.exit(1);
|
|
45
|
-
}
|
|
46
|
-
if (!noColor) {
|
|
47
|
-
console.log(chalk_1.default.cyan.bold('Available AWS SSO profiles:'));
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
console.log('Available AWS SSO profiles:');
|
|
51
|
-
}
|
|
52
|
-
profiles.forEach(p => console.log(` ${p}`));
|
|
53
|
-
process.exit(0);
|
|
29
|
+
printProfiles(noColor);
|
|
30
|
+
return;
|
|
54
31
|
}
|
|
55
32
|
const config = await (0, config_1.loadConfig)();
|
|
56
33
|
const profile = (0, types_1.getEffectiveProfile)(options, config ?? undefined);
|
|
57
|
-
// Validate profile exists before attempting login
|
|
58
34
|
if (!(0, sso_1.profileExists)(profile)) {
|
|
59
|
-
|
|
35
|
+
printProfileNotFound(profile, noColor);
|
|
36
|
+
process.exit(2);
|
|
37
|
+
}
|
|
38
|
+
const { result, exitCode } = await (0, orchestrator_1.runLoginFlow)(options, config, profile);
|
|
39
|
+
(0, orchestrator_1.reportResults)(result, options);
|
|
40
|
+
process.exit(exitCode);
|
|
41
|
+
}
|
|
42
|
+
function printProfiles(noColor) {
|
|
43
|
+
const profiles = (0, sso_1.listSSOProfiles)();
|
|
44
|
+
if (profiles.length === 0) {
|
|
60
45
|
if (!noColor) {
|
|
61
|
-
console.
|
|
62
|
-
|
|
63
|
-
else {
|
|
64
|
-
console.error(`Profile '${profile}' not found in ~/.aws/config`);
|
|
65
|
-
}
|
|
66
|
-
console.error('');
|
|
67
|
-
if (available.length > 0) {
|
|
68
|
-
if (!noColor) {
|
|
69
|
-
console.error(chalk_1.default.cyan('Available profiles:'));
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
console.error('Available profiles:');
|
|
73
|
-
}
|
|
74
|
-
available.slice(0, 10).forEach(p => console.error(` ${p}`));
|
|
75
|
-
if (available.length > 10) {
|
|
76
|
-
console.error(` ... and ${available.length - 10} more`);
|
|
77
|
-
}
|
|
78
|
-
console.error('');
|
|
79
|
-
console.error(`Use: padua login -p <profile>`);
|
|
80
|
-
console.error(`Or update ~/.padua/padua.config.json with a valid defaultProfile`);
|
|
46
|
+
console.log(chalk_1.default.yellow('No AWS SSO profiles found.'));
|
|
47
|
+
console.log(chalk_1.default.gray('Run: padua init'));
|
|
81
48
|
}
|
|
82
49
|
else {
|
|
83
|
-
console.
|
|
50
|
+
console.log('No AWS SSO profiles found.');
|
|
51
|
+
console.log('Run: padua init');
|
|
84
52
|
}
|
|
85
|
-
process.exit(
|
|
86
|
-
}
|
|
87
|
-
const result = {
|
|
88
|
-
sso: { success: false, skipped: false, duration: 0 },
|
|
89
|
-
codeartifact: { success: false, skipped: false, duration: 0 },
|
|
90
|
-
ecr: { success: false, skipped: false, duration: 0 },
|
|
91
|
-
};
|
|
92
|
-
// Step 1: SSO Authentication (REQUIRED)
|
|
93
|
-
if (!options.quiet) {
|
|
94
|
-
console.log(chalk_1.default.blue(`[1/3] AWS SSO ...`));
|
|
95
|
-
}
|
|
96
|
-
const ssoStart = Date.now();
|
|
97
|
-
try {
|
|
98
|
-
result.sso = await (0, sso_1.authenticateSSO)(profile, options);
|
|
99
|
-
result.sso.duration = Date.now() - ssoStart;
|
|
100
|
-
if (!options.quiet) {
|
|
101
|
-
console.log(chalk_1.default.green(` ✓ authenticated (profile: ${profile})`));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
result.sso = {
|
|
106
|
-
success: false,
|
|
107
|
-
skipped: false,
|
|
108
|
-
error: error.message,
|
|
109
|
-
duration: Date.now() - ssoStart,
|
|
110
|
-
};
|
|
111
|
-
// SSO failed - skip remaining services
|
|
112
|
-
result.codeartifact = { success: false, skipped: true, duration: 0 };
|
|
113
|
-
result.ecr = { success: false, skipped: true, duration: 0 };
|
|
114
|
-
reportResults(result, options);
|
|
115
|
-
process.exit(2); // Exit code 2 = SSO failure
|
|
53
|
+
process.exit(1);
|
|
116
54
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
result.codeartifact = { success: false, skipped: true, duration: 0 };
|
|
120
|
-
result.ecr = { success: false, skipped: true, duration: 0 };
|
|
121
|
-
reportResults(result, options);
|
|
122
|
-
process.exit(0);
|
|
123
|
-
}
|
|
124
|
-
// Step 2: CodeArtifact (npm) - depends on SSO
|
|
125
|
-
if (!options.quiet) {
|
|
126
|
-
console.log(chalk_1.default.blue(`[2/3] CodeArtifact (npm) ...`));
|
|
127
|
-
}
|
|
128
|
-
if (config && (0, types_1.hasCodeArtifactConfig)(config)) {
|
|
129
|
-
const caStart = Date.now();
|
|
130
|
-
try {
|
|
131
|
-
result.codeartifact = await (0, codeartifact_1.configureCodeArtifact)(config.codeartifact, profile, options, config);
|
|
132
|
-
result.codeartifact.duration = Date.now() - caStart;
|
|
133
|
-
if (!options.quiet) {
|
|
134
|
-
console.log(chalk_1.default.green(` ✓ configured`));
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
result.codeartifact = {
|
|
139
|
-
success: false,
|
|
140
|
-
skipped: false,
|
|
141
|
-
error: error.message,
|
|
142
|
-
duration: Date.now() - caStart,
|
|
143
|
-
};
|
|
144
|
-
if (!options.quiet) {
|
|
145
|
-
console.log(chalk_1.default.yellow(` ⚠ failed: ${error.message}`));
|
|
146
|
-
}
|
|
147
|
-
}
|
|
55
|
+
if (!noColor) {
|
|
56
|
+
console.log(chalk_1.default.cyan.bold('Available AWS SSO profiles:'));
|
|
148
57
|
}
|
|
149
58
|
else {
|
|
150
|
-
|
|
151
|
-
if (!options.quiet) {
|
|
152
|
-
console.log(chalk_1.default.gray(` ○ skipped (not configured)`));
|
|
153
|
-
}
|
|
59
|
+
console.log('Available AWS SSO profiles:');
|
|
154
60
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
result.ecr = await (0, ecr_1.configureECR)(config.ecr, profile, options);
|
|
163
|
-
result.ecr.duration = Date.now() - ecrStart;
|
|
164
|
-
if (!options.quiet) {
|
|
165
|
-
console.log(chalk_1.default.green(` ✓ configured`));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
result.ecr = {
|
|
170
|
-
success: false,
|
|
171
|
-
skipped: false,
|
|
172
|
-
error: error.message,
|
|
173
|
-
duration: Date.now() - ecrStart,
|
|
174
|
-
};
|
|
175
|
-
if (!options.quiet) {
|
|
176
|
-
console.log(chalk_1.default.yellow(` ⚠ failed: ${error.message}`));
|
|
177
|
-
}
|
|
178
|
-
}
|
|
61
|
+
profiles.forEach(p => console.log(` ${p}`));
|
|
62
|
+
process.exit(0);
|
|
63
|
+
}
|
|
64
|
+
function printProfileNotFound(profile, noColor) {
|
|
65
|
+
const available = (0, sso_1.listSSOProfiles)();
|
|
66
|
+
if (!noColor) {
|
|
67
|
+
console.error(chalk_1.default.red(`Profile '${profile}' not found in ~/.aws/config`));
|
|
179
68
|
}
|
|
180
69
|
else {
|
|
181
|
-
|
|
182
|
-
if (!options.quiet) {
|
|
183
|
-
console.log(chalk_1.default.gray(` ○ skipped (not configured)`));
|
|
184
|
-
}
|
|
70
|
+
console.error(`Profile '${profile}' not found in ~/.aws/config`);
|
|
185
71
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const caOk = result.codeartifact.success || result.codeartifact.skipped;
|
|
191
|
-
const ecrOk = result.ecr.success || result.ecr.skipped;
|
|
192
|
-
const postSsoSuccess = caOk || ecrOk;
|
|
193
|
-
process.exit(postSsoSuccess ? 0 : 1);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Report login results to console
|
|
197
|
-
*/
|
|
198
|
-
function reportResults(result, options) {
|
|
199
|
-
if (options.quiet)
|
|
200
|
-
return;
|
|
201
|
-
console.log('');
|
|
202
|
-
console.log('=== Login Results ===');
|
|
203
|
-
const services = [
|
|
204
|
-
{ name: 'SSO', result: result.sso },
|
|
205
|
-
{ name: 'CodeArtifact', result: result.codeartifact },
|
|
206
|
-
{ name: 'ECR', result: result.ecr },
|
|
207
|
-
];
|
|
208
|
-
let successCount = 0;
|
|
209
|
-
let skippedCount = 0;
|
|
210
|
-
for (const service of services) {
|
|
211
|
-
let status;
|
|
212
|
-
if (service.result.skipped) {
|
|
213
|
-
status = chalk_1.default.gray('○ SKIPPED');
|
|
214
|
-
skippedCount++;
|
|
215
|
-
}
|
|
216
|
-
else if (service.result.success) {
|
|
217
|
-
status = chalk_1.default.green('✓ OK');
|
|
218
|
-
successCount++;
|
|
72
|
+
console.error('');
|
|
73
|
+
if (available.length > 0) {
|
|
74
|
+
if (!noColor) {
|
|
75
|
+
console.error(chalk_1.default.cyan('Available profiles:'));
|
|
219
76
|
}
|
|
220
77
|
else {
|
|
221
|
-
|
|
78
|
+
console.error('Available profiles:');
|
|
222
79
|
}
|
|
223
|
-
|
|
224
|
-
if (
|
|
225
|
-
console.
|
|
80
|
+
available.slice(0, 10).forEach(p => console.error(` ${p}`));
|
|
81
|
+
if (available.length > 10) {
|
|
82
|
+
console.error(` ... and ${available.length - 10} more`);
|
|
226
83
|
}
|
|
84
|
+
console.error('');
|
|
85
|
+
console.error(`Use: padua login -p <profile>`);
|
|
86
|
+
console.error(`Or update ~/.padua/padua.config.json with a valid defaultProfile`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.error('No SSO profiles found. Run: padua init');
|
|
227
90
|
}
|
|
228
|
-
const total = services.length - skippedCount;
|
|
229
|
-
console.log('');
|
|
230
|
-
console.log(`Total: ${successCount}/${total} services authenticated`);
|
|
231
|
-
console.log('');
|
|
232
91
|
}
|
|
233
92
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,qCAAsC;AACtC,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,qCAAsC;AACtC,+BAAuD;AACvD,mCAA4D;AAC5D,iDAA6D;AAE7D;;GAEG;AACU,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;KACxD,MAAM,CAAC,YAAY,EAAE,qDAAqD,CAAC;KAC3E,MAAM,CAAC,SAAS,EAAE,wEAAwE,CAAC;KAC3F,MAAM,CAAC,iBAAiB,EAAE,0CAA0C,CAAC;KACrE,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,KAAK,UAAU,WAAW,CAAC,OAAqB;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEzC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAU,GAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAA,2BAAmB,EAAC,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;IAElE,IAAI,CAAC,IAAA,mBAAa,EAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,2BAAY,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1E,IAAA,4BAAa,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB;IACrC,MAAM,QAAQ,GAAG,IAAA,qBAAe,GAAE,CAAC;IAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe,EAAE,OAAgB;IAC7D,MAAM,SAAS,GAAG,IAAA,qBAAe,GAAE,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,OAAO,8BAA8B,CAAC,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,8BAA8B,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACvC,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,aAAa,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACpF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ServiceResult } from './types';
|
|
2
|
+
import type { GitLabProviderConfig, AtlassianProviderConfig, McpLocalConfig } from '../../mcp/config/types';
|
|
3
|
+
import type { TokenStore } from '../../mcp/store/types';
|
|
4
|
+
/**
|
|
5
|
+
* Download the MCP providers config from S3 to ~/.padua/mcp-providers.json.
|
|
6
|
+
*
|
|
7
|
+
* Non-blocking: callers must not fail the overall login flow on error.
|
|
8
|
+
*/
|
|
9
|
+
export declare function downloadProvidersConfig(profile: string): Promise<ServiceResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Authenticate to GitLab using the PKCE OAuth flow.
|
|
12
|
+
*
|
|
13
|
+
* Strategy: if a valid token already exists in the store, return immediately.
|
|
14
|
+
* Otherwise run the full PKCE flow via OAuthTokenManager.authenticate().
|
|
15
|
+
* The OAuthTokenManager handles token refresh internally via ensureFresh().
|
|
16
|
+
*
|
|
17
|
+
* Non-blocking: callers must not fail the overall login flow on error.
|
|
18
|
+
*/
|
|
19
|
+
export declare function authenticateGitLab(config: GitLabProviderConfig, tokenStore?: TokenStore): Promise<ServiceResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Authenticate to Atlassian using the confidential client OAuth flow.
|
|
22
|
+
*
|
|
23
|
+
* Strategy: if a valid token already exists in the store, return immediately.
|
|
24
|
+
* Otherwise run the full OAuth flow via OAuthTokenManager.authenticate().
|
|
25
|
+
*
|
|
26
|
+
* Non-blocking: callers must not fail the overall login flow on error.
|
|
27
|
+
*/
|
|
28
|
+
export declare function authenticateAtlassian(config: AtlassianProviderConfig, tokenStore?: TokenStore): Promise<ServiceResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Ensure the MCP daemon is running and healthy.
|
|
31
|
+
* - If a healthy daemon is already running, return immediately.
|
|
32
|
+
* - If an unhealthy daemon is running, stop it and start a fresh one.
|
|
33
|
+
* - If no daemon is running, fork a new one.
|
|
34
|
+
*
|
|
35
|
+
* Non-blocking: callers must not fail the overall login flow on error.
|
|
36
|
+
*/
|
|
37
|
+
export declare function ensureMcpDaemon(mcpConfig?: McpLocalConfig): Promise<ServiceResult>;
|
|
38
|
+
//# sourceMappingURL=mcp-steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-steps.d.ts","sourceRoot":"","sources":["../../../src/commands/login/mcp-steps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWxD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6CrF;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,oBAAoB,EAC5B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,aAAa,CAAC,CAyBxB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,uBAAuB,EAC/B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,aAAa,CAAC,CAyBxB;AAMD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAyBxF"}
|