lifeos 1.0.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +202 -0
  3. package/README.md +202 -0
  4. package/assets/lifeos-rules.en.md +162 -0
  5. package/assets/lifeos-rules.zh.md +162 -0
  6. package/assets/lifeos.yaml +56 -0
  7. package/assets/prompts/AI_LLMResearch_Prompt.en.md +120 -0
  8. package/assets/prompts/AI_LLMResearch_Prompt.zh.md +120 -0
  9. package/assets/prompts/Art_ChinesePainting_Prompt.en.md +147 -0
  10. package/assets/prompts/Art_ChinesePainting_Prompt.zh.md +148 -0
  11. package/assets/prompts/Cryptography_Prompt.en.md +148 -0
  12. package/assets/prompts/Cryptography_Prompt.zh.md +147 -0
  13. package/assets/prompts/History_ChineseCulture_Prompt.en.md +98 -0
  14. package/assets/prompts/History_ChineseCulture_Prompt.zh.md +98 -0
  15. package/assets/prompts/Math_HigherMathematics_Prompt.en.md +117 -0
  16. package/assets/prompts/Math_HigherMathematics_Prompt.zh.md +116 -0
  17. package/assets/schema/Frontmatter_Schema.md +139 -0
  18. package/assets/skills/_shared/completion-report.en.md +30 -0
  19. package/assets/skills/_shared/completion-report.zh.md +30 -0
  20. package/assets/skills/_shared/dual-agent-orchestrator.en.md +40 -0
  21. package/assets/skills/_shared/dual-agent-orchestrator.zh.md +40 -0
  22. package/assets/skills/_shared/learning-lifecycle.en.md +53 -0
  23. package/assets/skills/_shared/learning-lifecycle.zh.md +53 -0
  24. package/assets/skills/_shared/lifecycle.en.md +84 -0
  25. package/assets/skills/_shared/lifecycle.zh.md +84 -0
  26. package/assets/skills/_shared/memory-protocol.en.md +36 -0
  27. package/assets/skills/_shared/memory-protocol.zh.md +36 -0
  28. package/assets/skills/_shared/template-loading.en.md +26 -0
  29. package/assets/skills/_shared/template-loading.zh.md +26 -0
  30. package/assets/skills/archive/SKILL.en.md +300 -0
  31. package/assets/skills/archive/SKILL.zh.md +300 -0
  32. package/assets/skills/ask/SKILL.en.md +164 -0
  33. package/assets/skills/ask/SKILL.zh.md +164 -0
  34. package/assets/skills/brainstorm/SKILL.en.md +242 -0
  35. package/assets/skills/brainstorm/SKILL.zh.md +242 -0
  36. package/assets/skills/brainstorm/references/action-options.en.md +65 -0
  37. package/assets/skills/brainstorm/references/action-options.zh.md +65 -0
  38. package/assets/skills/knowledge/SKILL.en.md +202 -0
  39. package/assets/skills/knowledge/SKILL.zh.md +202 -0
  40. package/assets/skills/project/SKILL.en.md +133 -0
  41. package/assets/skills/project/SKILL.zh.md +133 -0
  42. package/assets/skills/project/references/execution-agent-prompt.en.md +148 -0
  43. package/assets/skills/project/references/execution-agent-prompt.zh.md +148 -0
  44. package/assets/skills/project/references/planning-agent-prompt.en.md +162 -0
  45. package/assets/skills/project/references/planning-agent-prompt.zh.md +162 -0
  46. package/assets/skills/read-pdf/SKILL.en.md +199 -0
  47. package/assets/skills/read-pdf/SKILL.zh.md +199 -0
  48. package/assets/skills/read-pdf/scripts/read_pdf.py +354 -0
  49. package/assets/skills/research/SKILL.en.md +107 -0
  50. package/assets/skills/research/SKILL.zh.md +107 -0
  51. package/assets/skills/research/references/execution-agent-prompt.en.md +166 -0
  52. package/assets/skills/research/references/execution-agent-prompt.zh.md +166 -0
  53. package/assets/skills/research/references/planning-agent-prompt.en.md +129 -0
  54. package/assets/skills/research/references/planning-agent-prompt.zh.md +129 -0
  55. package/assets/skills/revise/SKILL.en.md +258 -0
  56. package/assets/skills/revise/SKILL.zh.md +258 -0
  57. package/assets/skills/revise/references/grading-protocol.en.md +99 -0
  58. package/assets/skills/revise/references/grading-protocol.zh.md +99 -0
  59. package/assets/skills/today/SKILL.en.md +211 -0
  60. package/assets/skills/today/SKILL.zh.md +211 -0
  61. package/assets/templates/en/Daily_Template.md +25 -0
  62. package/assets/templates/en/Draft_Template.md +29 -0
  63. package/assets/templates/en/Knowledge_Template.md +86 -0
  64. package/assets/templates/en/Project_Template.md +110 -0
  65. package/assets/templates/en/Research_Template.md +46 -0
  66. package/assets/templates/en/Retrospective_Template.md +89 -0
  67. package/assets/templates/en/Revise_Template.md +24 -0
  68. package/assets/templates/en/Wiki_Template.md +35 -0
  69. package/assets/templates/zh/Daily_Template.md +26 -0
  70. package/assets/templates/zh/Draft_Template.md +29 -0
  71. package/assets/templates/zh/Knowledge_Template.md +86 -0
  72. package/assets/templates/zh/Project_Template.md +110 -0
  73. package/assets/templates/zh/Research_Template.md +46 -0
  74. package/assets/templates/zh/Retrospective_Template.md +89 -0
  75. package/assets/templates/zh/Revise_Template.md +24 -0
  76. package/assets/templates/zh/Wiki_Template.md +35 -0
  77. package/bin/lifeos.js +24 -0
  78. package/dist/active-docs/citations.d.ts +20 -0
  79. package/dist/active-docs/citations.js +74 -0
  80. package/dist/active-docs/citations.js.map +1 -0
  81. package/dist/active-docs/derived-memory.d.ts +57 -0
  82. package/dist/active-docs/derived-memory.js +161 -0
  83. package/dist/active-docs/derived-memory.js.map +1 -0
  84. package/dist/active-docs/index.d.ts +51 -0
  85. package/dist/active-docs/index.js +165 -0
  86. package/dist/active-docs/index.js.map +1 -0
  87. package/dist/active-docs/long-term-profile.d.ts +24 -0
  88. package/dist/active-docs/long-term-profile.js +75 -0
  89. package/dist/active-docs/long-term-profile.js.map +1 -0
  90. package/dist/active-docs/taskboard.d.ts +12 -0
  91. package/dist/active-docs/taskboard.js +146 -0
  92. package/dist/active-docs/taskboard.js.map +1 -0
  93. package/dist/active-docs/userprofile.d.ts +12 -0
  94. package/dist/active-docs/userprofile.js +169 -0
  95. package/dist/active-docs/userprofile.js.map +1 -0
  96. package/dist/cli/commands/doctor.d.ts +9 -0
  97. package/dist/cli/commands/doctor.js +125 -0
  98. package/dist/cli/commands/doctor.js.map +1 -0
  99. package/dist/cli/commands/init.d.ts +1 -0
  100. package/dist/cli/commands/init.js +129 -0
  101. package/dist/cli/commands/init.js.map +1 -0
  102. package/dist/cli/commands/rename.d.ts +7 -0
  103. package/dist/cli/commands/rename.js +188 -0
  104. package/dist/cli/commands/rename.js.map +1 -0
  105. package/dist/cli/commands/upgrade.d.ts +6 -0
  106. package/dist/cli/commands/upgrade.js +66 -0
  107. package/dist/cli/commands/upgrade.js.map +1 -0
  108. package/dist/cli/index.d.ts +1 -0
  109. package/dist/cli/index.js +52 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/utils/assets.d.ts +3 -0
  112. package/dist/cli/utils/assets.js +20 -0
  113. package/dist/cli/utils/assets.js.map +1 -0
  114. package/dist/cli/utils/install-assets.d.ts +39 -0
  115. package/dist/cli/utils/install-assets.js +141 -0
  116. package/dist/cli/utils/install-assets.js.map +1 -0
  117. package/dist/cli/utils/lang.d.ts +1 -0
  118. package/dist/cli/utils/lang.js +32 -0
  119. package/dist/cli/utils/lang.js.map +1 -0
  120. package/dist/cli/utils/managed-assets.d.ts +9 -0
  121. package/dist/cli/utils/managed-assets.js +20 -0
  122. package/dist/cli/utils/managed-assets.js.map +1 -0
  123. package/dist/cli/utils/mcp-register.d.ts +2 -0
  124. package/dist/cli/utils/mcp-register.js +132 -0
  125. package/dist/cli/utils/mcp-register.js.map +1 -0
  126. package/dist/cli/utils/sync-vault.d.ts +14 -0
  127. package/dist/cli/utils/sync-vault.js +132 -0
  128. package/dist/cli/utils/sync-vault.js.map +1 -0
  129. package/dist/cli/utils/ui.d.ts +14 -0
  130. package/dist/cli/utils/ui.js +78 -0
  131. package/dist/cli/utils/ui.js.map +1 -0
  132. package/dist/cli/utils/version.d.ts +1 -0
  133. package/dist/cli/utils/version.js +4 -0
  134. package/dist/cli/utils/version.js.map +1 -0
  135. package/dist/config.d.ts +127 -0
  136. package/dist/config.js +356 -0
  137. package/dist/config.js.map +1 -0
  138. package/dist/core.d.ts +106 -0
  139. package/dist/core.js +286 -0
  140. package/dist/core.js.map +1 -0
  141. package/dist/db/consolidation.d.ts +14 -0
  142. package/dist/db/consolidation.js +28 -0
  143. package/dist/db/consolidation.js.map +1 -0
  144. package/dist/db/index.d.ts +22 -0
  145. package/dist/db/index.js +39 -0
  146. package/dist/db/index.js.map +1 -0
  147. package/dist/db/schema.d.ts +7 -0
  148. package/dist/db/schema.js +175 -0
  149. package/dist/db/schema.js.map +1 -0
  150. package/dist/index.d.ts +3 -0
  151. package/dist/index.js +5 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/server.d.ts +6 -0
  154. package/dist/server.js +303 -0
  155. package/dist/server.js.map +1 -0
  156. package/dist/services/capture.d.ts +101 -0
  157. package/dist/services/capture.js +297 -0
  158. package/dist/services/capture.js.map +1 -0
  159. package/dist/services/enhance.d.ts +51 -0
  160. package/dist/services/enhance.js +184 -0
  161. package/dist/services/enhance.js.map +1 -0
  162. package/dist/services/layer0.d.ts +24 -0
  163. package/dist/services/layer0.js +90 -0
  164. package/dist/services/layer0.js.map +1 -0
  165. package/dist/services/maintenance.d.ts +27 -0
  166. package/dist/services/maintenance.js +73 -0
  167. package/dist/services/maintenance.js.map +1 -0
  168. package/dist/services/retrieval.d.ts +120 -0
  169. package/dist/services/retrieval.js +571 -0
  170. package/dist/services/retrieval.js.map +1 -0
  171. package/dist/services/startup.d.ts +28 -0
  172. package/dist/services/startup.js +112 -0
  173. package/dist/services/startup.js.map +1 -0
  174. package/dist/skill-context/ask-global.d.ts +8 -0
  175. package/dist/skill-context/ask-global.js +21 -0
  176. package/dist/skill-context/ask-global.js.map +1 -0
  177. package/dist/skill-context/base.d.ts +48 -0
  178. package/dist/skill-context/base.js +5 -0
  179. package/dist/skill-context/base.js.map +1 -0
  180. package/dist/skill-context/daily-global.d.ts +8 -0
  181. package/dist/skill-context/daily-global.js +25 -0
  182. package/dist/skill-context/daily-global.js.map +1 -0
  183. package/dist/skill-context/index.d.ts +32 -0
  184. package/dist/skill-context/index.js +171 -0
  185. package/dist/skill-context/index.js.map +1 -0
  186. package/dist/skill-context/knowledge-strict.d.ts +8 -0
  187. package/dist/skill-context/knowledge-strict.js +26 -0
  188. package/dist/skill-context/knowledge-strict.js.map +1 -0
  189. package/dist/skill-context/review-strict.d.ts +8 -0
  190. package/dist/skill-context/review-strict.js +26 -0
  191. package/dist/skill-context/review-strict.js.map +1 -0
  192. package/dist/skill-context/revise-strict.d.ts +8 -0
  193. package/dist/skill-context/revise-strict.js +26 -0
  194. package/dist/skill-context/revise-strict.js.map +1 -0
  195. package/dist/skill-context/seed-profiles.d.ts +21 -0
  196. package/dist/skill-context/seed-profiles.js +80 -0
  197. package/dist/skill-context/seed-profiles.js.map +1 -0
  198. package/dist/types.d.ts +165 -0
  199. package/dist/types.js +76 -0
  200. package/dist/types.js.map +1 -0
  201. package/dist/utils/context-policy.d.ts +57 -0
  202. package/dist/utils/context-policy.js +333 -0
  203. package/dist/utils/context-policy.js.map +1 -0
  204. package/dist/utils/scan-state.d.ts +41 -0
  205. package/dist/utils/scan-state.js +79 -0
  206. package/dist/utils/scan-state.js.map +1 -0
  207. package/dist/utils/segmenter.d.ts +19 -0
  208. package/dist/utils/segmenter.js +75 -0
  209. package/dist/utils/segmenter.js.map +1 -0
  210. package/dist/utils/shared.d.ts +103 -0
  211. package/dist/utils/shared.js +313 -0
  212. package/dist/utils/shared.js.map +1 -0
  213. package/dist/utils/vault-indexer.d.ts +53 -0
  214. package/dist/utils/vault-indexer.js +256 -0
  215. package/dist/utils/vault-indexer.js.map +1 -0
  216. package/package.json +59 -0
