@tayo-dev/rtl 1.0.0 → 1.2.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 (87) hide show
  1. package/README.md +89 -86
  2. package/assets/claude/commands/@tayo-dev/rtl/generate.md +15 -0
  3. package/assets/claude/commands/@tayo-dev/rtl/help.md +16 -0
  4. package/assets/codex/@tayo-dev/rtl-conventions/SKILL.md +19 -0
  5. package/assets/codex/@tayo-dev/rtl-generate/SKILL.md +27 -0
  6. package/assets/codex/@tayo-dev/rtl-help/SKILL.md +25 -0
  7. package/assets/codex/@tayo-dev/rtl-mocks/SKILL.md +22 -0
  8. package/assets/gemini/commands/@tayo-dev/rtl/generate.toml +10 -0
  9. package/assets/gemini/commands/@tayo-dev/rtl/help.toml +11 -0
  10. package/assets/opencode/commands/@tayo-dev/rtl-generate.md +11 -0
  11. package/assets/opencode/commands/@tayo-dev/rtl-help.md +12 -0
  12. package/dist/cli/commands/install.d.ts +22 -0
  13. package/dist/cli/commands/install.d.ts.map +1 -0
  14. package/dist/cli/commands/install.js +69 -0
  15. package/dist/cli/commands/install.js.map +1 -0
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.js +10 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/install/assets.d.ts +5 -0
  20. package/dist/install/assets.d.ts.map +1 -0
  21. package/dist/install/assets.js +23 -0
  22. package/dist/install/assets.js.map +1 -0
  23. package/dist/install/executor.d.ts +4 -0
  24. package/dist/install/executor.d.ts.map +1 -0
  25. package/dist/install/executor.js +26 -0
  26. package/dist/install/executor.js.map +1 -0
  27. package/dist/install/manifest.d.ts +21 -0
  28. package/dist/install/manifest.d.ts.map +1 -0
  29. package/dist/install/manifest.js +45 -0
  30. package/dist/install/manifest.js.map +1 -0
  31. package/dist/install/options.d.ts +13 -0
  32. package/dist/install/options.d.ts.map +1 -0
  33. package/dist/install/options.js +87 -0
  34. package/dist/install/options.js.map +1 -0
  35. package/dist/install/planner.d.ts +8 -0
  36. package/dist/install/planner.d.ts.map +1 -0
  37. package/dist/install/planner.js +31 -0
  38. package/dist/install/planner.js.map +1 -0
  39. package/dist/install/prompts.d.ts +9 -0
  40. package/dist/install/prompts.d.ts.map +1 -0
  41. package/dist/install/prompts.js +98 -0
  42. package/dist/install/prompts.js.map +1 -0
  43. package/dist/install/registry.d.ts +3 -0
  44. package/dist/install/registry.d.ts.map +1 -0
  45. package/dist/install/registry.js +47 -0
  46. package/dist/install/registry.js.map +1 -0
  47. package/dist/install/resolver.d.ts +8 -0
  48. package/dist/install/resolver.d.ts.map +1 -0
  49. package/dist/install/resolver.js +20 -0
  50. package/dist/install/resolver.js.map +1 -0
  51. package/dist/install/runtimes/claude.d.ts +3 -0
  52. package/dist/install/runtimes/claude.d.ts.map +1 -0
  53. package/dist/install/runtimes/claude.js +8 -0
  54. package/dist/install/runtimes/claude.js.map +1 -0
  55. package/dist/install/runtimes/codex.d.ts +3 -0
  56. package/dist/install/runtimes/codex.d.ts.map +1 -0
  57. package/dist/install/runtimes/codex.js +51 -0
  58. package/dist/install/runtimes/codex.js.map +1 -0
  59. package/dist/install/runtimes/gemini.d.ts +3 -0
  60. package/dist/install/runtimes/gemini.d.ts.map +1 -0
  61. package/dist/install/runtimes/gemini.js +8 -0
  62. package/dist/install/runtimes/gemini.js.map +1 -0
  63. package/dist/install/runtimes/opencode.d.ts +3 -0
  64. package/dist/install/runtimes/opencode.d.ts.map +1 -0
  65. package/dist/install/runtimes/opencode.js +8 -0
  66. package/dist/install/runtimes/opencode.js.map +1 -0
  67. package/dist/install/runtimes/prompt-runtimes.d.ts +3 -0
  68. package/dist/install/runtimes/prompt-runtimes.d.ts.map +1 -0
  69. package/dist/install/runtimes/prompt-runtimes.js +74 -0
  70. package/dist/install/runtimes/prompt-runtimes.js.map +1 -0
  71. package/dist/install/summary.d.ts +12 -0
  72. package/dist/install/summary.d.ts.map +1 -0
  73. package/dist/install/summary.js +112 -0
  74. package/dist/install/summary.js.map +1 -0
  75. package/dist/install/types.d.ts +119 -0
  76. package/dist/install/types.d.ts.map +1 -0
  77. package/dist/install/types.js +5 -0
  78. package/dist/install/types.js.map +1 -0
  79. package/dist/install/verification.d.ts +3 -0
  80. package/dist/install/verification.d.ts.map +1 -0
  81. package/dist/install/verification.js +34 -0
  82. package/dist/install/verification.js.map +1 -0
  83. package/dist/install/writer.d.ts +11 -0
  84. package/dist/install/writer.d.ts.map +1 -0
  85. package/dist/install/writer.js +99 -0
  86. package/dist/install/writer.js.map +1 -0
  87. package/package.json +3 -1
