create-hq 10.1.0 → 10.7.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/admin-onboarding.d.ts +42 -0
- package/dist/admin-onboarding.d.ts.map +1 -0
- package/dist/admin-onboarding.js +445 -0
- package/dist/admin-onboarding.js.map +1 -0
- package/dist/auth.d.ts +60 -23
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +219 -116
- package/dist/auth.js.map +1 -1
- package/dist/company-template.d.ts +34 -0
- package/dist/company-template.d.ts.map +1 -0
- package/dist/company-template.js +142 -0
- package/dist/company-template.js.map +1 -0
- package/dist/deps.d.ts +2 -0
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +42 -30
- package/dist/deps.js.map +1 -1
- package/dist/fetch-template.d.ts +2 -2
- package/dist/fetch-template.d.ts.map +1 -1
- package/dist/fetch-template.js +54 -38
- package/dist/fetch-template.js.map +1 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +28 -4
- package/dist/git.js.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/invite-command.d.ts +10 -0
- package/dist/invite-command.d.ts.map +1 -0
- package/dist/invite-command.js +110 -0
- package/dist/invite-command.js.map +1 -0
- package/dist/invite.d.ts +91 -0
- package/dist/invite.d.ts.map +1 -0
- package/dist/invite.js +230 -0
- package/dist/invite.js.map +1 -0
- package/dist/join-flow.d.ts +32 -0
- package/dist/join-flow.d.ts.map +1 -0
- package/dist/join-flow.js +194 -0
- package/dist/join-flow.js.map +1 -0
- package/dist/platform.d.ts +2 -2
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +14 -1
- package/dist/platform.js.map +1 -1
- package/dist/scaffold.d.ts +4 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +152 -41
- package/dist/scaffold.js.map +1 -1
- package/dist/team-setup.d.ts +58 -0
- package/dist/team-setup.d.ts.map +1 -0
- package/dist/team-setup.js +237 -0
- package/dist/team-setup.js.map +1 -0
- package/dist/teams-flow.d.ts +36 -0
- package/dist/teams-flow.d.ts.map +1 -0
- package/dist/teams-flow.js +134 -0
- package/dist/teams-flow.js.map +1 -0
- package/dist/ui.d.ts +17 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +35 -0
- package/dist/ui.js.map +1 -1
- package/package.json +49 -49
package/dist/scaffold.d.ts
CHANGED
|
@@ -2,9 +2,12 @@ interface ScaffoldOptions {
|
|
|
2
2
|
skipDeps?: boolean;
|
|
3
3
|
skipCli?: boolean;
|
|
4
4
|
skipSync?: boolean;
|
|
5
|
+
skipPackages?: boolean;
|
|
5
6
|
tag?: string;
|
|
6
7
|
localTemplate?: string;
|
|
8
|
+
join?: string;
|
|
9
|
+
invite?: string;
|
|
7
10
|
}
|
|
8
|
-
export declare function scaffold(directory: string, options: ScaffoldOptions): Promise<void>;
|
|
11
|
+
export declare function scaffold(directory: string | undefined, options: ScaffoldOptions): Promise<void>;
|
|
9
12
|
export {};
|
|
10
13
|
//# sourceMappingURL=scaffold.d.ts.map
|
package/dist/scaffold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AA0BA,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoDD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAwPf"}
|
package/dist/scaffold.js
CHANGED
|
@@ -2,12 +2,14 @@ import * as path from "path";
|
|
|
2
2
|
import fs from "fs-extra";
|
|
3
3
|
import { createInterface } from "readline";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
|
-
import
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import { banner, success, warn, info, nextSteps, stepStatus, teamOrientation, } from "./ui.js";
|
|
6
7
|
import { checkDeps } from "./deps.js";
|
|
7
8
|
import { initGit, hasGit } from "./git.js";
|
|
8
9
|
import { execSync } from "child_process";
|
|
9
10
|
import { fetchTemplate } from "./fetch-template.js";
|
|
10
11
|
import { detectExistingSync } from "./cloud-sync.js";
|
|
12
|
+
import { runTeamsFlow, authenticate } from "./teams-flow.js";
|
|
11
13
|
const require = createRequire(import.meta.url);
|
|
12
14
|
const pkg = require("../package.json");
|
|
13
15
|
async function prompt(question, defaultVal) {
|
|
@@ -27,15 +29,61 @@ async function confirm(question, defaultYes = true) {
|
|
|
27
29
|
return defaultYes;
|
|
28
30
|
return answer.toLowerCase().startsWith("y");
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Cascading entry-mode selection:
|
|
34
|
+
* 1. HQ Teams account? yes → teams-existing
|
|
35
|
+
* 2. Create one? yes → teams-new
|
|
36
|
+
* 3. Personal HQ instead? yes → personal
|
|
37
|
+
* no → exit
|
|
38
|
+
*/
|
|
39
|
+
async function chooseEntryMode() {
|
|
40
|
+
console.log();
|
|
41
|
+
const hasTeamsAccount = await confirm(`${chalk.bold("Do you have an HQ Teams account?")}`, false);
|
|
42
|
+
if (hasTeamsAccount)
|
|
43
|
+
return "teams-existing";
|
|
44
|
+
const wantsTeam = await confirm(`${chalk.bold("Would you like to create an HQ Teams account?")}`, true);
|
|
45
|
+
if (wantsTeam)
|
|
46
|
+
return "teams-new";
|
|
47
|
+
const wantsPersonal = await confirm(`${chalk.bold("Set up a personal HQ instead?")}`, true);
|
|
48
|
+
if (wantsPersonal)
|
|
49
|
+
return "personal";
|
|
50
|
+
return "exit";
|
|
51
|
+
}
|
|
30
52
|
export async function scaffold(directory, options) {
|
|
31
|
-
// Show banner with installer version; hqVersion will be added after template fetch
|
|
32
53
|
banner(pkg.version);
|
|
33
|
-
// 1.
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
54
|
+
// 1. Entry mode — if --invite or --join is provided, force teams-existing
|
|
55
|
+
const inviteToken = options.invite || options.join;
|
|
56
|
+
const mode = inviteToken ? "teams-existing" : await chooseEntryMode();
|
|
57
|
+
if (mode === "exit") {
|
|
58
|
+
console.log();
|
|
59
|
+
info("No problem — come back any time with: npx create-hq");
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
// 2. Authenticate immediately if teams (pure HTTP — no local deps needed)
|
|
63
|
+
let teamsAuth = null;
|
|
64
|
+
if (mode === "teams-existing" || mode === "teams-new") {
|
|
65
|
+
teamsAuth = await authenticate();
|
|
66
|
+
if (!teamsAuth) {
|
|
67
|
+
console.log();
|
|
68
|
+
warn("GitHub sign-in is required for HQ Teams.");
|
|
69
|
+
const fallback = await confirm("Set up a personal HQ instead?", true);
|
|
70
|
+
if (!fallback) {
|
|
71
|
+
info("No problem — come back any time with: npx create-hq");
|
|
72
|
+
process.exit(0);
|
|
73
|
+
}
|
|
74
|
+
// Fall through to personal mode
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 3. Resolve target directory (prompt if not provided)
|
|
78
|
+
let dir = directory;
|
|
79
|
+
if (!dir) {
|
|
80
|
+
console.log();
|
|
81
|
+
dir = await prompt("Where should HQ be installed?", "hq");
|
|
82
|
+
}
|
|
83
|
+
const targetDir = path.resolve(dir);
|
|
84
|
+
const displayDir = dir.startsWith("/")
|
|
85
|
+
? dir
|
|
37
86
|
: path.relative(process.cwd(), targetDir) || ".";
|
|
38
|
-
// Check if directory already exists
|
|
39
87
|
if (fs.existsSync(targetDir)) {
|
|
40
88
|
const contents = fs.readdirSync(targetDir);
|
|
41
89
|
if (contents.length > 0) {
|
|
@@ -46,7 +94,17 @@ export async function scaffold(directory, options) {
|
|
|
46
94
|
}
|
|
47
95
|
}
|
|
48
96
|
}
|
|
49
|
-
//
|
|
97
|
+
// 4. Dependency check (no spinner — checkDeps is interactive with prompts)
|
|
98
|
+
if (!options.skipDeps) {
|
|
99
|
+
const { allRequired } = await checkDeps();
|
|
100
|
+
if (!allRequired) {
|
|
101
|
+
console.log();
|
|
102
|
+
warn("Required dependencies are missing — cannot continue.");
|
|
103
|
+
info("Install the missing dependencies above, then run create-hq again.");
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// 4. Fetch core HQ template (every user gets this — personal or team)
|
|
50
108
|
let hqVersion = "";
|
|
51
109
|
if (options.localTemplate) {
|
|
52
110
|
const localLabel = "Copying local HQ template...";
|
|
@@ -95,26 +153,30 @@ export async function scaffold(directory, options) {
|
|
|
95
153
|
throw err;
|
|
96
154
|
}
|
|
97
155
|
}
|
|
98
|
-
//
|
|
156
|
+
// 5. Git init the root HQ (no remote — root HQ is always local-only)
|
|
99
157
|
const gitLabel = "Initializing git repository";
|
|
100
158
|
stepStatus(gitLabel, "running");
|
|
101
159
|
if (hasGit()) {
|
|
102
|
-
|
|
103
|
-
|
|
160
|
+
try {
|
|
161
|
+
initGit(targetDir);
|
|
162
|
+
stepStatus(gitLabel, "done");
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
stepStatus(gitLabel, "failed");
|
|
166
|
+
warn(`git init failed (non-fatal): ${err.message}`);
|
|
167
|
+
}
|
|
104
168
|
}
|
|
105
169
|
else {
|
|
106
170
|
stepStatus(gitLabel, "failed");
|
|
107
171
|
warn("git not found — skipping git init");
|
|
108
172
|
}
|
|
109
|
-
//
|
|
173
|
+
// 6. Governance bootstrap — checksums + integrity verification
|
|
110
174
|
const integrityLabel = "Verifying kernel integrity";
|
|
111
175
|
stepStatus(integrityLabel, "running");
|
|
112
176
|
try {
|
|
113
177
|
const computeChecksumsScript = path.join(targetDir, "scripts", "compute-checksums.sh");
|
|
114
178
|
const coreIntegrityScript = path.join(targetDir, "scripts", "core-integrity.sh");
|
|
115
|
-
|
|
116
|
-
const hasCoreIntegrity = fs.existsSync(coreIntegrityScript);
|
|
117
|
-
if (hasComputeChecksums && hasCoreIntegrity) {
|
|
179
|
+
if (fs.existsSync(computeChecksumsScript) && fs.existsSync(coreIntegrityScript)) {
|
|
118
180
|
execSync("bash scripts/compute-checksums.sh", { cwd: targetDir, stdio: "pipe" });
|
|
119
181
|
try {
|
|
120
182
|
execSync("bash scripts/core-integrity.sh", { cwd: targetDir, stdio: "pipe" });
|
|
@@ -126,42 +188,56 @@ export async function scaffold(directory, options) {
|
|
|
126
188
|
}
|
|
127
189
|
}
|
|
128
190
|
else {
|
|
129
|
-
// Scripts not present in this template version — skip silently
|
|
130
191
|
stepStatus(integrityLabel, "done");
|
|
131
192
|
}
|
|
132
193
|
}
|
|
133
194
|
catch {
|
|
134
195
|
stepStatus(integrityLabel, "failed");
|
|
135
|
-
// governance bootstrap should never abort the scaffold
|
|
136
|
-
}
|
|
137
|
-
// 5. Check dependencies
|
|
138
|
-
const depsLabel = "Checking dependencies";
|
|
139
|
-
if (!options.skipDeps) {
|
|
140
|
-
// No spinner here — checkDeps uses interactive readline prompts.
|
|
141
|
-
// An ora spinner would overwrite the prompt line, making it look stuck.
|
|
142
|
-
step(depsLabel);
|
|
143
|
-
await checkDeps();
|
|
144
|
-
success(depsLabel);
|
|
145
196
|
}
|
|
146
|
-
|
|
147
|
-
stepStatus(depsLabel, "running");
|
|
148
|
-
stepStatus(depsLabel, "done");
|
|
149
|
-
}
|
|
150
|
-
// 6. Smart cloud sync detection
|
|
197
|
+
// 7. Cloud sync detection
|
|
151
198
|
const alreadySynced = await detectExistingSync(targetDir);
|
|
152
199
|
if (alreadySynced) {
|
|
153
200
|
success("Cloud sync already configured — skipping setup");
|
|
154
201
|
}
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (
|
|
160
|
-
|
|
161
|
-
|
|
202
|
+
// 8. Teams flow (only if auth succeeded earlier)
|
|
203
|
+
let teamsResult = null;
|
|
204
|
+
if (teamsAuth && (mode === "teams-existing" || mode === "teams-new")) {
|
|
205
|
+
teamsResult = await runTeamsFlow(mode === "teams-existing" ? "existing" : "new", targetDir, hqVersion, teamsAuth, inviteToken);
|
|
206
|
+
if (!teamsResult) {
|
|
207
|
+
console.log();
|
|
208
|
+
warn("Team setup did not complete — your personal HQ is still set up correctly.");
|
|
162
209
|
}
|
|
163
210
|
}
|
|
164
|
-
//
|
|
211
|
+
// 9. Optional: install hq-cli globally (disabled for now)
|
|
212
|
+
// if (!options.skipCli) {
|
|
213
|
+
// console.log();
|
|
214
|
+
// const installCli = await confirm(
|
|
215
|
+
// "Install @indigoai-us/hq-cli globally for module management?"
|
|
216
|
+
// );
|
|
217
|
+
// if (installCli) {
|
|
218
|
+
// const cliLabel = "Installing @indigoai-us/hq-cli";
|
|
219
|
+
// stepStatus(cliLabel, "running");
|
|
220
|
+
// try {
|
|
221
|
+
// execSync("npm install -g @indigoai-us/hq-cli", { stdio: "pipe" });
|
|
222
|
+
// stepStatus(cliLabel, "done");
|
|
223
|
+
// } catch {
|
|
224
|
+
// stepStatus(cliLabel, "failed");
|
|
225
|
+
// warn("Failed to install @indigoai-us/hq-cli — install manually with: npm install -g @indigoai-us/hq-cli");
|
|
226
|
+
// }
|
|
227
|
+
// }
|
|
228
|
+
// }
|
|
229
|
+
// 10. Cloud sync setup (disabled for now)
|
|
230
|
+
// if (!options.skipSync && !alreadySynced) {
|
|
231
|
+
// console.log();
|
|
232
|
+
// const setupSync = await confirm(
|
|
233
|
+
// "Set up cloud sync? (enables mobile access via hq.indigoai.com)"
|
|
234
|
+
// );
|
|
235
|
+
// if (setupSync) {
|
|
236
|
+
// step("Cloud sync setup will be available after running /setup in Claude Code");
|
|
237
|
+
// step("Run: hq sync init");
|
|
238
|
+
// }
|
|
239
|
+
// }
|
|
240
|
+
// 11. qmd index
|
|
165
241
|
try {
|
|
166
242
|
execSync("qmd index .", { cwd: targetDir, stdio: "pipe" });
|
|
167
243
|
success("Indexed HQ for search");
|
|
@@ -169,7 +245,42 @@ export async function scaffold(directory, options) {
|
|
|
169
245
|
catch {
|
|
170
246
|
// qmd not installed, skip silently — already warned in deps check
|
|
171
247
|
}
|
|
172
|
-
//
|
|
173
|
-
|
|
248
|
+
// 12. Orientation
|
|
249
|
+
console.log();
|
|
250
|
+
if (teamsResult?.admin) {
|
|
251
|
+
teamOrientation({
|
|
252
|
+
mode: "admin",
|
|
253
|
+
displayDir,
|
|
254
|
+
teamName: teamsResult.admin.team.team_name,
|
|
255
|
+
teamSlug: teamsResult.admin.team.team_slug,
|
|
256
|
+
orgLogin: teamsResult.admin.team.org_login,
|
|
257
|
+
repoUrl: teamsResult.admin.repoHtmlUrl,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
else if (teamsResult?.joinedByInvite) {
|
|
261
|
+
teamOrientation({
|
|
262
|
+
mode: "member",
|
|
263
|
+
displayDir,
|
|
264
|
+
teams: [{
|
|
265
|
+
name: teamsResult.joinedByInvite.teamName,
|
|
266
|
+
slug: teamsResult.joinedByInvite.slug,
|
|
267
|
+
repoUrl: teamsResult.joinedByInvite.repoUrl,
|
|
268
|
+
}],
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else if (teamsResult?.member && teamsResult.member.joined.length > 0) {
|
|
272
|
+
teamOrientation({
|
|
273
|
+
mode: "member",
|
|
274
|
+
displayDir,
|
|
275
|
+
teams: teamsResult.member.joined.map((t) => ({
|
|
276
|
+
name: t.name,
|
|
277
|
+
slug: t.slug,
|
|
278
|
+
repoUrl: t.repoHtmlUrl,
|
|
279
|
+
})),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
nextSteps(displayDir);
|
|
284
|
+
}
|
|
174
285
|
}
|
|
175
286
|
//# sourceMappingURL=scaffold.js.map
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Member team discovery + clone flow.
|
|
3
|
+
*
|
|
4
|
+
* For users who already have access to one or more HQ team repos via the
|
|
5
|
+
* hq-team-sync GitHub App, enumerate their installations, find the {org}/hq
|
|
6
|
+
* repo for each, present a checklist, and clone the selected repos into
|
|
7
|
+
* companies/{slug}/.
|
|
8
|
+
*
|
|
9
|
+
* No backend involved — all data comes from api.github.com using the user's
|
|
10
|
+
* GitHub App user token.
|
|
11
|
+
*/
|
|
12
|
+
import { type GitHubAuth } from "./auth.js";
|
|
13
|
+
export interface DiscoveredTeam {
|
|
14
|
+
/** Org login (used as companies/{slug}/ directory name) */
|
|
15
|
+
slug: string;
|
|
16
|
+
/** Display name (defaults to org login). */
|
|
17
|
+
name: string;
|
|
18
|
+
/** GitHub HTML URL for the team repo. */
|
|
19
|
+
repoHtmlUrl: string;
|
|
20
|
+
/** HTTPS clone URL. */
|
|
21
|
+
cloneUrl: string;
|
|
22
|
+
/** GitHub installation ID for the App on this org. */
|
|
23
|
+
installationId: number;
|
|
24
|
+
}
|
|
25
|
+
export interface MemberJoinResult {
|
|
26
|
+
joined: DiscoveredTeam[];
|
|
27
|
+
skipped: DiscoveredTeam[];
|
|
28
|
+
failed: {
|
|
29
|
+
team: DiscoveredTeam;
|
|
30
|
+
error: string;
|
|
31
|
+
}[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Enumerate the user's HQ team memberships by walking their App installations.
|
|
35
|
+
* Returns one DiscoveredTeam per hq-* repo found across all installed orgs.
|
|
36
|
+
*/
|
|
37
|
+
export declare function discoverTeams(auth: GitHubAuth): Promise<DiscoveredTeam[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Present discovered teams as a numbered list with all pre-selected, and
|
|
40
|
+
* let the user deselect any they want to skip.
|
|
41
|
+
*
|
|
42
|
+
* Input format:
|
|
43
|
+
* - empty / "all" → keep all
|
|
44
|
+
* - "none" → skip all
|
|
45
|
+
* - "1,3" → deselect entries 1 and 3
|
|
46
|
+
*/
|
|
47
|
+
export declare function selectTeams(teams: DiscoveredTeam[]): Promise<{
|
|
48
|
+
selected: DiscoveredTeam[];
|
|
49
|
+
skipped: DiscoveredTeam[];
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Discover, select, and clone team repos for an authenticated member.
|
|
53
|
+
*
|
|
54
|
+
* Returns a result with joined / skipped / failed lists. Returns null if
|
|
55
|
+
* the user has no HQ teams at all (caller can route to admin onboarding).
|
|
56
|
+
*/
|
|
57
|
+
export declare function runMemberJoin(auth: GitHubAuth, hqRoot: string): Promise<MemberJoinResult | null>;
|
|
58
|
+
//# sourceMappingURL=team-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-setup.d.ts","sourceRoot":"","sources":["../src/team-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EACL,KAAK,UAAU,EAGhB,MAAM,WAAW,CAAC;AA6BnB,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnD;AA4FD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwB/E;AAID;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CA8CpE;AAoCD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAkDlC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Member team discovery + clone flow.
|
|
3
|
+
*
|
|
4
|
+
* For users who already have access to one or more HQ team repos via the
|
|
5
|
+
* hq-team-sync GitHub App, enumerate their installations, find the {org}/hq
|
|
6
|
+
* repo for each, present a checklist, and clone the selected repos into
|
|
7
|
+
* companies/{slug}/.
|
|
8
|
+
*
|
|
9
|
+
* No backend involved — all data comes from api.github.com using the user's
|
|
10
|
+
* GitHub App user token.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from "fs";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import * as os from "os";
|
|
15
|
+
import { execSync } from "child_process";
|
|
16
|
+
import { createInterface } from "readline";
|
|
17
|
+
import chalk from "chalk";
|
|
18
|
+
import { HQ_GITHUB_APP_SLUG, githubApi, } from "./auth.js";
|
|
19
|
+
import { ensureCompanyStructure } from "./company-template.js";
|
|
20
|
+
import { stepStatus, success, warn, info } from "./ui.js";
|
|
21
|
+
// ─── Prompt helper ──────────────────────────────────────────────────────────
|
|
22
|
+
function prompt(question, defaultVal) {
|
|
23
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
24
|
+
const suffix = defaultVal ? ` (${defaultVal})` : "";
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
rl.question(` ? ${question}${suffix} `, (answer) => {
|
|
27
|
+
rl.close();
|
|
28
|
+
resolve(answer.trim() || defaultVal || "");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// ─── Git with embedded token (mirrors admin-onboarding.ts) ──────────────────
|
|
33
|
+
function runGitWithToken(args, cwd, auth) {
|
|
34
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "create-hq-git-"));
|
|
35
|
+
const isWindows = process.platform === "win32";
|
|
36
|
+
const askpassPath = path.join(tmpDir, isWindows ? "askpass.cmd" : "askpass.sh");
|
|
37
|
+
try {
|
|
38
|
+
if (isWindows) {
|
|
39
|
+
fs.writeFileSync(askpassPath, `@echo off\nif "%~1"=="" (echo %GIT_TOKEN%) else (echo %GIT_TOKEN%)\n`, "utf-8");
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
fs.writeFileSync(askpassPath, `#!/bin/sh\necho "$GIT_TOKEN"\n`, "utf-8");
|
|
43
|
+
fs.chmodSync(askpassPath, 0o700);
|
|
44
|
+
}
|
|
45
|
+
execSync(`git ${args.join(" ")}`, {
|
|
46
|
+
cwd,
|
|
47
|
+
stdio: "pipe",
|
|
48
|
+
env: {
|
|
49
|
+
...process.env,
|
|
50
|
+
GIT_TOKEN: auth.access_token,
|
|
51
|
+
GIT_ASKPASS: askpassPath,
|
|
52
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
53
|
+
GCM_INTERACTIVE: "never",
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
try {
|
|
59
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// ignore
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function tokenAuthUrl(cloneUrl) {
|
|
67
|
+
const u = new URL(cloneUrl);
|
|
68
|
+
u.username = "x-access-token";
|
|
69
|
+
return u.toString();
|
|
70
|
+
}
|
|
71
|
+
// ─── Discovery ──────────────────────────────────────────────────────────────
|
|
72
|
+
async function fetchHqInstallations(auth) {
|
|
73
|
+
const data = await githubApi("/user/installations?per_page=100", auth);
|
|
74
|
+
return (data.installations ?? []).filter((i) => i.app_slug === HQ_GITHUB_APP_SLUG);
|
|
75
|
+
}
|
|
76
|
+
async function findHqReposInInstallation(auth, installation) {
|
|
77
|
+
// GitHub App user token can list repos accessible through this installation
|
|
78
|
+
const data = await githubApi(`/user/installations/${installation.id}/repositories?per_page=100`, auth);
|
|
79
|
+
const repos = data.repositories ?? [];
|
|
80
|
+
// Match repos named hq-* (e.g. hq-indigo, hq-frogbear)
|
|
81
|
+
return repos.filter((r) => /^hq-.+$/i.test(r.name));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Derive a team slug from the repo name. Repo naming convention: hq-{teamSlug}.
|
|
85
|
+
* e.g. "hq-indigo" → "indigo", "hq-frogbear" → "frogbear"
|
|
86
|
+
*/
|
|
87
|
+
function teamSlugFromRepoName(repoName) {
|
|
88
|
+
return repoName.replace(/^hq-/i, "").toLowerCase();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Enumerate the user's HQ team memberships by walking their App installations.
|
|
92
|
+
* Returns one DiscoveredTeam per hq-* repo found across all installed orgs.
|
|
93
|
+
*/
|
|
94
|
+
export async function discoverTeams(auth) {
|
|
95
|
+
const installations = await fetchHqInstallations(auth);
|
|
96
|
+
const teams = [];
|
|
97
|
+
for (const inst of installations) {
|
|
98
|
+
try {
|
|
99
|
+
const repos = await findHqReposInInstallation(auth, inst);
|
|
100
|
+
for (const repo of repos) {
|
|
101
|
+
const slug = teamSlugFromRepoName(repo.name);
|
|
102
|
+
teams.push({
|
|
103
|
+
slug,
|
|
104
|
+
name: `${inst.account.login}/${slug}`,
|
|
105
|
+
repoHtmlUrl: repo.html_url,
|
|
106
|
+
cloneUrl: repo.clone_url,
|
|
107
|
+
installationId: inst.id,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Per-installation errors should not abort the whole discovery
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return teams;
|
|
117
|
+
}
|
|
118
|
+
// ─── Selection UI ───────────────────────────────────────────────────────────
|
|
119
|
+
/**
|
|
120
|
+
* Present discovered teams as a numbered list with all pre-selected, and
|
|
121
|
+
* let the user deselect any they want to skip.
|
|
122
|
+
*
|
|
123
|
+
* Input format:
|
|
124
|
+
* - empty / "all" → keep all
|
|
125
|
+
* - "none" → skip all
|
|
126
|
+
* - "1,3" → deselect entries 1 and 3
|
|
127
|
+
*/
|
|
128
|
+
export async function selectTeams(teams) {
|
|
129
|
+
if (teams.length === 0) {
|
|
130
|
+
return { selected: [], skipped: [] };
|
|
131
|
+
}
|
|
132
|
+
if (teams.length === 1) {
|
|
133
|
+
console.log();
|
|
134
|
+
console.log(chalk.bold(" Found 1 HQ team:"));
|
|
135
|
+
console.log(chalk.green(" [✓] ") + chalk.white(teams[0].name));
|
|
136
|
+
console.log();
|
|
137
|
+
const answer = await prompt(`Set up ${chalk.cyan(teams[0].name)}? (Y/n)`, "y");
|
|
138
|
+
if (answer.toLowerCase().startsWith("y")) {
|
|
139
|
+
return { selected: [teams[0]], skipped: [] };
|
|
140
|
+
}
|
|
141
|
+
return { selected: [], skipped: [teams[0]] };
|
|
142
|
+
}
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.bold(` Found ${teams.length} HQ teams (all pre-selected):`));
|
|
145
|
+
for (let i = 0; i < teams.length; i++) {
|
|
146
|
+
console.log(chalk.green(" [✓] ") + chalk.cyan(`${i + 1}. `) + chalk.white(teams[i].name));
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
console.log(chalk.dim(" Press Enter to set up all, or type numbers to skip (e.g. 2,3)"));
|
|
150
|
+
const answer = await prompt("Skip");
|
|
151
|
+
if (!answer || answer.toLowerCase() === "all") {
|
|
152
|
+
return { selected: [...teams], skipped: [] };
|
|
153
|
+
}
|
|
154
|
+
if (answer.toLowerCase() === "none") {
|
|
155
|
+
return { selected: [], skipped: [...teams] };
|
|
156
|
+
}
|
|
157
|
+
const skipIdx = new Set(answer
|
|
158
|
+
.split(",")
|
|
159
|
+
.map((s) => parseInt(s.trim(), 10) - 1)
|
|
160
|
+
.filter((n) => Number.isInteger(n) && n >= 0 && n < teams.length));
|
|
161
|
+
const selected = teams.filter((_, i) => !skipIdx.has(i));
|
|
162
|
+
const skipped = teams.filter((_, i) => skipIdx.has(i));
|
|
163
|
+
return { selected, skipped };
|
|
164
|
+
}
|
|
165
|
+
// ─── Clone ──────────────────────────────────────────────────────────────────
|
|
166
|
+
function cloneTeam(team, hqRoot, auth) {
|
|
167
|
+
const companiesDir = path.join(hqRoot, "companies");
|
|
168
|
+
if (!fs.existsSync(companiesDir)) {
|
|
169
|
+
fs.mkdirSync(companiesDir, { recursive: true });
|
|
170
|
+
}
|
|
171
|
+
const companyDir = path.join(companiesDir, team.slug);
|
|
172
|
+
if (fs.existsSync(companyDir) && fs.readdirSync(companyDir).length > 0) {
|
|
173
|
+
throw new Error(`companies/${team.slug}/ already exists and is not empty`);
|
|
174
|
+
}
|
|
175
|
+
const remoteUrl = tokenAuthUrl(team.cloneUrl);
|
|
176
|
+
runGitWithToken(["clone", `"${remoteUrl}"`, `"${companyDir}"`], companiesDir, auth);
|
|
177
|
+
// Strip token from stored remote URL
|
|
178
|
+
execSync(`git remote set-url origin "${team.cloneUrl}"`, {
|
|
179
|
+
cwd: companyDir,
|
|
180
|
+
stdio: "pipe",
|
|
181
|
+
});
|
|
182
|
+
// Make sure all standard subdirs exist
|
|
183
|
+
ensureCompanyStructure(companyDir);
|
|
184
|
+
return companyDir;
|
|
185
|
+
}
|
|
186
|
+
// ─── Main flow ──────────────────────────────────────────────────────────────
|
|
187
|
+
/**
|
|
188
|
+
* Discover, select, and clone team repos for an authenticated member.
|
|
189
|
+
*
|
|
190
|
+
* Returns a result with joined / skipped / failed lists. Returns null if
|
|
191
|
+
* the user has no HQ teams at all (caller can route to admin onboarding).
|
|
192
|
+
*/
|
|
193
|
+
export async function runMemberJoin(auth, hqRoot) {
|
|
194
|
+
const discoveryLabel = "Looking up your HQ teams";
|
|
195
|
+
stepStatus(discoveryLabel, "running");
|
|
196
|
+
let teams;
|
|
197
|
+
try {
|
|
198
|
+
teams = await discoverTeams(auth);
|
|
199
|
+
stepStatus(discoveryLabel, "done");
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
stepStatus(discoveryLabel, "failed");
|
|
203
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
204
|
+
warn(`Could not look up your teams: ${message}`);
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
if (teams.length === 0) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const { selected, skipped } = await selectTeams(teams);
|
|
211
|
+
if (selected.length === 0) {
|
|
212
|
+
info("No teams selected — continuing.");
|
|
213
|
+
return { joined: [], skipped, failed: [] };
|
|
214
|
+
}
|
|
215
|
+
const joined = [];
|
|
216
|
+
const failed = [];
|
|
217
|
+
for (const team of selected) {
|
|
218
|
+
const label = `Cloning ${team.name} → companies/${team.slug}`;
|
|
219
|
+
stepStatus(label, "running");
|
|
220
|
+
try {
|
|
221
|
+
cloneTeam(team, hqRoot, auth);
|
|
222
|
+
stepStatus(label, "done");
|
|
223
|
+
joined.push(team);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
stepStatus(label, "failed");
|
|
227
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
228
|
+
warn(`Could not set up ${team.name}: ${message}`);
|
|
229
|
+
failed.push({ team, error: message });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (joined.length > 0) {
|
|
233
|
+
success(`${joined.length} team${joined.length === 1 ? "" : "s"} ready`);
|
|
234
|
+
}
|
|
235
|
+
return { joined, skipped, failed };
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=team-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-setup.js","sourceRoot":"","sources":["../src/team-setup.ts"],"names":[],"mappings":"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"}
|