create-hq 10.10.0 → 10.12.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/commands/{team-sync.md → sync-team.md} +167 -6
- package/dist/__tests__/auth.test.js +176 -186
- package/dist/__tests__/auth.test.js.map +1 -1
- package/dist/__tests__/scaffold.test.js +5 -3
- package/dist/__tests__/scaffold.test.js.map +1 -1
- package/dist/auth.d.ts +57 -129
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +81 -370
- package/dist/auth.js.map +1 -1
- package/dist/fetch-template.d.ts +7 -2
- package/dist/fetch-template.d.ts.map +1 -1
- package/dist/fetch-template.js +27 -15
- package/dist/fetch-template.js.map +1 -1
- package/dist/index.js +7 -17
- package/dist/index.js.map +1 -1
- package/dist/packages.d.ts.map +1 -1
- package/dist/packages.js +1 -1
- package/dist/packages.js.map +1 -1
- package/dist/recommended-packages.d.ts +93 -0
- package/dist/recommended-packages.d.ts.map +1 -0
- package/dist/recommended-packages.js +221 -0
- package/dist/recommended-packages.js.map +1 -0
- package/dist/scaffold.d.ts +4 -2
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +127 -232
- package/dist/scaffold.js.map +1 -1
- package/dist/ui.d.ts +0 -17
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +0 -45
- package/dist/ui.js.map +1 -1
- package/package.json +2 -1
- package/dist/admin-onboarding.d.ts +0 -44
- package/dist/admin-onboarding.d.ts.map +0 -1
- package/dist/admin-onboarding.js +0 -530
- package/dist/admin-onboarding.js.map +0 -1
- package/dist/company-template.d.ts +0 -34
- package/dist/company-template.d.ts.map +0 -1
- package/dist/company-template.js +0 -142
- package/dist/company-template.js.map +0 -1
- package/dist/invite-command.d.ts +0 -10
- package/dist/invite-command.d.ts.map +0 -1
- package/dist/invite-command.js +0 -110
- package/dist/invite-command.js.map +0 -1
- package/dist/invite.d.ts +0 -91
- package/dist/invite.d.ts.map +0 -1
- package/dist/invite.js +0 -230
- package/dist/invite.js.map +0 -1
- package/dist/join-flow.d.ts +0 -32
- package/dist/join-flow.d.ts.map +0 -1
- package/dist/join-flow.js +0 -315
- package/dist/join-flow.js.map +0 -1
- package/dist/team-setup.d.ts +0 -83
- package/dist/team-setup.d.ts.map +0 -1
- package/dist/team-setup.js +0 -353
- package/dist/team-setup.js.map +0 -1
- package/dist/teams-flow.d.ts +0 -41
- package/dist/teams-flow.d.ts.map +0 -1
- package/dist/teams-flow.js +0 -173
- package/dist/teams-flow.js.map +0 -1
package/dist/team-setup.d.ts
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
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
|
-
* Install the bundled team management commands into .claude/commands/.
|
|
35
|
-
* These ship with the create-hq npm package (in commands/) and are only
|
|
36
|
-
* installed when a user joins or creates a team.
|
|
37
|
-
*
|
|
38
|
-
* Returns the list of files installed (skips files that already exist).
|
|
39
|
-
*/
|
|
40
|
-
export declare function installTeamCommands(hqRoot: string): string[];
|
|
41
|
-
export interface SymlinkResult {
|
|
42
|
-
linked: string[];
|
|
43
|
-
alreadyLinked: string[];
|
|
44
|
-
skipped: string[];
|
|
45
|
-
unlinked: string[];
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Link team-distributed commands into .claude/commands/ so they're
|
|
49
|
-
* discoverable as slash commands. Mirrors the logic in /sync (Section 5).
|
|
50
|
-
*
|
|
51
|
-
* Naming convention: {slug}--{command}.md (double-dash separates team from command).
|
|
52
|
-
* Symlinks use relative paths so they work regardless of HQ's absolute location.
|
|
53
|
-
*
|
|
54
|
-
* @param hqRoot - The HQ root directory
|
|
55
|
-
* @param slug - Team slug (companies/{slug}/)
|
|
56
|
-
*/
|
|
57
|
-
export declare function linkTeamCommands(hqRoot: string, slug: string): SymlinkResult;
|
|
58
|
-
/**
|
|
59
|
-
* Enumerate the user's HQ team memberships by walking their App installations.
|
|
60
|
-
* Returns one DiscoveredTeam per hq-* repo found across all installed orgs.
|
|
61
|
-
*/
|
|
62
|
-
export declare function discoverTeams(auth: GitHubAuth): Promise<DiscoveredTeam[]>;
|
|
63
|
-
/**
|
|
64
|
-
* Present discovered teams as a numbered list with all pre-selected, and
|
|
65
|
-
* let the user deselect any they want to skip.
|
|
66
|
-
*
|
|
67
|
-
* Input format:
|
|
68
|
-
* - empty / "all" → keep all
|
|
69
|
-
* - "none" → skip all
|
|
70
|
-
* - "1,3" → deselect entries 1 and 3
|
|
71
|
-
*/
|
|
72
|
-
export declare function selectTeams(teams: DiscoveredTeam[]): Promise<{
|
|
73
|
-
selected: DiscoveredTeam[];
|
|
74
|
-
skipped: DiscoveredTeam[];
|
|
75
|
-
}>;
|
|
76
|
-
/**
|
|
77
|
-
* Discover, select, and clone team repos for an authenticated member.
|
|
78
|
-
*
|
|
79
|
-
* Returns a result with joined / skipped / failed lists. Returns null if
|
|
80
|
-
* the user has no HQ teams at all (caller can route to admin onboarding).
|
|
81
|
-
*/
|
|
82
|
-
export declare function runMemberJoin(auth: GitHubAuth, hqRoot: string): Promise<MemberJoinResult | null>;
|
|
83
|
-
//# sourceMappingURL=team-setup.d.ts.map
|
package/dist/team-setup.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"team-setup.d.ts","sourceRoot":"","sources":["../src/team-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,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;AAOD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB5D;AAID,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAiE5E;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,CA4DlC"}
|
package/dist/team-setup.js
DELETED
|
@@ -1,353 +0,0 @@
|
|
|
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 { fileURLToPath } from "url";
|
|
16
|
-
import { execSync } from "child_process";
|
|
17
|
-
import { createInterface } from "readline";
|
|
18
|
-
import chalk from "chalk";
|
|
19
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
-
const __dirname = path.dirname(__filename);
|
|
21
|
-
import { HQ_GITHUB_APP_SLUG, githubApi, } from "./auth.js";
|
|
22
|
-
import { ensureCompanyStructure } from "./company-template.js";
|
|
23
|
-
import { stepStatus, success, warn, info } from "./ui.js";
|
|
24
|
-
// ─── Bundled Team Commands ──────────────────────────────────────────────────
|
|
25
|
-
/** Team-specific commands bundled with create-hq (not part of core HQ template). */
|
|
26
|
-
const TEAM_COMMANDS = ["invite.md", "team-sync.md", "promote.md"];
|
|
27
|
-
/**
|
|
28
|
-
* Install the bundled team management commands into .claude/commands/.
|
|
29
|
-
* These ship with the create-hq npm package (in commands/) and are only
|
|
30
|
-
* installed when a user joins or creates a team.
|
|
31
|
-
*
|
|
32
|
-
* Returns the list of files installed (skips files that already exist).
|
|
33
|
-
*/
|
|
34
|
-
export function installTeamCommands(hqRoot) {
|
|
35
|
-
const hqCommandsDir = path.join(hqRoot, ".claude", "commands");
|
|
36
|
-
if (!fs.existsSync(hqCommandsDir)) {
|
|
37
|
-
fs.mkdirSync(hqCommandsDir, { recursive: true });
|
|
38
|
-
}
|
|
39
|
-
// Resolve the bundled commands directory relative to this module.
|
|
40
|
-
// In the built package: dist/team-setup.js → ../commands/
|
|
41
|
-
const bundledDir = path.resolve(__dirname, "..", "commands");
|
|
42
|
-
if (!fs.existsSync(bundledDir)) {
|
|
43
|
-
// Fallback: running from source (ts-node / vitest)
|
|
44
|
-
// src/team-setup.ts → ../commands/
|
|
45
|
-
return [];
|
|
46
|
-
}
|
|
47
|
-
const installed = [];
|
|
48
|
-
for (const file of TEAM_COMMANDS) {
|
|
49
|
-
const src = path.join(bundledDir, file);
|
|
50
|
-
const dest = path.join(hqCommandsDir, file);
|
|
51
|
-
if (!fs.existsSync(src))
|
|
52
|
-
continue;
|
|
53
|
-
if (fs.existsSync(dest))
|
|
54
|
-
continue; // don't overwrite — user may have customized
|
|
55
|
-
fs.copyFileSync(src, dest);
|
|
56
|
-
installed.push(file);
|
|
57
|
-
}
|
|
58
|
-
return installed;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Link team-distributed commands into .claude/commands/ so they're
|
|
62
|
-
* discoverable as slash commands. Mirrors the logic in /sync (Section 5).
|
|
63
|
-
*
|
|
64
|
-
* Naming convention: {slug}--{command}.md (double-dash separates team from command).
|
|
65
|
-
* Symlinks use relative paths so they work regardless of HQ's absolute location.
|
|
66
|
-
*
|
|
67
|
-
* @param hqRoot - The HQ root directory
|
|
68
|
-
* @param slug - Team slug (companies/{slug}/)
|
|
69
|
-
*/
|
|
70
|
-
export function linkTeamCommands(hqRoot, slug) {
|
|
71
|
-
const result = { linked: [], alreadyLinked: [], skipped: [], unlinked: [] };
|
|
72
|
-
const teamCommandsDir = path.join(hqRoot, "companies", slug, ".claude", "commands");
|
|
73
|
-
const hqCommandsDir = path.join(hqRoot, ".claude", "commands");
|
|
74
|
-
// Ensure .claude/commands/ exists
|
|
75
|
-
if (!fs.existsSync(hqCommandsDir)) {
|
|
76
|
-
fs.mkdirSync(hqCommandsDir, { recursive: true });
|
|
77
|
-
}
|
|
78
|
-
// Scan for team commands
|
|
79
|
-
if (!fs.existsSync(teamCommandsDir)) {
|
|
80
|
-
return result;
|
|
81
|
-
}
|
|
82
|
-
const teamFiles = fs.readdirSync(teamCommandsDir).filter((f) => f.endsWith(".md"));
|
|
83
|
-
if (teamFiles.length === 0) {
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
// Create symlinks for new commands
|
|
87
|
-
for (const file of teamFiles) {
|
|
88
|
-
const symlinkName = `${slug}--${file}`;
|
|
89
|
-
const symlinkPath = path.join(hqCommandsDir, symlinkName);
|
|
90
|
-
// Relative path from .claude/commands/ to companies/{slug}/.claude/commands/
|
|
91
|
-
const relativeSrc = path.join("..", "..", "companies", slug, ".claude", "commands", file);
|
|
92
|
-
if (fs.existsSync(symlinkPath)) {
|
|
93
|
-
const stats = fs.lstatSync(symlinkPath);
|
|
94
|
-
if (stats.isSymbolicLink()) {
|
|
95
|
-
const target = fs.readlinkSync(symlinkPath);
|
|
96
|
-
if (target === relativeSrc) {
|
|
97
|
-
result.alreadyLinked.push(symlinkName);
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Exists but is not the right symlink — skip to avoid collision
|
|
102
|
-
result.skipped.push(symlinkName);
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
fs.symlinkSync(relativeSrc, symlinkPath);
|
|
107
|
-
result.linked.push(symlinkName);
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
result.skipped.push(symlinkName);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Remove stale symlinks for this team
|
|
114
|
-
const teamPattern = `${slug}--`;
|
|
115
|
-
const existing = fs.readdirSync(hqCommandsDir).filter((f) => f.startsWith(teamPattern));
|
|
116
|
-
const expectedNames = new Set(teamFiles.map((f) => `${slug}--${f}`));
|
|
117
|
-
for (const link of existing) {
|
|
118
|
-
const linkPath = path.join(hqCommandsDir, link);
|
|
119
|
-
const stats = fs.lstatSync(linkPath);
|
|
120
|
-
if (stats.isSymbolicLink() && !expectedNames.has(link)) {
|
|
121
|
-
fs.unlinkSync(linkPath);
|
|
122
|
-
result.unlinked.push(link);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return result;
|
|
126
|
-
}
|
|
127
|
-
// ─── Prompt helper ──────────────────────────────────────────────────────────
|
|
128
|
-
function prompt(question, defaultVal) {
|
|
129
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
130
|
-
const suffix = defaultVal ? ` (${defaultVal})` : "";
|
|
131
|
-
return new Promise((resolve) => {
|
|
132
|
-
rl.question(` ? ${question}${suffix} `, (answer) => {
|
|
133
|
-
rl.close();
|
|
134
|
-
resolve(answer.trim() || defaultVal || "");
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
// ─── Git with embedded token (mirrors admin-onboarding.ts) ──────────────────
|
|
139
|
-
function runGitWithToken(args, cwd, auth) {
|
|
140
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "create-hq-git-"));
|
|
141
|
-
const isWindows = process.platform === "win32";
|
|
142
|
-
const askpassPath = path.join(tmpDir, isWindows ? "askpass.cmd" : "askpass.sh");
|
|
143
|
-
try {
|
|
144
|
-
if (isWindows) {
|
|
145
|
-
fs.writeFileSync(askpassPath, `@echo off\nif "%~1"=="" (echo %GIT_TOKEN%) else (echo %GIT_TOKEN%)\n`, "utf-8");
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
fs.writeFileSync(askpassPath, `#!/bin/sh\necho "$GIT_TOKEN"\n`, "utf-8");
|
|
149
|
-
fs.chmodSync(askpassPath, 0o700);
|
|
150
|
-
}
|
|
151
|
-
execSync(`git -c credential.helper= ${args.join(" ")}`, {
|
|
152
|
-
cwd,
|
|
153
|
-
stdio: "pipe",
|
|
154
|
-
env: {
|
|
155
|
-
...process.env,
|
|
156
|
-
GIT_TOKEN: auth.access_token,
|
|
157
|
-
GIT_ASKPASS: askpassPath,
|
|
158
|
-
GIT_TERMINAL_PROMPT: "0",
|
|
159
|
-
GCM_INTERACTIVE: "never",
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
finally {
|
|
164
|
-
try {
|
|
165
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
// ignore
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
function tokenAuthUrl(cloneUrl) {
|
|
173
|
-
const u = new URL(cloneUrl);
|
|
174
|
-
u.username = "x-access-token";
|
|
175
|
-
return u.toString();
|
|
176
|
-
}
|
|
177
|
-
// ─── Discovery ──────────────────────────────────────────────────────────────
|
|
178
|
-
async function fetchHqInstallations(auth) {
|
|
179
|
-
const data = await githubApi("/user/installations?per_page=100", auth);
|
|
180
|
-
return (data.installations ?? []).filter((i) => i.app_slug === HQ_GITHUB_APP_SLUG);
|
|
181
|
-
}
|
|
182
|
-
async function findHqReposInInstallation(auth, installation) {
|
|
183
|
-
// GitHub App user token can list repos accessible through this installation
|
|
184
|
-
const data = await githubApi(`/user/installations/${installation.id}/repositories?per_page=100`, auth);
|
|
185
|
-
const repos = data.repositories ?? [];
|
|
186
|
-
// Match repos named hq-* (e.g. hq-indigo, hq-frogbear)
|
|
187
|
-
return repos.filter((r) => /^hq-.+$/i.test(r.name));
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Derive a team slug from the repo name. Repo naming convention: hq-{teamSlug}.
|
|
191
|
-
* e.g. "hq-indigo" → "indigo", "hq-frogbear" → "frogbear"
|
|
192
|
-
*/
|
|
193
|
-
function teamSlugFromRepoName(repoName) {
|
|
194
|
-
return repoName.replace(/^hq-/i, "").toLowerCase();
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Enumerate the user's HQ team memberships by walking their App installations.
|
|
198
|
-
* Returns one DiscoveredTeam per hq-* repo found across all installed orgs.
|
|
199
|
-
*/
|
|
200
|
-
export async function discoverTeams(auth) {
|
|
201
|
-
const installations = await fetchHqInstallations(auth);
|
|
202
|
-
const teams = [];
|
|
203
|
-
for (const inst of installations) {
|
|
204
|
-
try {
|
|
205
|
-
const repos = await findHqReposInInstallation(auth, inst);
|
|
206
|
-
for (const repo of repos) {
|
|
207
|
-
const slug = teamSlugFromRepoName(repo.name);
|
|
208
|
-
teams.push({
|
|
209
|
-
slug,
|
|
210
|
-
name: `${inst.account.login}/${slug}`,
|
|
211
|
-
repoHtmlUrl: repo.html_url,
|
|
212
|
-
cloneUrl: repo.clone_url,
|
|
213
|
-
installationId: inst.id,
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
catch {
|
|
218
|
-
// Per-installation errors should not abort the whole discovery
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
return teams;
|
|
223
|
-
}
|
|
224
|
-
// ─── Selection UI ───────────────────────────────────────────────────────────
|
|
225
|
-
/**
|
|
226
|
-
* Present discovered teams as a numbered list with all pre-selected, and
|
|
227
|
-
* let the user deselect any they want to skip.
|
|
228
|
-
*
|
|
229
|
-
* Input format:
|
|
230
|
-
* - empty / "all" → keep all
|
|
231
|
-
* - "none" → skip all
|
|
232
|
-
* - "1,3" → deselect entries 1 and 3
|
|
233
|
-
*/
|
|
234
|
-
export async function selectTeams(teams) {
|
|
235
|
-
if (teams.length === 0) {
|
|
236
|
-
return { selected: [], skipped: [] };
|
|
237
|
-
}
|
|
238
|
-
if (teams.length === 1) {
|
|
239
|
-
console.log();
|
|
240
|
-
console.log(chalk.bold(" Found 1 HQ team:"));
|
|
241
|
-
console.log(chalk.green(" [✓] ") + chalk.white(teams[0].name));
|
|
242
|
-
console.log();
|
|
243
|
-
const answer = await prompt(`Set up ${chalk.cyan(teams[0].name)}? (Y/n)`, "y");
|
|
244
|
-
if (answer.toLowerCase().startsWith("y")) {
|
|
245
|
-
return { selected: [teams[0]], skipped: [] };
|
|
246
|
-
}
|
|
247
|
-
return { selected: [], skipped: [teams[0]] };
|
|
248
|
-
}
|
|
249
|
-
console.log();
|
|
250
|
-
console.log(chalk.bold(` Found ${teams.length} HQ teams (all pre-selected):`));
|
|
251
|
-
for (let i = 0; i < teams.length; i++) {
|
|
252
|
-
console.log(chalk.green(" [✓] ") + chalk.cyan(`${i + 1}. `) + chalk.white(teams[i].name));
|
|
253
|
-
}
|
|
254
|
-
console.log();
|
|
255
|
-
console.log(chalk.dim(" Press Enter to set up all, or type numbers to skip (e.g. 2,3)"));
|
|
256
|
-
const answer = await prompt("Skip");
|
|
257
|
-
if (!answer || answer.toLowerCase() === "all") {
|
|
258
|
-
return { selected: [...teams], skipped: [] };
|
|
259
|
-
}
|
|
260
|
-
if (answer.toLowerCase() === "none") {
|
|
261
|
-
return { selected: [], skipped: [...teams] };
|
|
262
|
-
}
|
|
263
|
-
const skipIdx = new Set(answer
|
|
264
|
-
.split(",")
|
|
265
|
-
.map((s) => parseInt(s.trim(), 10) - 1)
|
|
266
|
-
.filter((n) => Number.isInteger(n) && n >= 0 && n < teams.length));
|
|
267
|
-
const selected = teams.filter((_, i) => !skipIdx.has(i));
|
|
268
|
-
const skipped = teams.filter((_, i) => skipIdx.has(i));
|
|
269
|
-
return { selected, skipped };
|
|
270
|
-
}
|
|
271
|
-
// ─── Clone ──────────────────────────────────────────────────────────────────
|
|
272
|
-
function cloneTeam(team, hqRoot, auth) {
|
|
273
|
-
const companiesDir = path.join(hqRoot, "companies");
|
|
274
|
-
if (!fs.existsSync(companiesDir)) {
|
|
275
|
-
fs.mkdirSync(companiesDir, { recursive: true });
|
|
276
|
-
}
|
|
277
|
-
const companyDir = path.join(companiesDir, team.slug);
|
|
278
|
-
if (fs.existsSync(companyDir) && fs.readdirSync(companyDir).length > 0) {
|
|
279
|
-
throw new Error(`companies/${team.slug}/ already exists and is not empty`);
|
|
280
|
-
}
|
|
281
|
-
const remoteUrl = tokenAuthUrl(team.cloneUrl);
|
|
282
|
-
runGitWithToken(["clone", `"${remoteUrl}"`, `"${companyDir}"`], companiesDir, auth);
|
|
283
|
-
// Strip token from stored remote URL
|
|
284
|
-
execSync(`git remote set-url origin "${team.cloneUrl}"`, {
|
|
285
|
-
cwd: companyDir,
|
|
286
|
-
stdio: "pipe",
|
|
287
|
-
});
|
|
288
|
-
// Make sure all standard subdirs exist
|
|
289
|
-
ensureCompanyStructure(companyDir);
|
|
290
|
-
return companyDir;
|
|
291
|
-
}
|
|
292
|
-
// ─── Main flow ──────────────────────────────────────────────────────────────
|
|
293
|
-
/**
|
|
294
|
-
* Discover, select, and clone team repos for an authenticated member.
|
|
295
|
-
*
|
|
296
|
-
* Returns a result with joined / skipped / failed lists. Returns null if
|
|
297
|
-
* the user has no HQ teams at all (caller can route to admin onboarding).
|
|
298
|
-
*/
|
|
299
|
-
export async function runMemberJoin(auth, hqRoot) {
|
|
300
|
-
const discoveryLabel = "Looking up your HQ teams";
|
|
301
|
-
stepStatus(discoveryLabel, "running");
|
|
302
|
-
let teams;
|
|
303
|
-
try {
|
|
304
|
-
teams = await discoverTeams(auth);
|
|
305
|
-
stepStatus(discoveryLabel, "done");
|
|
306
|
-
}
|
|
307
|
-
catch (err) {
|
|
308
|
-
stepStatus(discoveryLabel, "failed");
|
|
309
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
310
|
-
warn(`Could not look up your teams: ${message}`);
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
if (teams.length === 0) {
|
|
314
|
-
return null;
|
|
315
|
-
}
|
|
316
|
-
const { selected, skipped } = await selectTeams(teams);
|
|
317
|
-
if (selected.length === 0) {
|
|
318
|
-
info("No teams selected — continuing.");
|
|
319
|
-
return { joined: [], skipped, failed: [] };
|
|
320
|
-
}
|
|
321
|
-
const joined = [];
|
|
322
|
-
const failed = [];
|
|
323
|
-
for (const team of selected) {
|
|
324
|
-
const label = `Cloning ${team.name} → companies/${team.slug}`;
|
|
325
|
-
stepStatus(label, "running");
|
|
326
|
-
try {
|
|
327
|
-
cloneTeam(team, hqRoot, auth);
|
|
328
|
-
stepStatus(label, "done");
|
|
329
|
-
// Install bundled team commands (invite, sync, promote)
|
|
330
|
-
const installed = installTeamCommands(hqRoot);
|
|
331
|
-
if (installed.length > 0) {
|
|
332
|
-
info(`Installed ${installed.length} team command${installed.length === 1 ? "" : "s"}: ${installed.join(", ")}`);
|
|
333
|
-
}
|
|
334
|
-
// Link team-distributed commands as slash commands
|
|
335
|
-
const symlinks = linkTeamCommands(hqRoot, team.slug);
|
|
336
|
-
if (symlinks.linked.length > 0) {
|
|
337
|
-
info(`Linked ${symlinks.linked.length} team command${symlinks.linked.length === 1 ? "" : "s"} from ${team.name}`);
|
|
338
|
-
}
|
|
339
|
-
joined.push(team);
|
|
340
|
-
}
|
|
341
|
-
catch (err) {
|
|
342
|
-
stepStatus(label, "failed");
|
|
343
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
344
|
-
warn(`Could not set up ${team.name}: ${message}`);
|
|
345
|
-
failed.push({ team, error: message });
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
if (joined.length > 0) {
|
|
349
|
-
success(`${joined.length} team${joined.length === 1 ? "" : "s"} ready`);
|
|
350
|
-
}
|
|
351
|
-
return { joined, skipped, failed };
|
|
352
|
-
}
|
|
353
|
-
//# sourceMappingURL=team-setup.js.map
|
package/dist/team-setup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"team-setup.js","sourceRoot":"","sources":["../src/team-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/teams-flow.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Teams flow router.
|
|
3
|
-
*
|
|
4
|
-
* Called by scaffold.ts after the user opts into the HQ Teams path. Handles:
|
|
5
|
-
* - Reusing or refreshing GitHub auth
|
|
6
|
-
* - Routing: invite code → join-by-invite, discovery → auto-discovery, new → admin onboarding
|
|
7
|
-
*
|
|
8
|
-
* The team setup happens *after* core HQ has been installed, so all paths
|
|
9
|
-
* receive a fully scaffolded hqRoot to drop companies/{slug}/ into.
|
|
10
|
-
*/
|
|
11
|
-
import { type GitHubAuth } from "./auth.js";
|
|
12
|
-
import { type AdminOnboardingResult } from "./admin-onboarding.js";
|
|
13
|
-
import { type MemberJoinResult } from "./team-setup.js";
|
|
14
|
-
import { type JoinByInviteResult } from "./join-flow.js";
|
|
15
|
-
export type TeamsFlowMode = "existing" | "new";
|
|
16
|
-
export interface TeamsFlowResult {
|
|
17
|
-
auth: GitHubAuth;
|
|
18
|
-
member: MemberJoinResult | null;
|
|
19
|
-
admin: AdminOnboardingResult | null;
|
|
20
|
-
/** Set when the member joined via an invite token. */
|
|
21
|
-
joinedByInvite: JoinByInviteResult | null;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Authenticate the user, reusing a stored HQ App token if it's still valid.
|
|
25
|
-
*
|
|
26
|
-
* Priority:
|
|
27
|
-
* 1. ~/.hq/app-token.json — cached HQ App token from a previous session
|
|
28
|
-
* 2. Device flow — browser-based OAuth through the hq-team-sync GitHub App
|
|
29
|
-
*
|
|
30
|
-
* The user's existing `gh` CLI auth is never read or modified.
|
|
31
|
-
*/
|
|
32
|
-
export declare function authenticate(): Promise<GitHubAuth | null>;
|
|
33
|
-
/**
|
|
34
|
-
* Run the teams flow. The mode determines the entry point:
|
|
35
|
-
* - "existing": user said they have an HQ Teams account → prompt for invite code, then discovery
|
|
36
|
-
* - "new": user wants to create a new team → admin onboarding
|
|
37
|
-
*
|
|
38
|
-
* @param joinToken - Pre-supplied invite token (from --join flag). Skips the invite code prompt.
|
|
39
|
-
*/
|
|
40
|
-
export declare function runTeamsFlow(mode: TeamsFlowMode, hqRoot: string, hqVersion: string, preAuth?: GitHubAuth, joinToken?: string): Promise<TeamsFlowResult | null>;
|
|
41
|
-
//# sourceMappingURL=teams-flow.d.ts.map
|
package/dist/teams-flow.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"teams-flow.d.ts","sourceRoot":"","sources":["../src/teams-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,KAAK,UAAU,EAOhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAI1E,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC3C;AAoBD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsD/D;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0EjC"}
|