@@ -0,0 +1,21 @@
1
+ import type { InstallAssetConflict, InstallAssetKind, InstallLocation, InstallOwnershipManifest, InstallOwnedFile, RuntimeTarget } from './types.js';
2
+ export interface CreateOwnershipManifestParams {
3
+ runtime: RuntimeTarget;
4
+ location: InstallLocation;
5
+ files: InstallOwnedFile[];
6
+ generatedAt?: string;
7
+ }
8
+ export interface ClassifyAssetConflictParams {
9
+ targetPath: string;
10
+ existingContent?: string | null;
11
+ manifest?: InstallOwnershipManifest | null;
12
+ relativePath: string;
13
+ }
14
+ export declare function createOwnedFile(params: {
15
+ relativePath: string;
16
+ kind: InstallAssetKind;
17
+ content?: string;
18
+ }): InstallOwnedFile;
19
+ export declare function createOwnershipManifest(params: CreateOwnershipManifestParams): InstallOwnershipManifest;
20
+ export declare function classifyAssetConflict(params: ClassifyAssetConflictParams): InstallAssetConflict;
21
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/install/manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAEpB,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,aAAa,CAAA;IACtB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;IAC1C,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,gBAAgB,CAUnB;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,6BAA6B,GACpC,wBAAwB,CAS1B;AA2BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,2BAA2B,GAClC,oBAAoB,CAKtB"}
@@ -0,0 +1,45 @@
1
+ import { createHash } from 'node:crypto';
2
+ export function createOwnedFile(params) {
3
+ const checksum = params.content
4
+ ? createHash('sha256').update(params.content).digest('hex')
5
+ : undefined;
6
+ return {
7
+ relativePath: params.relativePath,
8
+ kind: params.kind,
9
+ checksum,
10
+ };
11
+ }
12
+ export function createOwnershipManifest(params) {
13
+ return {
14
+ packageName: '@tayo-dev/rtl',
15
+ runtime: params.runtime,
16
+ location: params.location,
17
+ manifestVersion: 1,
18
+ generatedAt: params.generatedAt ?? new Date().toISOString(),
19
+ files: params.files,
20
+ };
21
+ }
22
+ function resolveConflictKind(params) {
23
+ const { existingContent, manifest, relativePath } = params;
24
+ if (existingContent == null) {
25
+ return 'missing';
26
+ }
27
+ const manifestFile = manifest?.files.find((file) => file.relativePath === relativePath);
28
+ if (!manifestFile) {
29
+ return 'external-collision';
30
+ }
31
+ if (!manifestFile.checksum) {
32
+ return 'installer-owned';
33
+ }
34
+ const existingChecksum = createHash('sha256').update(existingContent).digest('hex');
35
+ return existingChecksum === manifestFile.checksum
36
+ ? 'installer-owned'
37
+ : 'installer-owned-modified';
38
+ }
39
+ export function classifyAssetConflict(params) {
40
+ return {
41
+ kind: resolveConflictKind(params),
42
+ targetPath: params.targetPath,
43
+ };
44
+ }
45
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/install/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAyBxC,MAAM,UAAU,eAAe,CAAC,MAI/B;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO;QAC7B,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3D,CAAC,CAAC,SAAS,CAAA;IAEb,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ;KACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAqC;IAErC,OAAO;QACL,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3D,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAmC;IAEnC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAE1D,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,CAAA;IAEvF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnF,OAAO,gBAAgB,KAAK,YAAY,CAAC,QAAQ;QAC/C,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,0BAA0B,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAmC;IAEnC,OAAO;QACL,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { stdin, stdout } from 'node:process';
2
+ import type { InstallCommandOptions, InstallSelection, NormalizedInstallOptions } from './types.js';
3
+ export declare class InstallValidationError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ interface PromptCapability {
7
+ input?: Pick<typeof stdin, 'isTTY'>;
8
+ output?: Pick<typeof stdout, 'isTTY'>;
9
+ }
10
+ export declare function normalizeInstallOptions(options: InstallCommandOptions, io?: PromptCapability): NormalizedInstallOptions;
11
+ export declare function toInstallSelection(normalized: NormalizedInstallOptions): InstallSelection;
12
+ export {};
13
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/install/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EACV,qBAAqB,EAErB,gBAAgB,EAEhB,wBAAwB,EAGzB,MAAM,YAAY,CAAA;AAGnB,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC;AA8DD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,EAAE,GAAE,gBAAmD,GACtD,wBAAwB,CA2B1B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,wBAAwB,GACnC,gBAAgB,CA2BlB"}
@@ -0,0 +1,87 @@
1
+ import { stdin, stdout } from 'node:process';
2
+ import { SUPPORTED_RUNTIMES } from './types.js';
3
+ export class InstallValidationError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = 'InstallValidationError';
7
+ }
8
+ }
9
+ function hasPromptCapability(io) {
10
+ return Boolean(io.input?.isTTY && io.output?.isTTY);
11
+ }
12
+ function resolveRuntimeSelection(options) {
13
+ if (options.all) {
14
+ return [...SUPPORTED_RUNTIMES];
15
+ }
16
+ return SUPPORTED_RUNTIMES.filter((runtime) => Boolean(options[runtime]));
17
+ }
18
+ function resolveLocationOption(options) {
19
+ if (options.global && options.local) {
20
+ throw new InstallValidationError('Choose either `--global` or `--local`, not both.');
21
+ }
22
+ if (options.global) {
23
+ return 'global';
24
+ }
25
+ if (options.local) {
26
+ return 'local';
27
+ }
28
+ return undefined;
29
+ }
30
+ function resolveSelectionSource(params) {
31
+ const { runtimesSelected, locationSelected } = params;
32
+ if (runtimesSelected && locationSelected) {
33
+ return 'flags';
34
+ }
35
+ if (runtimesSelected || locationSelected) {
36
+ return 'mixed';
37
+ }
38
+ return 'prompt';
39
+ }
40
+ function fillRuntimeLocations(runtimes, location) {
41
+ if (!location) {
42
+ return {};
43
+ }
44
+ return Object.fromEntries(runtimes.map((runtime) => [runtime, location]));
45
+ }
46
+ export function normalizeInstallOptions(options, io = { input: stdin, output: stdout }) {
47
+ const runtimes = resolveRuntimeSelection(options);
48
+ const location = resolveLocationOption(options);
49
+ const needsRuntimePrompt = runtimes.length === 0;
50
+ const runtimesNeedingLocation = location ? [] : [...runtimes];
51
+ const mode = needsRuntimePrompt || runtimesNeedingLocation.length > 0
52
+ ? 'interactive'
53
+ : 'non-interactive';
54
+ if (mode === 'interactive' && !hasPromptCapability(io)) {
55
+ throw new InstallValidationError('Non-interactive install requires runtime flags (`--claude`, `--opencode`, `--gemini`, `--codex`, or `--all`) and exactly one location flag (`--global` or `--local`).');
56
+ }
57
+ return {
58
+ mode,
59
+ runtimes,
60
+ locations: fillRuntimeLocations(runtimes, location),
61
+ needsRuntimePrompt,
62
+ runtimesNeedingLocation,
63
+ source: resolveSelectionSource({
64
+ runtimesSelected: runtimes.length > 0,
65
+ locationSelected: Boolean(location),
66
+ }),
67
+ };
68
+ }
69
+ export function toInstallSelection(normalized) {
70
+ if (normalized.mode !== 'non-interactive') {
71
+ throw new InstallValidationError('Cannot materialize install selection before interactive prompts complete.');
72
+ }
73
+ const locations = Object.fromEntries(normalized.runtimes.map((runtime) => {
74
+ const location = normalized.locations[runtime];
75
+ if (!location) {
76
+ throw new InstallValidationError(`Missing install location for ${runtime}.`);
77
+ }
78
+ return [runtime, location];
79
+ }));
80
+ return {
81
+ mode: normalized.mode,
82
+ runtimes: normalized.runtimes,
83
+ locations,
84
+ source: normalized.source,
85
+ };
86
+ }
87
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/install/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { InstallPlan, InstallSelection } from './types.js';
2
+ interface BuildInstallPlanContext {
3
+ cwd?: string;
4
+ home?: string;
5
+ }
6
+ export declare function buildInstallPlan(selection: InstallSelection, context?: BuildInstallPlanContext): InstallPlan;
7
+ export {};
8
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/install/planner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAyB,MAAM,YAAY,CAAA;AAEtF,UAAU,uBAAuB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAeD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE,uBAA4B,GACpC,WAAW,CAYb"}
@@ -0,0 +1,31 @@
1
+ import { buildClaudeRuntimeOperations } from './runtimes/claude.js';
2
+ import { buildCodexOperations } from './runtimes/codex.js';
3
+ import { buildGeminiRuntimeOperations } from './runtimes/gemini.js';
4
+ import { buildOpenCodeRuntimeOperations } from './runtimes/opencode.js';
5
+ import { resolveInstallTargets } from './resolver.js';
6
+ function buildRuntimeOperations(target) {
7
+ switch (target.id) {
8
+ case 'claude':
9
+ return buildClaudeRuntimeOperations(target);
10
+ case 'opencode':
11
+ return buildOpenCodeRuntimeOperations(target);
12
+ case 'gemini':
13
+ return buildGeminiRuntimeOperations(target);
14
+ case 'codex':
15
+ return buildCodexOperations(target);
16
+ }
17
+ }
18
+ export function buildInstallPlan(selection, context = {}) {
19
+ return {
20
+ packageName: '@tayo-dev/rtl',
21
+ commandName: 'taro',
22
+ stage: 'ready-to-write',
23
+ source: selection.source,
24
+ mode: selection.mode,
25
+ targets: resolveInstallTargets(selection, context).map((target) => ({
26
+ ...target,
27
+ operations: buildRuntimeOperations(target),
28
+ })),
29
+ };
30
+ }
31
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/install/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAQrD,SAAS,sBAAsB,CAAC,MAA6B;IAC3D,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;QAC7C,KAAK,UAAU;YACb,OAAO,8BAA8B,CAAC,MAAM,CAAC,CAAA;QAC/C,KAAK,QAAQ;YACX,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;QAC7C,KAAK,OAAO;YACV,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAA2B,EAC3B,UAAmC,EAAE;IAErC,OAAO;QACL,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,OAAO,EAAE,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAClE,GAAG,MAAM;YACT,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC;SAC3C,CAAC,CAAC;KACJ,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { stdin, stdout } from 'node:process';
2
+ import type { InstallSelection, NormalizedInstallOptions } from './types.js';
3
+ interface PromptIO {
4
+ input?: typeof stdin;
5
+ output?: typeof stdout;
6
+ }
7
+ export declare function promptForInstallChoices(normalized: NormalizedInstallOptions, io?: PromptIO): Promise<InstallSelection>;
8
+ export {};
9
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/install/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAEV,gBAAgB,EAChB,wBAAwB,EAGzB,MAAM,YAAY,CAAA;AAInB,UAAU,QAAQ;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,MAAM,CAAA;CACvB;AAmED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,wBAAwB,EACpC,EAAE,GAAE,QAA2C,GAC9C,OAAO,CAAC,gBAAgB,CAAC,CA+D3B"}
@@ -0,0 +1,98 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { stdin, stdout } from 'node:process';
3
+ import pc from 'picocolors';
4
+ import { SUPPORTED_RUNTIMES } from './types.js';
5
+ import { RUNTIME_REGISTRY } from './registry.js';
6
+ const ALL_RUNTIMES_CHOICE = SUPPORTED_RUNTIMES.length + 1;
7
+ function runtimeMenu() {
8
+ const lines = SUPPORTED_RUNTIMES.map((runtime, index) => {
9
+ return ` ${index + 1}. ${RUNTIME_REGISTRY[runtime].displayName}`;
10
+ });
11
+ lines.push(` ${ALL_RUNTIMES_CHOICE}. All runtimes`);
12
+ return lines.join('\n');
13
+ }
14
+ function parseRuntimeSelection(answer) {
15
+ const selections = answer
16
+ .split(',')
17
+ .map((part) => Number(part.trim()))
18
+ .filter((value) => !Number.isNaN(value));
19
+ if (selections.length === 0) {
20
+ return null;
21
+ }
22
+ if (selections.includes(ALL_RUNTIMES_CHOICE)) {
23
+ return [...SUPPORTED_RUNTIMES];
24
+ }
25
+ const runtimes = Array.from(new Set(selections
26
+ .filter((value) => value >= 1 && value <= SUPPORTED_RUNTIMES.length)
27
+ .map((value) => SUPPORTED_RUNTIMES[value - 1])));
28
+ return runtimes.length > 0 ? runtimes : null;
29
+ }
30
+ function parseLocation(answer) {
31
+ const normalized = answer.trim().toLowerCase();
32
+ if (normalized === '1' || normalized === 'g' || normalized === 'global') {
33
+ return 'global';
34
+ }
35
+ if (normalized === '2' || normalized === 'l' || normalized === 'local') {
36
+ return 'local';
37
+ }
38
+ return null;
39
+ }
40
+ function deriveSelectionSource(normalized) {
41
+ if (normalized.source === 'flags' && normalized.mode === 'non-interactive') {
42
+ return 'flags';
43
+ }
44
+ if (normalized.source === 'prompt') {
45
+ return 'prompt';
46
+ }
47
+ return 'mixed';
48
+ }
49
+ export async function promptForInstallChoices(normalized, io = { input: stdin, output: stdout }) {
50
+ const rl = createInterface({
51
+ input: io.input ?? stdin,
52
+ output: io.output ?? stdout,
53
+ });
54
+ try {
55
+ let runtimes = [...normalized.runtimes];
56
+ if (normalized.needsRuntimePrompt) {
57
+ while (runtimes.length === 0) {
58
+ console.log(pc.bold('Choose the runtimes to install:'));
59
+ console.log(runtimeMenu());
60
+ const answer = await rl.question('Enter one or more numbers separated by commas: ');
61
+ const selectedRuntimes = parseRuntimeSelection(answer);
62
+ if (selectedRuntimes) {
63
+ runtimes = selectedRuntimes;
64
+ break;
65
+ }
66
+ console.log(pc.yellow('Select at least one runtime to continue.\n'));
67
+ }
68
+ }
69
+ const locations = { ...normalized.locations };
70
+ for (const runtime of runtimes) {
71
+ if (locations[runtime]) {
72
+ continue;
73
+ }
74
+ let location = null;
75
+ while (!location) {
76
+ console.log(`\n${pc.bold(RUNTIME_REGISTRY[runtime].displayName)} installation location:`);
77
+ console.log(' 1. Global');
78
+ console.log(' 2. Local');
79
+ const answer = await rl.question('Choose 1 or 2: ');
80
+ location = parseLocation(answer);
81
+ if (!location) {
82
+ console.log(pc.yellow('Choose `1` for global or `2` for local.'));
83
+ }
84
+ }
85
+ locations[runtime] = location;
86
+ }
87
+ return {
88
+ mode: 'interactive',
89
+ runtimes,
90
+ locations: locations,
91
+ source: deriveSelectionSource(normalized),
92
+ };
93
+ }
94
+ finally {
95
+ rl.close();
96
+ }
97
+ }
98
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/install/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RuntimeTarget, RuntimeDefinition } from './types.js';
2
+ export declare const RUNTIME_REGISTRY: Record<RuntimeTarget, RuntimeDefinition>;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/install/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAElE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,iBAAiB,CA6CrE,CAAA"}
@@ -0,0 +1,47 @@
1
+ export const RUNTIME_REGISTRY = {
2
+ claude: {
3
+ id: 'claude',
4
+ displayName: 'Claude Code',
5
+ family: 'prompt',
6
+ globalDirectorySegments: ['.claude'],
7
+ localDirectoryName: '.claude',
8
+ packageContainerSegments: ['commands', '@tayo-dev', 'rtl'],
9
+ verificationCommand: '/@tayo-dev/rtl:help',
10
+ ownershipMarkerFileName: 'install-manifest.json',
11
+ assets: [],
12
+ },
13
+ opencode: {
14
+ id: 'opencode',
15
+ displayName: 'OpenCode',
16
+ family: 'prompt',
17
+ globalDirectorySegments: ['.config', 'opencode'],
18
+ localDirectoryName: '.opencode',
19
+ packageContainerSegments: ['commands', '@tayo-dev', 'rtl'],
20
+ verificationCommand: '/@tayo-dev/rtl-help',
21
+ ownershipMarkerFileName: 'install-manifest.json',
22
+ assets: [],
23
+ },
24
+ gemini: {
25
+ id: 'gemini',
26
+ displayName: 'Gemini CLI',
27
+ family: 'prompt',
28
+ globalDirectorySegments: ['.gemini'],
29
+ localDirectoryName: '.gemini',
30
+ packageContainerSegments: ['commands', '@tayo-dev', 'rtl'],
31
+ verificationCommand: '/@tayo-dev/rtl:help',
32
+ ownershipMarkerFileName: 'install-manifest.json',
33
+ assets: [],
34
+ },
35
+ codex: {
36
+ id: 'codex',
37
+ displayName: 'Codex',
38
+ family: 'skill',
39
+ globalDirectorySegments: ['.codex'],
40
+ localDirectoryName: '.codex',
41
+ packageContainerSegments: ['skills'],
42
+ verificationCommand: '$@tayo-dev/rtl-help',
43
+ ownershipMarkerFileName: '@tayo-dev-rtl-manifest.json',
44
+ assets: [],
45
+ },
46
+ };
47
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/install/registry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAA6C;IACxE,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,WAAW,EAAE,aAAa;QAC1B,MAAM,EAAE,QAAQ;QAChB,uBAAuB,EAAE,CAAC,SAAS,CAAC;QACpC,kBAAkB,EAAE,SAAS;QAC7B,wBAAwB,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC;QAC1D,mBAAmB,EAAE,qBAAqB;QAC1C,uBAAuB,EAAE,uBAAuB;QAChD,MAAM,EAAE,EAAE;KACX;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU;QACd,WAAW,EAAE,UAAU;QACvB,MAAM,EAAE,QAAQ;QAChB,uBAAuB,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;QAChD,kBAAkB,EAAE,WAAW;QAC/B,wBAAwB,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC;QAC1D,mBAAmB,EAAE,qBAAqB;QAC1C,uBAAuB,EAAE,uBAAuB;QAChD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,QAAQ;QAChB,uBAAuB,EAAE,CAAC,SAAS,CAAC;QACpC,kBAAkB,EAAE,SAAS;QAC7B,wBAAwB,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC;QAC1D,mBAAmB,EAAE,qBAAqB;QAC1C,uBAAuB,EAAE,uBAAuB;QAChD,MAAM,EAAE,EAAE;KACX;IACD,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,OAAO;QACpB,MAAM,EAAE,OAAO;QACf,uBAAuB,EAAE,CAAC,QAAQ,CAAC;QACnC,kBAAkB,EAAE,QAAQ;QAC5B,wBAAwB,EAAE,CAAC,QAAQ,CAAC;QACpC,mBAAmB,EAAE,qBAAqB;QAC1C,uBAAuB,EAAE,6BAA6B;QACtD,MAAM,EAAE,EAAE;KACX;CACF,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { InstallSelection, ResolvedInstallTarget } from './types.js';
2
+ interface ResolveInstallTargetsContext {
3
+ cwd?: string;
4
+ home?: string;
5
+ }
6
+ export declare function resolveInstallTargets(selection: InstallSelection, context?: ResolveInstallTargetsContext): ResolvedInstallTarget[];
7
+ export {};
8
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/install/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAGzE,UAAU,4BAA4B;IACpC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE,4BAAiC,GACzC,qBAAqB,EAAE,CAkBzB"}
@@ -0,0 +1,20 @@
1
+ import { homedir } from 'node:os';
2
+ import { join, resolve } from 'node:path';
3
+ import { RUNTIME_REGISTRY } from './registry.js';
4
+ export function resolveInstallTargets(selection, context = {}) {
5
+ const currentWorkingDirectory = context.cwd ?? process.cwd();
6
+ const homeDirectory = context.home ?? homedir();
7
+ return selection.runtimes.map((runtime) => {
8
+ const metadata = RUNTIME_REGISTRY[runtime];
9
+ const location = selection.locations[runtime];
10
+ const destinationDirectory = location === 'global'
11
+ ? join(homeDirectory, ...metadata.globalDirectorySegments)
12
+ : resolve(currentWorkingDirectory, metadata.localDirectoryName);
13
+ return {
14
+ ...metadata,
15
+ location,
16
+ destinationDirectory,
17
+ };
18
+ });
19
+ }
20
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/install/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOhD,MAAM,UAAU,qBAAqB,CACnC,SAA2B,EAC3B,UAAwC,EAAE;IAE1C,MAAM,uBAAuB,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAC5D,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAA;IAE/C,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,oBAAoB,GACxB,QAAQ,KAAK,QAAQ;YACnB,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,uBAAuB,CAAC;YAC1D,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QAEnE,OAAO;YACL,GAAG,QAAQ;YACX,QAAQ;YACR,oBAAoB;SACrB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallFileOperation, ResolvedInstallTarget } from '../types.js';
2
+ export declare function buildClaudeRuntimeOperations(target: ResolvedInstallTarget, fromModuleUrl?: string): InstallFileOperation[];
3
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/install/runtimes/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAG9E,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,aAAa,GAAE,MAAwB,GACtC,oBAAoB,EAAE,CAMxB"}
@@ -0,0 +1,8 @@
1
+ import { buildPromptRuntimeOperations } from './prompt-runtimes.js';
2
+ export function buildClaudeRuntimeOperations(target, fromModuleUrl = import.meta.url) {
3
+ if (target.id !== 'claude') {
4
+ throw new Error(`Claude runtime builder received ${target.id}.`);
5
+ }
6
+ return buildPromptRuntimeOperations(target, fromModuleUrl);
7
+ }
8
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/install/runtimes/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAEnE,MAAM,UAAU,4BAA4B,CAC1C,MAA6B,EAC7B,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEvC,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;IAClE,CAAC;IAED,OAAO,4BAA4B,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallFileOperation, ResolvedInstallTarget } from '../types.js';
2
+ export declare function buildCodexOperations(target: ResolvedInstallTarget, fromModuleUrl?: string): InstallFileOperation[];
3
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/install/runtimes/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAA0B,MAAM,aAAa,CAAA;AAiCtG,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,qBAAqB,EAC7B,aAAa,GAAE,MAAwB,GACtC,oBAAoB,EAAE,CAmBxB"}
@@ -0,0 +1,51 @@
1
+ import { join } from 'node:path';
2
+ import { resolveAssetSource } from '../assets.js';
3
+ const CODEX_SKILL_ASSETS = [
4
+ {
5
+ id: 'help',
6
+ kind: 'skill',
7
+ sourceSegments: ['@tayo-dev', 'rtl-help', 'SKILL.md'],
8
+ destinationSegments: ['skills', '@tayo-dev', 'rtl-help', 'SKILL.md'],
9
+ entrypoint: '$@tayo-dev/rtl-help',
10
+ },
11
+ {
12
+ id: 'generate',
13
+ kind: 'skill',
14
+ sourceSegments: ['@tayo-dev', 'rtl-generate', 'SKILL.md'],
15
+ destinationSegments: ['skills', '@tayo-dev', 'rtl-generate', 'SKILL.md'],
16
+ entrypoint: '$@tayo-dev/rtl-generate',
17
+ },
18
+ {
19
+ id: 'conventions',
20
+ kind: 'skill',
21
+ sourceSegments: ['@tayo-dev', 'rtl-conventions', 'SKILL.md'],
22
+ destinationSegments: ['skills', '@tayo-dev', 'rtl-conventions', 'SKILL.md'],
23
+ entrypoint: '$@tayo-dev/rtl-conventions',
24
+ },
25
+ {
26
+ id: 'mocks',
27
+ kind: 'skill',
28
+ sourceSegments: ['@tayo-dev', 'rtl-mocks', 'SKILL.md'],
29
+ destinationSegments: ['skills', '@tayo-dev', 'rtl-mocks', 'SKILL.md'],
30
+ entrypoint: '$@tayo-dev/rtl-mocks',
31
+ },
32
+ ];
33
+ export function buildCodexOperations(target, fromModuleUrl = import.meta.url) {
34
+ if (target.id !== 'codex') {
35
+ throw new Error(`Codex runtime builder received ${target.id}.`);
36
+ }
37
+ return CODEX_SKILL_ASSETS.map((asset) => {
38
+ const relativeDestinationPath = join(...asset.destinationSegments);
39
+ return {
40
+ assetId: asset.id,
41
+ runtime: target.id,
42
+ location: target.location,
43
+ kind: asset.kind,
44
+ sourcePath: resolveAssetSource(target.id, asset.sourceSegments, fromModuleUrl),
45
+ relativeDestinationPath,
46
+ targetPath: join(target.destinationDirectory, relativeDestinationPath),
47
+ entrypoint: asset.entrypoint,
48
+ };
49
+ });
50
+ }
51
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/install/runtimes/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGjD,MAAM,kBAAkB,GAA6B;IACnD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC;QACrD,mBAAmB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC;QACpE,UAAU,EAAE,qBAAqB;KAClC;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC;QACzD,mBAAmB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC;QACxE,UAAU,EAAE,yBAAyB;KACtC;IACD;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,CAAC;QAC5D,mBAAmB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,CAAC;QAC3E,UAAU,EAAE,4BAA4B;KACzC;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC;QACtD,mBAAmB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC;QACrE,UAAU,EAAE,sBAAsB;KACnC;CACF,CAAA;AAED,MAAM,UAAU,oBAAoB,CAClC,MAA6B,EAC7B,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEvC,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAElE,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,OAAO,EAAE,MAAM,CAAC,EAAE;YAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC;YAC9E,uBAAuB;YACvB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;YACtE,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallFileOperation, ResolvedInstallTarget } from '../types.js';
2
+ export declare function buildGeminiRuntimeOperations(target: ResolvedInstallTarget, fromModuleUrl?: string): InstallFileOperation[];
3
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/install/runtimes/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAG9E,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,aAAa,GAAE,MAAwB,GACtC,oBAAoB,EAAE,CAMxB"}
@@ -0,0 +1,8 @@
1
+ import { buildPromptRuntimeOperations } from './prompt-runtimes.js';
2
+ export function buildGeminiRuntimeOperations(target, fromModuleUrl = import.meta.url) {
3
+ if (target.id !== 'gemini') {
4
+ throw new Error(`Gemini runtime builder received ${target.id}.`);
5
+ }
6
+ return buildPromptRuntimeOperations(target, fromModuleUrl);
7
+ }
8
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/install/runtimes/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAEnE,MAAM,UAAU,4BAA4B,CAC1C,MAA6B,EAC7B,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEvC,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;IAClE,CAAC;IAED,OAAO,4BAA4B,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallFileOperation, ResolvedInstallTarget } from '../types.js';
2
+ export declare function buildOpenCodeRuntimeOperations(target: ResolvedInstallTarget, fromModuleUrl?: string): InstallFileOperation[];
3
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/install/runtimes/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAG9E,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,qBAAqB,EAC7B,aAAa,GAAE,MAAwB,GACtC,oBAAoB,EAAE,CAMxB"}
@@ -0,0 +1,8 @@
1
+ import { buildPromptRuntimeOperations } from './prompt-runtimes.js';
2
+ export function buildOpenCodeRuntimeOperations(target, fromModuleUrl = import.meta.url) {
3
+ if (target.id !== 'opencode') {
4
+ throw new Error(`OpenCode runtime builder received ${target.id}.`);
5
+ }
6
+ return buildPromptRuntimeOperations(target, fromModuleUrl);
7
+ }
8
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/install/runtimes/opencode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAEnE,MAAM,UAAU,8BAA8B,CAC5C,MAA6B,EAC7B,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEvC,IAAI,MAAM,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,4BAA4B,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InstallFileOperation, ResolvedInstallTarget } from '../types.js';
2
+ export declare function buildPromptRuntimeOperations(target: ResolvedInstallTarget, fromModuleUrl?: string): InstallFileOperation[];
3
+ //# sourceMappingURL=prompt-runtimes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-runtimes.d.ts","sourceRoot":"","sources":["../../../src/install/runtimes/prompt-runtimes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EAGtB,MAAM,aAAa,CAAA;AA2DpB,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,aAAa,GAAE,MAAwB,GACtC,oBAAoB,EAAE,CAmBxB"}