@@ -0,0 +1,129 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { existsSync, writeFileSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { stringify as stringifyYaml } from 'yaml';
5
+ import { EN_PRESET, ZH_PRESET } from '../../config.js';
6
+ import { ensureDir } from '../utils/assets.js';
7
+ import { syncVault } from '../utils/sync-vault.js';
8
+ import { parseArgs } from '../utils/ui.js';
9
+ import { bold, green, log, red, yellow } from '../utils/ui.js';
10
+ import { VERSION } from '../utils/version.js';
11
+ // ─── Language auto-detection ─────────────────────────────────────────────────
12
+ function detectLang() {
13
+ const locale = Intl.DateTimeFormat().resolvedOptions().locale ?? process.env.LANG ?? process.env.LC_ALL ?? '';
14
+ return locale.startsWith('zh') ? 'zh' : 'en';
15
+ }
16
+ const isWindows = process.platform === 'win32';
17
+ function checkCommand(cmd, versionFlag = '--version') {
18
+ try {
19
+ return execSync(`${cmd} ${versionFlag}`, { stdio: 'pipe' }).toString().trim().split('\n')[0];
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Resolve the Python 3 executable name for this platform. */
26
+ function findPython() {
27
+ // macOS/Linux: prefer python3; Windows: usually just python
28
+ const candidates = isWindows ? ['python', 'python3'] : ['python3', 'python'];
29
+ for (const cmd of candidates) {
30
+ const ver = checkCommand(cmd);
31
+ if (ver?.includes('3.'))
32
+ return { cmd, version: ver };
33
+ }
34
+ return null;
35
+ }
36
+ function checkPrerequisites() {
37
+ const results = [];
38
+ let pythonCmd = null;
39
+ // Node.js (already running, but check version)
40
+ const nodeVer = process.version;
41
+ results.push({
42
+ name: 'Node.js',
43
+ ok: true,
44
+ version: nodeVer,
45
+ hint: 'https://nodejs.org/',
46
+ });
47
+ // Git
48
+ const gitVer = checkCommand('git');
49
+ results.push({
50
+ name: 'Git',
51
+ ok: gitVer !== null,
52
+ version: gitVer ?? undefined,
53
+ hint: 'https://git-scm.com/',
54
+ });
55
+ // Python 3
56
+ const py = findPython();
57
+ pythonCmd = py?.cmd ?? null;
58
+ results.push({
59
+ name: 'Python 3',
60
+ ok: py !== null,
61
+ version: py?.version,
62
+ hint: 'https://www.python.org/ (required by /read-pdf skill)',
63
+ });
64
+ return { results, pythonCmd };
65
+ }
66
+ // ─── Main ────────────────────────────────────────────────────────────────────
67
+ export default async function init(args) {
68
+ const { positionals, flags } = parseArgs(args, {
69
+ lang: { alias: 'l' },
70
+ 'no-mcp': {},
71
+ });
72
+ const targetPath = resolve(positionals[0] ?? '.');
73
+ const lang = flags.lang && flags.lang !== true ? flags.lang : detectLang();
74
+ const noMcp = flags['no-mcp'] === true;
75
+ // 0. Prerequisite checks
76
+ const { results: prereqs } = checkPrerequisites();
77
+ const missing = prereqs.filter((p) => !p.ok);
78
+ log('📋', bold('Prerequisites:'));
79
+ for (const p of prereqs) {
80
+ const status = p.ok ? green('✔') : red('✘');
81
+ const ver = p.version ? ` (${p.version})` : '';
82
+ log(' ', `${status} ${p.name}${ver}`);
83
+ }
84
+ if (missing.length > 0) {
85
+ log(' ', '');
86
+ log('⚠️', yellow('Missing prerequisites:'));
87
+ for (const m of missing) {
88
+ log(' ', `${red('→')} ${m.name}: ${m.hint}`);
89
+ }
90
+ log(' ', '');
91
+ throw new Error('Please install missing prerequisites before initializing.');
92
+ }
93
+ log(' ', '');
94
+ const preset = lang === 'en' ? EN_PRESET : ZH_PRESET;
95
+ // 1. Validate target
96
+ const yamlPath = join(targetPath, 'lifeos.yaml');
97
+ if (existsSync(yamlPath)) {
98
+ throw new Error('Vault already initialized. Use "lifeos upgrade" to update assets.');
99
+ }
100
+ // 2. Create target directory
101
+ ensureDir(targetPath);
102
+ // 4. Generate lifeos.yaml
103
+ const yamlConfig = {
104
+ ...preset,
105
+ installed_versions: {
106
+ cli: VERSION,
107
+ assets: VERSION,
108
+ },
109
+ };
110
+ writeFileSync(yamlPath, stringifyYaml(yamlConfig), 'utf-8');
111
+ // 5. Sync vault scaffold
112
+ const syncResult = await syncVault(targetPath, yamlConfig, {
113
+ lang,
114
+ assetMode: 'overwrite',
115
+ skillMode: 'overwrite',
116
+ ensureMcp: !noMcp,
117
+ mcpMode: 'replace',
118
+ rulesMode: 'preserve',
119
+ assetVersion: VERSION,
120
+ });
121
+ yamlConfig.managed_assets = syncResult.managedAssets ?? {};
122
+ writeFileSync(yamlPath, stringifyYaml(yamlConfig), 'utf-8');
123
+ // 6. Print summary
124
+ log(green('✔'), bold('LifeOS vault initialized'));
125
+ log(' ', `Path: ${targetPath}`);
126
+ log(' ', `Language: ${lang}`);
127
+ log(' ', `Version: ${VERSION}`);
128
+ }
129
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface RenameResult {
2
+ logical: string;
3
+ oldPhysical: string;
4
+ newPhysical: string;
5
+ wikilinksUpdated: number;
6
+ }
7
+ export default function rename(args: string[]): Promise<RenameResult>;
@@ -0,0 +1,188 @@
1
+ import { existsSync, readFileSync, readdirSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
5
+ import { bold, green, log, parseArgs } from '../utils/ui.js';
6
+ export default async function rename(args) {
7
+ const { positionals, flags } = parseArgs(args, {
8
+ logical: {},
9
+ name: {},
10
+ });
11
+ const targetPath = resolve(positionals[0] ?? '.');
12
+ const yamlPath = join(targetPath, 'lifeos.yaml');
13
+ if (!existsSync(yamlPath)) {
14
+ throw new Error('No lifeos.yaml found. Run `lifeos init` first.');
15
+ }
16
+ const config = parseYaml(readFileSync(yamlPath, 'utf-8'));
17
+ const dirs = config.directories;
18
+ // Build selection list: [{ logical, physical, isSubdir, parentLogical? }]
19
+ const items = [];
20
+ // Top-level directories
21
+ for (const [logical, physical] of Object.entries(dirs)) {
22
+ items.push({ logical, physical, isSubdir: false });
23
+ }
24
+ // Subdirectories (nested structure)
25
+ for (const [parentLogical, group] of Object.entries(config.subdirectories)) {
26
+ if (typeof group !== 'object' || group === null)
27
+ continue;
28
+ for (const [childKey, value] of Object.entries(group)) {
29
+ if (typeof value === 'string') {
30
+ const parentDir = dirs[parentLogical] ?? parentLogical;
31
+ items.push({
32
+ logical: `${parentLogical}/${childKey}`,
33
+ physical: `${parentDir}/${value}`,
34
+ isSubdir: true,
35
+ parentLogical,
36
+ childKey,
37
+ });
38
+ }
39
+ else if (typeof value === 'object' && value !== null) {
40
+ // Nested group like archive: { projects, drafts, plans }
41
+ for (const [nestedKey, nestedValue] of Object.entries(value)) {
42
+ const parentDir = dirs[parentLogical] ?? parentLogical;
43
+ items.push({
44
+ logical: `${parentLogical}/${childKey}/${nestedKey}`,
45
+ physical: `${parentDir}/${nestedValue}`,
46
+ isSubdir: true,
47
+ parentLogical,
48
+ childKey: `${childKey}.${nestedKey}`,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ }
54
+ let selectedItem;
55
+ let newPhysical;
56
+ if (typeof flags.logical === 'string' && typeof flags.name === 'string') {
57
+ // Script mode
58
+ const found = items.find((i) => i.logical === flags.logical);
59
+ if (!found)
60
+ throw new Error(`Unknown logical name: ${flags.logical}`);
61
+ selectedItem = found;
62
+ newPhysical = flags.name;
63
+ }
64
+ else {
65
+ // Interactive mode
66
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
67
+ try {
68
+ console.log(`\n${bold('当前目录配置:\n')}`);
69
+ console.log(' 顶级目录:');
70
+ items.forEach((item, i) => {
71
+ if (!item.isSubdir) {
72
+ console.log(` ${String(i + 1).padStart(2)}) ${item.logical.padEnd(15)} → ${item.physical}`);
73
+ }
74
+ });
75
+ console.log('\n 子目录:');
76
+ items.forEach((item, i) => {
77
+ if (item.isSubdir) {
78
+ console.log(` ${String(i + 1).padStart(2)}) ${item.logical.padEnd(25)} → ${item.physical}`);
79
+ }
80
+ });
81
+ const numStr = await rl.question('\n? 选择要重命名的目录 [编号]: ');
82
+ const idx = Number.parseInt(numStr, 10) - 1;
83
+ if (Number.isNaN(idx) || idx < 0 || idx >= items.length) {
84
+ throw new Error('Invalid selection');
85
+ }
86
+ selectedItem = items[idx];
87
+ newPhysical = await rl.question(`? 新名称 (当前: ${selectedItem.isSubdir ? selectedItem.physical.split('/').pop() : selectedItem.physical}): `);
88
+ if (!newPhysical.trim())
89
+ throw new Error('Name cannot be empty');
90
+ }
91
+ finally {
92
+ rl.close();
93
+ }
94
+ }
95
+ const oldPhysical = selectedItem.physical;
96
+ let managedAssetsNewPrefix = newPhysical;
97
+ if (selectedItem.isSubdir) {
98
+ // For subdirectories, only rename the leaf part
99
+ // Update config
100
+ const parentLogical = selectedItem.parentLogical;
101
+ const parts = selectedItem.childKey.split('.');
102
+ const subGroup = config.subdirectories;
103
+ if (parts.length === 1) {
104
+ subGroup[parentLogical][parts[0]] = newPhysical;
105
+ }
106
+ else {
107
+ // Nested: archive.projects
108
+ const nested = subGroup[parentLogical][parts[0]];
109
+ nested[parts[1]] = newPhysical;
110
+ }
111
+ // Rename physical directory
112
+ const parentDir = dirs[parentLogical];
113
+ managedAssetsNewPrefix = join(parentDir, newPhysical);
114
+ const oldPath = join(targetPath, parentDir, oldPhysical.split('/').slice(1).join('/'));
115
+ const newPath = join(targetPath, parentDir, newPhysical);
116
+ if (existsSync(oldPath)) {
117
+ renameSync(oldPath, newPath);
118
+ }
119
+ }
120
+ else {
121
+ // Top-level directory
122
+ config.directories[selectedItem.logical] = newPhysical;
123
+ // Rename physical directory
124
+ const oldPath = join(targetPath, oldPhysical);
125
+ const newPath = join(targetPath, newPhysical);
126
+ if (existsSync(oldPath)) {
127
+ renameSync(oldPath, newPath);
128
+ }
129
+ }
130
+ if (config.managed_assets) {
131
+ config.managed_assets = rewriteManagedAssetKeys(config.managed_assets, oldPhysical, managedAssetsNewPrefix);
132
+ }
133
+ // Write updated config
134
+ writeFileSync(yamlPath, stringifyYaml(config), 'utf-8');
135
+ // Batch replace wikilinks
136
+ const replaced = replaceWikilinks(targetPath, oldPhysical, newPhysical);
137
+ // Print summary
138
+ log(green('✔'), bold('重命名完成'));
139
+ log(' ', `目录: ${oldPhysical} → ${newPhysical}`);
140
+ log(' ', '配置: lifeos.yaml 已更新');
141
+ log(' ', `链接: ${replaced} 个 wikilinks 已更新`);
142
+ return {
143
+ logical: selectedItem.logical,
144
+ oldPhysical,
145
+ newPhysical,
146
+ wikilinksUpdated: replaced,
147
+ };
148
+ }
149
+ function rewriteManagedAssetKeys(managedAssets, oldPrefix, newPrefix) {
150
+ const next = {};
151
+ for (const [key, value] of Object.entries(managedAssets)) {
152
+ if (key === oldPrefix || key.startsWith(`${oldPrefix}/`)) {
153
+ next[`${newPrefix}${key.slice(oldPrefix.length)}`] = value;
154
+ continue;
155
+ }
156
+ next[key] = value;
157
+ }
158
+ return next;
159
+ }
160
+ function replaceWikilinks(vaultRoot, oldPrefix, newPrefix) {
161
+ let count = 0;
162
+ walkMdFiles(vaultRoot, (filePath) => {
163
+ const content = readFileSync(filePath, 'utf-8');
164
+ const updated = content
165
+ .replaceAll(`[[${oldPrefix}/`, `[[${newPrefix}/`)
166
+ .replaceAll(`[[${oldPrefix}]]`, `[[${newPrefix}]]`)
167
+ .replaceAll(`](${oldPrefix}/`, `](${newPrefix}/`);
168
+ if (updated !== content) {
169
+ writeFileSync(filePath, updated);
170
+ count++;
171
+ }
172
+ });
173
+ return count;
174
+ }
175
+ function walkMdFiles(dir, callback) {
176
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
177
+ const full = join(dir, entry.name);
178
+ if (entry.name.startsWith('.'))
179
+ continue;
180
+ if (entry.isDirectory()) {
181
+ walkMdFiles(full, callback);
182
+ }
183
+ else if (entry.name.endsWith('.md')) {
184
+ callback(full);
185
+ }
186
+ }
187
+ }
188
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../src/cli/commands/rename.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface UpgradeResult {
2
+ updated: string[];
3
+ skipped: string[];
4
+ unchanged: string[];
5
+ }
6
+ export default function upgrade(args: string[]): Promise<UpgradeResult>;
@@ -0,0 +1,66 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
4
+ import { resolveConfig } from '../../config.js';
5
+ import { syncVault } from '../utils/sync-vault.js';
6
+ import { bold, green, log, parseArgs } from '../utils/ui.js';
7
+ import { VERSION } from '../utils/version.js';
8
+ export default async function upgrade(args) {
9
+ const { positionals, flags } = parseArgs(args, {
10
+ lang: { alias: 'l' },
11
+ override: {},
12
+ });
13
+ // 1. Parse args
14
+ const targetPath = resolve(positionals[0] ?? '.');
15
+ // 2. Read lifeos.yaml
16
+ const yamlPath = join(targetPath, 'lifeos.yaml');
17
+ if (!existsSync(yamlPath)) {
18
+ throw new Error('No lifeos.yaml found. Run `lifeos init` first.');
19
+ }
20
+ const yamlContent = readFileSync(yamlPath, 'utf-8');
21
+ const rawConfig = parseYaml(yamlContent) ?? {};
22
+ const config = resolveConfig(targetPath, rawConfig).rawConfig;
23
+ const result = { updated: [], skipped: [], unchanged: [] };
24
+ const override = flags.override === true;
25
+ // 3. Version check
26
+ const installedAssets = config.installed_versions?.assets ?? '0.0.0';
27
+ if (installedAssets === VERSION) {
28
+ log(green('✔'), 'Assets version already current. Syncing files anyway.');
29
+ }
30
+ const lang = flags.lang && flags.lang !== true
31
+ ? flags.lang
32
+ : (config.language ?? 'zh');
33
+ // Update config language if overridden by flag
34
+ if (flags.lang && flags.lang !== true && config.language !== lang) {
35
+ config.language = lang;
36
+ }
37
+ // 4. Reuse the same vault sync path as init, but in conservative upgrade mode.
38
+ const syncResult = await syncVault(targetPath, config, {
39
+ lang,
40
+ assetMode: override ? 'overwrite' : 'smart-merge',
41
+ skillMode: override ? 'overwrite' : 'smart-merge',
42
+ ensureMcp: true,
43
+ mcpMode: override ? 'replace' : 'merge-missing',
44
+ rulesMode: override ? 'overwrite' : 'preserve',
45
+ assetVersion: VERSION,
46
+ });
47
+ result.updated.push(...syncResult.updated);
48
+ result.skipped.push(...syncResult.skipped);
49
+ result.unchanged.push(...syncResult.unchanged);
50
+ // 7. Update installed_versions
51
+ if (!config.installed_versions) {
52
+ config.installed_versions = {};
53
+ }
54
+ config.managed_assets = syncResult.managedAssets ?? config.managed_assets ?? {};
55
+ config.installed_versions.cli = VERSION;
56
+ config.installed_versions.assets = VERSION;
57
+ writeFileSync(yamlPath, stringifyYaml(config), 'utf-8');
58
+ // 8. Print summary
59
+ log(green('✔'), bold('LifeOS vault upgraded'));
60
+ log(' ', `Version: ${installedAssets} → ${VERSION}`);
61
+ log(' ', `Updated: ${result.updated.length} files`);
62
+ log(' ', `Skipped: ${result.skipped.length} files (user-modified)`);
63
+ log(' ', `Unchanged: ${result.unchanged.length} files`);
64
+ return result;
65
+ }
66
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/cli/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function run(args: string[]): Promise<void>;
@@ -0,0 +1,52 @@
1
+ import { VERSION } from './utils/version.js';
2
+ export async function run(args) {
3
+ const cmd = args[0];
4
+ switch (cmd) {
5
+ case 'init':
6
+ return (await import('./commands/init.js')).default(args.slice(1));
7
+ case 'upgrade': {
8
+ await (await import('./commands/upgrade.js')).default(args.slice(1));
9
+ return;
10
+ }
11
+ case 'doctor': {
12
+ await (await import('./commands/doctor.js')).default(args.slice(1));
13
+ return;
14
+ }
15
+ case 'rename': {
16
+ await (await import('./commands/rename.js')).default(args.slice(1));
17
+ return;
18
+ }
19
+ case 'help':
20
+ case '--help':
21
+ case '-h':
22
+ return printHelp();
23
+ case '--version':
24
+ case '-V':
25
+ return printVersion();
26
+ default:
27
+ console.error(`Unknown command: ${cmd}\nRun "lifeos help" for usage.`);
28
+ process.exit(1);
29
+ }
30
+ }
31
+ function printHelp() {
32
+ console.log(`lifeos v${VERSION} — AI-native knowledge OS
33
+
34
+ Usage:
35
+ lifeos Start MCP server (default)
36
+ lifeos init [path] [options] Create a new LifeOS vault
37
+ lifeos upgrade [path] [opts] Upgrade assets to latest version
38
+ lifeos doctor [path] Check vault health
39
+ lifeos rename [path] Rename a vault directory
40
+
41
+ Options (init / upgrade):
42
+ --lang, -l <zh|en> Language preset (default: auto-detect / from config)
43
+ --override Force-refresh managed assets and managed config files
44
+
45
+ Options (global):
46
+ --help, -h Show this help
47
+ --version, -V Show version`);
48
+ }
49
+ function printVersion() {
50
+ console.log(`lifeos v${VERSION}`);
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,GAAG,EAAE,CAAC;QACb,KAAK,MAAM;YACV,OAAO,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,KAAK,SAAS,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,OAAO;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO;QACR,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,SAAS,EAAE,CAAC;QACpB,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACR,OAAO,YAAY,EAAE,CAAC;QACvB;YACC,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,gCAAgC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,SAAS;IACjB,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO;;;;;;;;;;;;;;;oCAeK,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY;IACpB,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function assetsDir(): string;
2
+ export declare function ensureDir(dir: string): boolean;
3
+ export declare function copyDir(src: string, dest: string): void;
@@ -0,0 +1,20 @@
1
+ import { cpSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ // dist/cli/utils/ → up 3 levels to package root
7
+ const PACKAGE_ROOT = join(__dirname, '..', '..', '..');
8
+ export function assetsDir() {
9
+ return join(PACKAGE_ROOT, 'assets');
10
+ }
11
+ export function ensureDir(dir) {
12
+ if (existsSync(dir))
13
+ return false;
14
+ mkdirSync(dir, { recursive: true });
15
+ return true;
16
+ }
17
+ export function copyDir(src, dest) {
18
+ cpSync(src, dest, { recursive: true });
19
+ }
20
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/cli/utils/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,gDAAgD;AAChD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvD,MAAM,UAAU,SAAS;IACxB,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACpC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IAChD,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { LifeOSConfig } from '../../config.js';
2
+ import { type ManagedAssetsMap } from './managed-assets.js';
3
+ export interface InstallResult {
4
+ updated: string[];
5
+ skipped: string[];
6
+ unchanged: string[];
7
+ managedAssets?: ManagedAssetsMap;
8
+ }
9
+ export type InstallMode = 'overwrite' | 'smart-merge';
10
+ interface ManagedAssetContext {
11
+ managedAssets: ManagedAssetsMap;
12
+ version: string;
13
+ }
14
+ /**
15
+ * Copy language-specific templates from assets to vault.
16
+ * Supports overwrite for init and smart-merge for upgrade.
17
+ */
18
+ export declare function installTemplates(targetPath: string, config: LifeOSConfig, mode: InstallMode, managedAssetContext?: ManagedAssetContext): InstallResult;
19
+ /**
20
+ * Copy schema files from assets to vault.
21
+ * Supports overwrite for init and smart-merge for upgrade.
22
+ */
23
+ export declare function installSchema(targetPath: string, config: LifeOSConfig, mode: InstallMode, managedAssetContext?: ManagedAssetContext): InstallResult;
24
+ /**
25
+ * Copy language-specific prompt files from assets to vault.
26
+ * Files are named `Foo_Prompt.zh.md` / `Foo_Prompt.en.md`;
27
+ * only the matching language is copied, with the lang suffix stripped.
28
+ * Supports overwrite for init and smart-merge for upgrade.
29
+ */
30
+ export declare function installPrompts(targetPath: string, config: LifeOSConfig, mode: InstallMode, managedAssetContext?: ManagedAssetContext): InstallResult;
31
+ /**
32
+ * Copy skills from assets to vault with language resolution.
33
+ *
34
+ * @param mode
35
+ * - 'overwrite': Always copy (for init)
36
+ * - 'smart-merge': Skip user-modified files, copy new/unchanged (for upgrade)
37
+ */
38
+ export declare function installSkills(targetPath: string, lang: 'zh' | 'en', mode: InstallMode, managedAssetContext?: ManagedAssetContext): InstallResult;
39
+ export {};