create-hq 10.0.0 → 10.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/admin-onboarding.d.ts +42 -0
  2. package/dist/admin-onboarding.d.ts.map +1 -0
  3. package/dist/admin-onboarding.js +445 -0
  4. package/dist/admin-onboarding.js.map +1 -0
  5. package/dist/auth.d.ts +60 -23
  6. package/dist/auth.d.ts.map +1 -1
  7. package/dist/auth.js +219 -116
  8. package/dist/auth.js.map +1 -1
  9. package/dist/company-template.d.ts +34 -0
  10. package/dist/company-template.d.ts.map +1 -0
  11. package/dist/company-template.js +142 -0
  12. package/dist/company-template.js.map +1 -0
  13. package/dist/deps.d.ts +2 -0
  14. package/dist/deps.d.ts.map +1 -1
  15. package/dist/deps.js +41 -25
  16. package/dist/deps.js.map +1 -1
  17. package/dist/fetch-template.d.ts +2 -2
  18. package/dist/fetch-template.d.ts.map +1 -1
  19. package/dist/fetch-template.js +54 -38
  20. package/dist/fetch-template.js.map +1 -1
  21. package/dist/git.d.ts.map +1 -1
  22. package/dist/git.js +28 -4
  23. package/dist/git.js.map +1 -1
  24. package/dist/index.js +19 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/invite-command.d.ts +10 -0
  27. package/dist/invite-command.d.ts.map +1 -0
  28. package/dist/invite-command.js +110 -0
  29. package/dist/invite-command.js.map +1 -0
  30. package/dist/invite.d.ts +91 -0
  31. package/dist/invite.d.ts.map +1 -0
  32. package/dist/invite.js +230 -0
  33. package/dist/invite.js.map +1 -0
  34. package/dist/join-flow.d.ts +32 -0
  35. package/dist/join-flow.d.ts.map +1 -0
  36. package/dist/join-flow.js +194 -0
  37. package/dist/join-flow.js.map +1 -0
  38. package/dist/platform.d.ts +2 -2
  39. package/dist/platform.d.ts.map +1 -1
  40. package/dist/platform.js +14 -1
  41. package/dist/platform.js.map +1 -1
  42. package/dist/scaffold.d.ts +4 -1
  43. package/dist/scaffold.d.ts.map +1 -1
  44. package/dist/scaffold.js +152 -35
  45. package/dist/scaffold.js.map +1 -1
  46. package/dist/team-setup.d.ts +58 -0
  47. package/dist/team-setup.d.ts.map +1 -0
  48. package/dist/team-setup.js +237 -0
  49. package/dist/team-setup.js.map +1 -0
  50. package/dist/teams-flow.d.ts +36 -0
  51. package/dist/teams-flow.d.ts.map +1 -0
  52. package/dist/teams-flow.js +134 -0
  53. package/dist/teams-flow.js.map +1 -0
  54. package/dist/ui.d.ts +17 -0
  55. package/dist/ui.d.ts.map +1 -1
  56. package/dist/ui.js +36 -1
  57. package/dist/ui.js.map +1 -1
  58. package/package.json +49 -49
package/dist/auth.js CHANGED
@@ -1,44 +1,56 @@
1
1
  /**
2
- * Auth utilities for create-hq OAuth PKCE flow for Clerk (US-008)
2
+ * GitHub App device flow auth for create-hq.
3
3
  *
4
- * Reuses the same patterns as hq-cli/src/utils/auth.ts and
5
- * hq-cli/src/utils/token-store.ts but bundled inline so create-hq
6
- * has no dependency on @indigoai-us/hq-cli.
4
+ * Talks directly to github.com no backend involved.
5
+ *
6
+ * Flow:
7
+ * 1. POST github.com/login/device/code with our App's client_id
8
+ * 2. Display user_code, open verification_uri in browser
9
+ * 3. Poll github.com/login/oauth/access_token at the GitHub-specified interval
10
+ * 4. On success: GET api.github.com/user → store { access_token, login, id, name, email }
11
+ *
12
+ * Token is stored at ~/.hq/credentials.json (mode 0600). Tokens are
13
+ * GitHub App user-to-server tokens (ghu_…), so they ignore OAuth scopes —
14
+ * permissions are configured on the App settings page.
7
15
  *
8
16
  * Token values are NEVER written to stdout or logs.
9
17
  */
