mewkit 1.0.1 → 1.4.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 (48) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/init.d.ts +7 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +176 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/upgrade.d.ts +1 -2
  7. package/dist/commands/upgrade.d.ts.map +1 -1
  8. package/dist/commands/upgrade.js +119 -85
  9. package/dist/commands/upgrade.js.map +1 -1
  10. package/dist/core/compute-checksums.d.ts +25 -0
  11. package/dist/core/compute-checksums.d.ts.map +1 -0
  12. package/dist/core/compute-checksums.js +105 -0
  13. package/dist/core/compute-checksums.js.map +1 -0
  14. package/dist/core/core-logger.d.ts +9 -0
  15. package/dist/core/core-logger.d.ts.map +1 -0
  16. package/dist/core/core-logger.js +31 -0
  17. package/dist/core/core-logger.js.map +1 -0
  18. package/dist/core/github-releases.d.ts +30 -0
  19. package/dist/core/github-releases.d.ts.map +1 -0
  20. package/dist/core/github-releases.js +92 -0
  21. package/dist/core/github-releases.js.map +1 -0
  22. package/dist/core/index.d.ts +10 -0
  23. package/dist/core/index.d.ts.map +1 -0
  24. package/dist/core/index.js +10 -0
  25. package/dist/core/index.js.map +1 -0
  26. package/dist/core/merge-settings.d.ts +7 -0
  27. package/dist/core/merge-settings.d.ts.map +1 -0
  28. package/dist/core/merge-settings.js +125 -0
  29. package/dist/core/merge-settings.js.map +1 -0
  30. package/dist/core/smart-update-utils.d.ts +10 -0
  31. package/dist/core/smart-update-utils.d.ts.map +1 -0
  32. package/dist/core/smart-update-utils.js +62 -0
  33. package/dist/core/smart-update-utils.js.map +1 -0
  34. package/dist/core/smart-update.d.ts +18 -0
  35. package/dist/core/smart-update.d.ts.map +1 -0
  36. package/dist/core/smart-update.js +146 -0
  37. package/dist/core/smart-update.js.map +1 -0
  38. package/dist/core/substitute-placeholders.d.ts +10 -0
  39. package/dist/core/substitute-placeholders.d.ts.map +1 -0
  40. package/dist/core/substitute-placeholders.js +28 -0
  41. package/dist/core/substitute-placeholders.js.map +1 -0
  42. package/dist/core/validate-install.d.ts +6 -0
  43. package/dist/core/validate-install.d.ts.map +1 -0
  44. package/dist/core/validate-install.js +97 -0
  45. package/dist/core/validate-install.js.map +1 -0
  46. package/dist/index.js +11 -2
  47. package/dist/index.js.map +1 -1
  48. package/package.json +2 -1
package/README.md CHANGED
@@ -47,7 +47,7 @@ npx mewkit memory --clear # Reset memory
47
47
 
48
48
  ## Related
49
49
 
