hub-launch 1.22.0 → 1.24.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/CHANGELOG.md +32 -0
- package/README.md +5 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +66 -23
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/launch.d.ts +14 -2
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +209 -70
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/schedule.d.ts.map +1 -1
- package/dist/commands/schedule.js +8 -7
- package/dist/commands/schedule.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -1
- package/dist/config/index.js.map +1 -1
- package/dist/templates/proceed-instructions.md +2 -0
- package/dist/templates/skills/hula-confirm/SKILL.md +1 -1
- package/dist/templates/skills/hula-help/SKILL.md +1 -1
- package/dist/templates/skills/hula-plan/SKILL.md +1 -0
- package/dist/templates/skills/hula-schedule/SKILL.md +3 -3
- package/dist/types/config.schema.d.ts +34 -3
- package/dist/types/config.schema.d.ts.map +1 -1
- package/dist/types/config.schema.js +35 -1
- package/dist/types/config.schema.js.map +1 -1
- package/dist/utils/config-file-edit.d.ts +8 -4
- package/dist/utils/config-file-edit.d.ts.map +1 -1
- package/dist/utils/config-file-edit.js +13 -9
- package/dist/utils/config-file-edit.js.map +1 -1
- package/dist/utils/config-parser.d.ts.map +1 -1
- package/dist/utils/config-parser.js +4 -0
- package/dist/utils/config-parser.js.map +1 -1
- package/dist/utils/env-vars.d.ts.map +1 -1
- package/dist/utils/env-vars.js +4 -0
- package/dist/utils/env-vars.js.map +1 -1
- package/dist/utils/provider-credentials.d.ts +54 -0
- package/dist/utils/provider-credentials.d.ts.map +1 -0
- package/dist/utils/provider-credentials.js +83 -0
- package/dist/utils/provider-credentials.js.map +1 -0
- package/package.json +2 -2
- package/dist/utils/ephemeral-credentials.d.ts +0 -32
- package/dist/utils/ephemeral-credentials.d.ts.map +0 -1
- package/dist/utils/ephemeral-credentials.js +0 -26
- package/dist/utils/ephemeral-credentials.js.map +0 -1
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
export declare const LlmProviderTypeSchema: z.ZodEnum<["claude", "openai", "openrouter"]>;
|
|
3
|
+
export type LlmProviderType = z.infer<typeof LlmProviderTypeSchema>;
|
|
4
|
+
/**
|
|
5
|
+
* Friendly migration error for the removed `anthropicApiKey` config key. The
|
|
6
|
+
* hard rename to the `provider` block ships in lockstep with hula-server, so a
|
|
7
|
+
* leftover `anthropicApiKey` is a configuration error, not a silently-stripped
|
|
8
|
+
* unknown key.
|
|
9
|
+
*/
|
|
10
|
+
export declare const LEGACY_ANTHROPIC_KEY_ERROR = "Config key `anthropicApiKey` is no longer supported \u2014 use provider: { type: 'claude', apiKey: '\u2026' } in .hublaunch/hublaunch.config.js. See CHANGELOG.md.";
|
|
11
|
+
/**
|
|
12
|
+
* Detect the removed `anthropicApiKey` key on a RAW (pre-parse) config object
|
|
13
|
+
* and throw the migration error. Zod's `z.object` strips unknown keys before
|
|
14
|
+
* any refinement runs, so this must run against the raw object — call it before
|
|
15
|
+
* `ConfigSchema.parse`. Pure and side-effect free.
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertNoLegacyProviderKeys(raw: unknown): void;
|
|
2
18
|
declare const DeploymentServiceSchema: z.ZodObject<{
|
|
3
19
|
provider: z.ZodDefault<z.ZodEnum<["vercel", "netlify", "railway", "custom"]>>;
|
|
4
20
|
customPath: z.ZodOptional<z.ZodString>;
|
|
@@ -141,7 +157,16 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
141
157
|
hulaProjectUrl: z.ZodOptional<z.ZodString>;
|
|
142
158
|
hulaApiKey: z.ZodOptional<z.ZodString>;
|
|
143
159
|
hulaProject: z.ZodOptional<z.ZodString>;
|
|
144
|
-
|
|
160
|
+
provider: z.ZodOptional<z.ZodObject<{
|
|
161
|
+
type: z.ZodDefault<z.ZodEnum<["claude", "openai", "openrouter"]>>;
|
|
162
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
163
|
+
}, "strip", z.ZodTypeAny, {
|
|
164
|
+
type: "claude" | "openai" | "openrouter";
|
|
165
|
+
apiKey?: string | undefined;
|
|
166
|
+
}, {
|
|
167
|
+
type?: "claude" | "openai" | "openrouter" | undefined;
|
|
168
|
+
apiKey?: string | undefined;
|
|
169
|
+
}>>;
|
|
145
170
|
containerResources: z.ZodOptional<z.ZodObject<{
|
|
146
171
|
cpu: z.ZodOptional<z.ZodNumber>;
|
|
147
172
|
memory: z.ZodOptional<z.ZodNumber>;
|
|
@@ -473,13 +498,16 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
473
498
|
worktreeBasePath: string;
|
|
474
499
|
projectOwner?: string | undefined;
|
|
475
500
|
version?: string | undefined;
|
|
501
|
+
provider?: {
|
|
502
|
+
type: "claude" | "openai" | "openrouter";
|
|
503
|
+
apiKey?: string | undefined;
|
|
504
|
+
} | undefined;
|
|
476
505
|
teamMembers?: string[] | undefined;
|
|
477
506
|
projectNumber?: number | undefined;
|
|
478
507
|
projectId?: string | undefined;
|
|
479
508
|
hulaProjectUrl?: string | undefined;
|
|
480
509
|
hulaApiKey?: string | undefined;
|
|
481
510
|
hulaProject?: string | undefined;
|
|
482
|
-
anthropicApiKey?: string | undefined;
|
|
483
511
|
containerResources?: {
|
|
484
512
|
cpu?: number | undefined;
|
|
485
513
|
memory?: number | undefined;
|
|
@@ -571,6 +599,10 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
571
599
|
planPath?: string | undefined;
|
|
572
600
|
projectOwner?: string | undefined;
|
|
573
601
|
version?: string | undefined;
|
|
602
|
+
provider?: {
|
|
603
|
+
type?: "claude" | "openai" | "openrouter" | undefined;
|
|
604
|
+
apiKey?: string | undefined;
|
|
605
|
+
} | undefined;
|
|
574
606
|
editorCommand?: "cursor" | "vsCode" | "other" | undefined;
|
|
575
607
|
trackingFile?: string | undefined;
|
|
576
608
|
createIssuesPreference?: "alwaysLatest" | "chooseRecentPlan" | undefined;
|
|
@@ -587,7 +619,6 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
587
619
|
hulaProjectUrl?: string | undefined;
|
|
588
620
|
hulaApiKey?: string | undefined;
|
|
589
621
|
hulaProject?: string | undefined;
|
|
590
|
-
anthropicApiKey?: string | undefined;
|
|
591
622
|
containerResources?: {
|
|
592
623
|
cpu?: number | undefined;
|
|
593
624
|
memory?: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../src/types/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../src/types/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,qBAAqB,+CAA6C,CAAC;AAChF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,uKACqH,CAAC;AAE7J;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAQ7D;AAGD,QAAA,MAAM,uBAAuB;;;;;;;;;EAK3B,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;EAGrB,CAAC;AAEH,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlB,CAAC;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;EAOf,CAAC;AAGH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYrB,CAAC;AAGH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC9E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGlE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6KvB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAGlD,eAAO,MAAM,cAAc,EAAE,MAc5B,CAAC"}
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { PriorityLevelSchema, DEFAULT_POLL_INTERVAL_SECONDS, MIN_POLL_INTERVAL_SECONDS, } from './common.schema.js';
|
|
3
|
+
// LLM provider selection. The `provider` config block dispatches to a native
|
|
4
|
+
// agent harness server-side (Claude Code for `claude`; OpenAI Codex CLI for
|
|
5
|
+
// `openai`/`openrouter`). Shaped as an object (not a bare string) so a future
|
|
6
|
+
// per-step `steps.<step>.provider` override can be added without breaking
|
|
7
|
+
// existing configs.
|
|
8
|
+
export const LlmProviderTypeSchema = z.enum(['claude', 'openai', 'openrouter']);
|
|
9
|
+
/**
|
|
10
|
+
* Friendly migration error for the removed `anthropicApiKey` config key. The
|
|
11
|
+
* hard rename to the `provider` block ships in lockstep with hula-server, so a
|
|
12
|
+
* leftover `anthropicApiKey` is a configuration error, not a silently-stripped
|
|
13
|
+
* unknown key.
|
|
14
|
+
*/
|
|
15
|
+
export const LEGACY_ANTHROPIC_KEY_ERROR = "Config key `anthropicApiKey` is no longer supported — use provider: { type: 'claude', apiKey: '…' } in .hublaunch/hublaunch.config.js. See CHANGELOG.md.";
|
|
16
|
+
/**
|
|
17
|
+
* Detect the removed `anthropicApiKey` key on a RAW (pre-parse) config object
|
|
18
|
+
* and throw the migration error. Zod's `z.object` strips unknown keys before
|
|
19
|
+
* any refinement runs, so this must run against the raw object — call it before
|
|
20
|
+
* `ConfigSchema.parse`. Pure and side-effect free.
|
|
21
|
+
*/
|
|
22
|
+
export function assertNoLegacyProviderKeys(raw) {
|
|
23
|
+
if (raw &&
|
|
24
|
+
typeof raw === 'object' &&
|
|
25
|
+
Object.prototype.hasOwnProperty.call(raw, 'anthropicApiKey')) {
|
|
26
|
+
throw new Error(LEGACY_ANTHROPIC_KEY_ERROR);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
3
29
|
// Service provider schemas
|
|
4
30
|
const DeploymentServiceSchema = z.object({
|
|
5
31
|
provider: z
|
|
@@ -67,7 +93,15 @@ export const ConfigSchema = z.object({
|
|
|
67
93
|
hulaProjectUrl: z.string().optional(),
|
|
68
94
|
hulaApiKey: z.string().optional(),
|
|
69
95
|
hulaProject: z.string().optional(), // Format: "owner/repo" - set during login when API key is project-scoped
|
|
70
|
-
|
|
96
|
+
// LLM provider selection + credential. Absent means `claude` (consistent with
|
|
97
|
+
// `anthropicApiKey` being absent before the multi-provider rename). The key is
|
|
98
|
+
// optional here and can instead come from --provider-key or PROVIDER_AUTH_TOKEN.
|
|
99
|
+
provider: z
|
|
100
|
+
.object({
|
|
101
|
+
type: LlmProviderTypeSchema.default('claude'),
|
|
102
|
+
apiKey: z.string().optional(),
|
|
103
|
+
})
|
|
104
|
+
.optional(),
|
|
71
105
|
containerResources: z
|
|
72
106
|
.object({
|
|
73
107
|
cpu: z.number().int().min(1).max(32).optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../src/types/config.schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../src/types/config.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,18 +6,22 @@
|
|
|
6
6
|
* writing the file.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
* Insert or replace the `
|
|
9
|
+
* Insert or replace the `provider` block in a config file's source text.
|
|
10
10
|
*
|
|
11
11
|
* Mirrors the comment-out-then-insert approach used by `saveApiKeyToConfig` in
|
|
12
12
|
* `src/commands/login.ts` for `hulaApiKey`:
|
|
13
|
-
* - Any existing `
|
|
14
|
-
*
|
|
13
|
+
* - Any existing `provider:` line — whether active or commented out (including
|
|
14
|
+
* the placeholder init writes) — is commented out.
|
|
15
15
|
* - The new active line is inserted immediately after the config opening
|
|
16
16
|
* (`export const config = {` or `export default {`).
|
|
17
17
|
*
|
|
18
|
+
* The block is written on a SINGLE line (`provider: { type: '…', apiKey: '…' },`)
|
|
19
|
+
* so the comment-out regex is robust — a multi-line object would leave dangling
|
|
20
|
+
* inner lines. `init` emits the same single-line shape.
|
|
21
|
+
*
|
|
18
22
|
* If no config opening is found the content is returned unchanged (the caller
|
|
19
23
|
* degrades gracefully rather than corrupting the file). Never echoes the key
|
|
20
24
|
* anywhere but the returned string.
|
|
21
25
|
*/
|
|
22
|
-
export declare function
|
|
26
|
+
export declare function upsertProviderApiKey(content: string, providerType: string, key: string): string;
|
|
23
27
|
//# sourceMappingURL=config-file-edit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file-edit.d.ts","sourceRoot":"","sources":["../../src/utils/config-file-edit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
1
|
+
{"version":3,"file":"config-file-edit.d.ts","sourceRoot":"","sources":["../../src/utils/config-file-edit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,GACV,MAAM,CAuBR"}
|
|
@@ -6,25 +6,29 @@
|
|
|
6
6
|
* writing the file.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
* Insert or replace the `
|
|
9
|
+
* Insert or replace the `provider` block in a config file's source text.
|
|
10
10
|
*
|
|
11
11
|
* Mirrors the comment-out-then-insert approach used by `saveApiKeyToConfig` in
|
|
12
12
|
* `src/commands/login.ts` for `hulaApiKey`:
|
|
13
|
-
* - Any existing `
|
|
14
|
-
*
|
|
13
|
+
* - Any existing `provider:` line — whether active or commented out (including
|
|
14
|
+
* the placeholder init writes) — is commented out.
|
|
15
15
|
* - The new active line is inserted immediately after the config opening
|
|
16
16
|
* (`export const config = {` or `export default {`).
|
|
17
17
|
*
|
|
18
|
+
* The block is written on a SINGLE line (`provider: { type: '…', apiKey: '…' },`)
|
|
19
|
+
* so the comment-out regex is robust — a multi-line object would leave dangling
|
|
20
|
+
* inner lines. `init` emits the same single-line shape.
|
|
21
|
+
*
|
|
18
22
|
* If no config opening is found the content is returned unchanged (the caller
|
|
19
23
|
* degrades gracefully rather than corrupting the file). Never echoes the key
|
|
20
24
|
* anywhere but the returned string.
|
|
21
25
|
*/
|
|
22
|
-
export function
|
|
26
|
+
export function upsertProviderApiKey(content, providerType, key) {
|
|
23
27
|
let result = content;
|
|
24
|
-
if (/^(\s*)(?:\/\/\s*)?
|
|
25
|
-
// Comment out ALL existing
|
|
26
|
-
//
|
|
27
|
-
result = result.replace(/^(\s*)(?:\/\/\s*)?
|
|
28
|
+
if (/^(\s*)(?:\/\/\s*)?provider:/m.test(result)) {
|
|
29
|
+
// Comment out ALL existing provider lines (commented or not) so we never
|
|
30
|
+
// leave two active declarations behind.
|
|
31
|
+
result = result.replace(/^(\s*)(?:\/\/\s*)?provider:\s*.*$/gm, (match, indent) => `${indent}// ${match.trim()}`);
|
|
28
32
|
}
|
|
29
33
|
// Match both real config openings: `export const config = {` and
|
|
30
34
|
// `export default {` (the latter has no `=`). The `= ` is therefore optional.
|
|
@@ -32,6 +36,6 @@ export function upsertAnthropicApiKey(content, key) {
|
|
|
32
36
|
if (!configStart) {
|
|
33
37
|
return content;
|
|
34
38
|
}
|
|
35
|
-
return result.replace(configStart[0], `${configStart[0]}\n
|
|
39
|
+
return result.replace(configStart[0], `${configStart[0]}\n provider: { type: '${providerType}', apiKey: '${key}' },`);
|
|
36
40
|
}
|
|
37
41
|
//# sourceMappingURL=config-file-edit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file-edit.js","sourceRoot":"","sources":["../../src/utils/config-file-edit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
1
|
+
{"version":3,"file":"config-file-edit.js","sourceRoot":"","sources":["../../src/utils/config-file-edit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,YAAoB,EACpB,GAAW;IAEX,IAAI,MAAM,GAAG,OAAO,CAAC;IAErB,IAAI,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,yEAAyE;QACzE,wCAAwC;QACxC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,qCAAqC,EACrC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,CACjD,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,8EAA8E;IAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CACnB,WAAW,CAAC,CAAC,CAAC,EACd,GAAG,WAAW,CAAC,CAAC,CAAC,0BAA0B,YAAY,eAAe,GAAG,MAAM,CAChF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-parser.d.ts","sourceRoot":"","sources":["../../src/utils/config-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-parser.d.ts","sourceRoot":"","sources":["../../src/utils/config-parser.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CA6C9C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAC7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkBrB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
2
|
import { pathToFileURL } from 'url';
|
|
3
3
|
import { logger } from './logger.js';
|
|
4
|
+
import { assertNoLegacyProviderKeys } from '../types/config.schema.js';
|
|
4
5
|
/**
|
|
5
6
|
* Prefix used to mark errors that originate from a failed dynamic `import()` of
|
|
6
7
|
* an existing config file (i.e. a syntactically broken config). Callers can test
|
|
@@ -55,6 +56,9 @@ export async function parseExistingConfig(configPath) {
|
|
|
55
56
|
throw new Error('Config key `hulaRepository` is no longer supported. Rename it to ' +
|
|
56
57
|
'`hulaProject` in .hublaunch/hublaunch.config.js. See CHANGELOG.md.');
|
|
57
58
|
}
|
|
59
|
+
// Detect the removed `anthropicApiKey` key and fail fast with the same
|
|
60
|
+
// friendly migration guidance the runtime loader uses.
|
|
61
|
+
assertNoLegacyProviderKeys(parsed);
|
|
58
62
|
return parsed;
|
|
59
63
|
}
|
|
60
64
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-parser.js","sourceRoot":"","sources":["../../src/utils/config-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config-parser.js","sourceRoot":"","sources":["../../src/utils/config-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB;IAElB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IAEpE,IAAI,MAA2B,CAAC;IAChC,IAAI,CAAC;QACH,yEAAyE;QACzE,sDAAsD;QACtD,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,SAAS,GAAG,GAAG,SAAS,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAG5C,CAAC;QAEF,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO;YAC5B,YAAY,CAAC,MAAM;YACnB,YAAY,CAAwB,CAAC;IACzC,CAAC;IAAC,OAAO,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,OAAO,GACX,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,0BAA0B,GAAG,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,wEAAwE;IACxE,6EAA6E;IAC7E,UAAU;IACV,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CACb,mEAAmE;YACjE,oEAAoE,CACvE,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,uDAAuD;IACvD,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA6C,EAC7C,SAA8B;IAE9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,GAAG,SAAS;QACZ,GAAG,QAAQ;QACX,gCAAgC;QAChC,QAAQ,EAAE;YACR,GAAG,SAAS,CAAC,QAAQ;YACrB,GAAG,QAAQ,CAAC,QAAQ;SACrB;QACD,KAAK,EAAE;YACL,GAAG,SAAS,CAAC,KAAK;YAClB,GAAG,QAAQ,CAAC,KAAK;SAClB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-vars.d.ts","sourceRoot":"","sources":["../../src/utils/env-vars.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"env-vars.d.ts","sourceRoot":"","sources":["../../src/utils/env-vars.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,aAmD5B,CAAC;AAEH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAQpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAmC3B"}
|
package/dist/utils/env-vars.js
CHANGED
|
@@ -37,6 +37,10 @@ export const RESERVED_ENV_VARS = new Set([
|
|
|
37
37
|
'DAYTONA_WORKSPACE_ID',
|
|
38
38
|
'CLAUDE_CODE_OAUTH_TOKEN',
|
|
39
39
|
'ANTHROPIC_API_KEY',
|
|
40
|
+
'OPENAI_API_KEY',
|
|
41
|
+
'OPENROUTER_API_KEY',
|
|
42
|
+
'CODEX_API_KEY',
|
|
43
|
+
'PROVIDER_AUTH_TOKEN',
|
|
40
44
|
'HULA_PROJECT_URL',
|
|
41
45
|
'HULA_API_KEY',
|
|
42
46
|
// Node/npm
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../src/utils/env-vars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS;IAC/C,2BAA2B;IAC3B,MAAM;IACN,iBAAiB;IACjB,YAAY;IACZ,mBAAmB;IACnB,KAAK;IACL,QAAQ;IACR,QAAQ;IAER,aAAa;IACb,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,UAAU;IAEV,UAAU;IACV,eAAe;IACf,eAAe;IACf,gBAAgB;IAEhB,cAAc;IACd,SAAS;IACT,YAAY;IAEZ,wCAAwC;IACxC,iBAAiB;IACjB,wBAAwB;IACxB,sBAAsB;IACtB,yBAAyB;IACzB,mBAAmB;IACnB,kBAAkB;IAClB,cAAc;IAEd,WAAW;IACX,UAAU;IACV,cAAc;IACd,uBAAuB;IAEvB,uBAAuB;IACvB,uBAAuB;IACvB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAuB;IAC5D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,kDAAkD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACtE,uFAAuF,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,aAAuB;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE1C,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,6DAA6D,OAAO,IAAI;YACtE,iBAAiB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9C,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,iCAAiC;IACjC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,8CAA8C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAClE,wBAAwB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,iEAAiE;IACjE,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../src/utils/env-vars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS;IAC/C,2BAA2B;IAC3B,MAAM;IACN,iBAAiB;IACjB,YAAY;IACZ,mBAAmB;IACnB,KAAK;IACL,QAAQ;IACR,QAAQ;IAER,aAAa;IACb,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,UAAU;IAEV,UAAU;IACV,eAAe;IACf,eAAe;IACf,gBAAgB;IAEhB,cAAc;IACd,SAAS;IACT,YAAY;IAEZ,wCAAwC;IACxC,iBAAiB;IACjB,wBAAwB;IACxB,sBAAsB;IACtB,yBAAyB;IACzB,mBAAmB;IACnB,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,qBAAqB;IACrB,kBAAkB;IAClB,cAAc;IAEd,WAAW;IACX,UAAU;IACV,cAAc;IACd,uBAAuB;IAEvB,uBAAuB;IACvB,uBAAuB;IACvB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAuB;IAC5D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,kDAAkD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACtE,uFAAuF,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,aAAuB;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE1C,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,6DAA6D,OAAO,IAAI;YACtE,iBAAiB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9C,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,iCAAiC;IACjC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,8CAA8C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAClE,wBAAwB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,iEAAiE;IACjE,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Config } from '../types/index.js';
|
|
2
|
+
import type { LlmProviderType } from '../types/config.schema.js';
|
|
3
|
+
export interface ProviderCredentialOptions {
|
|
4
|
+
/** --provider-key: the credential (ephemeral). */
|
|
5
|
+
providerKey?: string;
|
|
6
|
+
/** --provider: the provider type (claude | openai | openrouter). */
|
|
7
|
+
provider?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ResolvedProviderCredentials {
|
|
10
|
+
/** The resolved provider type (defaults to 'claude'). */
|
|
11
|
+
providerType: LlmProviderType;
|
|
12
|
+
/** The resolved credential. Empty string when none was supplied. */
|
|
13
|
+
authToken: string;
|
|
14
|
+
/** Human-readable error strings. Empty when the credential is valid. */
|
|
15
|
+
errors: string[];
|
|
16
|
+
/**
|
|
17
|
+
* True only when no token was supplied at all (via flag, config, or env) —
|
|
18
|
+
* NOT for the wrong-format case. Lets interactive callers (e.g. `hula launch`)
|
|
19
|
+
* distinguish "prompt the user for a key" from other errors. Purely additive:
|
|
20
|
+
* `errors` behavior is unchanged, so non-interactive callers such as `hula
|
|
21
|
+
* schedule` are unaffected.
|
|
22
|
+
*/
|
|
23
|
+
missingToken: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Per-provider token format validation. Returns an error string when the token
|
|
27
|
+
* does not match the provider's expected format, or `null` when it is
|
|
28
|
+
* acceptable. `claude` and `openrouter` enforce a prefix (which catches
|
|
29
|
+
* cross-provider paste mistakes before any network call); `openai` only
|
|
30
|
+
* requires a non-empty string (formats vary — live validation catches bad keys).
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateTokenFormat(providerType: LlmProviderType, authToken: string): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the ephemeral LLM provider credential required to launch a hula-server
|
|
35
|
+
* sandbox, via a single precedence chain shared by every command that POSTs to
|
|
36
|
+
* the sandbox APIs.
|
|
37
|
+
*
|
|
38
|
+
* Provider type (highest precedence first):
|
|
39
|
+
* 1. explicit CLI flag (--provider)
|
|
40
|
+
* 2. .hublaunch/hublaunch.config.js (config.provider.type)
|
|
41
|
+
* 3. default 'claude'
|
|
42
|
+
*
|
|
43
|
+
* Credential (highest precedence first):
|
|
44
|
+
* 1. explicit CLI flag (--provider-key)
|
|
45
|
+
* 2. .hublaunch/hublaunch.config.js (config.provider.apiKey)
|
|
46
|
+
* 3. environment variable (PROVIDER_AUTH_TOKEN)
|
|
47
|
+
*
|
|
48
|
+
* Pure and side-effect free: returns the resolved values plus a list of
|
|
49
|
+
* human-readable error strings. Callers choose how to present errors (logger,
|
|
50
|
+
* chalk) and whether to exit. This keeps resolution + validation in ONE place
|
|
51
|
+
* (DRY) while leaving presentation to each command. Never echoes secret values.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveProviderCredentials(options: ProviderCredentialOptions, config: Config): ResolvedProviderCredentials;
|
|
54
|
+
//# sourceMappingURL=provider-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-credentials.d.ts","sourceRoot":"","sources":["../../src/utils/provider-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,MAAM,WAAW,yBAAyB;IACxC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,yDAAyD;IACzD,YAAY,EAAE,eAAe,CAAC;IAC9B,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAKD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,eAAe,EAC7B,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAkBf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,MAAM,GACb,2BAA2B,CAwC7B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { LlmProviderTypeSchema } from '../types/config.schema.js';
|
|
2
|
+
/** The three valid provider types, for error messages. */
|
|
3
|
+
const VALID_PROVIDER_TYPES = LlmProviderTypeSchema.options;
|
|
4
|
+
/**
|
|
5
|
+
* Per-provider token format validation. Returns an error string when the token
|
|
6
|
+
* does not match the provider's expected format, or `null` when it is
|
|
7
|
+
* acceptable. `claude` and `openrouter` enforce a prefix (which catches
|
|
8
|
+
* cross-provider paste mistakes before any network call); `openai` only
|
|
9
|
+
* requires a non-empty string (formats vary — live validation catches bad keys).
|
|
10
|
+
*/
|
|
11
|
+
export function validateTokenFormat(providerType, authToken) {
|
|
12
|
+
switch (providerType) {
|
|
13
|
+
case 'claude':
|
|
14
|
+
if (!authToken.startsWith('sk-ant-')) {
|
|
15
|
+
return 'Claude credential must be a subscription OAuth token (sk-ant-oat01-…, from https://claude.ai/settings) or an Anthropic API key (sk-ant-api03-…, from https://platform.claude.com).';
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
case 'openrouter':
|
|
19
|
+
if (!authToken.startsWith('sk-or-')) {
|
|
20
|
+
return 'OpenRouter key must start with sk-or- (create one at https://openrouter.ai/settings/keys).';
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
case 'openai':
|
|
24
|
+
if (authToken.length === 0) {
|
|
25
|
+
return 'OpenAI API key required (create one at https://platform.openai.com/api-keys).';
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the ephemeral LLM provider credential required to launch a hula-server
|
|
32
|
+
* sandbox, via a single precedence chain shared by every command that POSTs to
|
|
33
|
+
* the sandbox APIs.
|
|
34
|
+
*
|
|
35
|
+
* Provider type (highest precedence first):
|
|
36
|
+
* 1. explicit CLI flag (--provider)
|
|
37
|
+
* 2. .hublaunch/hublaunch.config.js (config.provider.type)
|
|
38
|
+
* 3. default 'claude'
|
|
39
|
+
*
|
|
40
|
+
* Credential (highest precedence first):
|
|
41
|
+
* 1. explicit CLI flag (--provider-key)
|
|
42
|
+
* 2. .hublaunch/hublaunch.config.js (config.provider.apiKey)
|
|
43
|
+
* 3. environment variable (PROVIDER_AUTH_TOKEN)
|
|
44
|
+
*
|
|
45
|
+
* Pure and side-effect free: returns the resolved values plus a list of
|
|
46
|
+
* human-readable error strings. Callers choose how to present errors (logger,
|
|
47
|
+
* chalk) and whether to exit. This keeps resolution + validation in ONE place
|
|
48
|
+
* (DRY) while leaving presentation to each command. Never echoes secret values.
|
|
49
|
+
*/
|
|
50
|
+
export function resolveProviderCredentials(options, config) {
|
|
51
|
+
const errors = [];
|
|
52
|
+
// --- Provider type resolution ---
|
|
53
|
+
const rawProvider = options.provider ?? config.provider?.type ?? 'claude';
|
|
54
|
+
const parsedType = LlmProviderTypeSchema.safeParse(rawProvider);
|
|
55
|
+
if (!parsedType.success) {
|
|
56
|
+
errors.push(`Unknown provider '${rawProvider}'. Valid providers are: ${VALID_PROVIDER_TYPES.join(', ')}.`);
|
|
57
|
+
// Return early with a safe default type; the token is not meaningful yet.
|
|
58
|
+
return {
|
|
59
|
+
providerType: 'claude',
|
|
60
|
+
authToken: '',
|
|
61
|
+
errors,
|
|
62
|
+
missingToken: false,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const providerType = parsedType.data;
|
|
66
|
+
// --- Credential resolution ---
|
|
67
|
+
const authToken = options.providerKey ||
|
|
68
|
+
config.provider?.apiKey ||
|
|
69
|
+
process.env.PROVIDER_AUTH_TOKEN ||
|
|
70
|
+
'';
|
|
71
|
+
const missingToken = !authToken;
|
|
72
|
+
if (!authToken) {
|
|
73
|
+
errors.push(`No credential found for provider '${providerType}'. Pass --provider-key, set provider.apiKey in .hublaunch/hublaunch.config.js, or export PROVIDER_AUTH_TOKEN.`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const formatError = validateTokenFormat(providerType, authToken);
|
|
77
|
+
if (formatError) {
|
|
78
|
+
errors.push(formatError);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { providerType, authToken, errors, missingToken };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=provider-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-credentials.js","sourceRoot":"","sources":["../../src/utils/provider-credentials.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AA0BlE,0DAA0D;AAC1D,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,OAAO,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAA6B,EAC7B,SAAiB;IAEjB,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,OAAO,oLAAoL,CAAC;YAC9L,CAAC;YACD,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,OAAO,4FAA4F,CAAC;YACtG,CAAC;YACD,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,+EAA+E,CAAC;YACzF,CAAC;YACD,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAkC,EAClC,MAAc;IAEd,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,mCAAmC;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC;IAC1E,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,qBAAqB,WAAW,2BAA2B,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9F,CAAC;QACF,0EAA0E;QAC1E,OAAO;YACL,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,EAAE;YACb,MAAM;YACN,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC;IAErC,gCAAgC;IAChC,MAAM,SAAS,GACb,OAAO,CAAC,WAAW;QACnB,MAAM,CAAC,QAAQ,EAAE,MAAM;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,EAAE,CAAC;IACL,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC;IAEhC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CACT,qCAAqC,YAAY,+GAA+G,CACjK,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hub-launch",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.24.0",
|
|
4
4
|
"description": "GitHub Issue and PR automation CLI tool with plugin/hook system for project-specific customizations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"url": "https://github.com/NoStackApp/hub-launch/issues"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
|
-
"build": "tsc && shx chmod +x dist/index.js && npm run copy-templates",
|
|
21
|
+
"build": "tsc && shx chmod +x dist/index.js && npm run copy-templates && shx echo Build complete",
|
|
22
22
|
"postbuild": "node scripts/postinstall.mjs",
|
|
23
23
|
"postinstall": "node scripts/postinstall.mjs",
|
|
24
24
|
"copy-templates": "shx mkdir -p dist/templates && shx cp src/templates/*.md dist/templates/ && shx mkdir -p dist/templates/skills && shx cp -r src/templates/skills/* dist/templates/skills/",
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { Config } from '../types/index.js';
|
|
2
|
-
export interface EphemeralCredentialOptions {
|
|
3
|
-
anthropicKey?: string;
|
|
4
|
-
}
|
|
5
|
-
export interface ResolvedEphemeralCredentials {
|
|
6
|
-
anthropicApiKey?: string;
|
|
7
|
-
/** Human-readable error strings. Empty when the credential is valid. */
|
|
8
|
-
errors: string[];
|
|
9
|
-
/**
|
|
10
|
-
* True only when no token was supplied at all (via flag, config, or env) —
|
|
11
|
-
* NOT for the wrong-prefix case. Lets interactive callers (e.g. `hula
|
|
12
|
-
* launch`) distinguish "prompt the user for a key" from other errors. Purely
|
|
13
|
-
* additive: `errors` behavior is unchanged, so non-interactive callers such
|
|
14
|
-
* as `hula schedule` are unaffected.
|
|
15
|
-
*/
|
|
16
|
-
missingAnthropicKey: boolean;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Resolve the ephemeral Anthropic OAuth token required to launch a hula-server
|
|
20
|
-
* sandbox via a single precedence chain shared by every command that POSTs to
|
|
21
|
-
* the sandbox APIs:
|
|
22
|
-
* 1. explicit CLI flag (--anthropic-key)
|
|
23
|
-
* 2. .hublaunch/hublaunch.config.js (config.anthropicApiKey)
|
|
24
|
-
* 3. environment variable (ANTHROPIC_API_KEY)
|
|
25
|
-
*
|
|
26
|
-
* Pure and side-effect free: returns the resolved value plus a list of
|
|
27
|
-
* human-readable error strings. Callers choose how to present errors (logger,
|
|
28
|
-
* chalk) and whether to exit. This keeps resolution + validation in ONE place
|
|
29
|
-
* (DRY) while leaving presentation to each command. Never echoes secret values.
|
|
30
|
-
*/
|
|
31
|
-
export declare function resolveEphemeralCredentials(options: EphemeralCredentialOptions, config: Config): ResolvedEphemeralCredentials;
|
|
32
|
-
//# sourceMappingURL=ephemeral-credentials.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ephemeral-credentials.d.ts","sourceRoot":"","sources":["../../src/utils/ephemeral-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,0BAA0B;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;;OAMG;IACH,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,MAAM,GACb,4BAA4B,CAiB9B"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve the ephemeral Anthropic OAuth token required to launch a hula-server
|
|
3
|
-
* sandbox via a single precedence chain shared by every command that POSTs to
|
|
4
|
-
* the sandbox APIs:
|
|
5
|
-
* 1. explicit CLI flag (--anthropic-key)
|
|
6
|
-
* 2. .hublaunch/hublaunch.config.js (config.anthropicApiKey)
|
|
7
|
-
* 3. environment variable (ANTHROPIC_API_KEY)
|
|
8
|
-
*
|
|
9
|
-
* Pure and side-effect free: returns the resolved value plus a list of
|
|
10
|
-
* human-readable error strings. Callers choose how to present errors (logger,
|
|
11
|
-
* chalk) and whether to exit. This keeps resolution + validation in ONE place
|
|
12
|
-
* (DRY) while leaving presentation to each command. Never echoes secret values.
|
|
13
|
-
*/
|
|
14
|
-
export function resolveEphemeralCredentials(options, config) {
|
|
15
|
-
const errors = [];
|
|
16
|
-
const anthropicApiKey = options.anthropicKey || config.anthropicApiKey || process.env.ANTHROPIC_API_KEY;
|
|
17
|
-
const missingAnthropicKey = !anthropicApiKey;
|
|
18
|
-
if (!anthropicApiKey) {
|
|
19
|
-
errors.push('No Anthropic OAuth token configured. Set anthropicApiKey in .hublaunch/hublaunch.config.js, use --anthropic-key, or set ANTHROPIC_API_KEY. Get a token at https://claude.ai/settings (requires a paid Claude.ai plan — Pro or Max).');
|
|
20
|
-
}
|
|
21
|
-
else if (!anthropicApiKey.startsWith('sk-ant-oat')) {
|
|
22
|
-
errors.push('Anthropic credential must be an OAuth token (starts with sk-ant-oat01-…). Standard API keys (sk-ant-api03-…) are not supported — the container requires CLAUDE_CODE_OAUTH_TOKEN.');
|
|
23
|
-
}
|
|
24
|
-
return { anthropicApiKey, errors, missingAnthropicKey };
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=ephemeral-credentials.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ephemeral-credentials.js","sourceRoot":"","sources":["../../src/utils/ephemeral-credentials.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAmC,EACnC,MAAc;IAEd,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,eAAe,GACnB,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAClF,MAAM,mBAAmB,GAAG,CAAC,eAAe,CAAC;IAC7C,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACT,qOAAqO,CACtO,CAAC;IACJ,CAAC;SAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CACT,kLAAkL,CACnL,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;AAC1D,CAAC"}
|