create-hq 10.1.0 → 10.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-onboarding.d.ts +42 -0
- package/dist/admin-onboarding.d.ts.map +1 -0
- package/dist/admin-onboarding.js +460 -0
- package/dist/admin-onboarding.js.map +1 -0
- package/dist/art.d.ts +17 -0
- package/dist/art.d.ts.map +1 -0
- package/dist/art.js +171 -0
- package/dist/art.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/cloud.d.ts +26 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +126 -0
- package/dist/cloud.js.map +1 -0
- 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/tui.d.ts +8 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +86 -0
- package/dist/tui.js.map +1 -0
- package/dist/ui.d.ts +17 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +45 -0
- package/dist/ui.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Join-via-invite flow for HQ Teams members.
|
|
3
|
+
*
|
|
4
|
+
* When a member has an invite token (from an admin), this flow:
|
|
5
|
+
* 1. Decodes the token to get team coordinates
|
|
6
|
+
* 2. Authenticates via GitHub device flow
|
|
7
|
+
* 3. Checks org membership / repo access (waits if invite is pending)
|
|
8
|
+
* 4. Clones the team repo into companies/{slug}/
|
|
9
|
+
*
|
|
10
|
+
* This is the primary path for non-technical users who received an invite.
|
|
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 { ensureCompanyStructure } from "./company-template.js";
|
|
19
|
+
import { stepStatus, success, warn, info, step } from "./ui.js";
|
|
20
|
+
import { decodeInviteToken, checkRepoAccess, } from "./invite.js";
|
|
21
|
+
// ─── Prompt helpers ─────────────────────────────────────────────────────────
|
|
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
|
+
function pause(message) {
|
|
33
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
rl.question(` ${message}`, () => {
|
|
36
|
+
rl.close();
|
|
37
|
+
resolve();
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// ─── Git helpers (same as team-setup.ts / admin-onboarding.ts) ──────────────
|
|
42
|
+
function runGitWithToken(args, cwd, auth) {
|
|
43
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "create-hq-git-"));
|
|
44
|
+
const isWindows = process.platform === "win32";
|
|
45
|
+
const askpassPath = path.join(tmpDir, isWindows ? "askpass.cmd" : "askpass.sh");
|
|
46
|
+
try {
|
|
47
|
+
if (isWindows) {
|
|
48
|
+
fs.writeFileSync(askpassPath, `@echo off\nif "%~1"=="" (echo %GIT_TOKEN%) else (echo %GIT_TOKEN%)\n`, "utf-8");
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
fs.writeFileSync(askpassPath, `#!/bin/sh\necho "$GIT_TOKEN"\n`, "utf-8");
|
|
52
|
+
fs.chmodSync(askpassPath, 0o700);
|
|
53
|
+
}
|
|
54
|
+
execSync(`git -c credential.helper= ${args.join(" ")}`, {
|
|
55
|
+
cwd,
|
|
56
|
+
stdio: "pipe",
|
|
57
|
+
env: {
|
|
58
|
+
...process.env,
|
|
59
|
+
GIT_TOKEN: auth.access_token,
|
|
60
|
+
GIT_ASKPASS: askpassPath,
|
|
61
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
62
|
+
GCM_INTERACTIVE: "never",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
try {
|
|
68
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// ignore
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function tokenAuthUrl(cloneUrl) {
|
|
76
|
+
const u = new URL(cloneUrl);
|
|
77
|
+
u.username = "x-access-token";
|
|
78
|
+
return u.toString();
|
|
79
|
+
}
|
|
80
|
+
// ─── Main flow ──────────────────────────────────────────────────────────────
|
|
81
|
+
/**
|
|
82
|
+
* Run the join-via-invite flow.
|
|
83
|
+
*
|
|
84
|
+
* @param auth - Authenticated GitHub user (already signed in)
|
|
85
|
+
* @param hqRoot - Local HQ root directory (where companies/ lives)
|
|
86
|
+
* @param token - The invite token string (hq_...) or raw base64
|
|
87
|
+
* @returns - Result on success, null on failure/abort
|
|
88
|
+
*/
|
|
89
|
+
export async function runJoinByInvite(auth, hqRoot, token) {
|
|
90
|
+
// 1. Decode token
|
|
91
|
+
const payload = decodeInviteToken(token);
|
|
92
|
+
if (!payload) {
|
|
93
|
+
warn("Invalid invite code. Check that you copied it correctly and try again.");
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
console.log();
|
|
97
|
+
console.log(chalk.bold(" Joining a team"));
|
|
98
|
+
console.log();
|
|
99
|
+
console.log(` ${chalk.dim("Team:")} ${chalk.cyan(payload.teamName)}`);
|
|
100
|
+
console.log(` ${chalk.dim("Org:")} ${payload.org}`);
|
|
101
|
+
console.log(` ${chalk.dim("Invited by:")} @${payload.invitedBy}`);
|
|
102
|
+
console.log();
|
|
103
|
+
// 2. Check repo access (proves org membership + repo visibility)
|
|
104
|
+
const accessLabel = `Checking access to ${payload.org}/${payload.repo}`;
|
|
105
|
+
stepStatus(accessLabel, "running");
|
|
106
|
+
let hasAccess = await checkRepoAccess(auth, payload.org, payload.repo);
|
|
107
|
+
if (!hasAccess) {
|
|
108
|
+
stepStatus(accessLabel, "failed");
|
|
109
|
+
console.log();
|
|
110
|
+
// Guide the user to accept the org invite
|
|
111
|
+
info("You don't have access to this team's repository yet.");
|
|
112
|
+
console.log();
|
|
113
|
+
step("Check your email for a GitHub organization invite from " + chalk.cyan(payload.org));
|
|
114
|
+
step("Accept the invite, then come back here.");
|
|
115
|
+
console.log();
|
|
116
|
+
// Give them up to 3 chances to retry
|
|
117
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
118
|
+
await pause(`Press Enter after accepting the invite (attempt ${attempt}/3)... `);
|
|
119
|
+
stepStatus(`Re-checking access (attempt ${attempt})`, "running");
|
|
120
|
+
hasAccess = await checkRepoAccess(auth, payload.org, payload.repo);
|
|
121
|
+
if (hasAccess) {
|
|
122
|
+
stepStatus(`Re-checking access (attempt ${attempt})`, "done");
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
stepStatus(`Re-checking access (attempt ${attempt})`, "failed");
|
|
127
|
+
if (attempt < 3) {
|
|
128
|
+
console.log();
|
|
129
|
+
info("Still no access. Make sure you:");
|
|
130
|
+
step(`Accepted the org invite from ${payload.org} (check email from GitHub)`);
|
|
131
|
+
step("Are signed in to GitHub with the same account you accepted the invite on");
|
|
132
|
+
console.log();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (!hasAccess) {
|
|
137
|
+
console.log();
|
|
138
|
+
warn("Could not access the team repository after 3 attempts.");
|
|
139
|
+
info(`Your GitHub username is @${auth.login}`);
|
|
140
|
+
info(`Ask @${payload.invitedBy} to add @${auth.login} to the ${payload.org} organization.`);
|
|
141
|
+
info("Then run create-hq again with the same invite code.");
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
stepStatus(accessLabel, "done");
|
|
147
|
+
}
|
|
148
|
+
// 3. Clone the repo into companies/{slug}/
|
|
149
|
+
const companiesDir = path.join(hqRoot, "companies");
|
|
150
|
+
if (!fs.existsSync(companiesDir)) {
|
|
151
|
+
fs.mkdirSync(companiesDir, { recursive: true });
|
|
152
|
+
}
|
|
153
|
+
const companyDir = path.join(companiesDir, payload.slug);
|
|
154
|
+
if (fs.existsSync(companyDir) && fs.readdirSync(companyDir).length > 0) {
|
|
155
|
+
info(`companies/${payload.slug}/ already exists — skipping clone.`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const cloneLabel = `Cloning ${payload.teamName} into companies/${payload.slug}`;
|
|
159
|
+
stepStatus(cloneLabel, "running");
|
|
160
|
+
try {
|
|
161
|
+
const remoteUrl = tokenAuthUrl(payload.cloneUrl);
|
|
162
|
+
runGitWithToken(["clone", `"${remoteUrl}"`, `"${companyDir}"`], companiesDir, auth);
|
|
163
|
+
// Strip the token from the stored remote URL
|
|
164
|
+
execSync(`git remote set-url origin "${payload.cloneUrl}"`, {
|
|
165
|
+
cwd: companyDir,
|
|
166
|
+
stdio: "pipe",
|
|
167
|
+
});
|
|
168
|
+
// Ensure standard company subdirectories exist
|
|
169
|
+
ensureCompanyStructure(companyDir);
|
|
170
|
+
stepStatus(cloneLabel, "done");
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
stepStatus(cloneLabel, "failed");
|
|
174
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
175
|
+
warn(`Could not clone team repo: ${message}`);
|
|
176
|
+
// Provide actionable guidance
|
|
177
|
+
console.log();
|
|
178
|
+
info("This usually means the repository doesn't exist or your access isn't set up yet.");
|
|
179
|
+
info(`Ask @${payload.invitedBy} to verify the repo exists at: https://github.com/${payload.org}/${payload.repo}`);
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const repoUrl = `https://github.com/${payload.org}/${payload.repo}`;
|
|
184
|
+
console.log();
|
|
185
|
+
success(`Joined ${payload.teamName}!`);
|
|
186
|
+
info(`Team workspace: companies/${payload.slug}/`);
|
|
187
|
+
return {
|
|
188
|
+
slug: payload.slug,
|
|
189
|
+
teamName: payload.teamName,
|
|
190
|
+
companyDir,
|
|
191
|
+
repoUrl,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=join-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-flow.js","sourceRoot":"","sources":["../src/join-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAEhB,MAAM,aAAa,CAAC;AAerB,+EAA+E;AAE/E,SAAS,MAAM,CAAC,QAAgB,EAAE,UAAmB;IACnD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,OAAO,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;YAClD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,OAAe;IAC5B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,EAAE,GAAG,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,SAAS,eAAe,CAAC,IAAc,EAAE,GAAW,EAAE,IAAgB;IACpE,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAEhF,IAAI,CAAC;QACH,IAAI,SAAS,EAAE,CAAC;YACd,EAAE,CAAC,aAAa,CACd,WAAW,EACX,sEAAsE,EACtE,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,gCAAgC,EAAE,OAAO,CAAC,CAAC;YACzE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,QAAQ,CAAC,6BAA6B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;YACtD,GAAG;YACH,KAAK,EAAE,MAAM;YACb,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,SAAS,EAAE,IAAI,CAAC,YAAY;gBAC5B,WAAW,EAAE,WAAW;gBACxB,mBAAmB,EAAE,GAAG;gBACxB,eAAe,EAAE,OAAO;aACzB;SACF,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC,QAAQ,GAAG,gBAAgB,CAAC;IAC9B,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAgB,EAChB,MAAc,EACd,KAAa;IAEb,kBAAkB;IAClB,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,wEAAwE,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,iEAAiE;IACjE,MAAM,WAAW,GAAG,sBAAsB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACxE,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEnC,IAAI,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,0CAA0C;QAC1C,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,yDAAyD,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,qCAAqC;QACrC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,KAAK,CAAC,mDAAmD,OAAO,SAAS,CAAC,CAAC;YAEjF,UAAU,CAAC,+BAA+B,OAAO,GAAG,EAAE,SAAS,CAAC,CAAC;YACjE,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnE,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,CAAC,+BAA+B,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC9D,MAAM;YACR,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,+BAA+B,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAEhE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,IAAI,CAAC,iCAAiC,CAAC,CAAC;oBACxC,IAAI,CAAC,gCAAgC,OAAO,CAAC,GAAG,4BAA4B,CAAC,CAAC;oBAC9E,IAAI,CAAC,0EAA0E,CAAC,CAAC;oBACjF,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAC/D,IAAI,CAAC,4BAA4B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,OAAO,CAAC,SAAS,YAAY,IAAI,CAAC,KAAK,WAAW,OAAO,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAC5F,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,2CAA2C;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,aAAa,OAAO,CAAC,IAAI,oCAAoC,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,WAAW,OAAO,CAAC,QAAQ,mBAAmB,OAAO,CAAC,IAAI,EAAE,CAAC;QAChF,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjD,eAAe,CACb,CAAC,OAAO,EAAE,IAAI,SAAS,GAAG,EAAE,IAAI,UAAU,GAAG,CAAC,EAC9C,YAAY,EACZ,IAAI,CACL,CAAC;YAEF,6CAA6C;YAC7C,QAAQ,CAAC,8BAA8B,OAAO,CAAC,QAAQ,GAAG,EAAE;gBAC1D,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,+CAA+C;YAC/C,sBAAsB,CAAC,UAAU,CAAC,CAAC;YAEnC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;YAE9C,8BAA8B;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,kFAAkF,CAAC,CAAC;YACzF,IAAI,CAAC,QAAQ,OAAO,CAAC,SAAS,qDAAqD,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAClH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAEpE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,UAAU,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,6BAA6B,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAEnD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU;QACV,OAAO;KACR,CAAC;AACJ,CAAC"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type SystemPackageManager = "brew" | "apt" | "dnf" | "yum" | "pacman" | null;
|
|
2
|
-
export type OsType = "macos" | "linux-debian" | "linux-fedora" | "linux-arch" | "linux" | "unix";
|
|
1
|
+
export type SystemPackageManager = "brew" | "apt" | "dnf" | "yum" | "pacman" | "winget" | "choco" | null;
|
|
2
|
+
export type OsType = "macos" | "linux-debian" | "linux-fedora" | "linux-arch" | "linux" | "windows" | "unix";
|
|
3
3
|
export interface PlatformInfo {
|
|
4
4
|
os: OsType;
|
|
5
5
|
packageManager: SystemPackageManager;
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;AAEzG,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE7G,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,oBAAoB,CAAC;IACrC,YAAY,EAAE,OAAO,CAAC;CACvB;AA4DD,wBAAgB,cAAc,IAAI,YAAY,CAO7C"}
|
package/dist/platform.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
2
|
function hasBin(name) {
|
|
3
3
|
try {
|
|
4
|
-
|
|
4
|
+
if (process.platform === "win32") {
|
|
5
|
+
execSync(`where ${name}`, { stdio: "pipe" });
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
execSync(`which ${name}`, { stdio: "pipe" });
|
|
9
|
+
}
|
|
5
10
|
return true;
|
|
6
11
|
}
|
|
7
12
|
catch {
|
|
@@ -10,6 +15,8 @@ function hasBin(name) {
|
|
|
10
15
|
}
|
|
11
16
|
function detectOs() {
|
|
12
17
|
const platform = process.platform;
|
|
18
|
+
if (platform === "win32")
|
|
19
|
+
return "windows";
|
|
13
20
|
if (platform === "darwin")
|
|
14
21
|
return "macos";
|
|
15
22
|
if (platform !== "linux")
|
|
@@ -31,6 +38,12 @@ function detectOs() {
|
|
|
31
38
|
}
|
|
32
39
|
function detectSystemPm(os) {
|
|
33
40
|
switch (os) {
|
|
41
|
+
case "windows":
|
|
42
|
+
if (hasBin("winget"))
|
|
43
|
+
return "winget";
|
|
44
|
+
if (hasBin("choco"))
|
|
45
|
+
return "choco";
|
|
46
|
+
return null;
|
|
34
47
|
case "macos":
|
|
35
48
|
return hasBin("brew") ? "brew" : null;
|
|
36
49
|
case "linux-debian":
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
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":"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,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,MAAM,EACN,OAAO,EACP,IAAI,EAEJ,IAAI,EACJ,SAAS,EACT,UAAU,EACV,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAwB,MAAM,iBAAiB,CAAC;AAGnF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAe9D,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,UAAmB;IACzD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,OAAO,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;YAClD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,UAAU,GAAG,IAAI;IACxD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,QAAQ,KAAK,IAAI,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC;IAC/B,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe;IAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,eAAe,GAAG,MAAM,OAAO,CACnC,GAAG,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,EAAE,EACnD,KAAK,CACN,CAAC;IACF,IAAI,eAAe;QAAE,OAAO,gBAAgB,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,GAAG,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,EAAE,EAChE,IAAI,CACL,CAAC;IACF,IAAI,SAAS;QAAE,OAAO,WAAW,CAAC;IAElC,MAAM,aAAa,GAAG,MAAM,OAAO,CACjC,GAAG,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAE,EAChD,IAAI,CACL,CAAC;IACF,IAAI,aAAa;QAAE,OAAO,UAAU,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAA6B,EAC7B,OAAwB;IAExB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEpB,0EAA0E;IAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,gBAA6B,CAAC,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC;IACnF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0EAA0E;IAC1E,IAAI,SAAS,GAAsB,IAAI,CAAC;IACxC,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACtD,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,qDAAqD,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,GAAG,GAAG,MAAM,MAAM,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QACpC,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC;IAEnD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3B,aAAa,UAAU,oDAAoD,EAC3E,KAAK,CACN,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,sDAAsD,CAAC,CAAC;YAC7D,IAAI,CAAC,mEAAmE,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,8BAA8B,CAAC;QAClD,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC5B,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,SAAS,GAAG,OAAO,CAAC;YAEpB,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC7E,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gBACrG,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAChE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;qBACjE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;gBAC5D,CAAC,CAAC,CAAC,CAAC;YAEN,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,wBAAwB,YAAY,cAAc,WAAW,WAAW,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACjC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,qCAAqC,CAAC;QACzD,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAChE,SAAS,GAAG,OAAO,CAAC;YAEpB,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC7E,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gBACrG,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAChE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;qBACjE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;gBAC5D,CAAC,CAAC,CAAC,CAAC;YAEN,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,eAAe,OAAO,KAAK,YAAY,cAAc,WAAW,WAAW,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACjC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,MAAM,QAAQ,GAAG,6BAA6B,CAAC;IAC/C,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChC,IAAI,MAAM,EAAE,EAAE,CAAC;QACb,IAAI,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,CAAC;YACnB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC5C,CAAC;IAED,+DAA+D;IAC/D,MAAM,cAAc,GAAG,4BAA4B,CAAC;IACpD,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;QACvF,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;QACjF,IAAI,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAChF,QAAQ,CAAC,mCAAmC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC;gBACH,QAAQ,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9E,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;gBACrC,IAAI,CAAC,oFAAoF,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,0BAA0B;IAC1B,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,gDAAgD,CAAC,CAAC;IAC5D,CAAC;IAED,iDAAiD;IACjD,IAAI,WAAW,GAA2B,IAAI,CAAC;IAC/C,IAAI,SAAS,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QACrE,WAAW,GAAG,MAAM,YAAY,CAC9B,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAC9C,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,CACZ,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,2EAA2E,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,0BAA0B;IAC1B,mBAAmB;IACnB,sCAAsC;IACtC,oEAAoE;IACpE,OAAO;IACP,sBAAsB;IACtB,yDAAyD;IACzD,uCAAuC;IACvC,YAAY;IACZ,2EAA2E;IAC3E,sCAAsC;IACtC,gBAAgB;IAChB,wCAAwC;IACxC,mHAAmH;IACnH,QAAQ;IACR,MAAM;IACN,IAAI;IAEJ,0CAA0C;IAC1C,6CAA6C;IAC7C,mBAAmB;IACnB,qCAAqC;IACrC,uEAAuE;IACvE,OAAO;IACP,qBAAqB;IACrB,sFAAsF;IACtF,iCAAiC;IACjC,MAAM;IACN,IAAI;IAEJ,gBAAgB;IAChB,IAAI,CAAC;QACH,QAAQ,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,EAAE,KAAK,EAAE,CAAC;QACvB,eAAe,CAAC;YACd,IAAI,EAAE,OAAO;YACb,UAAU;YACV,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;YAC1C,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;YAC1C,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;YAC1C,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW;SACvC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,WAAW,EAAE,cAAc,EAAE,CAAC;QACvC,eAAe,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,KAAK,EAAE,CAAC;oBACN,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ;oBACzC,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI;oBACrC,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,OAAO;iBAC5C,CAAC;SACH,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,WAAW,EAAE,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvE,eAAe,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,WAAW;aACvB,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
|