@g3nomaly/core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +95 -0
- package/dist/cli/commands/add.d.ts +17 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +76 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/installFromSources.d.ts +49 -0
- package/dist/cli/commands/installFromSources.d.ts.map +1 -0
- package/dist/cli/commands/installFromSources.js +138 -0
- package/dist/cli/commands/installFromSources.js.map +1 -0
- package/dist/cli/commands/ls.d.ts +16 -0
- package/dist/cli/commands/ls.d.ts.map +1 -0
- package/dist/cli/commands/ls.js +65 -0
- package/dist/cli/commands/ls.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +13 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +109 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/sources.d.ts +45 -0
- package/dist/cli/commands/sources.d.ts.map +1 -0
- package/dist/cli/commands/sources.js +89 -0
- package/dist/cli/commands/sources.js.map +1 -0
- package/dist/cli/commands/update.d.ts +10 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +92 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/dialogue.d.ts +74 -0
- package/dist/cli/dialogue.d.ts.map +1 -0
- package/dist/cli/dialogue.js +117 -0
- package/dist/cli/dialogue.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/installDialogues.d.ts +15 -0
- package/dist/cli/installDialogues.d.ts.map +1 -0
- package/dist/cli/installDialogues.js +72 -0
- package/dist/cli/installDialogues.js.map +1 -0
- package/dist/cli/pick.d.ts +14 -0
- package/dist/cli/pick.d.ts.map +1 -0
- package/dist/cli/pick.js +35 -0
- package/dist/cli/pick.js.map +1 -0
- package/dist/cli/report.d.ts +34 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +71 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/theme.d.ts +23 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +25 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/types.d.ts +45 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +30 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +77 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +124 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +61 -0
- package/dist/config/types.js.map +1 -0
- package/dist/hash/hash.d.ts +25 -0
- package/dist/hash/hash.d.ts.map +1 -0
- package/dist/hash/hash.js +44 -0
- package/dist/hash/hash.js.map +1 -0
- package/dist/hash/index.d.ts +2 -0
- package/dist/hash/index.d.ts.map +1 -0
- package/dist/hash/index.js +2 -0
- package/dist/hash/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/classify.d.ts +7 -0
- package/dist/installer/classify.d.ts.map +1 -0
- package/dist/installer/classify.js +47 -0
- package/dist/installer/classify.js.map +1 -0
- package/dist/installer/files.d.ts +15 -0
- package/dist/installer/files.d.ts.map +1 -0
- package/dist/installer/files.js +22 -0
- package/dist/installer/files.js.map +1 -0
- package/dist/installer/index.d.ts +19 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +14 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/install.d.ts +13 -0
- package/dist/installer/install.d.ts.map +1 -0
- package/dist/installer/install.js +61 -0
- package/dist/installer/install.js.map +1 -0
- package/dist/installer/io.d.ts +4 -0
- package/dist/installer/io.d.ts.map +1 -0
- package/dist/installer/io.js +18 -0
- package/dist/installer/io.js.map +1 -0
- package/dist/installer/manifest.d.ts +59 -0
- package/dist/installer/manifest.d.ts.map +1 -0
- package/dist/installer/manifest.js +60 -0
- package/dist/installer/manifest.js.map +1 -0
- package/dist/installer/manifestSources.d.ts +21 -0
- package/dist/installer/manifestSources.d.ts.map +1 -0
- package/dist/installer/manifestSources.js +39 -0
- package/dist/installer/manifestSources.js.map +1 -0
- package/dist/installer/marketplace.d.ts +34 -0
- package/dist/installer/marketplace.d.ts.map +1 -0
- package/dist/installer/marketplace.js +64 -0
- package/dist/installer/marketplace.js.map +1 -0
- package/dist/installer/origin.d.ts +43 -0
- package/dist/installer/origin.d.ts.map +1 -0
- package/dist/installer/origin.js +22 -0
- package/dist/installer/origin.js.map +1 -0
- package/dist/installer/remove.d.ts +14 -0
- package/dist/installer/remove.d.ts.map +1 -0
- package/dist/installer/remove.js +37 -0
- package/dist/installer/remove.js.map +1 -0
- package/dist/installer/resolve.d.ts +78 -0
- package/dist/installer/resolve.d.ts.map +1 -0
- package/dist/installer/resolve.js +184 -0
- package/dist/installer/resolve.js.map +1 -0
- package/dist/installer/sourceRegistry.d.ts +59 -0
- package/dist/installer/sourceRegistry.d.ts.map +1 -0
- package/dist/installer/sourceRegistry.js +71 -0
- package/dist/installer/sourceRegistry.js.map +1 -0
- package/dist/installer/types.d.ts +80 -0
- package/dist/installer/types.d.ts.map +1 -0
- package/dist/installer/types.js +21 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/registry/index.d.ts +12 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.handlers.d.ts +9 -0
- package/dist/registry/registry.handlers.d.ts.map +1 -0
- package/dist/registry/registry.handlers.js +13 -0
- package/dist/registry/registry.handlers.js.map +1 -0
- package/dist/registry/registry.io.d.ts +22 -0
- package/dist/registry/registry.io.d.ts.map +1 -0
- package/dist/registry/registry.io.js +78 -0
- package/dist/registry/registry.io.js.map +1 -0
- package/dist/registry/registry.mutations.d.ts +12 -0
- package/dist/registry/registry.mutations.d.ts.map +1 -0
- package/dist/registry/registry.mutations.js +22 -0
- package/dist/registry/registry.mutations.js.map +1 -0
- package/dist/registry/registry.selectors.d.ts +38 -0
- package/dist/registry/registry.selectors.d.ts.map +1 -0
- package/dist/registry/registry.selectors.js +61 -0
- package/dist/registry/registry.selectors.js.map +1 -0
- package/dist/registry/registry.store.d.ts +34 -0
- package/dist/registry/registry.store.d.ts.map +1 -0
- package/dist/registry/registry.store.js +27 -0
- package/dist/registry/registry.store.js.map +1 -0
- package/dist/registry/registry.template.d.ts +23 -0
- package/dist/registry/registry.template.d.ts.map +1 -0
- package/dist/registry/registry.template.js +63 -0
- package/dist/registry/registry.template.js.map +1 -0
- package/dist/registry/types.d.ts +33 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +25 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +2 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/securityParser.d.ts +14 -0
- package/dist/security/securityParser.d.ts.map +1 -0
- package/dist/security/securityParser.js +89 -0
- package/dist/security/securityParser.js.map +1 -0
- package/dist/security/securityWorker.d.ts +8 -0
- package/dist/security/securityWorker.d.ts.map +1 -0
- package/dist/security/securityWorker.js +158 -0
- package/dist/security/securityWorker.js.map +1 -0
- package/dist/sources/checkout.d.ts +14 -0
- package/dist/sources/checkout.d.ts.map +1 -0
- package/dist/sources/checkout.js +27 -0
- package/dist/sources/checkout.js.map +1 -0
- package/dist/sources/git.d.ts +9 -0
- package/dist/sources/git.d.ts.map +1 -0
- package/dist/sources/git.js +22 -0
- package/dist/sources/git.js.map +1 -0
- package/dist/sources/index.d.ts +5 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +6 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/local.d.ts +10 -0
- package/dist/sources/local.d.ts.map +1 -0
- package/dist/sources/local.js +20 -0
- package/dist/sources/local.js.map +1 -0
- package/dist/sources/npm.d.ts +13 -0
- package/dist/sources/npm.d.ts.map +1 -0
- package/dist/sources/npm.js +128 -0
- package/dist/sources/npm.js.map +1 -0
- package/dist/sources/packageJson.d.ts +3 -0
- package/dist/sources/packageJson.d.ts.map +1 -0
- package/dist/sources/packageJson.js +13 -0
- package/dist/sources/packageJson.js.map +1 -0
- package/dist/sources/parse.d.ts +34 -0
- package/dist/sources/parse.d.ts.map +1 -0
- package/dist/sources/parse.js +92 -0
- package/dist/sources/parse.js.map +1 -0
- package/dist/sources/process.d.ts +18 -0
- package/dist/sources/process.d.ts.map +1 -0
- package/dist/sources/process.js +43 -0
- package/dist/sources/process.js.map +1 -0
- package/dist/sources/register.d.ts +16 -0
- package/dist/sources/register.d.ts.map +1 -0
- package/dist/sources/register.js +37 -0
- package/dist/sources/register.js.map +1 -0
- package/dist/sources/types.d.ts +73 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +36 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/utils/errors.d.ts +3 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +6 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge.d.ts +6 -0
- package/dist/utils/merge.d.ts.map +1 -0
- package/dist/utils/merge.js +21 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/utils/packageMeta.d.ts +12 -0
- package/dist/utils/packageMeta.d.ts.map +1 -0
- package/dist/utils/packageMeta.js +20 -0
- package/dist/utils/packageMeta.js.map +1 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +40 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/prompt.d.ts +3 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +8 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/version.d.ts +9 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +103 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +64 -3
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,mBAAmB;;;;;iBAS9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;iBAE5B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;iBAGjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAE/B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;EAA8B,CAAC;AAE7D,eAAO,MAAM,uBAAuB;;;iBAKlC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAO/B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;iBAE7B,CAAC;AAMH,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI9B,CAAC;AAEH,0EAA0E;AAC1E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI1B,CAAC;AAMH,MAAM,MAAM,aAAa,GAAS,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,WAAW,GAAW,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAM,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACzE,MAAM,MAAM,cAAc,GAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACvE,MAAM,MAAM,WAAW,GAAW,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAK,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACvE,MAAM,MAAM,YAAY,GAAU,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACrE,MAAM,MAAM,aAAa,GAAS,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,SAAS,GAAa,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// packages/core/src/config/types.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Per-package section schemas — settings only. Package metadata (version,
|
|
5
|
+
// description, license) lives in each package's package.json and is read at
|
|
6
|
+
// runtime via `readPackageMeta`, never persisted here.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
export const G3nuiSettingsSchema = z.object({
|
|
9
|
+
/** Where components are installed in the user's project */
|
|
10
|
+
componentsDir: z.string().default("src/components/ui"),
|
|
11
|
+
/** Whether to copy .debug.ts files alongside components */
|
|
12
|
+
includeDebugFiles: z.boolean().default(false),
|
|
13
|
+
/** Whether to copy .meta.ts files alongside components */
|
|
14
|
+
includeMetaFiles: z.boolean().default(false),
|
|
15
|
+
/** External package adapters to load (e.g. ["shadcn"]) */
|
|
16
|
+
registeredPackages: z.array(z.string()).default([]),
|
|
17
|
+
});
|
|
18
|
+
export const G3nuiConfigSchema = z.object({
|
|
19
|
+
settings: G3nuiSettingsSchema.default(() => G3nuiSettingsSchema.parse({})),
|
|
20
|
+
});
|
|
21
|
+
export const G3nerateSettingsSchema = z.object({
|
|
22
|
+
/** Output directory for generated files */
|
|
23
|
+
outputDir: z.string().default("src/generated"),
|
|
24
|
+
});
|
|
25
|
+
export const G3nerateConfigSchema = z.object({
|
|
26
|
+
settings: G3nerateSettingsSchema.default(() => G3nerateSettingsSchema.parse({})),
|
|
27
|
+
});
|
|
28
|
+
export const SkillTargetSchema = z.enum(["claude", "codex"]);
|
|
29
|
+
export const SkillsInstallDirsSchema = z.object({
|
|
30
|
+
/** Skill install directory for Claude Code, relative to the project root */
|
|
31
|
+
claude: z.string().default(".claude/skills"),
|
|
32
|
+
/** Skill install directory for Codex (`.agents/skills`), relative to the project root */
|
|
33
|
+
codex: z.string().default(".agents/skills"),
|
|
34
|
+
});
|
|
35
|
+
export const SkillsSettingsSchema = z.object({
|
|
36
|
+
/** Where the plan, phase and task tree lives, relative to the project root */
|
|
37
|
+
filetreeRoot: z.string().default("docs/task-manager"),
|
|
38
|
+
/** Which agent harnesses skills are installed for */
|
|
39
|
+
targets: z.array(SkillTargetSchema).min(1).default(["claude"]),
|
|
40
|
+
/** Install directory per target; the skills.json registry sits next to each */
|
|
41
|
+
installDirs: SkillsInstallDirsSchema.default(() => SkillsInstallDirsSchema.parse({})),
|
|
42
|
+
});
|
|
43
|
+
export const SkillsConfigSchema = z.object({
|
|
44
|
+
settings: SkillsSettingsSchema.default(() => SkillsSettingsSchema.parse({})),
|
|
45
|
+
});
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Root config schemas
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/** What `.g3n.config.json` holds on disk: only the sections a package's init has written. */
|
|
50
|
+
export const G3nConfigFileSchema = z.object({
|
|
51
|
+
g3nui: G3nuiConfigSchema.optional(),
|
|
52
|
+
g3nerate: G3nerateConfigSchema.optional(),
|
|
53
|
+
skills: SkillsConfigSchema.optional(),
|
|
54
|
+
});
|
|
55
|
+
/** The fully-defaulted view every consumer reads through `loadConfig`. */
|
|
56
|
+
export const G3nConfigSchema = z.object({
|
|
57
|
+
g3nui: G3nuiConfigSchema.default(() => G3nuiConfigSchema.parse({})),
|
|
58
|
+
g3nerate: G3nerateConfigSchema.default(() => G3nerateConfigSchema.parse({})),
|
|
59
|
+
skills: SkillsConfigSchema.default(() => SkillsConfigSchema.parse({})),
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hashes a file's contents using SHA-256.
|
|
3
|
+
* Uses Bun's native file API + Web Crypto — no external dependencies.
|
|
4
|
+
*
|
|
5
|
+
* @param filePath - Absolute or relative path to the file
|
|
6
|
+
* @returns Lowercase hex SHA-256 digest
|
|
7
|
+
*/
|
|
8
|
+
export declare function hashFile(filePath: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Hashes an arbitrary string using SHA-256.
|
|
11
|
+
* Useful for hashing in-memory content before writing to disk.
|
|
12
|
+
*
|
|
13
|
+
* @param content - String to hash
|
|
14
|
+
* @returns Lowercase hex SHA-256 digest
|
|
15
|
+
*/
|
|
16
|
+
export declare function hashString(content: string): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Short (first 12 chars) SHA-256 hash of a file — for display purposes.
|
|
19
|
+
*/
|
|
20
|
+
export declare function hashFileShort(filePath: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Short (first 12 chars) SHA-256 hash of a string — for display purposes.
|
|
23
|
+
*/
|
|
24
|
+
export declare function hashStringShort(content: string): Promise<string>;
|
|
25
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/hash/hash.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
if ("window" in globalThis) {
|
|
2
|
+
throw new Error("@g3nomaly/core hash utilities are CLI-only");
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Hashes a file's contents using SHA-256.
|
|
6
|
+
* Uses Bun's native file API + Web Crypto — no external dependencies.
|
|
7
|
+
*
|
|
8
|
+
* @param filePath - Absolute or relative path to the file
|
|
9
|
+
* @returns Lowercase hex SHA-256 digest
|
|
10
|
+
*/
|
|
11
|
+
export async function hashFile(filePath) {
|
|
12
|
+
const file = Bun.file(filePath);
|
|
13
|
+
const buffer = await file.arrayBuffer();
|
|
14
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
|
|
15
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
16
|
+
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hashes an arbitrary string using SHA-256.
|
|
20
|
+
* Useful for hashing in-memory content before writing to disk.
|
|
21
|
+
*
|
|
22
|
+
* @param content - String to hash
|
|
23
|
+
* @returns Lowercase hex SHA-256 digest
|
|
24
|
+
*/
|
|
25
|
+
export async function hashString(content) {
|
|
26
|
+
const encoder = new TextEncoder();
|
|
27
|
+
const buffer = encoder.encode(content);
|
|
28
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
|
|
29
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
30
|
+
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Short (first 12 chars) SHA-256 hash of a file — for display purposes.
|
|
34
|
+
*/
|
|
35
|
+
export async function hashFileShort(filePath) {
|
|
36
|
+
return (await hashFile(filePath)).substring(0, 12);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Short (first 12 chars) SHA-256 hash of a string — for display purposes.
|
|
40
|
+
*/
|
|
41
|
+
export async function hashStringShort(content) {
|
|
42
|
+
return (await hashString(content)).substring(0, 12);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/hash/hash.ts"],"names":[],"mappings":"AAAA,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;IAC3B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,OAAO,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,OAAO,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hash/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hash/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BaseFileEntry, BaseRegistryEntry } from "../registry/types";
|
|
2
|
+
import type { FileClassification, InstallerIO } from "./types";
|
|
3
|
+
/** `path → hash` map of a manifest entry's files; empty when never installed. */
|
|
4
|
+
export declare function recordedHashes(entry: Pick<BaseRegistryEntry, "files"> | undefined): Record<string, string>;
|
|
5
|
+
export declare function classifyFile<F extends BaseFileEntry>(file: F, installDir: string, recordedHash: string | undefined, io: InstallerIO, resolveLatestHash?: (file: F) => Promise<string>): Promise<FileClassification<F>>;
|
|
6
|
+
export declare function classifyFiles<F extends BaseFileEntry>(files: readonly F[], installDir: string, recorded: Record<string, string | undefined>, io: InstallerIO, resolveLatestHash?: (file: F) => Promise<string>): Promise<FileClassification<F>[]>;
|
|
7
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/installer/classify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE9D,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM1G;AAoBD,wBAAsB,YAAY,CAAC,CAAC,SAAS,aAAa,EACxD,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,EAAE,EAAE,WAAW,EACf,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAC/C,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAUhC;AAED,wBAAsB,aAAa,CAAC,CAAC,SAAS,aAAa,EACzD,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC5C,EAAE,EAAE,WAAW,EACf,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAC/C,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAMlC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// packages/core/src/installer/classify.ts
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { FileState } from "./types";
|
|
4
|
+
/** `path → hash` map of a manifest entry's files; empty when never installed. */
|
|
5
|
+
export function recordedHashes(entry) {
|
|
6
|
+
const map = {};
|
|
7
|
+
for (const file of entry?.files ?? []) {
|
|
8
|
+
if (file.hash)
|
|
9
|
+
map[file.path] = file.hash;
|
|
10
|
+
}
|
|
11
|
+
return map;
|
|
12
|
+
}
|
|
13
|
+
function resolveState(exists, currentHash, recordedHash, latestHash) {
|
|
14
|
+
if (!exists)
|
|
15
|
+
return FileState.SafeUpdate;
|
|
16
|
+
if (recordedHash === undefined) {
|
|
17
|
+
return currentHash === latestHash ? FileState.UpToDate : FileState.Conflict;
|
|
18
|
+
}
|
|
19
|
+
const userModified = currentHash !== recordedHash;
|
|
20
|
+
const registryChanged = latestHash !== recordedHash;
|
|
21
|
+
if (!userModified && !registryChanged)
|
|
22
|
+
return FileState.UpToDate;
|
|
23
|
+
if (!userModified)
|
|
24
|
+
return FileState.SafeUpdate;
|
|
25
|
+
if (!registryChanged)
|
|
26
|
+
return FileState.UserOnly;
|
|
27
|
+
return FileState.Conflict;
|
|
28
|
+
}
|
|
29
|
+
export async function classifyFile(file, installDir, recordedHash, io, resolveLatestHash) {
|
|
30
|
+
const destPath = path.join(installDir, file.path);
|
|
31
|
+
const latestHash = file.hash ?? (await resolveLatestHash?.(file));
|
|
32
|
+
if (latestHash === undefined) {
|
|
33
|
+
throw new Error(`no hash for "${file.path}" and no resolveLatestHash provided`);
|
|
34
|
+
}
|
|
35
|
+
const exists = io.exists(destPath);
|
|
36
|
+
const currentHash = exists ? await io.hashFile(destPath) : null;
|
|
37
|
+
const state = resolveState(exists, currentHash, recordedHash, latestHash);
|
|
38
|
+
return { file, destPath, state, exists, currentHash, recordedHash, latestHash };
|
|
39
|
+
}
|
|
40
|
+
export async function classifyFiles(files, installDir, recorded, io, resolveLatestHash) {
|
|
41
|
+
const classifications = [];
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
classifications.push(await classifyFile(file, installDir, recorded[file.path], io, resolveLatestHash));
|
|
44
|
+
}
|
|
45
|
+
return classifications;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/installer/classify.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGnC,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAmD;IAChF,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;IAC3C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,YAAY,CACnB,MAAe,EACf,WAA0B,EAC1B,YAAgC,EAChC,UAAkB;IAElB,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC,UAAU,CAAA;IACxC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAA;IAC7E,CAAC;IACD,MAAM,YAAY,GAAM,WAAW,KAAK,YAAY,CAAA;IACpD,MAAM,eAAe,GAAG,UAAU,KAAM,YAAY,CAAA;IACpD,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;IAChE,IAAI,CAAC,YAAY;QAAsB,OAAO,SAAS,CAAC,UAAU,CAAA;IAClE,IAAI,CAAC,eAAe;QAAmB,OAAO,SAAS,CAAC,QAAQ,CAAA;IAChE,OAAO,SAAS,CAAC,QAAQ,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAO,EACP,UAAkB,EAClB,YAAgC,EAChC,EAAe,EACf,iBAAgD;IAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACjE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,qCAAqC,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,MAAM,GAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/D,MAAM,KAAK,GAAS,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;IAC/E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,EACnB,UAAkB,EAClB,QAA4C,EAC5C,EAAe,EACf,iBAAgD;IAEhD,MAAM,eAAe,GAA4B,EAAE,CAAA;IACnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,eAAe,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAA;IACxG,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** What `listFiles` leaves out. Folders always skipped: `node_modules` and `.git`. */
|
|
2
|
+
export interface FileFilter {
|
|
3
|
+
/** Folder names, or folder paths relative to the listed root, e.g. `tests` or `.claude-plugin/types` */
|
|
4
|
+
skipDirs?: readonly string[];
|
|
5
|
+
/** Tested against each file name, e.g. `/\.test\.tsx?$/` */
|
|
6
|
+
skipFiles?: RegExp;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Paths of every file below `dir`, relative to it and sorted, without the
|
|
10
|
+
* folders and files `filter` names.
|
|
11
|
+
*
|
|
12
|
+
* @param dir - Absolute folder to list
|
|
13
|
+
*/
|
|
14
|
+
export declare function listFiles(dir: string, filter?: FileFilter): string[];
|
|
15
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/installer/files.ts"],"names":[],"mappings":"AAIA,sFAAsF;AACtF,MAAM,WAAW,UAAU;IACzB,wGAAwG;IACxG,QAAQ,CAAC,EAAG,SAAS,MAAM,EAAE,CAAA;IAC7B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,UAAe,GAAG,MAAM,EAAE,CAUxE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// packages/core/src/installer/files.ts
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const ALWAYS_SKIPPED = ["node_modules", ".git"];
|
|
5
|
+
/**
|
|
6
|
+
* Paths of every file below `dir`, relative to it and sorted, without the
|
|
7
|
+
* folders and files `filter` names.
|
|
8
|
+
*
|
|
9
|
+
* @param dir - Absolute folder to list
|
|
10
|
+
*/
|
|
11
|
+
export function listFiles(dir, filter = {}) {
|
|
12
|
+
const skipDirs = new Set([...ALWAYS_SKIPPED, ...(filter.skipDirs ?? [])]);
|
|
13
|
+
const walk = (current) => fs.readdirSync(current, { withFileTypes: true }).flatMap((d) => {
|
|
14
|
+
const full = path.join(current, d.name);
|
|
15
|
+
const rel = path.relative(dir, full);
|
|
16
|
+
if (d.isDirectory())
|
|
17
|
+
return skipDirs.has(d.name) || skipDirs.has(rel) ? [] : walk(full);
|
|
18
|
+
return filter.skipFiles?.test(d.name) === true ? [] : [rel];
|
|
19
|
+
});
|
|
20
|
+
return walk(dir).sort();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/installer/files.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAU5B,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAM,GAAe,EAAE;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,CAAC,OAAe,EAAY,EAAE,CACzC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,GAAG,GAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvF,OAAO,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export { createInstallerIO } from "./io";
|
|
3
|
+
export { classifyFile, classifyFiles, recordedHashes } from "./classify";
|
|
4
|
+
export { applyClassifications, copySource } from "./install";
|
|
5
|
+
export { removeInstalledFiles, pruneEmptyDirs } from "./remove";
|
|
6
|
+
export { EntryOriginSchema, OriginEntrySchema } from "./origin";
|
|
7
|
+
export type { EntryOrigin, OriginEntry, ReadContext } from "./origin";
|
|
8
|
+
export { listFiles } from "./files";
|
|
9
|
+
export type { FileFilter } from "./files";
|
|
10
|
+
export { MANIFEST_DIRS, manifestFile, readMarketplace, resolveInside } from "./marketplace";
|
|
11
|
+
export type { MarketplacePlugin } from "./marketplace";
|
|
12
|
+
export { installManifestSchema, loadInstallManifest, installedEntries, saveInstallManifest } from "./manifest";
|
|
13
|
+
export type { InstallManifest } from "./manifest";
|
|
14
|
+
export { manifestSources, registerSource, unregisterSource } from "./manifestSources";
|
|
15
|
+
export { loadSourceRegistry, offers, offerRegistry, entrySource } from "./sourceRegistry";
|
|
16
|
+
export type { SourceRegistry, SourceEntries, SourceOffer, ReadSource, FailedSource } from "./sourceRegistry";
|
|
17
|
+
export { parseRequest, formatRequest, resolveDependencies, resolveRequests, resolveInstalled, resolveUpdates, installedOrigins } from "./resolve";
|
|
18
|
+
export type { EntryRequest, Resolution, ResolvedDependencies } from "./resolve";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC3F,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAC9G,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACzF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC5G,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACjJ,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// packages/core/src/installer/index.ts
|
|
2
|
+
export * from "./types";
|
|
3
|
+
export { createInstallerIO } from "./io";
|
|
4
|
+
export { classifyFile, classifyFiles, recordedHashes } from "./classify";
|
|
5
|
+
export { applyClassifications, copySource } from "./install";
|
|
6
|
+
export { removeInstalledFiles, pruneEmptyDirs } from "./remove";
|
|
7
|
+
export { EntryOriginSchema, OriginEntrySchema } from "./origin";
|
|
8
|
+
export { listFiles } from "./files";
|
|
9
|
+
export { MANIFEST_DIRS, manifestFile, readMarketplace, resolveInside } from "./marketplace";
|
|
10
|
+
export { installManifestSchema, loadInstallManifest, installedEntries, saveInstallManifest } from "./manifest";
|
|
11
|
+
export { manifestSources, registerSource, unregisterSource } from "./manifestSources";
|
|
12
|
+
export { loadSourceRegistry, offers, offerRegistry, entrySource } from "./sourceRegistry";
|
|
13
|
+
export { parseRequest, formatRequest, resolveDependencies, resolveRequests, resolveInstalled, resolveUpdates, installedOrigins } from "./resolve";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE3F,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAE9G,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEzF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BaseFileEntry } from "../registry/types";
|
|
2
|
+
import type { ApplyOptions, ApplyResult, FileClassification, FileSource, InstallerIO } from "./types";
|
|
3
|
+
/** Local default: copy each file from the package source tree at its relative path. */
|
|
4
|
+
export declare function copySource<F extends BaseFileEntry>(resolveSourcePath: (relPath: string) => string): FileSource<F>;
|
|
5
|
+
/**
|
|
6
|
+
* Writes the files an install/update decision allows and reports what
|
|
7
|
+
* happened per file. `SafeUpdate` files are always written; `UserOnly` and
|
|
8
|
+
* `Conflict` files only when `decision` is Overwrite or `force` is set.
|
|
9
|
+
* `files` in the result mirrors the on-disk state afterwards so the caller
|
|
10
|
+
* can register it in the user manifest.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyClassifications<F extends BaseFileEntry>(classifications: readonly FileClassification<F>[], source: FileSource<F>, opts: ApplyOptions, io: InstallerIO): Promise<ApplyResult<F>>;
|
|
13
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErG,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,CAAC,SAAS,aAAa,EAAE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAEjH;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,aAAa,EAChE,eAAe,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,EACjD,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA2CzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// packages/core/src/installer/install.ts
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ConflictDecision, FileState } from "./types";
|
|
4
|
+
/** Local default: copy each file from the package source tree at its relative path. */
|
|
5
|
+
export function copySource(resolveSourcePath) {
|
|
6
|
+
return (file) => ({ kind: "copy", sourcePath: resolveSourcePath(file.path) });
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Writes the files an install/update decision allows and reports what
|
|
10
|
+
* happened per file. `SafeUpdate` files are always written; `UserOnly` and
|
|
11
|
+
* `Conflict` files only when `decision` is Overwrite or `force` is set.
|
|
12
|
+
* `files` in the result mirrors the on-disk state afterwards so the caller
|
|
13
|
+
* can register it in the user manifest.
|
|
14
|
+
*/
|
|
15
|
+
export async function applyClassifications(classifications, source, opts, io) {
|
|
16
|
+
const result = { written: [], kept: [], missingSource: [], files: [] };
|
|
17
|
+
const overwrite = opts.force === true || opts.decision === ConflictDecision.Overwrite;
|
|
18
|
+
const write = async (cl) => {
|
|
19
|
+
const content = await source(cl.file);
|
|
20
|
+
if (content === null) {
|
|
21
|
+
result.missingSource.push(cl.file.path);
|
|
22
|
+
if (cl.exists)
|
|
23
|
+
result.files.push({ ...cl.file, hash: cl.currentHash ?? undefined });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (opts.dryRun === true) {
|
|
27
|
+
result.files.push({ ...cl.file, hash: cl.latestHash });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
io.ensureDir(path.dirname(cl.destPath));
|
|
31
|
+
if (content.kind === "copy")
|
|
32
|
+
io.copyFile(content.sourcePath, cl.destPath);
|
|
33
|
+
else
|
|
34
|
+
io.writeFile(cl.destPath, content.content);
|
|
35
|
+
result.files.push({ ...cl.file, hash: await io.hashFile(cl.destPath) });
|
|
36
|
+
}
|
|
37
|
+
result.written.push(cl.file.path);
|
|
38
|
+
};
|
|
39
|
+
for (const cl of classifications) {
|
|
40
|
+
switch (cl.state) {
|
|
41
|
+
case FileState.UpToDate:
|
|
42
|
+
result.files.push({ ...cl.file, hash: cl.currentHash ?? cl.latestHash });
|
|
43
|
+
break;
|
|
44
|
+
case FileState.SafeUpdate:
|
|
45
|
+
await write(cl);
|
|
46
|
+
break;
|
|
47
|
+
case FileState.UserOnly:
|
|
48
|
+
case FileState.Conflict:
|
|
49
|
+
if (overwrite) {
|
|
50
|
+
await write(cl);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
result.kept.push(cl.file.path);
|
|
54
|
+
result.files.push({ ...cl.file, hash: cl.currentHash ?? undefined });
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/installer/io.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAYnF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// packages/core/src/installer/io.ts
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { hashFile } from "../hash/hash";
|
|
4
|
+
/** Real-filesystem `InstallerIO`; any field can be overridden for tests. */
|
|
5
|
+
export function createInstallerIO(overrides = {}) {
|
|
6
|
+
return {
|
|
7
|
+
exists: (path) => fs.existsSync(path),
|
|
8
|
+
ensureDir: (dir) => { fs.mkdirSync(dir, { recursive: true }); },
|
|
9
|
+
copyFile: (src, dest) => { fs.copyFileSync(src, dest); },
|
|
10
|
+
writeFile: (dest, content) => { fs.writeFileSync(dest, content, "utf8"); },
|
|
11
|
+
removeFile: (path) => { fs.rmSync(path); },
|
|
12
|
+
listDir: (dir) => fs.readdirSync(dir),
|
|
13
|
+
removeDir: (dir) => { fs.rmSync(dir, { recursive: true }); },
|
|
14
|
+
hashFile,
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/installer/io.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAGvC,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAAC,SAAS,GAAyB,EAAE;IACpE,OAAO;QACL,MAAM,EAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACzC,SAAS,EAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAC/D,QAAQ,EAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;QACzD,SAAS,EAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC;QAC1E,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC;QACzC,OAAO,EAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC;QACxC,SAAS,EAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAC5D,QAAQ;QACR,GAAG,SAAS;KACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type RegistryStore } from "../registry/registry.store";
|
|
3
|
+
import type { BaseRegistryEntry } from "../registry/types";
|
|
4
|
+
import { type SourceRecord } from "../sources/types";
|
|
5
|
+
/**
|
|
6
|
+
* One install manifest: the sources registered for an install target and
|
|
7
|
+
* the entries installed into it, as `{ "sources": {...}, "entries": {...} }`
|
|
8
|
+
* on disk.
|
|
9
|
+
*
|
|
10
|
+
* Created by `loadInstallManifest` in each installer's project setup
|
|
11
|
+
* (`skills.json`, `mods.json`, the g3nui manifest). The installer changes
|
|
12
|
+
* `sources` directly and hands `store` to the core `add`, `update` and
|
|
13
|
+
* `remove` commands; `saveInstallManifest` writes both back.
|
|
14
|
+
*/
|
|
15
|
+
export interface InstallManifest {
|
|
16
|
+
/** Absolute path of the file, e.g. `/home/me/app/.claude/skills.json` */
|
|
17
|
+
filePath: string;
|
|
18
|
+
sources: SourceRecord;
|
|
19
|
+
/** Installed entries by key */
|
|
20
|
+
store: RegistryStore<BaseRegistryEntry>;
|
|
21
|
+
}
|
|
22
|
+
/** Schema of a manifest file whose entries match `entrySchema`. */
|
|
23
|
+
export declare function installManifestSchema<S extends z.ZodType>(entrySchema: S): z.ZodObject<{
|
|
24
|
+
sources: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
25
|
+
kind: z.ZodLiteral<"git">;
|
|
26
|
+
url: z.ZodString;
|
|
27
|
+
ref: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
29
|
+
kind: z.ZodLiteral<"npm">;
|
|
30
|
+
package: z.ZodString;
|
|
31
|
+
version: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
33
|
+
kind: z.ZodLiteral<"local">;
|
|
34
|
+
path: z.ZodString;
|
|
35
|
+
}, z.core.$strip>], "kind">>>;
|
|
36
|
+
entries: z.ZodDefault<z.ZodRecord<z.ZodString, S>>;
|
|
37
|
+
}, z.core.$strict>;
|
|
38
|
+
/**
|
|
39
|
+
* Reads a manifest file and checks every entry against `entrySchema`; a
|
|
40
|
+
* missing file reads as no sources and no entries.
|
|
41
|
+
*
|
|
42
|
+
* @param filePath - Absolute path of the manifest
|
|
43
|
+
* @throws naming the file when it is not JSON or does not match the schema
|
|
44
|
+
*/
|
|
45
|
+
export declare function loadInstallManifest(filePath: string, entrySchema: z.ZodType<BaseRegistryEntry>): InstallManifest;
|
|
46
|
+
/**
|
|
47
|
+
* Installed entries of a manifest, each checked against `entrySchema`.
|
|
48
|
+
*
|
|
49
|
+
* @throws when an entry the install commands wrote does not match the schema
|
|
50
|
+
*/
|
|
51
|
+
export declare function installedEntries<T extends BaseRegistryEntry>(manifest: InstallManifest, entrySchema: z.ZodType<T>): Record<string, T>;
|
|
52
|
+
/**
|
|
53
|
+
* Writes sources and entries back, each sorted by name, after checking every
|
|
54
|
+
* entry against `entrySchema`.
|
|
55
|
+
*
|
|
56
|
+
* @throws when an entry does not match the schema; nothing is written then
|
|
57
|
+
*/
|
|
58
|
+
export declare function saveInstallManifest(manifest: InstallManifest, entrySchema: z.ZodType<BaseRegistryEntry>): void;
|
|
59
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/installer/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAEpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAGxE;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAG,YAAY,CAAA;IACtB,+BAA+B;IAC/B,KAAK,EAAK,aAAa,CAAC,iBAAiB,CAAC,CAAA;CAC3C;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;;;;;;;;;;;;;;mBAKxE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,eAAe,CAehH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAErI;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAK9G"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// packages/core/src/installer/manifest.ts
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { createRegistryStore } from "../registry/registry.store";
|
|
6
|
+
import { entries } from "../registry/registry.selectors";
|
|
7
|
+
import { SourceRecordSchema } from "../sources/types";
|
|
8
|
+
import { errorMessage } from "../utils/errors";
|
|
9
|
+
/** Schema of a manifest file whose entries match `entrySchema`. */
|
|
10
|
+
export function installManifestSchema(entrySchema) {
|
|
11
|
+
return z.strictObject({
|
|
12
|
+
sources: SourceRecordSchema.default({}),
|
|
13
|
+
entries: z.record(z.string(), entrySchema).default({}),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Reads a manifest file and checks every entry against `entrySchema`; a
|
|
18
|
+
* missing file reads as no sources and no entries.
|
|
19
|
+
*
|
|
20
|
+
* @param filePath - Absolute path of the manifest
|
|
21
|
+
* @throws naming the file when it is not JSON or does not match the schema
|
|
22
|
+
*/
|
|
23
|
+
export function loadInstallManifest(filePath, entrySchema) {
|
|
24
|
+
const store = createRegistryStore();
|
|
25
|
+
if (!fs.existsSync(filePath))
|
|
26
|
+
return { filePath, sources: {}, store };
|
|
27
|
+
let raw;
|
|
28
|
+
try {
|
|
29
|
+
raw = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new Error(`${filePath} is not valid JSON: ${errorMessage(error)}`);
|
|
33
|
+
}
|
|
34
|
+
const parsed = installManifestSchema(entrySchema).safeParse(raw);
|
|
35
|
+
if (!parsed.success)
|
|
36
|
+
throw new Error(`${filePath} is not a valid install manifest:\n${z.prettifyError(parsed.error)}`);
|
|
37
|
+
store.store.setState(() => ({ ...parsed.data.entries }));
|
|
38
|
+
return { filePath, sources: parsed.data.sources, store };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Installed entries of a manifest, each checked against `entrySchema`.
|
|
42
|
+
*
|
|
43
|
+
* @throws when an entry the install commands wrote does not match the schema
|
|
44
|
+
*/
|
|
45
|
+
export function installedEntries(manifest, entrySchema) {
|
|
46
|
+
return z.record(z.string(), entrySchema).parse(entries(manifest.store));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Writes sources and entries back, each sorted by name, after checking every
|
|
50
|
+
* entry against `entrySchema`.
|
|
51
|
+
*
|
|
52
|
+
* @throws when an entry does not match the schema; nothing is written then
|
|
53
|
+
*/
|
|
54
|
+
export function saveInstallManifest(manifest, entrySchema) {
|
|
55
|
+
const sorted = (record) => Object.fromEntries(Object.entries(record).sort(([a], [b]) => a.localeCompare(b)));
|
|
56
|
+
const content = { sources: sorted(manifest.sources), entries: sorted(installedEntries(manifest, entrySchema)) };
|
|
57
|
+
fs.mkdirSync(path.dirname(manifest.filePath), { recursive: true });
|
|
58
|
+
fs.writeFileSync(manifest.filePath, JSON.stringify(content, null, 2) + "\n");
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/installer/manifest.ts"],"names":[],"mappings":"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"}
|