10
- import * as crypto from "crypto";
11
- import * as http from "http";
12
18
  import * as fs from "fs";
13
19
  import * as path from "path";
14
20
  import * as os from "os";
15
21
  import { exec } from "child_process";
22
+ import chalk from "chalk";
23
+ // ─── Constants ──────────────────────────────────────────────────────────────
24
+ /** hq-team-sync GitHub App client ID (public — safe to commit). */
25
+ export const HQ_GITHUB_APP_CLIENT_ID = "Iv23liSdkCBQYhrNcRmI";
26
+ export const HQ_GITHUB_APP_SLUG = "hq-team-sync";
27
+ const GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
28
+ const GITHUB_TOKEN_URL = "https://github.com/login/oauth/access_token";
29
+ const GITHUB_API_USER_URL = "https://api.github.com/user";
16
30
  const HQ_DIR = path.join(os.homedir(), ".hq");
17
- const AUTH_FILE = path.join(HQ_DIR, "auth.json");
18
- // ─── Token store ─────────────────────────────────────────────────────────────
31
+ const CREDENTIALS_FILE = path.join(HQ_DIR, "credentials.json");
32
+ // ─── Token store ────────────────────────────────────────────────────────────
19
33
  function ensureHqDir() {
20
34
  if (!fs.existsSync(HQ_DIR)) {
21
35
  fs.mkdirSync(HQ_DIR, { recursive: true, mode: 0o700 });
22
36
  }
23
37
  }
24
- /** Save auth token to ~/.hq/auth.json with 0600 permissions. */
25
- export function saveToken(token) {
38
+ /** Save credentials to ~/.hq/credentials.json with 0600 perms. */
39
+ export function saveGitHubAuth(auth) {
26
40
  ensureHqDir();
27
- const content = JSON.stringify(token, null, 2);
28
- fs.writeFileSync(AUTH_FILE, content, { mode: 0o600 });
41
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(auth, null, 2), {
42
+ mode: 0o600,
43
+ });
29
44
  }