50
- - [create-meowkit](https://www.npmjs.com/package/create-meowkit) — Scaffold CLI (`npm create meowkit@latest`)
50
+ - [create-meowkit](https://www.npmjs.com/package/create-meowkit) — Scaffold CLI (deprecated; use `npx mewkit init`)
51
51
  - [GitHub](https://github.com/ngocsangyem/MeowKit)
52
52
 
53
53
  ## License
@@ -0,0 +1,7 @@
1
+ export interface InitArgs {
2
+ dryRun?: boolean;
3
+ force?: boolean;
4
+ beta?: boolean;
5
+ }
6
+ export declare function init(args: InitArgs): Promise<void>;
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAgFD,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGxD"}
@@ -0,0 +1,176 @@
1
+ import fs from "node:fs";
2
+ import { join } from "node:path";
3
+ import * as p from "@clack/prompts";
4
+ import pc from "picocolors";
5
+ import { fetchReleases, downloadRelease, cleanupDownload, smartUpdate, validate, } from "../core/index.js";
6
+ /** Detect if this is a fresh install or an update */
7
+ function detectMode(targetDir) {
8
+ return fs.existsSync(join(targetDir, ".claude")) ? "update" : "new";
9
+ }
10
+ /** Build @clack/prompts options from release list */
11
+ function buildReleaseOptions(releases, beta) {
12
+ const latestStable = releases.find((r) => !r.isBeta);
13
+ const pool = beta ? releases : releases.filter((r) => !r.isBeta);
14
+ return pool.slice(0, 10).map((r) => ({
15
+ value: r.tag,
16
+ label: `${r.version}${r.isBeta ? pc.yellow(" (beta)") : ""}${r.tag === latestStable?.tag ? pc.green(" (latest)") : ""}`,
17
+ hint: r.publishedAt.split("T")[0],
18
+ }));
19
+ }
20
+ /** Cancel-safe wrapper: exits on Ctrl+C */
21
+ function cancelCheck(value) {
22
+ if (p.isCancel(value)) {
23
+ p.cancel("Installation cancelled.");
24
+ process.exit(0);
25
+ }
26
+ }
27
+ /** Prompt the user for project description + optional Gemini API key */
28
+ async function promptNewInstall() {
29
+ const description = await p.text({
30
+ message: "Describe your project (optional)",
31
+ placeholder: "Press Enter to skip",
32
+ validate() { return undefined; },
33
+ });
34
+ cancelCheck(description);
35
+ const addGeminiKey = await p.confirm({
36
+ message: "Add Gemini API key? (for image/video/audio analysis)",
37
+ initialValue: false,
38
+ });
39
+ cancelCheck(addGeminiKey);
40
+ let geminiApiKey = null;
41
+ if (addGeminiKey) {
42
+ const keyInput = await p.text({
43
+ message: "Enter your Gemini API key",
44
+ placeholder: "Get one at aistudio.google.com/apikey",
45
+ validate(value) {
46
+ if (!value || value.trim().length === 0)
47
+ return "API key is required";
48
+ if (value.trim().length < 10)
49
+ return "Key too short — check aistudio.google.com/apikey";
50
+ return undefined;
51
+ },
52
+ });
53
+ cancelCheck(keyInput);
54
+ geminiApiKey = typeof keyInput === "string" ? keyInput.trim() : null;
55
+ if (geminiApiKey)
56
+ p.log.success("Gemini API key will be saved to .claude/.env");
57
+ }
58
+ return {
59
+ description: typeof description === "string" ? description.trim() : "",
60
+ enableCostTracking: true,
61
+ enableMemory: true,
62
+ geminiApiKey,
63
+ };
64
+ }
65
+ /** Print install/update summary */
66
+ function printSummary(stats, dryRun) {
67
+ console.log(`\n${pc.bold("Summary:")}`);
68
+ if (stats.added > 0)
69
+ console.log(` ${pc.green("added")} ${stats.added}`);
70
+ if (stats.updated > 0)
71
+ console.log(` ${pc.cyan("updated")} ${stats.updated}`);
72
+ if (stats.skipped > 0)
73
+ console.log(` ${pc.dim("skipped")} ${stats.skipped}`);
74
+ if (stats.userModified.length > 0) {
75
+ console.log(pc.yellow(`\n ${stats.userModified.length} user-modified file(s) preserved:`));
76
+ stats.userModified.slice(0, 8).forEach((f) => console.log(` ${pc.dim(f)}`));
77
+ if (stats.userModified.length > 8)
78
+ console.log(` ${pc.dim(`...and ${stats.userModified.length - 8} more`)}`);
79
+ }
80
+ if (!dryRun) {
81
+ console.log(`\n${pc.bold("Next steps:")}`);
82
+ console.log(` ${pc.dim("1.")} Run ${pc.bold("npx mewkit setup")} for guided configuration`);
83
+ console.log(` ${pc.dim("2.")} Run ${pc.bold("npx mewkit doctor")} to verify your environment`);
84
+ }
85
+ }
86
+ export async function init(args) {
87
+ const targetDir = process.cwd();
88
+ const mode = detectMode(targetDir);
89
+ const dryRun = args.dryRun ?? false;
90
+ const force = args.force ?? false;
91
+ p.intro(pc.bgCyan(pc.black(" meowkit init ")));
92
+ if (dryRun)
93
+ p.log.warn("Dry-run mode — no files will be written.");
94
+ if (mode === "update")
95
+ p.log.info("Existing .claude/ detected — running in update mode.");
96
+ // Step 1: Fetch releases
97
+ const releaseSpinner = p.spinner();
98
+ releaseSpinner.start("Fetching available releases...");
99
+ let releases;
100
+ try {
101
+ releases = await fetchReleases();
102
+ }
103
+ catch (err) {
104
+ releaseSpinner.stop("Failed to fetch releases");
105
+ const msg = err instanceof Error ? err.message : String(err);
106
+ p.cancel(`Cannot fetch releases from GitHub: ${msg}`);
107
+ process.exit(1);
108
+ }
109
+ if (releases.length === 0) {
110
+ releaseSpinner.stop("No releases found");
111
+ p.cancel("No releases available on GitHub.");
112
+ process.exit(1);
113
+ }
114
+ releaseSpinner.stop(`Found ${releases.length} release(s)`);
115
+ // Step 2: Version picker
116
+ const options = buildReleaseOptions(releases, args.beta ?? false);
117
+ const latestStable = releases.find((r) => !r.isBeta);
118
+ const selected = await p.select({
119
+ message: "Select MeowKit version to install",
120
+ options,
121
+ initialValue: latestStable?.tag ?? releases[0].tag,
122
+ });
123
+ if (p.isCancel(selected)) {
124
+ p.cancel("Installation cancelled.");
125
+ process.exit(0);
126
+ }
127
+ const release = releases.find((r) => r.tag === selected);
128
+ // Step 3: Config prompts (new installs only)
129
+ let config;
130
+ if (mode === "new") {
131
+ config = await promptNewInstall();
132
+ }
133
+ else {
134
+ config = { description: "", enableCostTracking: true, enableMemory: true, geminiApiKey: null };
135
+ }
136
+ // Step 4: Download release
137
+ const downloadSpinner = p.spinner();
138
+ downloadSpinner.start(`Downloading v${release.version}...`);
139
+ let sourceDir;
140
+ try {
141
+ sourceDir = await downloadRelease(release);
142
+ }
143
+ catch (err) {
144
+ downloadSpinner.stop("Download failed");
145
+ const msg = err instanceof Error ? err.message : String(err);
146
+ p.cancel(`Failed to download release: ${msg}`);
147
+ process.exit(1);
148
+ }
149
+ downloadSpinner.stop(`Downloaded v${release.version}`);
150
+ try {
151
+ // Step 5: Apply via smart update
152
+ const updateSpinner = p.spinner();
153
+ updateSpinner.start("Applying files...");
154
+ const stats = await smartUpdate(config, sourceDir, targetDir, dryRun, force);
155
+ updateSpinner.stop(`Applied: ${stats.added} added, ${stats.updated} updated, ${stats.skipped} skipped`);
156
+ // Step 6: Validate (skip dry-run)
157
+ if (!dryRun) {
158
+ const validateSpinner = p.spinner();
159
+ validateSpinner.start("Validating installation...");
160
+ const result = validate(targetDir);
161
+ if (result.valid) {
162
+ validateSpinner.stop("Validation passed");
163
+ }
164
+ else {
165
+ validateSpinner.stop(`Validation: ${result.issues.length} issue(s) — run \`mewkit validate\` for details`);
166
+ }
167
+ }
168
+ // Step 7: Summary
169
+ printSummary(stats, dryRun);
170
+ p.outro(pc.green(mode === "new" ? "MeowKit installed!" : "MeowKit updated!"));
171
+ }
172
+ finally {
173
+ cleanupDownload(sourceDir);
174
+ }
175
+ }
176
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- interface UpgradeArgs {
1
+ export interface UpgradeArgs {
2
2
  check?: boolean;
3
3
  beta?: boolean;
4
4
  list?: boolean;
5
5
  }
6
6
  export declare function upgrade(args: UpgradeArgs): Promise<void>;
7
- export {};
8
7
  //# sourceMappingURL=upgrade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAYA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAgCD,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0F9D"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmID,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B9D"}
@@ -1,108 +1,142 @@
1
- import { execSync } from "node:child_process";
1
+ import fs from "node:fs";
2
+ import { join } from "node:path";
2
3
  import pc from "picocolors";
4
+ import { fetchReleases, downloadRelease, cleanupDownload, smartUpdate, } from "../core/index.js";
5
+ /** Read installed version from .claude/metadata.json (instant, no npx) */
3
6
  function getLocalVersion() {
4
7
  try {
5
- // Check version via npx no global install required
6
- const output = execSync("npx --yes create-meowkit --version 2>/dev/null", {
7
- encoding: "utf-8",
8
- timeout: 15000,
9
- });
10
- return output.trim() || null;
8
+ const raw = fs.readFileSync(join(process.cwd(), ".claude", "metadata.json"), "utf-8");
9
+ const meta = JSON.parse(raw);
10
+ return meta.version ?? null;
11
11
  }
12
12
  catch {
13
13
  return null;
14
14
  }
15
15
  }
16
- async function fetchVersion(tag) {
17
- const response = await fetch(`https://registry.npmjs.org/create-meowkit/${tag}`);
18
- if (!response.ok) {
19
- throw new Error(`Failed to fetch ${tag} from npm registry: ${response.statusText}`);
20
- }
21
- const data = (await response.json());
22
- return data.version;
16
+ /** Format a date string as YYYY-MM-DD */
17
+ function formatDate(iso) {
18
+ return iso.split("T")[0];
23
19
  }
24
- async function fetchRegistryInfo() {
25
- const response = await fetch("https://registry.npmjs.org/create-meowkit");
26
- if (!response.ok) {
27
- throw new Error(`Failed to fetch from npm registry: ${response.statusText}`);
20
+ /** Show available releases fetched from GitHub */
21
+ async function listReleases(localVersion) {
22
+ console.log(pc.dim("Fetching available releases from GitHub..."));
23
+ const releases = await fetchReleases();
24
+ const stable = releases.filter((r) => !r.isBeta);
25
+ const beta = releases.filter((r) => r.isBeta);
26
+ console.log();
27
+ console.log(pc.bold("Channels:"));
28
+ console.log(` ${pc.green("stable:")} ${stable[0]?.version ?? "none"}`);
29
+ if (beta.length > 0) {
30
+ console.log(` ${pc.yellow("beta:")} ${beta[0]?.version ?? "none"}`);
31
+ }
32
+ console.log();
33
+ console.log(pc.bold("Recent releases:"));
34
+ for (const r of releases.slice(0, 10)) {
35
+ const installed = r.version === localVersion ? pc.cyan(" (installed)") : "";
36
+ const label = r.isBeta ? pc.yellow(" (beta)") : "";
37
+ console.log(` ${r.version}${label}${installed} ${pc.dim(formatDate(r.publishedAt))}`);
28
38
  }
29
- return (await response.json());
30
39
  }
31
- export async function upgrade(args) {
32
- const localVersion = getLocalVersion();
33
- const isBeta = localVersion?.includes("-beta") || localVersion?.includes("-rc");
34
- console.log(`${pc.bold("Current version:")} ${localVersion ? pc.cyan(localVersion) : pc.dim("not installed")}${isBeta ? pc.dim(" (beta)") : ""}`);
35
- // List available versions
36
- if (args.list) {
37
- console.log(pc.dim("Fetching available versions..."));
38
- try {
39
- const info = await fetchRegistryInfo();
40
- const tags = info["dist-tags"];
41
- const versions = Object.keys(info.versions).reverse().slice(0, 10);
42
- console.log();
43
- console.log(pc.bold("Channels:"));
44
- console.log(` ${pc.green("stable:")} ${tags.latest ?? "none"}`);
45
- if (tags.beta) {
46
- console.log(` ${pc.yellow("beta:")} ${tags.beta}`);
47
- }
48
- console.log();
49
- console.log(pc.bold("Recent versions:"));
50
- for (const v of versions) {
51
- const marker = v === localVersion ? pc.cyan(" (installed)") : "";
52
- console.log(` ${v}${marker}`);
53
- }
54
- }
55
- catch (error) {
56
- const message = error instanceof Error ? error.message : String(error);
57
- console.error(pc.red(`Failed to list versions: ${message}`));
58
- }
40
+ /** Compare local vs latest GitHub release */
41
+ async function checkVersion(localVersion, useBeta) {
42
+ console.log(pc.dim("Checking for updates..."));
43
+ const releases = await fetchReleases();
44
+ const latestStable = releases.find((r) => !r.isBeta);
45
+ const latestBeta = releases.find((r) => r.isBeta);
46
+ console.log(`${pc.bold("Local version:")} ${localVersion ? pc.cyan(localVersion) : pc.dim("not installed")}`);
47
+ if (latestStable) {
48
+ console.log(`${pc.bold("Latest stable:")} ${pc.green(latestStable.version)} ${pc.dim(formatDate(latestStable.publishedAt))}`);
49
+ }
50
+ if (latestBeta) {
51
+ console.log(`${pc.bold("Latest beta:")} ${pc.yellow(latestBeta.version)} ${pc.dim(formatDate(latestBeta.publishedAt))}`);
52
+ }
53
+ const compareTo = useBeta ? (latestBeta ?? latestStable) : latestStable;
54
+ if (!compareTo) {
55
+ console.log(pc.yellow("No releases found on GitHub."));
59
56
  return;
60
57
  }
61
- // Check for updates
62
- if (args.check) {
63
- console.log(pc.dim("Checking for updates..."));
64
- try {
65
- const latest = await fetchVersion("latest");
66
- console.log(`${pc.bold("Latest stable:")} ${pc.green(latest)}`);
67
- try {
68
- const beta = await fetchVersion("beta");
69
- console.log(`${pc.bold("Latest beta:")} ${pc.yellow(beta)}`);
70
- }
71
- catch {
72
- // No beta published yet — skip
73
- }
74
- if (localVersion === latest) {
75
- console.log(pc.green("You are on the latest stable version."));
76
- }
77
- else {
78
- console.log(pc.yellow(`Update available: ${localVersion ?? "none"} -> ${latest}`));
79
- console.log(pc.dim("Run `npx mewkit upgrade` to install."));
80
- }
81
- }
82
- catch (error) {
83
- const message = error instanceof Error ? error.message : String(error);
84
- console.error(pc.red(`Failed to check for updates: ${message}`));
85
- }
58
+ if (localVersion === compareTo.version) {
59
+ console.log(pc.green("\nAlready up to date."));
60
+ }
61
+ else {
62
+ console.log(pc.yellow(`\nUpdate available: ${localVersion ?? "none"} → ${compareTo.version}`));
63
+ console.log(pc.dim("Run `npx mewkit upgrade` to install."));
64
+ }
65
+ }
66
+ /** Perform the upgrade: download latest release and apply via smart update */
67
+ async function performUpgrade(localVersion, useBeta) {
68
+ console.log(pc.dim("Fetching latest release from GitHub..."));
69
+ const releases = await fetchReleases();
70
+ const latest = useBeta
71
+ ? (releases.find((r) => r.isBeta) ?? releases.find((r) => !r.isBeta))
72
+ : releases.find((r) => !r.isBeta);
73
+ if (!latest) {
74
+ console.error(pc.red("No releases found on GitHub."));
75
+ process.exit(1);
76
+ }
77
+ if (localVersion === latest.version) {
78
+ console.log(pc.green(`Already up to date (v${latest.version}).`));
86
79
  return;
87
80
  }
88
- // Perform upgrade via npx (no global install)
89
- const tag = args.beta ? "beta" : "latest";
90
- const pkg = `create-meowkit@${tag}`;
91
- console.log(pc.dim(`Running ${pkg} via npx...`));
81
+ console.log(`Upgrading: ${pc.dim(localVersion ?? "none")} ${pc.cyan(latest.version)}`);
82
+ console.log(pc.dim(`Downloading v${latest.version}...`));
83
+ let sourceDir;
92
84
  try {
93
- execSync(`npx --yes ${pkg}`, {
94
- encoding: "utf-8",
95
- stdio: "inherit",
96
- });
97
- const newVersion = getLocalVersion();
85
+ sourceDir = await downloadRelease(latest);
86
+ }
87
+ catch (err) {
88
+ const msg = err instanceof Error ? err.message : String(err);
89
+ console.error(pc.red(`Download failed: ${msg}`));
90
+ process.exit(1);
91
+ }
92
+ try {
93
+ const config = {
94
+ description: "",
95
+ enableCostTracking: true,
96
+ enableMemory: true,
97
+ geminiApiKey: null,
98
+ };
99
+ const stats = await smartUpdate(config, sourceDir, process.cwd(), /* dryRun */ false, /* force */ false);
98
100
  console.log();
99
101
  console.log(pc.green(pc.bold("Upgrade complete!")));
100
102
  console.log(` ${pc.dim("Before:")} ${localVersion ?? "not installed"}`);
101
- console.log(` ${pc.dim("After:")} ${newVersion ?? "unknown"}`);
103
+ console.log(` ${pc.dim("After:")} ${latest.version}`);
104
+ console.log();
105
+ console.log(` ${pc.green("added")} ${stats.added}`);
106
+ console.log(` ${pc.cyan("updated")} ${stats.updated}`);
107
+ console.log(` ${pc.dim("skipped")} ${stats.skipped}`);
108
+ if (stats.userModified.length > 0) {
109
+ console.log(pc.yellow(`\n ${stats.userModified.length} user-modified file(s) preserved (use --force to overwrite).`));
110
+ }
111
+ }
112
+ finally {
113
+ cleanupDownload(sourceDir);
114
+ }
115
+ }
116
+ export async function upgrade(args) {
117
+ const localVersion = getLocalVersion();
118
+ const useBeta = args.beta ?? false;
119
+ if (localVersion) {
120
+ const isBeta = localVersion.includes("-beta") || localVersion.includes("-rc");
121
+ console.log(`${pc.bold("Current version:")} ${pc.cyan(localVersion)}${isBeta ? pc.dim(" (beta)") : ""}`);
122
+ }
123
+ else {
124
+ console.log(`${pc.bold("Current version:")} ${pc.dim("not installed")}`);
125
+ }
126
+ try {
127
+ if (args.list) {
128
+ await listReleases(localVersion);
129
+ return;
130
+ }
131
+ if (args.check) {
132
+ await checkVersion(localVersion, useBeta);
133
+ return;
134
+ }
135
+ await performUpgrade(localVersion, useBeta);
102
136
  }
103
- catch (error) {
104
- const message = error instanceof Error ? error.message : String(error);
105
- console.error(pc.red(`Upgrade failed: ${message}`));
137
+ catch (err) {
138
+ const msg = err instanceof Error ? err.message : String(err);
139
+ console.error(pc.red(`upgrade failed: ${msg}`));
106
140
  process.exit(1);
107
141
  }
108
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** File layer determines update behavior */
2
+ export type FileLayer = "core" | "skill" | "user";
3
+ export interface ManifestEntry {
4
+ sha256: string;
5
+ layer: FileLayer;
6
+ }
7
+ export interface Manifest {
8
+ version: string;
9
+ generatedAt: string;
10
+ checksums: Record<string, ManifestEntry>;
11
+ }
12
+ /** Compute SHA-256 hash of a file */
13
+ export declare function hashFile(filePath: string): string;
14
+ /** Determine the layer of a file based on its path relative to the project root */
15
+ export declare function classifyLayer(relativePath: string): FileLayer;
16
+ /**
17
+ * Build a manifest by scanning all files in the .claude/ directory.
18
+ * All MeowKit files live inside .claude/ — no root-level scanning.
19
+ */
20
+ export declare function buildManifest(claudeDir: string): Manifest;
21
+ /** Write manifest to disk */
22
+ export declare function writeManifest(targetDir: string, manifest: Manifest): void;
23
+ /** Read existing manifest from disk. Returns null if not found or invalid. */
24
+ export declare function readManifest(targetDir: string): Manifest | null;
25
+ //# sourceMappingURL=compute-checksums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-checksums.d.ts","sourceRoot":"","sources":["../../src/core/compute-checksums.ts"],"names":[],"mappings":"AAIA,4CAA4C;AAC5C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAsBD,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAe7D;AA0BD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAkBzD;AAED,6BAA6B;AAC7B,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAGzE;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ/D"}
@@ -0,0 +1,105 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
3
+ import { join, relative } from "node:path";
4
+ const MANIFEST_FILENAME = "meowkit.manifest.json";
5
+ /** Directories classified as "core" — overwritten on update if unchanged */
6
+ const CORE_DIRS = new Set(["agents", "commands", "hooks", "modes", "rules", "scripts"]);
7
+ /** Files classified as "user" — never overwritten */
8
+ const USER_FILES = new Set([
9
+ "CLAUDE.md",
10
+ "meowkit.config.json",
11
+ ".env",
12
+ "env.example",
13
+ "mcp.json.example",
14
+ "mcp.json",
15
+ "gitignore.meowkit",
16
+ "meowkit.manifest.json",
17
+ ]);
18
+ /** Directories classified as "user" — never overwritten */
19
+ const USER_DIRS = new Set(["memory", "logs"]);
20
+ /** Compute SHA-256 hash of a file */
21
+ export function hashFile(filePath) {
22
+ const content = readFileSync(filePath);
23
+ return createHash("sha256").update(content).digest("hex");
24
+ }
25
+ /** Determine the layer of a file based on its path relative to the project root */
26
+ export function classifyLayer(relativePath) {
27
+ // User-level files at project root
28
+ const basename = relativePath.split("/").pop() ?? "";
29
+ if (USER_FILES.has(basename) || USER_FILES.has(relativePath))
30
+ return "user";
31
+ // Check path segments for directory-based classification
32
+ const parts = relativePath.split("/");
33
+ const topDir = parts[0];
34
+ if (USER_DIRS.has(topDir))
35
+ return "user";
36
+ if (topDir === "skills")
37
+ return "skill";
38
+ if (CORE_DIRS.has(topDir))
39
+ return "core";
40
+ if (topDir === "settings.json")
41
+ return "core";
42
+ return "user";
43
+ }
44
+ /**
45
+ * Recursively collect all files in a directory, returning paths relative to baseDir.
46
+ * Skips __pycache__, node_modules, .DS_Store, .meowkit.manifest.json.
47
+ */
48
+ function collectFiles(dir, baseDir) {
49
+ const files = [];
50
+ if (!existsSync(dir))
51
+ return files;
52
+ const SKIP = new Set(["__pycache__", "node_modules", ".DS_Store", MANIFEST_FILENAME]);
53
+ const entries = readdirSync(dir);
54
+ for (const entry of entries) {
55
+ if (SKIP.has(entry))
56
+ continue;
57
+ const fullPath = join(dir, entry);
58
+ const stat = statSync(fullPath);
59
+ if (stat.isDirectory()) {
60
+ files.push(...collectFiles(fullPath, baseDir));
61
+ }
62
+ else {
63
+ files.push(relative(baseDir, fullPath));
64
+ }
65
+ }
66
+ return files;
67
+ }
68
+ /**
69
+ * Build a manifest by scanning all files in the .claude/ directory.
70
+ * All MeowKit files live inside .claude/ — no root-level scanning.
71
+ */
72
+ export function buildManifest(claudeDir) {
73
+ const checksums = {};
74
+ const files = collectFiles(claudeDir, claudeDir);
75
+ for (const relPath of files) {
76
+ const fullPath = join(claudeDir, relPath);
77
+ checksums[relPath] = {
78
+ sha256: hashFile(fullPath),
79
+ layer: classifyLayer(relPath),
80
+ };
81
+ }
82
+ return {
83
+ version: "0.1.0",
84
+ generatedAt: new Date().toISOString(),
85
+ checksums,
86
+ };
87
+ }
88
+ /** Write manifest to disk */
89
+ export function writeManifest(targetDir, manifest) {
90
+ const path = join(targetDir, MANIFEST_FILENAME);
91
+ writeFileSync(path, JSON.stringify(manifest, null, 2) + "\n", "utf-8");
92
+ }
93
+ /** Read existing manifest from disk. Returns null if not found or invalid. */
94
+ export function readManifest(targetDir) {
95
+ const path = join(targetDir, MANIFEST_FILENAME);
96
+ if (!existsSync(path))
97
+ return null;
98
+ try {
99
+ return JSON.parse(readFileSync(path, "utf-8"));
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ //# sourceMappingURL=compute-checksums.js.map