@parkercto/cli 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.
- package/dist/bin/parker.d.ts +3 -0
- package/dist/bin/parker.d.ts.map +1 -0
- package/dist/bin/parker.js +3 -0
- package/dist/bin/parker.js.map +1 -0
- package/dist/src/bin/parker.d.ts +3 -0
- package/dist/src/bin/parker.d.ts.map +1 -0
- package/dist/src/bin/parker.js +3 -0
- package/dist/src/bin/parker.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +36 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/client/api-client.d.ts +42 -0
- package/dist/src/client/api-client.d.ts.map +1 -0
- package/dist/src/client/api-client.js +73 -0
- package/dist/src/client/api-client.js.map +1 -0
- package/dist/src/client/auth.d.ts +12 -0
- package/dist/src/client/auth.d.ts.map +1 -0
- package/dist/src/client/auth.js +37 -0
- package/dist/src/client/auth.js.map +1 -0
- package/dist/src/commands/auth.d.ts +3 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +36 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/connect.d.ts +12 -0
- package/dist/src/commands/connect.d.ts.map +1 -0
- package/dist/src/commands/connect.js +158 -0
- package/dist/src/commands/connect.js.map +1 -0
- package/dist/src/commands/init.d.ts +3 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +130 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/join.d.ts +9 -0
- package/dist/src/commands/join.d.ts.map +1 -0
- package/dist/src/commands/join.js +77 -0
- package/dist/src/commands/join.js.map +1 -0
- package/dist/src/commands/update.d.ts +3 -0
- package/dist/src/commands/update.d.ts.map +1 -0
- package/dist/src/commands/update.js +36 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/constants.d.ts +15 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +17 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/lib/auto-update.d.ts +10 -0
- package/dist/src/lib/auto-update.d.ts.map +1 -0
- package/dist/src/lib/auto-update.js +93 -0
- package/dist/src/lib/auto-update.js.map +1 -0
- package/dist/src/lib/local-git.d.ts +8 -0
- package/dist/src/lib/local-git.d.ts.map +1 -0
- package/dist/src/lib/local-git.js +33 -0
- package/dist/src/lib/local-git.js.map +1 -0
- package/dist/src/lib/repo-config.d.ts +12 -0
- package/dist/src/lib/repo-config.d.ts.map +1 -0
- package/dist/src/lib/repo-config.js +36 -0
- package/dist/src/lib/repo-config.js.map +1 -0
- package/dist/src/render/help.d.ts +2 -0
- package/dist/src/render/help.d.ts.map +1 -0
- package/dist/src/render/help.js +21 -0
- package/dist/src/render/help.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parker.d.ts","sourceRoot":"","sources":["../../bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parker.js","sourceRoot":"","sources":["../../bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parker.d.ts","sourceRoot":"","sources":["../../../src/bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parker.js","sourceRoot":"","sources":["../../../src/bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { dirname, resolve } from "path";
|
|
6
|
+
import { initCommand } from "./commands/init.js";
|
|
7
|
+
import { authCommand } from "./commands/auth.js";
|
|
8
|
+
import { joinCommand } from "./commands/join.js";
|
|
9
|
+
import { connectCommand, disconnectCommand } from "./commands/connect.js";
|
|
10
|
+
import { updateCommand } from "./commands/update.js";
|
|
11
|
+
import { renderHelp } from "./render/help.js";
|
|
12
|
+
import { autoUpdateIfNeeded } from "./lib/auto-update.js";
|
|
13
|
+
// Auto-update: if a newer version is cached, install it and re-exec transparently.
|
|
14
|
+
// Checks the npm registry every 6 hours (via update-notifier's on-disk cache).
|
|
15
|
+
autoUpdateIfNeeded();
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../");
|
|
18
|
+
const packageJson = require(resolve(packageRoot, "package.json"));
|
|
19
|
+
const program = new Command()
|
|
20
|
+
.name("parker")
|
|
21
|
+
.description("Parker — Engineering team intelligence")
|
|
22
|
+
.version(packageJson.version);
|
|
23
|
+
// Add all commands
|
|
24
|
+
program.addCommand(initCommand);
|
|
25
|
+
program.addCommand(authCommand);
|
|
26
|
+
program.addCommand(joinCommand);
|
|
27
|
+
program.addCommand(connectCommand);
|
|
28
|
+
program.addCommand(disconnectCommand);
|
|
29
|
+
program.addCommand(updateCommand);
|
|
30
|
+
// Parse arguments
|
|
31
|
+
program.parse(process.argv);
|
|
32
|
+
// Show custom help menu if no command provided
|
|
33
|
+
if (!process.argv.slice(2).length) {
|
|
34
|
+
renderHelp(packageJson.version);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,mFAAmF;AACnF,+EAA+E;AAC/E,kBAAkB,EAAE,CAAC;AAErB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC/E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAC;AAE1C,mBAAmB;AACnB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,+CAA+C;AAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,UAAU,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface Team {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
teamCode: string;
|
|
5
|
+
createdAt?: string;
|
|
6
|
+
updatedAt?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ApiError extends Error {
|
|
9
|
+
status: number;
|
|
10
|
+
constructor(status: number, message: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class ParkerClient {
|
|
13
|
+
private baseUrl;
|
|
14
|
+
private token;
|
|
15
|
+
constructor(baseUrl: string, token: string);
|
|
16
|
+
private request;
|
|
17
|
+
joinTeam(teamCode: string): Promise<{
|
|
18
|
+
team: Team;
|
|
19
|
+
role: string;
|
|
20
|
+
}>;
|
|
21
|
+
getTeam(teamId: string): Promise<Team>;
|
|
22
|
+
verifyTeamCode(teamCode: string): Promise<{
|
|
23
|
+
name: string;
|
|
24
|
+
teamCode: string;
|
|
25
|
+
}>;
|
|
26
|
+
authDev(githubUsername: string): Promise<{
|
|
27
|
+
token: string;
|
|
28
|
+
user: {
|
|
29
|
+
id: string;
|
|
30
|
+
githubUsername: string;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
authGitHub(code: string): Promise<{
|
|
34
|
+
token: string;
|
|
35
|
+
user: {
|
|
36
|
+
id: string;
|
|
37
|
+
githubUsername: string;
|
|
38
|
+
};
|
|
39
|
+
}>;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../../src/client/api-client.ts"],"names":[],"mappings":"AACA,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,QAAS,SAAQ,KAAK;IAExB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBADL,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;YAGT,OAAO;IAsBf,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAU7E,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAezG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAczG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export class ApiError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
constructor(status, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.status = status;
|
|
6
|
+
this.name = "ApiError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class ParkerClient {
|
|
10
|
+
baseUrl;
|
|
11
|
+
token;
|
|
12
|
+
constructor(baseUrl, token) {
|
|
13
|
+
this.baseUrl = baseUrl;
|
|
14
|
+
this.token = token;
|
|
15
|
+
}
|
|
16
|
+
async request(method, path, body) {
|
|
17
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
18
|
+
method,
|
|
19
|
+
headers: {
|
|
20
|
+
"Authorization": `Bearer ${this.token}`,
|
|
21
|
+
"Content-Type": "application/json",
|
|
22
|
+
},
|
|
23
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
const error = await response.json().catch(() => ({}));
|
|
27
|
+
throw new ApiError(response.status, error.error?.message ?? response.statusText);
|
|
28
|
+
}
|
|
29
|
+
return response.json();
|
|
30
|
+
}
|
|
31
|
+
// Team endpoints
|
|
32
|
+
async joinTeam(teamCode) {
|
|
33
|
+
return this.request("POST", `/api/teams/join`, { teamCode });
|
|
34
|
+
}
|
|
35
|
+
async getTeam(teamId) {
|
|
36
|
+
return this.request("GET", `/api/teams/${teamId}`);
|
|
37
|
+
}
|
|
38
|
+
// Public endpoints (no auth required)
|
|
39
|
+
async verifyTeamCode(teamCode) {
|
|
40
|
+
const response = await fetch(`${this.baseUrl}/public/teams/verify?code=${encodeURIComponent(teamCode)}`);
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const error = await response.json().catch(() => ({}));
|
|
43
|
+
throw new ApiError(response.status, error.error?.message ?? response.statusText);
|
|
44
|
+
}
|
|
45
|
+
return response.json();
|
|
46
|
+
}
|
|
47
|
+
// Auth endpoints
|
|
48
|
+
async authDev(githubUsername) {
|
|
49
|
+
const response = await fetch(`${this.baseUrl}/auth/dev`, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: { "Content-Type": "application/json" },
|
|
52
|
+
body: JSON.stringify({ githubUsername }),
|
|
53
|
+
});
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
const error = await response.json().catch(() => ({}));
|
|
56
|
+
throw new ApiError(response.status, error.error?.message ?? response.statusText);
|
|
57
|
+
}
|
|
58
|
+
return response.json();
|
|
59
|
+
}
|
|
60
|
+
async authGitHub(code) {
|
|
61
|
+
const response = await fetch(`${this.baseUrl}/auth/github`, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: { "Content-Type": "application/json" },
|
|
64
|
+
body: JSON.stringify({ code }),
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const error = await response.json().catch(() => ({}));
|
|
68
|
+
throw new ApiError(response.status, error.error?.message ?? response.statusText);
|
|
69
|
+
}
|
|
70
|
+
return response.json();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../src/client/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AuthContext {
|
|
2
|
+
token: string;
|
|
3
|
+
userId: string;
|
|
4
|
+
githubUsername: string;
|
|
5
|
+
apiUrl: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function loadAuth(): Promise<AuthContext | null>;
|
|
8
|
+
export declare function saveAuth(ctx: AuthContext): Promise<void>;
|
|
9
|
+
export declare function clearAuth(): Promise<void>;
|
|
10
|
+
export declare function requireAuth(): Promise<AuthContext>;
|
|
11
|
+
export declare function getApiUrl(): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/client/auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAO5D;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAOxD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAEjD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { AUTH_FILE_PATH, DEFAULT_API_URL } from "../constants.js";
|
|
4
|
+
export async function loadAuth() {
|
|
5
|
+
try {
|
|
6
|
+
const data = await fs.readFile(AUTH_FILE_PATH, "utf-8");
|
|
7
|
+
return JSON.parse(data);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function saveAuth(ctx) {
|
|
14
|
+
const dir = path.dirname(AUTH_FILE_PATH);
|
|
15
|
+
await fs.mkdir(dir, { recursive: true });
|
|
16
|
+
await fs.writeFile(AUTH_FILE_PATH, JSON.stringify(ctx, null, 2));
|
|
17
|
+
}
|
|
18
|
+
export async function clearAuth() {
|
|
19
|
+
try {
|
|
20
|
+
await fs.unlink(AUTH_FILE_PATH);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// File doesn't exist, that's fine
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function requireAuth() {
|
|
27
|
+
const auth = await loadAuth();
|
|
28
|
+
if (!auth) {
|
|
29
|
+
console.error("Not authenticated. Run 'parker init' to get started.");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
return auth;
|
|
33
|
+
}
|
|
34
|
+
export async function getApiUrl() {
|
|
35
|
+
return process.env.PARKER_API_URL ?? DEFAULT_API_URL;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/client/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASlE,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAgB;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,eAAe,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SACiB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { loadAuth, clearAuth } from "../client/auth.js";
|
|
4
|
+
import { loadRepoConfig } from "../lib/repo-config.js";
|
|
5
|
+
export const authCommand = new Command("auth")
|
|
6
|
+
.description("Authentication commands");
|
|
7
|
+
authCommand
|
|
8
|
+
.command("logout")
|
|
9
|
+
.description("Logout from Parker")
|
|
10
|
+
.action(async () => {
|
|
11
|
+
await clearAuth();
|
|
12
|
+
console.log(chalk.green("✓ Logged out"));
|
|
13
|
+
});
|
|
14
|
+
authCommand
|
|
15
|
+
.command("status")
|
|
16
|
+
.description("Check authentication status")
|
|
17
|
+
.action(async () => {
|
|
18
|
+
const auth = await loadAuth();
|
|
19
|
+
if (!auth) {
|
|
20
|
+
console.log(chalk.yellow("Not authenticated"));
|
|
21
|
+
console.log(chalk.dim("Run 'parker init' to get started"));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(chalk.green("✓ Authenticated"));
|
|
25
|
+
console.log(` User: ${chalk.bold(auth.githubUsername)}`);
|
|
26
|
+
console.log(` API: ${auth.apiUrl}`);
|
|
27
|
+
const repoConfig = await loadRepoConfig();
|
|
28
|
+
if (repoConfig?.teamCode) {
|
|
29
|
+
console.log(` Team: ${chalk.bold(repoConfig.teamCode)}`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(chalk.yellow(" No team configured for this repo"));
|
|
33
|
+
console.log(chalk.dim(" Run 'parker join <code>' to join a team"));
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC,CAAC;AAE1C,WAAW;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Installs Parker skills into the project's .claude/skills/ directory.
|
|
4
|
+
*/
|
|
5
|
+
export declare function installClaudeIntegration(): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Removes Parker skills from the project's .claude/skills/ directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function uninstallClaudeIntegration(): Promise<void>;
|
|
10
|
+
export declare const connectCommand: Command;
|
|
11
|
+
export declare const disconnectCommand: Command;
|
|
12
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiEpC;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsD9D;AAED;;GAEG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BhE;AAED,eAAO,MAAM,cAAc,SAYvB,CAAC;AAEL,eAAO,MAAM,iBAAiB,SAY1B,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, rmSync } from "fs";
|
|
4
|
+
import { join, resolve, dirname } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { getGitRoot } from "../lib/local-git.js";
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
/** Path to the bundled skill templates relative to this file. */
|
|
10
|
+
function getSkillsTemplateDir() {
|
|
11
|
+
// In dev: packages/cli/src/commands/ → packages/cli/src/skills/
|
|
12
|
+
// In dist: packages/cli/dist/commands/ → packages/cli/src/skills/
|
|
13
|
+
const cliRoot = resolve(__dirname, "../..");
|
|
14
|
+
return join(cliRoot, "src", "skills");
|
|
15
|
+
}
|
|
16
|
+
/** Names of bundled skill directories to install. */
|
|
17
|
+
const BUNDLED_SKILLS = [
|
|
18
|
+
"prp",
|
|
19
|
+
];
|
|
20
|
+
const SUPPORTED_TARGETS = ["claude"];
|
|
21
|
+
function parseSkillFrontmatter(content) {
|
|
22
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
23
|
+
if (!frontmatterMatch) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const frontmatter = frontmatterMatch[1];
|
|
27
|
+
const name = frontmatter.match(/^name:\s*(.+)$/m)?.[1]?.trim() ?? "";
|
|
28
|
+
const description = frontmatter.match(/^description:\s*(.+)$/m)?.[1]?.trim() ?? "";
|
|
29
|
+
const argumentHint = frontmatter.match(/^argument-hint:\s*(.+)$/m)?.[1]?.trim();
|
|
30
|
+
if (!name || !description) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return { name, description, argumentHint };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Recursively copies a directory's contents from src to dest.
|
|
37
|
+
*/
|
|
38
|
+
function copyDirSync(src, dest) {
|
|
39
|
+
mkdirSync(dest, { recursive: true });
|
|
40
|
+
for (const entry of readdirSync(src, { withFileTypes: true })) {
|
|
41
|
+
const srcPath = join(src, entry.name);
|
|
42
|
+
const destPath = join(dest, entry.name);
|
|
43
|
+
if (entry.isDirectory()) {
|
|
44
|
+
copyDirSync(srcPath, destPath);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
writeFileSync(destPath, readFileSync(srcPath));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Installs Parker skills into the project's .claude/skills/ directory.
|
|
53
|
+
*/
|
|
54
|
+
export async function installClaudeIntegration() {
|
|
55
|
+
let projectRoot;
|
|
56
|
+
try {
|
|
57
|
+
projectRoot = await getGitRoot();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
console.error(chalk.red("Not in a git repository. Run this from your project root."));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
const templatesDir = getSkillsTemplateDir();
|
|
64
|
+
const skillsDir = join(projectRoot, ".claude", "skills");
|
|
65
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
66
|
+
let skillsInstalled = 0;
|
|
67
|
+
const installedSkills = [];
|
|
68
|
+
for (const skillName of BUNDLED_SKILLS) {
|
|
69
|
+
const srcDir = join(templatesDir, skillName);
|
|
70
|
+
const destDir = join(skillsDir, skillName);
|
|
71
|
+
if (!existsSync(srcDir)) {
|
|
72
|
+
console.warn(chalk.yellow(` Skill template not found: ${skillName} (skipped)`));
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
copyDirSync(srcDir, destDir);
|
|
76
|
+
skillsInstalled++;
|
|
77
|
+
console.log(chalk.green(` + .claude/skills/${skillName}/`));
|
|
78
|
+
const skillMdPath = join(srcDir, "SKILL.md");
|
|
79
|
+
if (existsSync(skillMdPath)) {
|
|
80
|
+
const meta = parseSkillFrontmatter(readFileSync(skillMdPath, "utf-8"));
|
|
81
|
+
if (meta) {
|
|
82
|
+
installedSkills.push(meta);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
console.log("");
|
|
87
|
+
console.log(chalk.bold("Parker connected to Claude Code."));
|
|
88
|
+
console.log(` ${skillsInstalled} skill(s) installed`);
|
|
89
|
+
if (installedSkills.length > 0) {
|
|
90
|
+
console.log("");
|
|
91
|
+
console.log(chalk.bold("Available skills:"));
|
|
92
|
+
for (const skill of installedSkills) {
|
|
93
|
+
const usage = skill.argumentHint
|
|
94
|
+
? `/${skill.name} ${skill.argumentHint}`
|
|
95
|
+
: `/${skill.name}`;
|
|
96
|
+
console.log(` ${chalk.cyan(usage)}`);
|
|
97
|
+
console.log(` ${chalk.dim(skill.description)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Removes Parker skills from the project's .claude/skills/ directory.
|
|
103
|
+
*/
|
|
104
|
+
export async function uninstallClaudeIntegration() {
|
|
105
|
+
let projectRoot;
|
|
106
|
+
try {
|
|
107
|
+
projectRoot = await getGitRoot();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
console.error(chalk.red("Not in a git repository. Run this from your project root."));
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
const skillsDir = join(projectRoot, ".claude", "skills");
|
|
114
|
+
let removed = 0;
|
|
115
|
+
for (const skillName of BUNDLED_SKILLS) {
|
|
116
|
+
const destDir = join(skillsDir, skillName);
|
|
117
|
+
if (existsSync(destDir)) {
|
|
118
|
+
rmSync(destDir, { recursive: true });
|
|
119
|
+
removed++;
|
|
120
|
+
console.log(chalk.red(` - .claude/skills/${skillName}/`));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (removed === 0) {
|
|
124
|
+
console.log(chalk.yellow("No Parker integration found to remove."));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log("");
|
|
128
|
+
console.log(chalk.bold("Parker disconnected from Claude Code."));
|
|
129
|
+
console.log(` ${removed} skill(s) removed`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export const connectCommand = new Command("connect")
|
|
133
|
+
.description("Connect Parker to an AI coding assistant")
|
|
134
|
+
.argument("<target>", `Target to connect: ${SUPPORTED_TARGETS.join(", ")}`)
|
|
135
|
+
.action(async (target) => {
|
|
136
|
+
switch (target) {
|
|
137
|
+
case "claude":
|
|
138
|
+
await installClaudeIntegration();
|
|
139
|
+
break;
|
|
140
|
+
default:
|
|
141
|
+
console.error(chalk.red(`Unknown target "${target}". Supported: ${SUPPORTED_TARGETS.join(", ")}`));
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
export const disconnectCommand = new Command("disconnect")
|
|
146
|
+
.description("Disconnect Parker from an AI coding assistant")
|
|
147
|
+
.argument("<target>", `Target to disconnect: ${SUPPORTED_TARGETS.join(", ")}`)
|
|
148
|
+
.action(async (target) => {
|
|
149
|
+
switch (target) {
|
|
150
|
+
case "claude":
|
|
151
|
+
await uninstallClaudeIntegration();
|
|
152
|
+
break;
|
|
153
|
+
default:
|
|
154
|
+
console.error(chalk.red(`Unknown target "${target}". Supported: ${SUPPORTED_TARGETS.join(", ")}`));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,SAoIpB,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import readline from "readline/promises";
|
|
4
|
+
import { ParkerClient } from "../client/api-client.js";
|
|
5
|
+
import { saveAuth, getApiUrl } from "../client/auth.js";
|
|
6
|
+
import { loadRepoConfig } from "../lib/repo-config.js";
|
|
7
|
+
import { OAUTH_CALLBACK_PORT } from "../constants.js";
|
|
8
|
+
import { joinTeamInteractive } from "./join.js";
|
|
9
|
+
import open from "open";
|
|
10
|
+
import http from "http";
|
|
11
|
+
import url from "url";
|
|
12
|
+
export const initCommand = new Command("init")
|
|
13
|
+
.description("Set up Parker — verify your team, authenticate, and join")
|
|
14
|
+
.option("--dev", "Use dev auth (no GitHub OAuth)")
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
const apiUrl = await getApiUrl();
|
|
17
|
+
const client = new ParkerClient(apiUrl, "");
|
|
18
|
+
// Step 1: Determine team code (auto-detect from repo config or prompt)
|
|
19
|
+
let teamCode;
|
|
20
|
+
const repoConfig = await loadRepoConfig();
|
|
21
|
+
if (repoConfig?.teamCode) {
|
|
22
|
+
teamCode = repoConfig.teamCode;
|
|
23
|
+
console.log(chalk.dim(`Found team code in .parker/config.json: ${teamCode}`));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const rl = readline.createInterface({
|
|
27
|
+
input: process.stdin,
|
|
28
|
+
output: process.stdout,
|
|
29
|
+
});
|
|
30
|
+
const answer = await rl.question("Team code: ");
|
|
31
|
+
rl.close();
|
|
32
|
+
if (!answer.trim()) {
|
|
33
|
+
console.error(chalk.red("Team code is required to get started."));
|
|
34
|
+
console.log(chalk.dim("Ask your team admin for the join code (e.g., XKCD-LAMP-FISH)"));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
teamCode = answer.trim();
|
|
38
|
+
}
|
|
39
|
+
// Step 2: Verify team code exists
|
|
40
|
+
let verifiedTeam;
|
|
41
|
+
try {
|
|
42
|
+
verifiedTeam = await client.verifyTeamCode(teamCode);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.status === 404) {
|
|
46
|
+
console.error(chalk.red("Team not found. Double-check the code and try again."));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error(chalk.red("Could not verify team:", error.message));
|
|
50
|
+
}
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.green(`✓ Found team "${verifiedTeam.name}"`));
|
|
54
|
+
console.log("");
|
|
55
|
+
// Step 3: Authenticate
|
|
56
|
+
if (options.dev) {
|
|
57
|
+
const rl = readline.createInterface({
|
|
58
|
+
input: process.stdin,
|
|
59
|
+
output: process.stdout,
|
|
60
|
+
});
|
|
61
|
+
const username = await rl.question("GitHub username: ");
|
|
62
|
+
rl.close();
|
|
63
|
+
try {
|
|
64
|
+
const result = await client.authDev(username);
|
|
65
|
+
const auth = {
|
|
66
|
+
token: result.token,
|
|
67
|
+
userId: result.user.id,
|
|
68
|
+
githubUsername: result.user.githubUsername,
|
|
69
|
+
apiUrl,
|
|
70
|
+
};
|
|
71
|
+
await saveAuth(auth);
|
|
72
|
+
console.log(chalk.green("✓ Logged in as " + result.user.githubUsername));
|
|
73
|
+
console.log("");
|
|
74
|
+
// Step 4: Join the verified team (writes .parker/config.json)
|
|
75
|
+
await joinTeamInteractive(auth, verifiedTeam.teamCode);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error(chalk.red("Login failed:", error.message));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// GitHub OAuth flow
|
|
84
|
+
console.log("Opening browser for GitHub authentication...");
|
|
85
|
+
const server = http.createServer();
|
|
86
|
+
const port = OAUTH_CALLBACK_PORT;
|
|
87
|
+
server.listen(port, () => {
|
|
88
|
+
const authUrl = `${apiUrl}/auth/github?cli_port=${port}`;
|
|
89
|
+
open(authUrl);
|
|
90
|
+
});
|
|
91
|
+
server.on("request", async (req, res) => {
|
|
92
|
+
const parsedUrl = url.parse(req.url, true);
|
|
93
|
+
if (parsedUrl.pathname === "/callback") {
|
|
94
|
+
const token = parsedUrl.query.token;
|
|
95
|
+
const userId = parsedUrl.query.user_id;
|
|
96
|
+
const username = parsedUrl.query.username;
|
|
97
|
+
if (token && userId && username) {
|
|
98
|
+
const auth = {
|
|
99
|
+
token,
|
|
100
|
+
userId,
|
|
101
|
+
githubUsername: username,
|
|
102
|
+
apiUrl,
|
|
103
|
+
};
|
|
104
|
+
await saveAuth(auth);
|
|
105
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
106
|
+
res.end("<html><body><h1>Success!</h1><p>You can close this window.</p></body></html>");
|
|
107
|
+
server.close();
|
|
108
|
+
console.log(chalk.green("✓ Logged in as " + username));
|
|
109
|
+
console.log("");
|
|
110
|
+
// Step 4: Join the verified team (writes .parker/config.json)
|
|
111
|
+
try {
|
|
112
|
+
await joinTeamInteractive(auth, verifiedTeam.teamCode);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error(chalk.red("Failed to join team:", error.message));
|
|
116
|
+
}
|
|
117
|
+
process.exit(0);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
121
|
+
res.end("<html><body><h1>Error</h1><p>Authentication failed — missing token.</p></body></html>");
|
|
122
|
+
console.error(chalk.red("Login failed: missing token in callback"));
|
|
123
|
+
server.close();
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type AuthContext } from "../client/auth.js";
|
|
3
|
+
/**
|
|
4
|
+
* Joins a team by code, writes repo config, and optionally connects to Claude Code.
|
|
5
|
+
* Shared between `parker join <code>` and the post-init interactive flow.
|
|
6
|
+
*/
|
|
7
|
+
export declare function joinTeamInteractive(auth: AuthContext, teamCode: string): Promise<void>;
|
|
8
|
+
export declare const joinCommand: Command;
|
|
9
|
+
//# sourceMappingURL=join.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../../src/commands/join.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIlE;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC5F;AAED,eAAO,MAAM,WAAW,SAgCpB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import readline from "readline/promises";
|
|
4
|
+
import { ParkerClient } from "../client/api-client.js";
|
|
5
|
+
import { requireAuth } from "../client/auth.js";
|
|
6
|
+
import { loadRepoConfig, saveRepoConfig } from "../lib/repo-config.js";
|
|
7
|
+
import { installClaudeIntegration } from "./connect.js";
|
|
8
|
+
/**
|
|
9
|
+
* Joins a team by code, writes repo config, and optionally connects to Claude Code.
|
|
10
|
+
* Shared between `parker join <code>` and the post-init interactive flow.
|
|
11
|
+
*/
|
|
12
|
+
export async function joinTeamInteractive(auth, teamCode) {
|
|
13
|
+
const client = new ParkerClient(auth.apiUrl, auth.token);
|
|
14
|
+
const result = await client.joinTeam(teamCode.toUpperCase());
|
|
15
|
+
await saveRepoConfig({ teamCode: result.team.teamCode });
|
|
16
|
+
console.log(chalk.green(`✓ Joined team "${result.team.name}" as ${result.role}`));
|
|
17
|
+
console.log(chalk.dim(`Team code: ${result.team.teamCode}`));
|
|
18
|
+
console.log("");
|
|
19
|
+
const rl = readline.createInterface({
|
|
20
|
+
input: process.stdin,
|
|
21
|
+
output: process.stdout,
|
|
22
|
+
});
|
|
23
|
+
console.log("Which AI coding assistant do you use?");
|
|
24
|
+
console.log(` ${chalk.bold("1.")} Claude Code`);
|
|
25
|
+
console.log(` ${chalk.dim("2.")} ${chalk.dim("More integrations coming soon")}`);
|
|
26
|
+
console.log(` ${chalk.bold("3.")} Skip`);
|
|
27
|
+
console.log("");
|
|
28
|
+
const answer = await rl.question("Choose (1-3): ");
|
|
29
|
+
rl.close();
|
|
30
|
+
switch (answer.trim()) {
|
|
31
|
+
case "1":
|
|
32
|
+
console.log("");
|
|
33
|
+
await installClaudeIntegration();
|
|
34
|
+
break;
|
|
35
|
+
case "2":
|
|
36
|
+
console.log(chalk.yellow("\nMore integrations are coming soon. Run 'parker connect' when they're available."));
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
console.log(chalk.dim("\nYou can connect later with 'parker connect claude'"));
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const joinCommand = new Command("join")
|
|
44
|
+
.description("Join a team")
|
|
45
|
+
.argument("[code]", "Team join code (e.g., XKCD-LAMP-FISH)")
|
|
46
|
+
.action(async (code) => {
|
|
47
|
+
const auth = await requireAuth();
|
|
48
|
+
let teamCode = code;
|
|
49
|
+
if (!teamCode) {
|
|
50
|
+
const repoConfig = await loadRepoConfig();
|
|
51
|
+
if (repoConfig?.teamCode) {
|
|
52
|
+
teamCode = repoConfig.teamCode;
|
|
53
|
+
console.log(chalk.dim(`Using team code from .parker/config.json: ${teamCode}`));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.error(chalk.red("No team code provided and no .parker/config.json found."));
|
|
57
|
+
console.log(chalk.dim("Usage: parker join <code>"));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await joinTeamInteractive(auth, teamCode);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error.status === 400) {
|
|
66
|
+
console.error(chalk.red("Invalid team code"));
|
|
67
|
+
}
|
|
68
|
+
else if (error.status === 404) {
|
|
69
|
+
console.error(chalk.red("Team not found"));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.error(chalk.red("Failed to join team:", error.message));
|
|
73
|
+
}
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=join.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.js","sourceRoot":"","sources":["../../../src/commands/join.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,aAAa,SAkCtB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { dirname, resolve } from "path";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import updateNotifier from "update-notifier";
|
|
8
|
+
import { PACKAGE_NAME } from "../constants.js";
|
|
9
|
+
export const updateCommand = new Command("update")
|
|
10
|
+
.description("Update the Parker CLI to the latest version")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
console.log(chalk.cyan("Checking for updates..."));
|
|
13
|
+
try {
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../../");
|
|
16
|
+
const packageJson = require(resolve(packageRoot, "package.json"));
|
|
17
|
+
// Force a fresh check (bypass cache) for manual updates.
|
|
18
|
+
const notifier = updateNotifier({ pkg: packageJson, updateCheckInterval: 0 });
|
|
19
|
+
await notifier.fetchInfo();
|
|
20
|
+
if (!notifier.update || notifier.update.latest === packageJson.version) {
|
|
21
|
+
console.log(chalk.green("Already on the latest version."));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const { current, latest } = notifier.update;
|
|
25
|
+
console.log(`Updating from ${chalk.dim(current)} → ${chalk.green(latest)}...`);
|
|
26
|
+
execSync(`npm install -g ${PACKAGE_NAME}@latest`, { stdio: "inherit" });
|
|
27
|
+
console.log(chalk.green("Successfully updated to the latest version."));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
31
|
+
console.error(chalk.red(`Update failed: ${message}`));
|
|
32
|
+
console.error(chalk.dim(`Try running: npm install -g ${PACKAGE_NAME}@latest`));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAG/D,CAAC;QAEF,yDAAyD;QACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;QAE3B,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/E,QAAQ,CAAC,kBAAkB,YAAY,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,YAAY,SAAS,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Production API endpoint. Override with PARKER_API_URL env var. */
|
|
2
|
+
export declare const DEFAULT_API_URL = "https://api.parkercto.com";
|
|
3
|
+
/** Directory for global Parker CLI config and auth storage (~/.parker/). */
|
|
4
|
+
export declare const PARKER_GLOBAL_DIR: string;
|
|
5
|
+
/** Path to the persisted auth context file (~/.parker/auth.json). */
|
|
6
|
+
export declare const AUTH_FILE_PATH: string;
|
|
7
|
+
/** Repo-level Parker config directory name. */
|
|
8
|
+
export declare const PARKER_REPO_DIR = ".parker";
|
|
9
|
+
/** Repo-level config file name within the .parker directory. */
|
|
10
|
+
export declare const PARKER_REPO_CONFIG_FILE = "config.json";
|
|
11
|
+
/** npm package name for the CLI. */
|
|
12
|
+
export declare const PACKAGE_NAME = "@parkercto/cli";
|
|
13
|
+
/** Local port used for the OAuth callback server during `parker init`. */
|
|
14
|
+
export declare const OAUTH_CALLBACK_PORT = 9999;
|
|
15
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAGA,qEAAqE;AACrE,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,QAAqC,CAAC;AAEpE,qEAAqE;AACrE,eAAO,MAAM,cAAc,QAA4C,CAAC;AAExE,+CAA+C;AAC/C,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AAErD,oCAAoC;AACpC,eAAO,MAAM,YAAY,mBAAmB,CAAC;AAE7C,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,OAAO,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import os from "os";
|
|
3
|
+
/** Production API endpoint. Override with PARKER_API_URL env var. */
|
|
4
|
+
export const DEFAULT_API_URL = "https://api.parkercto.com";
|
|
5
|
+
/** Directory for global Parker CLI config and auth storage (~/.parker/). */
|
|
6
|
+
export const PARKER_GLOBAL_DIR = path.join(os.homedir(), ".parker");
|
|
7
|
+
/** Path to the persisted auth context file (~/.parker/auth.json). */
|
|
8
|
+
export const AUTH_FILE_PATH = path.join(PARKER_GLOBAL_DIR, "auth.json");
|
|
9
|
+
/** Repo-level Parker config directory name. */
|
|
10
|
+
export const PARKER_REPO_DIR = ".parker";
|
|
11
|
+
/** Repo-level config file name within the .parker directory. */
|
|
12
|
+
export const PARKER_REPO_CONFIG_FILE = "config.json";
|
|
13
|
+
/** npm package name for the CLI. */
|
|
14
|
+
export const PACKAGE_NAME = "@parkercto/cli";
|
|
15
|
+
/** Local port used for the OAuth callback server during `parker init`. */
|
|
16
|
+
export const OAUTH_CALLBACK_PORT = 9999;
|
|
17
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAE3D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAEpE,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;AAExE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC,gEAAgE;AAChE,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAErD,oCAAoC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE7C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks for a newer CLI version and, if found, installs it and re-execs
|
|
3
|
+
* the current command transparently. Uses the update-notifier cache so this
|
|
4
|
+
* is a no-op most of the time (no network call unless the cache is stale).
|
|
5
|
+
*
|
|
6
|
+
* Call this before any command logic runs. It is safe to call unconditionally —
|
|
7
|
+
* it short-circuits immediately when running inside a re-exec.
|
|
8
|
+
*/
|
|
9
|
+
export declare function autoUpdateIfNeeded(): void;
|
|
10
|
+
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../../src/lib/auto-update.ts"],"names":[],"mappings":"AAuEA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAiCzC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { execSync, spawn } from "child_process";
|
|
2
|
+
import { createRequire } from "module";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { dirname, resolve } from "path";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import updateNotifier from "update-notifier";
|
|
7
|
+
import { PACKAGE_NAME } from "../constants.js";
|
|
8
|
+
/**
|
|
9
|
+
* Environment variable set during re-exec to prevent infinite update loops.
|
|
10
|
+
* When present, the CLI skips the auto-update check entirely.
|
|
11
|
+
*/
|
|
12
|
+
const REEXEC_ENV_VAR = "PARKER_SKIP_AUTO_UPDATE";
|
|
13
|
+
/** How often (in ms) to check the npm registry for a newer version. */
|
|
14
|
+
const UPDATE_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
15
|
+
function loadPackageJson() {
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../../");
|
|
18
|
+
return require(resolve(packageRoot, "package.json"));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Installs the latest version of the CLI globally via npm.
|
|
22
|
+
* Returns true if the install succeeded, false otherwise.
|
|
23
|
+
*/
|
|
24
|
+
function installLatestVersion(latestVersion) {
|
|
25
|
+
try {
|
|
26
|
+
console.error(chalk.cyan(`Updating ${PACKAGE_NAME} ${chalk.dim("→")} ${chalk.green(latestVersion)}...`));
|
|
27
|
+
execSync(`npm install -g ${PACKAGE_NAME}@latest`, {
|
|
28
|
+
stdio: ["ignore", "ignore", "inherit"],
|
|
29
|
+
});
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.error(chalk.yellow("Auto-update failed. Continuing with current version."));
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Re-executes the CLI with the same arguments using the newly installed version.
|
|
39
|
+
* This replaces the current process — it does not return on success.
|
|
40
|
+
*/
|
|
41
|
+
function reExecWithUpdatedBinary() {
|
|
42
|
+
const child = spawn(process.argv[0], process.argv.slice(1), {
|
|
43
|
+
stdio: "inherit",
|
|
44
|
+
env: { ...process.env, [REEXEC_ENV_VAR]: "1" },
|
|
45
|
+
});
|
|
46
|
+
child.on("exit", (code) => {
|
|
47
|
+
process.exit(code ?? 0);
|
|
48
|
+
});
|
|
49
|
+
child.on("error", () => {
|
|
50
|
+
process.exit(1);
|
|
51
|
+
});
|
|
52
|
+
// Keep the parent process alive until the child exits.
|
|
53
|
+
// The 'exit' handler above ensures we propagate the exit code.
|
|
54
|
+
// This unreachable throw satisfies the `never` return type.
|
|
55
|
+
throw new Error("unreachable");
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Checks for a newer CLI version and, if found, installs it and re-execs
|
|
59
|
+
* the current command transparently. Uses the update-notifier cache so this
|
|
60
|
+
* is a no-op most of the time (no network call unless the cache is stale).
|
|
61
|
+
*
|
|
62
|
+
* Call this before any command logic runs. It is safe to call unconditionally —
|
|
63
|
+
* it short-circuits immediately when running inside a re-exec.
|
|
64
|
+
*/
|
|
65
|
+
export function autoUpdateIfNeeded() {
|
|
66
|
+
// Prevent infinite re-exec loops.
|
|
67
|
+
if (process.env[REEXEC_ENV_VAR]) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Skip auto-update during local development (running via tsx).
|
|
71
|
+
if (process.argv[1]?.endsWith(".ts")) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const packageJson = loadPackageJson();
|
|
75
|
+
const notifier = updateNotifier({
|
|
76
|
+
pkg: packageJson,
|
|
77
|
+
updateCheckInterval: UPDATE_CHECK_INTERVAL_MS,
|
|
78
|
+
});
|
|
79
|
+
// update-notifier stores its last check result on disk. If the cached result
|
|
80
|
+
// indicates a newer version is available, act on it synchronously.
|
|
81
|
+
if (!notifier.update) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Don't "update" to the same or older version (can happen with stale cache).
|
|
85
|
+
if (notifier.update.latest === packageJson.version) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const installed = installLatestVersion(notifier.update.latest);
|
|
89
|
+
if (installed) {
|
|
90
|
+
reExecWithUpdatedBinary();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=auto-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../../src/lib/auto-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class GitError extends Error {
|
|
2
|
+
command: string;
|
|
3
|
+
exitCode: number;
|
|
4
|
+
constructor(command: string, exitCode: number, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function runGitLocal(...args: string[]): Promise<string>;
|
|
7
|
+
export declare function getGitRoot(): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=local-git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-git.d.ts","sourceRoot":"","sources":["../../../src/lib/local-git.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IAExB,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;gBADhB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAsB,WAAW,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAepE;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAMlD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { execFileSync } from "child_process";
|
|
2
|
+
export class GitError extends Error {
|
|
3
|
+
command;
|
|
4
|
+
exitCode;
|
|
5
|
+
constructor(command, exitCode, message) {
|
|
6
|
+
super(`Git command failed: ${command}\n${message}`);
|
|
7
|
+
this.command = command;
|
|
8
|
+
this.exitCode = exitCode;
|
|
9
|
+
this.name = "GitError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function runGitLocal(...args) {
|
|
13
|
+
try {
|
|
14
|
+
const result = execFileSync("git", args, {
|
|
15
|
+
encoding: "utf8",
|
|
16
|
+
cwd: process.cwd(),
|
|
17
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
18
|
+
});
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw new GitError(`git ${args.join(" ")}`, error.status || 1, error.stderr || error.message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function getGitRoot() {
|
|
26
|
+
try {
|
|
27
|
+
return (await runGitLocal("rev-parse", "--show-toplevel")).trim();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error("Not in a git repository");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=local-git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-git.js","sourceRoot":"","sources":["../../../src/lib/local-git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IACA;IAFT,YACS,OAAe,EACf,QAAgB,EACvB,OAAe;QAEf,KAAK,CAAC,uBAAuB,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;QAJ7C,YAAO,GAAP,OAAO,CAAQ;QACf,aAAQ,GAAR,QAAQ,CAAQ;QAIvB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAG,IAAc;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YACvC,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EACvB,KAAK,CAAC,MAAM,IAAI,CAAC,EACjB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAC9B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,WAAW,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface RepoConfig {
|
|
2
|
+
teamCode: string;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Loads the repo-level Parker config, or null if it doesn't exist.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadRepoConfig(): Promise<RepoConfig | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Saves the repo-level Parker config, creating .parker/ if needed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function saveRepoConfig(config: RepoConfig): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=repo-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config.d.ts","sourceRoot":"","sources":["../../../src/lib/repo-config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAWD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQjE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { PARKER_REPO_DIR, PARKER_REPO_CONFIG_FILE } from "../constants.js";
|
|
4
|
+
import { getGitRoot } from "./local-git.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns the path to the repo-level .parker/config.json.
|
|
7
|
+
* Throws if not in a git repository.
|
|
8
|
+
*/
|
|
9
|
+
async function getRepoConfigPath() {
|
|
10
|
+
const root = await getGitRoot();
|
|
11
|
+
return join(root, PARKER_REPO_DIR, PARKER_REPO_CONFIG_FILE);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Loads the repo-level Parker config, or null if it doesn't exist.
|
|
15
|
+
*/
|
|
16
|
+
export async function loadRepoConfig() {
|
|
17
|
+
try {
|
|
18
|
+
const configPath = await getRepoConfigPath();
|
|
19
|
+
const data = await fs.readFile(configPath, "utf-8");
|
|
20
|
+
return JSON.parse(data);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Saves the repo-level Parker config, creating .parker/ if needed.
|
|
28
|
+
*/
|
|
29
|
+
export async function saveRepoConfig(config) {
|
|
30
|
+
const root = await getGitRoot();
|
|
31
|
+
const parkerDir = join(root, PARKER_REPO_DIR);
|
|
32
|
+
await fs.mkdir(parkerDir, { recursive: true });
|
|
33
|
+
const configPath = join(parkerDir, PARKER_REPO_CONFIG_FILE);
|
|
34
|
+
await fs.writeFile(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=repo-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config.js","sourceRoot":"","sources":["../../../src/lib/repo-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAM5C;;;GAGG;AACH,KAAK,UAAU,iBAAiB;IAC9B,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB;IACrD,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/render/help.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAqBhD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export function renderHelp(version) {
|
|
3
|
+
const cmd = (name) => chalk.green(name);
|
|
4
|
+
const arg = (name) => chalk.yellow(name);
|
|
5
|
+
const dim = chalk.dim;
|
|
6
|
+
console.log("");
|
|
7
|
+
console.log(` ${chalk.bold("Parker")} ${dim(`v${version}`)} — Engineering team intelligence`);
|
|
8
|
+
console.log("");
|
|
9
|
+
// Getting Started
|
|
10
|
+
console.log(chalk.bold(" Getting Started"));
|
|
11
|
+
console.log(` ${cmd("parker init")} Set up Parker and authenticate`);
|
|
12
|
+
console.log(` ${cmd("parker join")} ${arg("<code>")} Join an existing team`);
|
|
13
|
+
console.log(` ${cmd("parker connect claude")} Connect to Claude Code`);
|
|
14
|
+
console.log("");
|
|
15
|
+
// Tips
|
|
16
|
+
console.log(dim(" Tips"));
|
|
17
|
+
console.log(dim(` Run ${chalk.reset("parker <command> --help")} for detailed options`));
|
|
18
|
+
console.log(dim(` Run ${chalk.reset("parker update")} to update to the latest version`));
|
|
19
|
+
console.log("");
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/render/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAEtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,kCAAkC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,oDAAoD,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,uBAAuB,CAAC,mCAAmC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;IACP,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@parkercto/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist",
|
|
7
|
+
"!dist/tsconfig.tsbuildinfo"
|
|
8
|
+
],
|
|
9
|
+
"bin": {
|
|
10
|
+
"parker": "./dist/bin/parker.js"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"chalk": "^5.4.0",
|
|
14
|
+
"commander": "^13.0.0",
|
|
15
|
+
"open": "^11.0.0",
|
|
16
|
+
"update-notifier": "^7.3.1"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^22.0.0",
|
|
20
|
+
"@types/update-notifier": "^6.0.8",
|
|
21
|
+
"tsx": "^4.19.0",
|
|
22
|
+
"typescript": "^5.7.0"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc",
|
|
26
|
+
"dev": "tsx src/cli.ts",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"clean": "rm -rf dist"
|
|
29
|
+
}
|
|
30
|
+
}
|