@haposoft/cafekit 0.9.6 → 0.10.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.
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Phase: write platform version metadata + install manifest.
3
+ *
4
+ * cafekit.json keeps pure version metadata (schemaVersion, version, platform,
5
+ * timestamps, previousVersion). The ownership baseline is written separately by
6
+ * the run's manifest tracker. Both are skipped in dry-run.
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { PLATFORMS, INSTALL_COMMAND, packageJson } = require('../lib/context');
12
+ const { readJsonFile } = require('../lib/copy-utils');
13
+
14
+ function writePlatformVersionMetadata(ctx, platformKey) {
15
+ const platform = PLATFORMS[platformKey];
16
+ const targetPath = path.join(platform.folder, 'cafekit.json');
17
+ const targetExists = fs.existsSync(targetPath);
18
+ const existingMetadata = readJsonFile(targetPath);
19
+ const now = new Date().toISOString();
20
+ const previousVersion = typeof existingMetadata.version === 'string'
21
+ ? existingMetadata.version
22
+ : null;
23
+
24
+ const metadata = {
25
+ schemaVersion: 1,
26
+ packageName: packageJson.name,
27
+ version: packageJson.version,
28
+ platform: platform.id,
29
+ platformName: platform.name,
30
+ installedAt: existingMetadata.installedAt || now,
31
+ lastInstalledAt: now,
32
+ installCommand: INSTALL_COMMAND
33
+ };
34
+
35
+ if (previousVersion && previousVersion !== packageJson.version) {
36
+ metadata.previousVersion = previousVersion;
37
+ }
38
+
39
+ if (!ctx.dryRun) {
40
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
41
+ fs.writeFileSync(targetPath, `${JSON.stringify(metadata, null, 2)}\n`, 'utf8');
42
+ }
43
+
44
+ const prefix = ctx.dryRun ? '[dry-run] ' : '';
45
+ if (targetExists) {
46
+ ctx.ui.detail(` ↻ ${prefix}Version metadata updated: ${targetPath}`);
47
+ ctx.results.updated++;
48
+ } else {
49
+ ctx.ui.detail(` ✓ ${prefix}Version metadata installed: ${targetPath}`);
50
+ ctx.results.copied++;
51
+ }
52
+
53
+ // Persist the ownership baseline of everything installed this run.
54
+ const tracker = ctx.trackers[platformKey];
55
+ if (tracker && !ctx.dryRun) {
56
+ tracker.write();
57
+ }
58
+ }
59
+
60
+ module.exports = { writePlatformVersionMetadata };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haposoft/cafekit",
3
- "version": "0.9.6",
3
+ "version": "0.10.0",
4
4
  "description": "Claude Code-first spec-driven workflow for AI coding assistants. Bundles CafeKit hapo: skills, runtime hooks, agents, and installer scaffolding.",
5
5
  "author": "Haposoft <nghialt@haposoft.com>",
6
6
  "license": "MIT",
@@ -46,5 +46,9 @@
46
46
  },
47
47
  "devDependencies": {
48
48
  "@opencode-ai/plugin": "1.15.11"
49
+ },
50
+ "dependencies": {
51
+ "@clack/prompts": "^1.5.0",
52
+ "picocolors": "^1.1.1"
49
53
  }
50
54
  }
@@ -127,6 +127,6 @@ When generating specs or structured project output, use the user's preferred lan
127
127
  - Do not provide unsolicited code explanations unless asked.
128
128
  - Do not apologize; correct the issue and continue.
129
129
 
130
- ## Xưng hô (Addressing - Context Overflow Indicator)
130
+ ## Addressing (Context Overflow Indicator)
131
131
 
132
- AI luôn gọi người dùng là "anh" trong suốt conversation. Nếu AI ngừng gọi như vậy, đó là dấu hiệu context đã bị compact — hãy báo người dùng cân nhắc `/clear`.
132
+ The AI always addresses the user as "anh" throughout the conversation. If the AI stops doing so, it is a sign the context has been compacted/truncated — tell the user to consider `/clear`.