30
- /** Load auth token from ~/.hq/auth.json. Returns null if missing/invalid. */
31
- export function loadToken() {
45
+ /** Load credentials, or null if missing/invalid. */
46
+ export function loadGitHubAuth() {
32
47
  try {
33
- if (!fs.existsSync(AUTH_FILE)) {
48
+ if (!fs.existsSync(CREDENTIALS_FILE))
34
49
  return null;
35
- }
36
- const content = fs.readFileSync(AUTH_FILE, "utf-8");
37
- const parsed = JSON.parse(content);
38
- if (typeof parsed.clerk_session_token !== "string" ||
39
- typeof parsed.user_id !== "string" ||
40
- typeof parsed.email !== "string" ||
41
- typeof parsed.expires_at !== "string") {
50
+ const parsed = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, "utf-8"));
51
+ if (typeof parsed.access_token !== "string" ||
52
+ typeof parsed.login !== "string" ||
53
+ typeof parsed.id !== "number") {
42
54
  return null;
43
55
  }
44
56
  return parsed;
@@ -47,110 +59,201 @@ export function loadToken() {
47
59
  return null;
48
60
  }
49
61
  }
50
- /** Check if a token is expired or within 5 minutes of expiry. */
51
- export function isTokenExpired(token) {
52
- const expiresAt = new Date(token.expires_at).getTime();
53
- const bufferMs = 5 * 60 * 1000;
54
- return Date.now() >= expiresAt - bufferMs;
55
- }
56
- // ─── PKCE helpers ────────────────────────────────────────────────────────────
57
- function generateCodeVerifier() {
58
- return crypto.randomBytes(32).toString("base64url");
62
+ /** Remove stored credentials. */
63
+ export function clearGitHubAuth() {
64
+ try {
65
+ if (fs.existsSync(CREDENTIALS_FILE)) {
66
+ fs.unlinkSync(CREDENTIALS_FILE);
67
+ }
68
+ }
69
+ catch {
70
+ // ignore
71
+ }
59
72
  }
60
- function generateCodeChallenge(verifier) {
61
- return crypto.createHash("sha256").update(verifier).digest("base64url");
73
+ /**
74
+ * Quick liveness probe — does the stored token still work?
75
+ * Calls api.github.com/user with the token; returns true on 200.
76
+ */
77
+ export async function isGitHubAuthValid(auth) {
78
+ try {
79
+ const res = await fetch(GITHUB_API_USER_URL, {
80
+ headers: {
81
+ Authorization: `token ${auth.access_token}`,
82
+ Accept: "application/vnd.github+json",
83
+ "User-Agent": "create-hq",
84
+ },
85
+ signal: AbortSignal.timeout(10_000),
86
+ });
87
+ return res.ok;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
62
92
  }
63
- function openBrowser(url) {
64
- const command = process.platform === "darwin" ? `open "${url}"` : `xdg-open "${url}"`;
93
+ // ─── Browser open (cross-platform) ──────────────────────────────────────────
94
+ /** Open a URL in the user's default browser. Best-effort, never throws. */
95
+ export function openBrowser(url) {
96
+ let command;
97
+ if (process.platform === "darwin") {
98
+ command = `open "${url}"`;
99
+ }
100
+ else if (process.platform === "win32") {
101
+ // Windows: `start` is a cmd.exe builtin. The empty quotes are the
102
+ // window title argument (start treats the first quoted arg as title).
103
+ command = `start "" "${url}"`;
104
+ }
105
+ else {
106
+ command = `xdg-open "${url}"`;
107
+ }
65
108
  exec(command, (err) => {
66
109
  if (err) {
67
- console.error(`Could not open browser automatically. Please visit:\n ${url}`);
110
+ console.error(chalk.dim(` (could not open browser automatically visit ${url} manually)`));
68
111
  }
69
112
  });
70
113
  }
71
- // ─── Auth flow ───────────────────────────────────────────────────────────────
114
+ // ─── Device flow ────────────────────────────────────────────────────────────
115
+ function sleep(ms) {
116
+ return new Promise((resolve) => setTimeout(resolve, ms));
117
+ }
72
118
  /**
73
- * Start the OAuth PKCE auth flow:
74
- * 1. Generate PKCE code_verifier + code_challenge
75
- * 2. Start local HTTP server on a random port for the callback
76
- * 3. Open browser to Clerk auth URL
77
- * 4. Wait for callback with auth code
78
- * 5. Exchange code for token via registry /auth/token endpoint
79
- * 6. Save token and return AuthToken
119
+ * Run the GitHub App device authorization flow.
120
+ *
121
+ * Throws on:
122
+ * - Network errors talking to github.com
123
+ * - User-denied authorization (access_denied)
124
+ * - Device code expiration
125
+ * - Failure to fetch the user profile
80
126
  */
81
- export async function startAuthFlow(registryUrl) {
82
- const codeVerifier = generateCodeVerifier();
83
- const codeChallenge = generateCodeChallenge(codeVerifier);
84
- return new Promise((resolve, reject) => {
85
- const server = http.createServer(async (req, res) => {
86
- try {
87
- const url = new URL(req.url ?? "/", "http://localhost");
88
- if (url.pathname !== "/callback") {
89
- res.writeHead(404);
90
- res.end("Not found");
91
- return;
92
- }
93
- const code = url.searchParams.get("code");
94
- const error = url.searchParams.get("error");
95
- if (error) {
96
- res.writeHead(200, { "Content-Type": "text/html" });
97
- res.end("<html><body><h2>Authentication failed</h2><p>You can close this window.</p></body></html>");
98
- server.close();
99
- reject(new Error(`Auth failed: ${error}`));
100
- return;
101
- }
102
- if (!code) {
103
- res.writeHead(400, { "Content-Type": "text/html" });
104
- res.end("<html><body><h2>Missing auth code</h2><p>You can close this window.</p></body></html>");
105
- server.close();
106
- reject(new Error("No authorization code received"));
107
- return;
108
- }
109
- // Exchange code for token
110
- const tokenResponse = await fetch(`${registryUrl}/auth/token`, {
111
- method: "POST",
112
- headers: { "Content-Type": "application/json" },
113
- body: JSON.stringify({
114
- code,
115
- code_verifier: codeVerifier,
116
- redirect_uri: `http://localhost:${server.address().port}/callback`,
117
- }),
118
- });
119
- if (!tokenResponse.ok) {
120
- const body = await tokenResponse.text();
121
- res.writeHead(200, { "Content-Type": "text/html" });
122
- res.end("<html><body><h2>Token exchange failed</h2><p>You can close this window.</p></body></html>");
123
- server.close();
124
- reject(new Error(`Token exchange failed (${tokenResponse.status}): ${body}`));
125
- return;
126
- }
127
- const tokenData = (await tokenResponse.json());
128
- // Save token to ~/.hq/auth.json
129
- saveToken(tokenData);
130
- res.writeHead(200, { "Content-Type": "text/html" });
131
- res.end("<html><body><h2>Authenticated!</h2><p>You can close this window and return to the terminal.</p></body></html>");
132
- server.close();
133
- resolve(tokenData);
134
- }
135
- catch (err) {
136
- server.close();
137
- reject(err);
138
- }
139
- });
140
- // Listen on random port
141
- server.listen(0, "127.0.0.1", () => {
142
- const addr = server.address();
143
- const redirectUri = `http://localhost:${addr.port}/callback`;
144
- const authUrl = `${registryUrl}/auth/login?redirect_uri=${encodeURIComponent(redirectUri)}&code_challenge=${codeChallenge}&code_challenge_method=S256`;
145
- console.log(" Opening browser for authentication...");
146
- openBrowser(authUrl);
147
- console.log(`\n If the browser doesn't open, visit:\n ${authUrl}\n`);
127
+ export async function startGitHubDeviceFlow() {
128
+ // 1. Request a device code
129
+ const deviceRes = await fetch(GITHUB_DEVICE_CODE_URL, {
130
+ method: "POST",
131
+ headers: {
132
+ Accept: "application/json",
133
+ "Content-Type": "application/json",
134
+ "User-Agent": "create-hq",
135
+ },
136
+ body: JSON.stringify({
137
+ client_id: HQ_GITHUB_APP_CLIENT_ID,
138
+ }),
139
+ signal: AbortSignal.timeout(15_000),
140
+ });
141
+ if (!deviceRes.ok) {
142
+ const body = await deviceRes.text().catch(() => "");
143
+ throw new Error(`GitHub device code request failed (${deviceRes.status}): ${body}`);
144
+ }
145
+ const device = (await deviceRes.json());
146
+ // 2. Display the code and open the browser
147
+ console.log();
148
+ console.log(chalk.bold(" Sign in with GitHub"));
149
+ console.log();
150
+ console.log(` Open this URL in your browser:`);
151
+ console.log(` ${chalk.cyan(device.verification_uri)}`);
152
+ console.log();
153
+ console.log(` Enter this code: ${chalk.bold.white(device.user_code)}`);
154
+ console.log();
155
+ console.log(chalk.dim(" Waiting for authorization..."));
156
+ openBrowser(device.verification_uri);
157
+ // 3. Poll for token
158
+ let pollInterval = Math.max((device.interval ?? 5) * 1000, 5000);
159
+ const expiresAt = Date.now() + (device.expires_in ?? 900) * 1000;
160
+ while (Date.now() < expiresAt) {
161
+ await sleep(pollInterval);
162
+ let tokenRes;
163
+ try {
164
+ tokenRes = await fetch(GITHUB_TOKEN_URL, {
165
+ method: "POST",
166
+ headers: {
167
+ Accept: "application/json",
168
+ "Content-Type": "application/json",
169
+ "User-Agent": "create-hq",
170
+ },
171
+ body: JSON.stringify({
172
+ client_id: HQ_GITHUB_APP_CLIENT_ID,
173
+ device_code: device.device_code,
174
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
175
+ }),
176
+ signal: AbortSignal.timeout(15_000),
177
+ });
178
+ }
179
+ catch {
180
+ // Network blip — keep polling
181
+ continue;
182
+ }
183
+ const data = (await tokenRes.json().catch(() => ({})));
184
+ if (data.error === "authorization_pending")
185
+ continue;
186
+ if (data.error === "slow_down") {
187
+ // Per spec: increase polling interval by at least 5 seconds
188
+ const bump = (data.interval ?? 5) * 1000;
189
+ pollInterval = Math.max(pollInterval + bump, pollInterval + 5000);
190
+ continue;
191
+ }
192
+ if (data.error === "expired_token") {
193
+ throw new Error("GitHub device code expired please run create-hq again");
194
+ }
195
+ if (data.error === "access_denied") {
196
+ throw new Error("Authorization was denied");
197
+ }
198
+ if (data.error) {
199
+ throw new Error(`GitHub auth error: ${data.error}${data.error_description ? ` — ${data.error_description}` : ""}`);
200
+ }
201
+ if (!data.access_token) {
202
+ throw new Error("GitHub returned no access_token");
203
+ }
204
+ // 4. Fetch the authenticated user profile
205
+ const userRes = await fetch(GITHUB_API_USER_URL, {
206
+ headers: {
207
+ Authorization: `token ${data.access_token}`,
208
+ Accept: "application/vnd.github+json",
209
+ "User-Agent": "create-hq",
210
+ },
211
+ signal: AbortSignal.timeout(15_000),
148
212
  });
149
- // Timeout after 2 minutes
150
- setTimeout(() => {
151
- server.close();
152
- reject(new Error("Authentication timed out after 2 minutes"));
153
- }, 120_000);
213
+ if (!userRes.ok) {
214
+ const body = await userRes.text().catch(() => "");
215
+ throw new Error(`Failed to fetch GitHub user (${userRes.status}): ${body}`);
216
+ }
217
+ const user = (await userRes.json());
218
+ const auth = {
219
+ access_token: data.access_token,
220
+ login: user.login,
221
+ id: user.id,
222
+ name: user.name,
223
+ email: user.email,
224
+ issued_at: new Date().toISOString(),
225
+ };
226
+ saveGitHubAuth(auth);
227
+ return auth;
228
+ }
229
+ throw new Error("GitHub device flow timed out — please try again");
230
+ }
231
+ // ─── GitHub API helpers used by downstream flows ────────────────────────────
232
+ /**
233
+ * Authenticated fetch against api.github.com. Throws on non-2xx with
234
+ * the response body included for diagnostics.
235
+ */
236
+ export async function githubApi(pathname, auth, init = {}) {
237
+ const url = pathname.startsWith("https://")
238
+ ? pathname
239
+ : `https://api.github.com${pathname.startsWith("/") ? "" : "/"}${pathname}`;
240
+ const res = await fetch(url, {
241
+ ...init,
242
+ headers: {
243
+ Authorization: `token ${auth.access_token}`,
244
+ Accept: "application/vnd.github+json",
245
+ "User-Agent": "create-hq",
246
+ ...(init.headers || {}),
247
+ },
248
+ signal: init.signal ?? AbortSignal.timeout(20_000),
154
249
  });
250
+ if (!res.ok) {
251
+ const body = await res.text().catch(() => "");
252
+ throw new Error(`GitHub API ${res.status} ${pathname}: ${body}`);
253
+ }
254
+ // Some endpoints return 204
255
+ if (res.status === 204)
256
+ return undefined;
257
+ return (await res.json());
155
258
  }
156
259
  //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Company / team-repo template generator.
3
+ *
4
+ * When an admin creates a new team, we need to seed the new {org}/hq private
5
+ * repo with a baseline directory structure that mirrors what /newcompany
6
+ * produces. This module renders that structure into a target directory
7
+ * (which is then committed and pushed to the new GitHub repo).
8
+ *
9
+ * No filesystem dependencies on the core HQ template — these files are
10
+ * synthesized in code so the seed is version-locked with the create-hq
11
+ * release the user just installed.
12
+ */
13
+ export interface TeamMetadata {
14
+ team_id: string;
15
+ team_name: string;
16
+ team_slug: string;
17
+ org_login: string;
18
+ org_id: number;
19
+ created_by: string;
20
+ created_at: string;
21
+ hq_version: string;
22
+ }
23
+ /**
24
+ * Render the company template into targetDir. Creates the directory if it
25
+ * does not exist. Will not overwrite existing files (idempotent on re-runs).
26
+ */
27
+ export declare function writeCompanyTemplate(targetDir: string, meta: TeamMetadata): void;
28
+ /**
29
+ * Ensure all standard company subdirectories exist inside targetDir
30
+ * without overwriting any existing files. Used after cloning a team repo
31
+ * to fill in any directories the upstream repo doesn't have yet.
32
+ */
33
+ export declare function ensureCompanyStructure(targetDir: string): void;
34
+ //# sourceMappingURL=company-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-template.d.ts","sourceRoot":"","sources":["../src/company-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0ED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,IAAI,CA6CN;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAO9D"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Company / team-repo template generator.
3
+ *
4
+ * When an admin creates a new team, we need to seed the new {org}/hq private
5
+ * repo with a baseline directory structure that mirrors what /newcompany
6
+ * produces. This module renders that structure into a target directory
7
+ * (which is then committed and pushed to the new GitHub repo).
8
+ *
9
+ * No filesystem dependencies on the core HQ template — these files are
10
+ * synthesized in code so the seed is version-locked with the create-hq
11
+ * release the user just installed.
12
+ */
13
+ import * as fs from "fs";
14
+ import * as path from "path";
15
+ const COMPANY_SUBDIRS = [
16
+ "knowledge",
17
+ "settings",
18
+ "data",
19
+ "workers",
20
+ "repos",
21
+ "projects",
22
+ "policies",
23
+ ];
24
+ const GITIGNORE = `# Local secrets and caches — never commit
25
+ settings/*.local.*
26
+ settings/.env*
27
+ data/cache/
28
+ data/tmp/
29
+ *.log
30
+ .DS_Store
31
+ Thumbs.db
32
+ `;
33
+ function readme(meta) {
34
+ return `# ${meta.team_name}
35
+
36
+ HQ Teams workspace for **${meta.org_login}**.
37
+
38
+ ## What is this?
39
+
40
+ This repository is the shared workspace for the **${meta.team_name}** HQ team.
41
+ Members of the \`${meta.org_login}\` GitHub organization with access to this
42
+ repo will see its contents inside their local HQ at:
43
+
44
+ \`\`\`
45
+ companies/${meta.team_slug}/
46
+ \`\`\`
47
+
48
+ ## Structure
49
+
50
+ | Directory | Purpose |
51
+ |-----------|---------|
52
+ | \`knowledge/\` | Shared docs, references, and qmd-indexed content |
53
+ | \`settings/\` | Team-scoped credentials and config (gitignore secrets) |
54
+ | \`data/\` | Exports, datasets, and reports |
55
+ | \`workers/\` | Custom worker definitions for this team |
56
+ | \`repos/\` | References to repos the team owns |
57
+ | \`projects/\` | Active projects with PRDs and stories |
58
+ | \`policies/\` | Team policies (auto-loaded by Claude Code) |
59
+
60
+ ## Adding members
61
+
62
+ Anyone with access to this repository on GitHub will automatically pick up
63
+ this workspace when they run \`npx create-hq\`. To add a teammate, grant them
64
+ access through the \`${meta.org_login}\` GitHub organization or directly to
65
+ this repository.
66
+
67
+ ## Created
68
+
69
+ - Created by: @${meta.created_by}
70
+ - Created at: ${meta.created_at}
71
+ - Seeded from: create-hq / HQ template ${meta.hq_version}
72
+ `;
73
+ }
74
+ function knowledgeReadme(meta) {
75
+ return `# ${meta.team_name} Knowledge
76
+
77
+ This is the shared knowledge base for the ${meta.team_name} HQ team.
78
+
79
+ Drop markdown files here to share docs, references, and conventions across
80
+ the team. Indexed by qmd for semantic + full-text search.
81
+ `;
82
+ }
83
+ /**
84
+ * Render the company template into targetDir. Creates the directory if it
85
+ * does not exist. Will not overwrite existing files (idempotent on re-runs).
86
+ */
87
+ export function writeCompanyTemplate(targetDir, meta) {
88
+ fs.mkdirSync(targetDir, { recursive: true });
89
+ // Subdirectories with .gitkeep
90
+ for (const sub of COMPANY_SUBDIRS) {
91
+ const dir = path.join(targetDir, sub);
92
+ fs.mkdirSync(dir, { recursive: true });
93
+ const gitkeep = path.join(dir, ".gitkeep");
94
+ if (!fs.existsSync(gitkeep)) {
95
+ fs.writeFileSync(gitkeep, "", "utf-8");
96
+ }
97
+ }
98
+ // README.md
99
+ const readmePath = path.join(targetDir, "README.md");
100
+ if (!fs.existsSync(readmePath)) {
101
+ fs.writeFileSync(readmePath, readme(meta), "utf-8");
102
+ }
103
+ // team.json
104
+ const teamJsonPath = path.join(targetDir, "team.json");
105
+ if (!fs.existsSync(teamJsonPath)) {
106
+ fs.writeFileSync(teamJsonPath, JSON.stringify(meta, null, 2) + "\n", "utf-8");
107
+ }
108
+ // knowledge/README.md (replaces .gitkeep there)
109
+ const knowledgeReadmePath = path.join(targetDir, "knowledge", "README.md");
110
+ if (!fs.existsSync(knowledgeReadmePath)) {
111
+ fs.writeFileSync(knowledgeReadmePath, knowledgeReadme(meta), "utf-8");
112
+ // Remove the redundant .gitkeep now that there's a real file
113
+ const gitkeep = path.join(targetDir, "knowledge", ".gitkeep");
114
+ if (fs.existsSync(gitkeep)) {
115
+ try {
116
+ fs.unlinkSync(gitkeep);
117
+ }
118
+ catch {
119
+ // ignore
120
+ }
121
+ }
122
+ }
123
+ // .gitignore
124
+ const gitignorePath = path.join(targetDir, ".gitignore");
125
+ if (!fs.existsSync(gitignorePath)) {
126
+ fs.writeFileSync(gitignorePath, GITIGNORE, "utf-8");
127
+ }
128
+ }
129
+ /**
130
+ * Ensure all standard company subdirectories exist inside targetDir
131
+ * without overwriting any existing files. Used after cloning a team repo
132
+ * to fill in any directories the upstream repo doesn't have yet.
133
+ */
134
+ export function ensureCompanyStructure(targetDir) {
135
+ for (const sub of COMPANY_SUBDIRS) {
136
+ const dir = path.join(targetDir, sub);
137
+ if (!fs.existsSync(dir)) {
138
+ fs.mkdirSync(dir, { recursive: true });
139
+ }
140
+ }
141
+ }
142
+ //# sourceMappingURL=company-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-template.js","sourceRoot":"","sources":["../src/company-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAa7B,MAAM,eAAe,GAAG;IACtB,WAAW;IACX,UAAU;IACV,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;IACV,UAAU;CACX,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;CAQjB,CAAC;AAEF,SAAS,MAAM,CAAC,IAAkB;IAChC,OAAO,KAAK,IAAI,CAAC,SAAS;;2BAED,IAAI,CAAC,SAAS;;;;oDAIW,IAAI,CAAC,SAAS;mBAC/C,IAAI,CAAC,SAAS;;;;YAIrB,IAAI,CAAC,SAAS;;;;;;;;;;;;;;;;;;;uBAmBH,IAAI,CAAC,SAAS;;;;;iBAKpB,IAAI,CAAC,UAAU;gBAChB,IAAI,CAAC,UAAU;yCACU,IAAI,CAAC,UAAU;CACvD,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,IAAkB;IACzC,OAAO,KAAK,IAAI,CAAC,SAAS;;4CAEgB,IAAI,CAAC,SAAS;;;;CAIzD,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,IAAkB;IAElB,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,+BAA+B;IAC/B,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACtC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,YAAY;IACZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,YAAY;IACZ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED,gDAAgD;IAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,6DAA6D;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
package/dist/deps.d.ts CHANGED
@@ -13,6 +13,8 @@ export interface InstallCommands {
13
13
  dnf?: string;
14
14
  pacman?: string;
15
15
  npm?: string;
16
+ winget?: string;
17
+ choco?: string;
16
18
  }
17
19
  export interface Dep {
18
20
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;CAClC;AA+ED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,YAAY,GACrB,MAAM,GAAG,IAAI,CAef;AAgCD,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CA+EnE"}
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;CAClC;AA8FD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,YAAY,GACrB,MAAM,GAAG,IAAI,CAef;AAgCD,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAgFnE"}