create-hq 10.7.1 → 10.9.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/invite.md +215 -0
- package/commands/promote.md +161 -0
- package/commands/team-sync.md +431 -0
- package/dist/__tests__/auth.test.d.ts +2 -0
- package/dist/__tests__/auth.test.d.ts.map +1 -0
- package/dist/__tests__/auth.test.js +201 -0
- package/dist/__tests__/auth.test.js.map +1 -0
- package/dist/__tests__/scaffold.test.js +14 -1
- package/dist/__tests__/scaffold.test.js.map +1 -1
- package/dist/admin-onboarding.d.ts.map +1 -1
- package/dist/admin-onboarding.js +11 -0
- package/dist/admin-onboarding.js.map +1 -1
- package/dist/auth.d.ts +58 -13
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +105 -29
- package/dist/auth.js.map +1 -1
- package/dist/fetch-template.d.ts +3 -3
- package/dist/fetch-template.d.ts.map +1 -1
- package/dist/fetch-template.js +93 -71
- package/dist/fetch-template.js.map +1 -1
- package/dist/git.d.ts +12 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +40 -20
- package/dist/git.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/join-flow.d.ts.map +1 -1
- package/dist/join-flow.js +11 -0
- package/dist/join-flow.js.map +1 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +48 -13
- package/dist/scaffold.js.map +1 -1
- package/dist/team-setup.d.ts +25 -0
- package/dist/team-setup.d.ts.map +1 -1
- package/dist/team-setup.js +113 -0
- package/dist/team-setup.js.map +1 -1
- package/dist/teams-flow.d.ts +7 -2
- package/dist/teams-flow.d.ts.map +1 -1
- package/dist/teams-flow.js +31 -8
- package/dist/teams-flow.js.map +1 -1
- package/dist/ui.d.ts +3 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +79 -3
- package/dist/ui.js.map +1 -1
- package/package.json +3 -2
- package/dist/art.d.ts +0 -17
- package/dist/art.d.ts.map +0 -1
- package/dist/art.js +0 -171
- package/dist/art.js.map +0 -1
- package/dist/cloud.d.ts +0 -26
- package/dist/cloud.d.ts.map +0 -1
- package/dist/cloud.js +0 -126
- package/dist/cloud.js.map +0 -1
- package/dist/tui.d.ts +0 -8
- package/dist/tui.d.ts.map +0 -1
- package/dist/tui.js +0 -86
- package/dist/tui.js.map +0 -1
package/dist/fetch-template.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import fs from "fs-extra";
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import * as os from "os";
|
|
4
|
-
import {
|
|
4
|
+
import { exec } from "child_process";
|
|
5
|
+
import { promisify } from "util";
|
|
6
|
+
const execAsync = promisify(exec);
|
|
5
7
|
const REPO = "indigoai-us/hq";
|
|
6
|
-
|
|
8
|
+
function formatBytes(bytes) {
|
|
9
|
+
if (bytes < 1024)
|
|
10
|
+
return `${bytes} B`;
|
|
11
|
+
if (bytes < 1024 * 1024)
|
|
12
|
+
return `${(bytes / 1024).toFixed(0)} KB`;
|
|
13
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
14
|
+
}
|
|
7
15
|
const GITHUB_API = "https://api.github.com";
|
|
8
16
|
async function getLatestRelease() {
|
|
9
17
|
const response = await fetch(`${GITHUB_API}/repos/${REPO}/releases/latest`, {
|
|
@@ -12,7 +20,8 @@ async function getLatestRelease() {
|
|
|
12
20
|
if (!response.ok) {
|
|
13
21
|
throw new Error(`GitHub API returned ${response.status}: ${response.statusText}`);
|
|
14
22
|
}
|
|
15
|
-
|
|
23
|
+
const data = (await response.json());
|
|
24
|
+
return data;
|
|
16
25
|
}
|
|
17
26
|
async function getTagRelease(tag) {
|
|
18
27
|
const response = await fetch(`${GITHUB_API}/repos/${REPO}/releases/tags/${tag}`, {
|
|
@@ -21,9 +30,11 @@ async function getTagRelease(tag) {
|
|
|
21
30
|
if (!response.ok) {
|
|
22
31
|
throw new Error(`GitHub API returned ${response.status}: ${response.statusText}`);
|
|
23
32
|
}
|
|
24
|
-
|
|
33
|
+
const data = (await response.json());
|
|
34
|
+
return data;
|
|
25
35
|
}
|
|
26
|
-
async function downloadAndExtractViaApi(tarballUrl, targetDir) {
|
|
36
|
+
async function downloadAndExtractViaApi(tarballUrl, targetDir, onProgress) {
|
|
37
|
+
onProgress?.("Downloading HQ template...");
|
|
27
38
|
const response = await fetch(tarballUrl, {
|
|
28
39
|
headers: { Accept: "application/vnd.github+json" },
|
|
29
40
|
redirect: "follow",
|
|
@@ -31,84 +42,83 @@ async function downloadAndExtractViaApi(tarballUrl, targetDir) {
|
|
|
31
42
|
if (!response.ok) {
|
|
32
43
|
throw new Error(`Failed to download tarball: ${response.status} ${response.statusText}`);
|
|
33
44
|
}
|
|
34
|
-
|
|
35
|
-
const
|
|
45
|
+
// Stream download with progress
|
|
46
|
+
const totalBytes = Number(response.headers.get("content-length")) || 0;
|
|
47
|
+
const chunks = [];
|
|
48
|
+
let downloadedBytes = 0;
|
|
49
|
+
if (response.body) {
|
|
50
|
+
const reader = response.body.getReader();
|
|
51
|
+
while (true) {
|
|
52
|
+
const { done, value } = await reader.read();
|
|
53
|
+
if (done)
|
|
54
|
+
break;
|
|
55
|
+
chunks.push(value);
|
|
56
|
+
downloadedBytes += value.length;
|
|
57
|
+
if (totalBytes > 0) {
|
|
58
|
+
onProgress?.(`Downloading HQ template... ${formatBytes(downloadedBytes)} / ${formatBytes(totalBytes)}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
onProgress?.(`Downloading HQ template... ${formatBytes(downloadedBytes)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Fallback if body stream not available
|
|
67
|
+
const buf = await response.arrayBuffer();
|
|
68
|
+
chunks.push(new Uint8Array(buf));
|
|
69
|
+
}
|
|
70
|
+
const buffer = Buffer.concat(chunks);
|
|
71
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "create-hq-"));
|
|
36
72
|
const tarPath = path.join(tmpDir, "hq.tar.gz");
|
|
37
73
|
try {
|
|
38
|
-
|
|
39
|
-
|
|
74
|
+
onProgress?.("Extracting template...");
|
|
75
|
+
await fs.writeFile(tarPath, buffer);
|
|
76
|
+
await extractTemplateDirFromTar(tarPath, targetDir, onProgress);
|
|
40
77
|
}
|
|
41
78
|
finally {
|
|
42
|
-
fs.
|
|
79
|
+
await fs.remove(tmpDir);
|
|
43
80
|
}
|
|
44
81
|
}
|
|
45
|
-
function extractTemplateDirFromTar(tarPath, targetDir) {
|
|
82
|
+
async function extractTemplateDirFromTar(tarPath, targetDir, onProgress) {
|
|
46
83
|
// The tarball contains a top-level directory like `indigoai-us-hq-<sha>/`
|
|
47
84
|
// We need to find the `template/` subdirectory within that and extract it.
|
|
48
|
-
const tmpExtract = fs.
|
|
85
|
+
const tmpExtract = await fs.mkdtemp(path.join(os.tmpdir(), "create-hq-extract-"));
|
|
49
86
|
try {
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
87
|
+
// Extract the full tarball to a temp location
|
|
88
|
+
await execAsync(`tar -xzf "${tarPath}" -C "${tmpExtract}"`);
|
|
89
|
+
// Find the top-level directory created by GitHub's tarball
|
|
90
|
+
const entries = await fs.readdir(tmpExtract);
|
|
53
91
|
if (entries.length === 0) {
|
|
54
92
|
throw new Error("Tarball was empty");
|
|
55
93
|
}
|
|
56
94
|
const rootDir = path.join(tmpExtract, entries[0]);
|
|
57
95
|
const templateSrc = path.join(rootDir, "template");
|
|
58
|
-
if (!fs.
|
|
96
|
+
if (!await fs.pathExists(templateSrc)) {
|
|
59
97
|
throw new Error("template/ directory not found in HQ tarball");
|
|
60
98
|
}
|
|
61
|
-
|
|
62
|
-
|
|
99
|
+
// Copy template contents to targetDir
|
|
100
|
+
onProgress?.("Copying template files...");
|
|
101
|
+
await fs.ensureDir(targetDir);
|
|
102
|
+
await fs.copy(templateSrc, targetDir, { overwrite: true });
|
|
63
103
|
}
|
|
64
104
|
finally {
|
|
65
|
-
fs.
|
|
105
|
+
await fs.remove(tmpExtract);
|
|
66
106
|
}
|
|
67
107
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
* function is reached.
|
|
73
|
-
*/
|
|
74
|
-
function fetchViaGitClone(targetDir, tag) {
|
|
75
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "create-hq-git-"));
|
|
108
|
+
async function extractTemplateDirViaGhCli(tag, targetDir, onProgress) {
|
|
109
|
+
const ref = tag || "HEAD";
|
|
110
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "create-hq-gh-"));
|
|
111
|
+
const tarPath = path.join(tmpDir, "hq.tar.gz");
|
|
76
112
|
try {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
execSync(`git clone --depth 1 "${REPO_HTTPS}" "${tmpDir}"`, {
|
|
84
|
-
stdio: "pipe",
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
const templateSrc = path.join(tmpDir, "template");
|
|
88
|
-
if (!fs.existsSync(templateSrc)) {
|
|
89
|
-
throw new Error("template/ directory not found in cloned HQ repo");
|
|
90
|
-
}
|
|
91
|
-
fs.ensureDirSync(targetDir);
|
|
92
|
-
fs.copySync(templateSrc, targetDir, { overwrite: true });
|
|
93
|
-
// Best-effort version detection: read the cloned tag, or fall back
|
|
94
|
-
let version = tag || "latest";
|
|
95
|
-
if (!tag) {
|
|
96
|
-
try {
|
|
97
|
-
const described = execSync(`git -C "${tmpDir}" describe --tags --abbrev=0`, {
|
|
98
|
-
stdio: "pipe",
|
|
99
|
-
encoding: "utf-8",
|
|
100
|
-
}).trim();
|
|
101
|
-
if (described)
|
|
102
|
-
version = described;
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// No tags reachable in shallow clone — keep "latest"
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return { version };
|
|
113
|
+
onProgress?.("Downloading via gh CLI...");
|
|
114
|
+
await execAsync(`gh api repos/${REPO}/tarball/${ref} > "${tarPath}"`, {
|
|
115
|
+
shell: "/bin/sh",
|
|
116
|
+
});
|
|
117
|
+
onProgress?.("Extracting template...");
|
|
118
|
+
await extractTemplateDirFromTar(tarPath, targetDir, onProgress);
|
|
109
119
|
}
|
|
110
120
|
finally {
|
|
111
|
-
fs.
|
|
121
|
+
await fs.remove(tmpDir);
|
|
112
122
|
}
|
|
113
123
|
}
|
|
114
124
|
/**
|
|
@@ -116,36 +126,48 @@ function fetchViaGitClone(targetDir, tag) {
|
|
|
116
126
|
*
|
|
117
127
|
* Strategy:
|
|
118
128
|
* 1. GitHub REST API → download tarball_url
|
|
119
|
-
* 2. Fallback:
|
|
120
|
-
* 3. If both fail: throw with manual instructions
|
|
129
|
+
* 2. Fallback: gh CLI (`gh api repos/indigoai-us/hq/tarball/{ref}`)
|
|
130
|
+
* 3. If both fail: throw with manual clone instructions
|
|
121
131
|
*
|
|
122
132
|
* Returns the version tag that was fetched.
|
|
123
133
|
*/
|
|
124
|
-
export async function fetchTemplate(targetDir, tag) {
|
|
134
|
+
export async function fetchTemplate(targetDir, tag, onProgress) {
|
|
125
135
|
let version = tag || "";
|
|
136
|
+
let tarballUrl = "";
|
|
126
137
|
let apiError = null;
|
|
127
138
|
// --- Attempt 1: GitHub API ---
|
|
128
139
|
try {
|
|
140
|
+
onProgress?.("Resolving latest release...");
|
|
129
141
|
const release = tag ? await getTagRelease(tag) : await getLatestRelease();
|
|
130
142
|
version = release.tag_name;
|
|
131
|
-
|
|
143
|
+
tarballUrl = release.tarball_url;
|
|
144
|
+
await downloadAndExtractViaApi(tarballUrl, targetDir, onProgress);
|
|
132
145
|
return { version };
|
|
133
146
|
}
|
|
134
147
|
catch (err) {
|
|
135
148
|
apiError = err;
|
|
136
149
|
}
|
|
137
|
-
// --- Attempt 2:
|
|
150
|
+
// --- Attempt 2: gh CLI fallback ---
|
|
138
151
|
try {
|
|
139
|
-
|
|
152
|
+
const ref = tag || "HEAD";
|
|
153
|
+
await extractTemplateDirViaGhCli(ref, targetDir, onProgress);
|
|
154
|
+
// If we got a version from the API response (even if download failed later), keep it.
|
|
155
|
+
// Otherwise mark as unknown.
|
|
156
|
+
if (!version) {
|
|
157
|
+
version = tag || "latest";
|
|
158
|
+
}
|
|
159
|
+
return { version };
|
|
140
160
|
}
|
|
141
|
-
catch (
|
|
161
|
+
catch (ghErr) {
|
|
162
|
+
// Both failed — provide a clear error message.
|
|
142
163
|
const apiMsg = apiError instanceof Error ? apiError.message : String(apiError);
|
|
143
|
-
const
|
|
164
|
+
const ghMsg = ghErr instanceof Error ? ghErr.message : String(ghErr);
|
|
144
165
|
throw new Error(`Failed to fetch HQ template from GitHub.\n\n` +
|
|
145
166
|
` GitHub API error: ${apiMsg}\n` +
|
|
146
|
-
`
|
|
147
|
-
`
|
|
148
|
-
`
|
|
167
|
+
` gh CLI error: ${ghMsg}\n\n` +
|
|
168
|
+
`You appear to be offline or rate-limited.\n` +
|
|
169
|
+
`To set up HQ manually, clone the repo and copy the template directory:\n\n` +
|
|
170
|
+
` git clone https://github.com/indigoai-us/hq.git\n` +
|
|
149
171
|
` cp -R hq/template ${targetDir}\n`);
|
|
150
172
|
}
|
|
151
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-template.js","sourceRoot":"","sources":["../src/fetch-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch-template.js","sourceRoot":"","sources":["../src/fetch-template.ts"],"names":[],"mappings":"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"}
|
package/dist/git.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface GitInitResult {
|
|
2
|
+
initialized: boolean;
|
|
3
|
+
committed: boolean;
|
|
4
|
+
error?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function initGit(dir: string): Promise<GitInitResult>;
|
|
2
7
|
export declare function hasGit(): boolean;
|
|
8
|
+
export declare function hasGitUser(): {
|
|
9
|
+
name: string | null;
|
|
10
|
+
email: string | null;
|
|
11
|
+
};
|
|
12
|
+
export declare function configureGitUser(name: string, email: string): Promise<void>;
|
|
13
|
+
export declare function gitCommit(dir: string, message: string): Promise<boolean>;
|
|
3
14
|
//# sourceMappingURL=git.d.ts.map
|
package/dist/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsBjE;AAED,wBAAgB,MAAM,IAAI,OAAO,CAOhC;AAED,wBAAgB,UAAU,IAAI;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAU1E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9E"}
|
package/dist/git.js
CHANGED
|
@@ -1,34 +1,28 @@
|
|
|
1
|
-
import { execSync } from "child_process";
|
|
2
|
-
|
|
1
|
+
import { execSync, exec } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export async function initGit(dir) {
|
|
3
5
|
try {
|
|
4
|
-
|
|
5
|
-
execSync(`git config ${key}`, { cwd, stdio: "pipe" });
|
|
6
|
-
return true;
|
|
6
|
+
await execAsync("git init", { cwd: dir });
|
|
7
7
|
}
|
|
8
8
|
catch {
|
|
9
|
-
return false;
|
|
9
|
+
return { initialized: false, committed: false, error: "git init failed" };
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
execSync("git init", { cwd: dir, stdio: "pipe" });
|
|
14
|
-
// Ensure user.email and user.name are set — use local config if global is missing
|
|
15
|
-
if (!hasGitConfig("user.email", dir)) {
|
|
16
|
-
execSync('git config user.email "hq-user@localhost"', { cwd: dir, stdio: "pipe" });
|
|
11
|
+
try {
|
|
12
|
+
await execAsync("git add -A", { cwd: dir });
|
|
17
13
|
}
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
catch {
|
|
15
|
+
return { initialized: true, committed: false, error: "git add failed" };
|
|
20
16
|
}
|
|
21
|
-
execSync("git add -A", { cwd: dir, stdio: "pipe" });
|
|
22
17
|
try {
|
|
23
|
-
|
|
18
|
+
await execAsync('git commit -m "Initial HQ setup via create-hq"', {
|
|
24
19
|
cwd: dir,
|
|
25
|
-
stdio: "pipe",
|
|
26
20
|
});
|
|
21
|
+
return { initialized: true, committed: true };
|
|
27
22
|
}
|
|
28
23
|
catch (err) {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
throw new Error(`git commit failed: ${stderr || stdout || err.message}`);
|
|
24
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
25
|
+
return { initialized: true, committed: false, error: msg };
|
|
32
26
|
}
|
|
33
27
|
}
|
|
34
28
|
export function hasGit() {
|
|
@@ -40,4 +34,30 @@ export function hasGit() {
|
|
|
40
34
|
return false;
|
|
41
35
|
}
|
|
42
36
|
}
|
|
37
|
+
export function hasGitUser() {
|
|
38
|
+
let name = null;
|
|
39
|
+
let email = null;
|
|
40
|
+
try {
|
|
41
|
+
name = execSync("git config user.name", { stdio: "pipe", encoding: "utf-8" }).trim() || null;
|
|
42
|
+
}
|
|
43
|
+
catch { /* not configured */ }
|
|
44
|
+
try {
|
|
45
|
+
email = execSync("git config user.email", { stdio: "pipe", encoding: "utf-8" }).trim() || null;
|
|
46
|
+
}
|
|
47
|
+
catch { /* not configured */ }
|
|
48
|
+
return { name, email };
|
|
49
|
+
}
|
|
50
|
+
export async function configureGitUser(name, email) {
|
|
51
|
+
await execAsync(`git config --global user.name "${name}"`);
|
|
52
|
+
await execAsync(`git config --global user.email "${email}"`);
|
|
53
|
+
}
|
|
54
|
+
export async function gitCommit(dir, message) {
|
|
55
|
+
try {
|
|
56
|
+
await execAsync(`git commit -m "${message}"`, { cwd: dir });
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
43
63
|
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/join-flow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-flow.d.ts","sourceRoot":"","sources":["../src/join-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"join-flow.d.ts","sourceRoot":"","sources":["../src/join-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAY5C,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAwED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAwIpC"}
|
package/dist/join-flow.js
CHANGED
|
@@ -18,6 +18,7 @@ import chalk from "chalk";
|
|
|
18
18
|
import { ensureCompanyStructure } from "./company-template.js";
|
|
19
19
|
import { stepStatus, success, warn, info, step } from "./ui.js";
|
|
20
20
|
import { decodeInviteToken, checkRepoAccess, } from "./invite.js";
|
|
21
|
+
import { linkTeamCommands, installTeamCommands } from "./team-setup.js";
|
|
21
22
|
// ─── Prompt helpers ─────────────────────────────────────────────────────────
|
|
22
23
|
function prompt(question, defaultVal) {
|
|
23
24
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -180,6 +181,16 @@ export async function runJoinByInvite(auth, hqRoot, token) {
|
|
|
180
181
|
return null;
|
|
181
182
|
}
|
|
182
183
|
}
|
|
184
|
+
// Install bundled team commands (invite, sync, promote)
|
|
185
|
+
const installed = installTeamCommands(hqRoot);
|
|
186
|
+
if (installed.length > 0) {
|
|
187
|
+
info(`Installed ${installed.length} team command${installed.length === 1 ? "" : "s"}: ${installed.join(", ")}`);
|
|
188
|
+
}
|
|
189
|
+
// Link team-distributed commands as slash commands
|
|
190
|
+
const symlinks = linkTeamCommands(hqRoot, payload.slug);
|
|
191
|
+
if (symlinks.linked.length > 0) {
|
|
192
|
+
info(`Linked ${symlinks.linked.length} team command${symlinks.linked.length === 1 ? "" : "s"}`);
|
|
193
|
+
}
|
|
183
194
|
const repoUrl = `https://github.com/${payload.org}/${payload.repo}`;
|
|
184
195
|
console.log();
|
|
185
196
|
success(`Joined ${payload.teamName}!`);
|
package/dist/join-flow.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"join-flow.js","sourceRoot":"","sources":["../src/join-flow.ts"],"names":[],"mappings":"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"}
|
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":"AA8BA,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,CAuRf"}
|
package/dist/scaffold.js
CHANGED
|
@@ -3,10 +3,12 @@ import fs from "fs-extra";
|
|
|
3
3
|
import { createInterface } from "readline";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
-
import { banner, success, warn, info, nextSteps, stepStatus, teamOrientation, } from "./ui.js";
|
|
6
|
+
import { banner, success, warn, info, nextSteps, stepStatus, updateSpinnerText, teamOrientation, } from "./ui.js";
|
|
7
7
|
import { checkDeps } from "./deps.js";
|
|
8
|
-
import { initGit, hasGit } from "./git.js";
|
|
9
|
-
import {
|
|
8
|
+
import { initGit, hasGit, hasGitUser, configureGitUser, gitCommit } from "./git.js";
|
|
9
|
+
import { exec } from "child_process";
|
|
10
|
+
import { promisify } from "util";
|
|
11
|
+
const execAsync = promisify(exec);
|
|
10
12
|
import { fetchTemplate } from "./fetch-template.js";
|
|
11
13
|
import { detectExistingSync } from "./cloud-sync.js";
|
|
12
14
|
import { runTeamsFlow, authenticate } from "./teams-flow.js";
|
|
@@ -136,7 +138,9 @@ export async function scaffold(directory, options) {
|
|
|
136
138
|
const fetchLabel = "Fetching HQ template from GitHub...";
|
|
137
139
|
stepStatus(fetchLabel, "running");
|
|
138
140
|
try {
|
|
139
|
-
const { version } = await fetchTemplate(targetDir, options.tag)
|
|
141
|
+
const { version } = await fetchTemplate(targetDir, options.tag, (phase) => {
|
|
142
|
+
updateSpinnerText(fetchLabel, phase);
|
|
143
|
+
});
|
|
140
144
|
hqVersion = version;
|
|
141
145
|
const commandCount = fs.existsSync(path.join(targetDir, ".claude", "commands"))
|
|
142
146
|
? fs.readdirSync(path.join(targetDir, ".claude", "commands")).filter((f) => f.endsWith(".md")).length
|
|
@@ -157,13 +161,42 @@ export async function scaffold(directory, options) {
|
|
|
157
161
|
const gitLabel = "Initializing git repository";
|
|
158
162
|
stepStatus(gitLabel, "running");
|
|
159
163
|
if (hasGit()) {
|
|
160
|
-
|
|
161
|
-
|
|
164
|
+
const gitResult = await initGit(targetDir);
|
|
165
|
+
if (gitResult.committed) {
|
|
162
166
|
stepStatus(gitLabel, "done");
|
|
163
167
|
}
|
|
164
|
-
|
|
168
|
+
else if (gitResult.initialized) {
|
|
169
|
+
stepStatus(gitLabel, "done");
|
|
170
|
+
const gitUser = hasGitUser();
|
|
171
|
+
if (!gitUser.name || !gitUser.email) {
|
|
172
|
+
info("Git needs your name and email for commits");
|
|
173
|
+
const userName = await prompt("Your name", gitUser.name || "");
|
|
174
|
+
const userEmail = await prompt("Your email", gitUser.email || "");
|
|
175
|
+
if (userName && userEmail) {
|
|
176
|
+
const configLabel = "Configuring git";
|
|
177
|
+
stepStatus(configLabel, "running");
|
|
178
|
+
await configureGitUser(userName, userEmail);
|
|
179
|
+
stepStatus(configLabel, "done");
|
|
180
|
+
const commitLabel = "Creating initial commit";
|
|
181
|
+
stepStatus(commitLabel, "running");
|
|
182
|
+
const committed = await gitCommit(targetDir, "Initial HQ setup via create-hq");
|
|
183
|
+
if (committed) {
|
|
184
|
+
stepStatus(commitLabel, "done");
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
stepStatus(commitLabel, "failed");
|
|
188
|
+
info("You can commit later: " + chalk.dim(`cd ${displayDir} && git add -A && git commit -m "Initial HQ setup"`));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
warn("Git repo initialized but initial commit failed");
|
|
194
|
+
info("You can commit later: " + chalk.dim(`cd ${displayDir} && git add -A && git commit -m "Initial HQ setup"`));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
165
198
|
stepStatus(gitLabel, "failed");
|
|
166
|
-
warn(
|
|
199
|
+
warn("Git initialization failed — you can set it up later");
|
|
167
200
|
}
|
|
168
201
|
}
|
|
169
202
|
else {
|
|
@@ -177,9 +210,9 @@ export async function scaffold(directory, options) {
|
|
|
177
210
|
const computeChecksumsScript = path.join(targetDir, "scripts", "compute-checksums.sh");
|
|
178
211
|
const coreIntegrityScript = path.join(targetDir, "scripts", "core-integrity.sh");
|
|
179
212
|
if (fs.existsSync(computeChecksumsScript) && fs.existsSync(coreIntegrityScript)) {
|
|
180
|
-
|
|
213
|
+
await execAsync("bash scripts/compute-checksums.sh", { cwd: targetDir });
|
|
181
214
|
try {
|
|
182
|
-
|
|
215
|
+
await execAsync("bash scripts/core-integrity.sh", { cwd: targetDir });
|
|
183
216
|
stepStatus(integrityLabel, "done");
|
|
184
217
|
}
|
|
185
218
|
catch {
|
|
@@ -238,12 +271,14 @@ export async function scaffold(directory, options) {
|
|
|
238
271
|
// }
|
|
239
272
|
// }
|
|
240
273
|
// 11. qmd index
|
|
274
|
+
const indexLabel = "Indexing HQ for search";
|
|
275
|
+
stepStatus(indexLabel, "running");
|
|
241
276
|
try {
|
|
242
|
-
|
|
243
|
-
|
|
277
|
+
await execAsync("qmd index .", { cwd: targetDir });
|
|
278
|
+
stepStatus(indexLabel, "done");
|
|
244
279
|
}
|
|
245
280
|
catch {
|
|
246
|
-
|
|
281
|
+
stepStatus(indexLabel, "failed");
|
|
247
282
|
}
|
|
248
283
|
// 12. Orientation
|
|
249
284
|
console.log();
|