@researai/meos 0.1.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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +423 -0
  3. package/README_ZH.md +423 -0
  4. package/SKILL/SKILL.md +130 -0
  5. package/SKILL/assets/INDEX.md +21 -0
  6. package/SKILL/assets/corrections/overrides.md +3 -0
  7. package/SKILL/assets/examples/README.md +10 -0
  8. package/SKILL/assets/examples/engineering/README.md +7 -0
  9. package/SKILL/assets/examples/engineering/corrections/overrides.md +4 -0
  10. package/SKILL/assets/examples/engineering/principles/tradeoffs.md +11 -0
  11. package/SKILL/assets/examples/engineering/taste/ui-product.md +12 -0
  12. package/SKILL/assets/examples/engineering/thought-style/reasoning-patterns.md +11 -0
  13. package/SKILL/assets/examples/engineering/work/technical-standards.md +17 -0
  14. package/SKILL/assets/examples/engineering/workflow/default-operating-sequence.md +16 -0
  15. package/SKILL/assets/examples/minimal/README.md +8 -0
  16. package/SKILL/assets/examples/minimal/corrections/overrides.md +4 -0
  17. package/SKILL/assets/examples/minimal/principles/tradeoffs.md +14 -0
  18. package/SKILL/assets/examples/minimal/taste/ui-product.md +14 -0
  19. package/SKILL/assets/examples/minimal/thought-style/reasoning-patterns.md +14 -0
  20. package/SKILL/assets/examples/minimal/work/technical-standards.md +16 -0
  21. package/SKILL/assets/examples/minimal/workflow/default-operating-sequence.md +16 -0
  22. package/SKILL/assets/examples/product/README.md +7 -0
  23. package/SKILL/assets/examples/product/corrections/overrides.md +4 -0
  24. package/SKILL/assets/examples/product/principles/tradeoffs.md +7 -0
  25. package/SKILL/assets/examples/product/taste/ui-product.md +15 -0
  26. package/SKILL/assets/examples/product/thought-style/reasoning-patterns.md +13 -0
  27. package/SKILL/assets/examples/product/work/technical-standards.md +10 -0
  28. package/SKILL/assets/examples/product/workflow/default-operating-sequence.md +16 -0
  29. package/SKILL/assets/examples/research/README.md +7 -0
  30. package/SKILL/assets/examples/research/corrections/overrides.md +4 -0
  31. package/SKILL/assets/examples/research/principles/tradeoffs.md +11 -0
  32. package/SKILL/assets/examples/research/taste/ui-product.md +15 -0
  33. package/SKILL/assets/examples/research/thought-style/reasoning-patterns.md +12 -0
  34. package/SKILL/assets/examples/research/work/technical-standards.md +12 -0
  35. package/SKILL/assets/examples/research/workflow/default-operating-sequence.md +17 -0
  36. package/SKILL/assets/knowledge/README.md +3 -0
  37. package/SKILL/assets/knowledge/episodic.md +10 -0
  38. package/SKILL/assets/knowledge/procedural.md +10 -0
  39. package/SKILL/assets/knowledge/semantic.md +10 -0
  40. package/SKILL/assets/live/README.md +5 -0
  41. package/SKILL/assets/preferences/README.md +3 -0
  42. package/SKILL/assets/preferences/input.md +3 -0
  43. package/SKILL/assets/preferences/interests.md +5 -0
  44. package/SKILL/assets/preferences/output.md +3 -0
  45. package/SKILL/assets/principles/README.md +3 -0
  46. package/SKILL/assets/principles/tradeoffs.md +10 -0
  47. package/SKILL/assets/taste/README.md +3 -0
  48. package/SKILL/assets/taste/ui-product.md +11 -0
  49. package/SKILL/assets/templates/README.md +3 -0
  50. package/SKILL/assets/templates/corrections/overrides.template.md +3 -0
  51. package/SKILL/assets/templates/knowledge/episodic.template.md +7 -0
  52. package/SKILL/assets/templates/knowledge/procedural.template.md +9 -0
  53. package/SKILL/assets/templates/knowledge/semantic.template.md +7 -0
  54. package/SKILL/assets/templates/preferences/input.template.md +5 -0
  55. package/SKILL/assets/templates/preferences/interests.template.md +5 -0
  56. package/SKILL/assets/templates/preferences/output.template.md +7 -0
  57. package/SKILL/assets/templates/principles/tradeoffs.template.md +9 -0
  58. package/SKILL/assets/templates/taste/ui-product.template.md +11 -0
  59. package/SKILL/assets/templates/thought-style/reasoning-patterns.template.md +9 -0
  60. package/SKILL/assets/templates/work/technical-standards.template.md +11 -0
  61. package/SKILL/assets/templates/workflow/default-operating-sequence.template.md +11 -0
  62. package/SKILL/assets/thought-style/README.md +3 -0
  63. package/SKILL/assets/thought-style/reasoning-patterns.md +10 -0
  64. package/SKILL/assets/work/README.md +3 -0
  65. package/SKILL/assets/work/technical-standards.md +11 -0
  66. package/SKILL/assets/workflow/README.md +3 -0
  67. package/SKILL/assets/workflow/default-operating-sequence.md +11 -0
  68. package/SKILL/evidence/README.md +11 -0
  69. package/SKILL/private/README.md +12 -0
  70. package/SKILL/references/apply-task-map.md +42 -0
  71. package/SKILL/references/asset-taxonomy.md +47 -0
  72. package/SKILL/references/correction-policy.md +22 -0
  73. package/SKILL/references/extraction-sop.md +76 -0
  74. package/SKILL/references/import-policy.md +35 -0
  75. package/SKILL/references/maintenance-policy.md +56 -0
  76. package/SKILL/references/privacy-policy.md +39 -0
  77. package/SKILL/references/promotion-policy.md +42 -0
  78. package/SKILL/references/source-locations.md +93 -0
  79. package/SKILL/references/writeback-policy.md +33 -0
  80. package/SKILL/runtime/README.md +11 -0
  81. package/SKILL/schemas/asset-entry.schema.json +50 -0
  82. package/SKILL/schemas/conflict-entry.schema.json +37 -0
  83. package/SKILL/schemas/correction-entry.schema.json +34 -0
  84. package/SKILL/schemas/evidence-entry.schema.json +37 -0
  85. package/SKILL/schemas/source-map.schema.json +26 -0
  86. package/assets/branding/logo.svg +37 -0
  87. package/assets/readme/00-overview.svg +15 -0
  88. package/assets/readme/01-lifecycle.svg +11 -0
  89. package/assets/readme/02-asset-layout.svg +5 -0
  90. package/assets/readme/03-privacy-boundary.svg +7 -0
  91. package/assets/readme/04-example-profile.svg +5 -0
  92. package/bin/meos.js +20 -0
  93. package/install.sh +11 -0
  94. package/installer.py +327 -0
  95. package/package.json +48 -0
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 640" role="img" aria-label="MeOS asset layout placeholder">
2
+ <rect width="1200" height="640" fill="#F7F2EA"/>
3
+ <text x="80" y="110" font-size="40" fill="#4F5B6D" font-family="Arial, sans-serif">Asset Layout</text>
4
+ <text x="80" y="170" font-size="22" fill="#7A7A7A" font-family="Arial, sans-serif">templates · examples · live</text>
5
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 480" role="img" aria-label="MeOS privacy boundary placeholder">
2
+ <rect width="1200" height="480" fill="#F7F2EA"/>
3
+ <rect x="100" y="120" width="430" height="240" rx="22" fill="#E8EEDF"/>
4
+ <rect x="670" y="120" width="430" height="240" rx="22" fill="#ECE4D8"/>
5
+ <text x="220" y="190" font-size="34" fill="#4F5B6D" font-family="Arial, sans-serif">Public Core</text>
6
+ <text x="790" y="190" font-size="34" fill="#4F5B6D" font-family="Arial, sans-serif">Local Only</text>
7
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 560" role="img" aria-label="MeOS example profile placeholder">
2
+ <rect width="1200" height="560" fill="#F7F2EA"/>
3
+ <text x="80" y="110" font-size="40" fill="#4F5B6D" font-family="Arial, sans-serif">Example Profile</text>
4
+ <text x="80" y="170" font-size="22" fill="#7A7A7A" font-family="Arial, sans-serif">Sanitized example assets for engineering, research, and product styles</text>
5
+ </svg>
package/bin/meos.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ const { spawnSync } = require("node:child_process");
3
+ const path = require("node:path");
4
+
5
+ const repoRoot = path.resolve(__dirname, "..");
6
+ const installer = path.join(repoRoot, "installer.py");
7
+ const args = process.argv.slice(2);
8
+
9
+ const finalArgs = args.length === 0 ? ["install"] : args;
10
+ const result = spawnSync("python3", [installer, ...finalArgs], {
11
+ stdio: "inherit",
12
+ });
13
+
14
+ if (result.error) {
15
+ console.error("Failed to start python3 for MeOS installer.");
16
+ console.error(result.error.message);
17
+ process.exit(1);
18
+ }
19
+
20
+ process.exit(result.status ?? 1);
package/install.sh ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+
6
+ if ! command -v python3 >/dev/null 2>&1; then
7
+ echo "python3 is required to install MeOS." >&2
8
+ exit 1
9
+ fi
10
+
11
+ exec python3 "$SCRIPT_DIR/installer.py" install "$@"
package/installer.py ADDED
@@ -0,0 +1,327 @@
1
+ #!/usr/bin/env python3
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import os
6
+ import shutil
7
+ import subprocess
8
+ import sys
9
+ from dataclasses import dataclass
10
+ from pathlib import Path
11
+
12
+
13
+ REPO_ROOT = Path(__file__).resolve().parent
14
+ SKILL_ROOT = REPO_ROOT / "SKILL"
15
+ SKILL_DIRNAME = "meos"
16
+ SKIP_COPY_NAMES = {
17
+ ".git",
18
+ "__pycache__",
19
+ ".pytest_cache",
20
+ "node_modules",
21
+ }
22
+
23
+ PROMPTS = {
24
+ "en": {
25
+ "init": "Use meos in init mode. Build the first sanitized operating-layer assets from the available local source material. Do not promote one-off behavior into stable assets.",
26
+ "refresh": "Use meos in refresh mode. Refresh the existing MeOS assets from new local material. Prefer merge over duplication, preserve corrections as highest priority, and keep weak or conflicting facts in evidence only.",
27
+ "apply": "Use meos in apply mode for this task. Read only the minimum relevant live assets and let them shape reasoning, workflow, output, and correction handling.",
28
+ },
29
+ "zh": {
30
+ "init": "使用 meos 的 init 模式。请从当前可用的本地材料中建立第一版去隐私、保守的资产集合,不要把一次性行为直接升级成长期规则。",
31
+ "refresh": "使用 meos 的 refresh 模式。请根据新增材料刷新已有资产,优先 merge,不要重复建规则;corrections 优先级最高;弱证据或冲突证据只留在 evidence。",
32
+ "apply": "使用 meos 的 apply 模式处理这个任务。只读取最相关的 live assets,用它们来影响 reasoning、workflow、输出风格和 correction handling。",
33
+ },
34
+ }
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ class InstallTarget:
39
+ runtime: str
40
+ scope: str
41
+ path: Path
42
+
43
+
44
+ def parse_args() -> argparse.Namespace:
45
+ parser = argparse.ArgumentParser(description="MeOS installer and helper CLI")
46
+ subparsers = parser.add_subparsers(dest="command", required=False)
47
+
48
+ install = subparsers.add_parser("install", help="Install MeOS into one or more runtimes")
49
+ install.add_argument("--runtime", choices=["codex", "claude", "openclaw", "opencode", "all"], default="all")
50
+ install.add_argument("--scope", choices=["global", "project"], default="global")
51
+ install.add_argument("--project-dir", default=None, help="Project directory when --scope project is used")
52
+ install.add_argument(
53
+ "--mode",
54
+ choices=["auto", "symlink", "copy"],
55
+ default="auto",
56
+ help="Install mode. auto uses runtime-safe defaults (copy for OpenClaw, symlink elsewhere).",
57
+ )
58
+ install.add_argument("--force", action="store_true", help="Replace an existing target if it differs")
59
+ install.add_argument("--dry-run", action="store_true", help="Print actions without modifying the filesystem")
60
+ install.add_argument("--skip-private-layout", action="store_true", help="Do not create local private directories")
61
+ install.add_argument("--codex-dir", default=None, help="Override the Codex skill root for testing or custom install")
62
+ install.add_argument("--claude-dir", default=None, help="Override the Claude Code skill root for testing or custom install")
63
+ install.add_argument("--openclaw-dir", default=None, help="Override the OpenClaw skill root for testing or custom install")
64
+ install.add_argument("--opencode-dir", default=None, help="Override the OpenCode skill root for testing or custom install")
65
+
66
+ doctor = subparsers.add_parser("doctor", help="Check MeOS install targets and repository layout")
67
+ doctor.add_argument("--project-dir", default=None)
68
+ doctor.add_argument("--codex-dir", default=None)
69
+ doctor.add_argument("--claude-dir", default=None)
70
+ doctor.add_argument("--openclaw-dir", default=None)
71
+ doctor.add_argument("--opencode-dir", default=None)
72
+
73
+ prompts = subparsers.add_parser("print-prompts", help="Print suggested init/refresh/apply prompts")
74
+ prompts.add_argument("--lang", choices=["en", "zh"], default="en")
75
+
76
+ parser.set_defaults(command="install")
77
+ return parser.parse_args()
78
+
79
+
80
+ def ensure_repo_layout() -> list[str]:
81
+ required = [
82
+ SKILL_ROOT / "SKILL.md",
83
+ REPO_ROOT / "README.md",
84
+ SKILL_ROOT / "references",
85
+ SKILL_ROOT / "schemas",
86
+ SKILL_ROOT / "assets",
87
+ ]
88
+ missing = [str(path) for path in required if not path.exists()]
89
+ return missing
90
+
91
+
92
+ def ensure_private_layout(dry_run: bool = False) -> list[Path]:
93
+ targets = [
94
+ SKILL_ROOT / "assets" / "live",
95
+ SKILL_ROOT / "private" / "imported",
96
+ SKILL_ROOT / "private" / "raw",
97
+ SKILL_ROOT / "private" / "snapshots",
98
+ SKILL_ROOT / "evidence",
99
+ SKILL_ROOT / "runtime",
100
+ ]
101
+ created: list[Path] = []
102
+ for target in targets:
103
+ if target.exists():
104
+ continue
105
+ created.append(target)
106
+ if not dry_run:
107
+ target.mkdir(parents=True, exist_ok=True)
108
+ return created
109
+
110
+
111
+ def resolve_targets(args: argparse.Namespace) -> list[InstallTarget]:
112
+ runtimes = ["codex", "claude", "openclaw", "opencode"] if args.runtime == "all" else [args.runtime]
113
+ scope = args.scope
114
+ project_dir = Path(args.project_dir).expanduser().resolve() if args.project_dir else None
115
+ if scope == "project" and project_dir is None:
116
+ raise SystemExit("--project-dir is required when --scope project is used")
117
+
118
+ home = Path.home()
119
+ custom_roots = {
120
+ "codex": Path(args.codex_dir).expanduser() if args.codex_dir else None,
121
+ "claude": Path(args.claude_dir).expanduser() if args.claude_dir else None,
122
+ "openclaw": Path(args.openclaw_dir).expanduser() if args.openclaw_dir else None,
123
+ "opencode": Path(args.opencode_dir).expanduser() if args.opencode_dir else None,
124
+ }
125
+
126
+ resolved: list[InstallTarget] = []
127
+ for runtime in runtimes:
128
+ root = custom_roots[runtime]
129
+ if root is None:
130
+ if scope == "global":
131
+ if runtime == "codex":
132
+ root = home / ".agents" / "skills"
133
+ elif runtime == "claude":
134
+ root = home / ".claude" / "skills"
135
+ elif runtime == "openclaw":
136
+ root = home / ".openclaw" / "skills"
137
+ elif runtime == "opencode":
138
+ root = home / ".config" / "opencode" / "skills"
139
+ else:
140
+ assert project_dir is not None
141
+ if runtime == "codex":
142
+ root = project_dir / ".agents" / "skills"
143
+ elif runtime == "claude":
144
+ root = project_dir / ".claude" / "skills"
145
+ elif runtime == "openclaw":
146
+ root = project_dir / "skills"
147
+ elif runtime == "opencode":
148
+ root = project_dir / ".opencode" / "skills"
149
+ assert root is not None
150
+ resolved.append(InstallTarget(runtime=runtime, scope=scope, path=root / SKILL_DIRNAME))
151
+ return resolved
152
+
153
+
154
+ def remove_path(path: Path) -> None:
155
+ if path.is_symlink() or path.is_file():
156
+ path.unlink()
157
+ elif path.is_dir():
158
+ shutil.rmtree(path)
159
+
160
+
161
+ def copy_repo(src: Path, dst: Path) -> None:
162
+ def _ignore(directory: str, names: list[str]) -> set[str]:
163
+ ignored = {name for name in names if name in SKIP_COPY_NAMES}
164
+ if Path(directory).resolve() == src.resolve():
165
+ ignored.update({".git"})
166
+ return ignored
167
+
168
+ shutil.copytree(src, dst, symlinks=True, ignore=_ignore)
169
+
170
+
171
+ def path_is_within_root(path: Path, root: Path) -> bool:
172
+ try:
173
+ path.relative_to(root)
174
+ return True
175
+ except ValueError:
176
+ return False
177
+
178
+
179
+ def resolve_install_mode(target: InstallTarget, requested_mode: str) -> str:
180
+ if requested_mode != "auto":
181
+ return requested_mode
182
+ if target.runtime == "openclaw":
183
+ return "copy"
184
+ return "symlink"
185
+
186
+
187
+ def openclaw_external_symlink(path: Path) -> bool:
188
+ if not path.is_symlink():
189
+ return False
190
+ try:
191
+ return not path_is_within_root(path.resolve(), path.parent.resolve())
192
+ except FileNotFoundError:
193
+ return False
194
+
195
+
196
+ def duplicate_warnings(home: Path) -> list[str]:
197
+ warnings: list[str] = []
198
+ visible = {
199
+ "codex": home / ".agents" / "skills" / SKILL_DIRNAME,
200
+ "claude": home / ".claude" / "skills" / SKILL_DIRNAME,
201
+ "openclaw": home / ".openclaw" / "skills" / SKILL_DIRNAME,
202
+ "opencode": home / ".config" / "opencode" / "skills" / SKILL_DIRNAME,
203
+ }
204
+ existing = {name: path for name, path in visible.items() if path.exists() or path.is_symlink()}
205
+
206
+ if sum(name in existing for name in ("codex", "claude", "opencode")) > 1:
207
+ warnings.append(
208
+ "OpenCode searches ~/.config/opencode/skills, ~/.claude/skills, and ~/.agents/skills. "
209
+ "Installing MeOS in more than one of those paths causes duplicate-skill warnings."
210
+ )
211
+ if sum(name in existing for name in ("codex", "openclaw")) > 1:
212
+ warnings.append(
213
+ "OpenClaw searches both ~/.openclaw/skills and ~/.agents/skills. "
214
+ "Installing MeOS in both paths causes duplicate-skill warnings."
215
+ )
216
+ return warnings
217
+
218
+
219
+ def install_target(target: InstallTarget, *, mode: str, force: bool, dry_run: bool) -> str:
220
+ actual_mode = resolve_install_mode(target, mode)
221
+ target.path.parent.mkdir(parents=True, exist_ok=True) if not dry_run else None
222
+ if target.path.exists() or target.path.is_symlink():
223
+ if target.path.is_symlink() and target.path.resolve() == SKILL_ROOT.resolve():
224
+ if actual_mode == "symlink":
225
+ return f"[skip] {target.runtime}: already linked at {target.path}"
226
+ if not force:
227
+ return (
228
+ f"[skip] {target.runtime}: existing symlink at {target.path} is incompatible with "
229
+ f"requested {actual_mode} mode (use --force to replace)"
230
+ )
231
+ if not force:
232
+ return f"[skip] {target.runtime}: target exists at {target.path} (use --force to replace)"
233
+ if not dry_run:
234
+ remove_path(target.path)
235
+ if dry_run:
236
+ return f"[dry-run] {target.runtime}: would {actual_mode} install to {target.path}"
237
+ if actual_mode == "symlink":
238
+ os.symlink(SKILL_ROOT, target.path, target_is_directory=True)
239
+ else:
240
+ copy_repo(SKILL_ROOT, target.path)
241
+ return f"[ok] {target.runtime}: installed to {target.path} using {actual_mode}"
242
+
243
+
244
+ def command_install(args: argparse.Namespace) -> int:
245
+ missing = ensure_repo_layout()
246
+ if missing:
247
+ print("Missing required repository files:")
248
+ for item in missing:
249
+ print(f"- {item}")
250
+ return 1
251
+
252
+ if not args.skip_private_layout:
253
+ created = ensure_private_layout(dry_run=args.dry_run)
254
+ else:
255
+ created = []
256
+ targets = resolve_targets(args)
257
+ messages = [install_target(target, mode=args.mode, force=args.force, dry_run=args.dry_run) for target in targets]
258
+
259
+ print("MeOS install summary")
260
+ print(f"- repository: {REPO_ROOT}")
261
+ print(f"- skill-source: {SKILL_ROOT}")
262
+ print(f"- mode: {args.mode}")
263
+ print(f"- scope: {args.scope}")
264
+ for line in messages:
265
+ print(line)
266
+ for warning in duplicate_warnings(Path.home()):
267
+ print(f"- warning: {warning}")
268
+ if created:
269
+ print("- local private layout:")
270
+ for path in created:
271
+ print(f" - {path}")
272
+ print("\nSuggested next prompts:\n")
273
+ for key, value in PROMPTS["en"].items():
274
+ print(f"{key}: {value}\n")
275
+ return 0
276
+
277
+
278
+ def command_doctor(args: argparse.Namespace) -> int:
279
+ missing = ensure_repo_layout()
280
+ targets = resolve_targets(argparse.Namespace(
281
+ runtime="all",
282
+ scope="project" if args.project_dir else "global",
283
+ project_dir=args.project_dir,
284
+ codex_dir=args.codex_dir,
285
+ claude_dir=args.claude_dir,
286
+ openclaw_dir=args.openclaw_dir,
287
+ opencode_dir=args.opencode_dir,
288
+ ))
289
+ print("MeOS doctor")
290
+ print(f"- repository: {REPO_ROOT}")
291
+ print(f"- skill-source: {SKILL_ROOT}")
292
+ print(f"- repository_layout_ok: {not missing}")
293
+ if missing:
294
+ for item in missing:
295
+ print(f" missing: {item}")
296
+ for target in targets:
297
+ exists = target.path.exists() or target.path.is_symlink()
298
+ print(f"- {target.runtime}: {'installed' if exists else 'missing'} -> {target.path}")
299
+ if target.runtime == "openclaw" and openclaw_external_symlink(target.path):
300
+ print(" warning: OpenClaw skips symlinked skill roots whose realpath escapes the configured root; use copy mode.")
301
+ for warning in duplicate_warnings(Path.home()):
302
+ print(f"- warning: {warning}")
303
+ return 0 if not missing else 1
304
+
305
+
306
+ def command_print_prompts(args: argparse.Namespace) -> int:
307
+ bundle = PROMPTS[args.lang]
308
+ for key in ("init", "refresh", "apply"):
309
+ print(f"{key}:")
310
+ print(bundle[key])
311
+ print()
312
+ return 0
313
+
314
+
315
+ def main() -> int:
316
+ args = parse_args()
317
+ if args.command == "install":
318
+ return command_install(args)
319
+ if args.command == "doctor":
320
+ return command_doctor(args)
321
+ if args.command == "print-prompts":
322
+ return command_print_prompts(args)
323
+ raise SystemExit(f"Unknown command: {args.command}")
324
+
325
+
326
+ if __name__ == "__main__":
327
+ raise SystemExit(main())
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@researai/meos",
3
+ "version": "0.1.0",
4
+ "description": "MeOS installer wrapper for local-first skill setup across Codex, Claude Code, OpenClaw, and OpenCode.",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/ResearAI/MeOS",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/ResearAI/MeOS.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/ResearAI/MeOS/issues"
13
+ },
14
+ "keywords": [
15
+ "agent-skill",
16
+ "codex",
17
+ "claude-code",
18
+ "openclaw",
19
+ "opencode",
20
+ "local-first",
21
+ "alignment",
22
+ "prompting"
23
+ ],
24
+ "bin": {
25
+ "meos": "bin/meos.js"
26
+ },
27
+ "scripts": {
28
+ "prepack": "python3 -m py_compile installer.py",
29
+ "release:check": "python3 -m py_compile installer.py && npm pack --dry-run"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "files": [
35
+ "README.md",
36
+ "README_ZH.md",
37
+ "LICENSE",
38
+ "install.sh",
39
+ "installer.py",
40
+ "bin/",
41
+ "SKILL/",
42
+ "assets/branding/",
43
+ "assets/readme/"
44
+ ],
45
+ "engines": {
46
+ "node": ">=18"
47
+ }
48
+ }