@datacore-one/cli 1.0.3 → 1.0.4

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 (2) hide show
  1. package/dist/index.js +114 -183
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8005,7 +8005,7 @@ function checkGitLfs(platform2) {
8005
8005
  const installed = commandExists("git-lfs");
8006
8006
  return {
8007
8007
  name: "git-lfs",
8008
- required: true,
8008
+ required: false,
8009
8009
  installed,
8010
8010
  version: installed ? getVersion("git-lfs") : undefined,
8011
8011
  installCommand: installed ? undefined : getInstallCommand("git-lfs", platform2) ?? undefined
@@ -8651,8 +8651,6 @@ function startOperation(operation, params = {}) {
8651
8651
  }
8652
8652
 
8653
8653
  // src/lib/animation.ts
8654
- var SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
8655
- var MATRIX_CHARS = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789";
8656
8654
  var c = {
8657
8655
  reset: "\x1B[0m",
8658
8656
  bright: "\x1B[1m",
@@ -8688,111 +8686,11 @@ ${c.green}${c.bright}
8688
8686
  ╚═══════════════════════════════════════════════════════════════╝
8689
8687
  ${c.reset}
8690
8688
  `;
8691
- function sleep(ms) {
8692
- return new Promise((resolve) => setTimeout(resolve, ms));
8693
- }
8694
- async function typewrite(text, speed = 30) {
8695
- for (const char of text) {
8696
- process.stdout.write(char);
8697
- await sleep(speed);
8698
- }
8699
- console.log();
8700
- }
8701
- class Spinner {
8702
- interval = null;
8703
- frame = 0;
8704
- message;
8705
- constructor(message) {
8706
- this.message = message;
8707
- }
8708
- start() {
8709
- process.stdout.write("\x1B[?25l");
8710
- this.interval = setInterval(() => {
8711
- const spinner = SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length];
8712
- process.stdout.write(`\r${c.cyan}${spinner}${c.reset} ${this.message}`);
8713
- this.frame++;
8714
- }, 80);
8715
- }
8716
- update(message) {
8717
- this.message = message;
8718
- }
8719
- succeed(message) {
8720
- this.stop();
8721
- console.log(`\r${c.green}✓${c.reset} ${message || this.message}`);
8722
- }
8723
- fail(message) {
8724
- this.stop();
8725
- console.log(`\r${c.yellow}✗${c.reset} ${message || this.message}`);
8726
- }
8727
- stop() {
8728
- if (this.interval) {
8729
- clearInterval(this.interval);
8730
- this.interval = null;
8731
- }
8732
- process.stdout.write("\x1B[?25h");
8733
- process.stdout.write("\r" + " ".repeat(this.message.length + 10) + "\r");
8734
- }
8735
- }
8736
- function step(num, total, message) {
8737
- console.log(`${c.dim}[${num}/${total}]${c.reset} ${message}`);
8738
- }
8739
8689
  function section(title) {
8740
8690
  console.log();
8741
8691
  console.log(`${c.cyan}${c.bright}▸ ${title}${c.reset}`);
8742
8692
  console.log(`${c.dim}${"─".repeat(50)}${c.reset}`);
8743
8693
  }
8744
- async function matrixRain(duration = 500) {
8745
- const cols = process.stdout.columns || 80;
8746
- const rows = 3;
8747
- const drops = Array(cols).fill(0).map(() => Math.floor(Math.random() * rows));
8748
- const startTime = Date.now();
8749
- while (Date.now() - startTime < duration) {
8750
- let frame = "";
8751
- for (let y = 0;y < rows; y++) {
8752
- for (let x = 0;x < cols; x++) {
8753
- const drop = drops[x] ?? 0;
8754
- if (drop === y) {
8755
- frame += `${c.green}${c.bright}${MATRIX_CHARS[Math.floor(Math.random() * MATRIX_CHARS.length)]}${c.reset}`;
8756
- } else if (drop === y - 1) {
8757
- frame += `${c.green}${MATRIX_CHARS[Math.floor(Math.random() * MATRIX_CHARS.length)]}${c.reset}`;
8758
- } else {
8759
- frame += " ";
8760
- }
8761
- }
8762
- frame += `
8763
- `;
8764
- }
8765
- process.stdout.write(frame);
8766
- for (let i = 0;i < drops.length; i++) {
8767
- if (Math.random() > 0.9)
8768
- drops[i] = 0;
8769
- else
8770
- drops[i] = (drops[i] ?? 0) + 1;
8771
- }
8772
- await sleep(50);
8773
- process.stdout.write(`\x1B[${rows}A`);
8774
- }
8775
- for (let y = 0;y < rows; y++) {
8776
- console.log(" ".repeat(cols));
8777
- }
8778
- process.stdout.write(`\x1B[${rows}A`);
8779
- }
8780
- async function bootSequence() {
8781
- const lines = [
8782
- "Initializing neural pathways...",
8783
- "Loading cognitive frameworks...",
8784
- "Establishing knowledge graph...",
8785
- "Calibrating AI agents...",
8786
- "Synchronizing memory banks..."
8787
- ];
8788
- for (const line of lines) {
8789
- process.stdout.write(`${c.dim}> ${line}${c.reset}`);
8790
- await sleep(100 + Math.random() * 200);
8791
- process.stdout.write(` ${c.green}OK${c.reset}
8792
- `);
8793
- await sleep(50);
8794
- }
8795
- }
8796
8694
 
8797
8695
  // src/lib/init.ts
8798
8696
  var DATA_DIR4 = join6(process.env.HOME || "~", "Data");
@@ -8816,26 +8714,48 @@ async function initDatacore(options = {}) {
8816
8714
  if (isTTY) {
8817
8715
  console.clear();
8818
8716
  console.log(BANNER);
8819
- await sleep(500);
8820
- await matrixRain(400);
8821
- await bootSequence();
8822
- await sleep(300);
8717
+ console.log();
8823
8718
  }
8824
8719
  const TOTAL_STEPS = 6;
8825
8720
  op.addStep("check_dependencies");
8826
8721
  op.startStep("check_dependencies");
8827
8722
  if (!skipChecks) {
8828
- let spinner = null;
8829
8723
  if (isTTY) {
8830
- section("System Check");
8831
- spinner = new Spinner("Scanning system dependencies...");
8832
- spinner.start();
8833
- await sleep(800);
8724
+ section("Checking Dependencies");
8725
+ console.log(" \x1B[90mDatacore requires a few tools to manage your knowledge system.\x1B[0m");
8726
+ console.log();
8834
8727
  }
8835
8728
  const doctor = runDoctor();
8729
+ const depInfo = {
8730
+ git: "Version control for your knowledge repos",
8731
+ "git-lfs": "Large file support (PDFs, images, videos)",
8732
+ node: "Runtime for CLI tools and automation",
8733
+ python: "Powers AI agents and data processing",
8734
+ claude: "Claude Code AI assistant integration"
8735
+ };
8736
+ if (isTTY) {
8737
+ for (const dep of doctor.dependencies) {
8738
+ const info2 = depInfo[dep.name] || "";
8739
+ if (dep.installed) {
8740
+ console.log(` \x1B[32m✓\x1B[0m ${dep.name} ${dep.version ? `\x1B[90m(${dep.version})\x1B[0m` : ""}`);
8741
+ console.log(` \x1B[90m${info2}\x1B[0m`);
8742
+ } else if (dep.required) {
8743
+ console.log(` \x1B[31m✗\x1B[0m ${dep.name} \x1B[31m(required)\x1B[0m`);
8744
+ console.log(` \x1B[90m${info2}\x1B[0m`);
8745
+ if (dep.installCommand) {
8746
+ console.log(` \x1B[33mInstall: ${dep.installCommand}\x1B[0m`);
8747
+ }
8748
+ } else {
8749
+ console.log(` \x1B[33m○\x1B[0m ${dep.name} \x1B[90m(optional)\x1B[0m`);
8750
+ console.log(` \x1B[90m${info2}\x1B[0m`);
8751
+ if (dep.installCommand) {
8752
+ console.log(` \x1B[90mInstall later: ${dep.installCommand}\x1B[0m`);
8753
+ }
8754
+ }
8755
+ }
8756
+ console.log();
8757
+ }
8836
8758
  if (doctor.status === "missing_required") {
8837
- if (spinner)
8838
- spinner.fail("Missing required dependencies");
8839
8759
  const missing = doctor.dependencies.filter((d) => d.required && !d.installed);
8840
8760
  for (const dep of missing) {
8841
8761
  result.errors.push(`Missing required dependency: ${dep.name}`);
@@ -8847,23 +8767,10 @@ async function initDatacore(options = {}) {
8847
8767
  op.fail("Missing required dependencies");
8848
8768
  return result;
8849
8769
  }
8850
- if (spinner) {
8851
- spinner.succeed(`Found ${doctor.dependencies.filter((d) => d.installed).length} dependencies`);
8852
- }
8853
8770
  if (doctor.status === "missing_recommended") {
8854
8771
  const missing = doctor.dependencies.filter((d) => !d.required && !d.installed);
8855
8772
  for (const dep of missing) {
8856
- result.warnings.push(`Missing recommended: ${dep.name}`);
8857
- }
8858
- }
8859
- if (isTTY) {
8860
- for (const dep of doctor.dependencies) {
8861
- if (dep.installed) {
8862
- console.log(` \x1B[32m✓\x1B[0m ${dep.name} ${dep.version ? `\x1B[90m(${dep.version})\x1B[0m` : ""}`);
8863
- } else {
8864
- console.log(` \x1B[33m○\x1B[0m ${dep.name} \x1B[90m(not installed)\x1B[0m`);
8865
- }
8866
- await sleep(100);
8773
+ result.warnings.push(`Optional: ${dep.name} - install for full functionality`);
8867
8774
  }
8868
8775
  }
8869
8776
  }
@@ -8871,53 +8778,49 @@ async function initDatacore(options = {}) {
8871
8778
  op.addStep("create_data_dir");
8872
8779
  op.startStep("create_data_dir");
8873
8780
  if (isTTY) {
8874
- section("Creating Brain Structure");
8781
+ section("Setting Up ~/Data");
8782
+ console.log(" \x1B[90mThis is your central knowledge directory. Everything lives here.\x1B[0m");
8783
+ console.log();
8875
8784
  }
8876
8785
  if (!existsSync6(DATA_DIR4)) {
8877
- if (isTTY) {
8878
- step(1, TOTAL_STEPS, "Allocating neural storage...");
8879
- await sleep(300);
8880
- }
8881
8786
  mkdirSync4(DATA_DIR4, { recursive: true });
8882
8787
  result.created.push(DATA_DIR4);
8883
8788
  if (isTTY)
8884
- console.log(` \x1B[32m→\x1B[0m ${DATA_DIR4}`);
8789
+ console.log(` \x1B[32m✓\x1B[0m Created ${DATA_DIR4}`);
8885
8790
  } else if (isTTY) {
8886
- step(1, TOTAL_STEPS, "Neural storage exists");
8791
+ console.log(` \x1B[32m✓\x1B[0m Found existing ${DATA_DIR4}`);
8887
8792
  }
8888
8793
  op.completeStep("create_data_dir");
8889
8794
  op.addStep("create_datacore_dir");
8890
8795
  op.startStep("create_datacore_dir");
8796
+ if (isTTY) {
8797
+ console.log();
8798
+ section("Creating .datacore");
8799
+ console.log(" \x1B[90mSystem configuration, agents, and modules live here.\x1B[0m");
8800
+ console.log();
8801
+ }
8891
8802
  if (!existsSync6(DATACORE_DIR)) {
8892
- if (isTTY) {
8893
- step(2, TOTAL_STEPS, "Building core matrix...");
8894
- }
8895
8803
  const dirs = [
8896
- { path: "", label: "core" },
8897
- { path: "commands", label: "commands" },
8898
- { path: "agents", label: "agents" },
8899
- { path: "modules", label: "modules" },
8900
- { path: "specs", label: "specs" },
8901
- { path: "lib", label: "lib" },
8902
- { path: "env", label: "env" },
8903
- { path: "state", label: "state" },
8904
- { path: "registry", label: "registry" }
8804
+ { path: "", desc: "Core configuration" },
8805
+ { path: "commands", desc: "Slash commands (e.g., /today, /sync)" },
8806
+ { path: "agents", desc: "AI agents for task automation" },
8807
+ { path: "modules", desc: "Optional extensions (CRM, meetings, etc.)" },
8808
+ { path: "specs", desc: "System documentation" },
8809
+ { path: "lib", desc: "Shared utilities" },
8810
+ { path: "env", desc: "Secrets and API keys (gitignored)" },
8811
+ { path: "state", desc: "Runtime state (gitignored)" },
8812
+ { path: "registry", desc: "Agent and command discovery" }
8905
8813
  ];
8906
- for (const { path: dir, label } of dirs) {
8814
+ for (const { path: dir, desc } of dirs) {
8907
8815
  const path = join6(DATACORE_DIR, dir);
8908
8816
  if (!existsSync6(path)) {
8909
8817
  mkdirSync4(path, { recursive: true });
8910
8818
  result.created.push(path);
8911
- if (isTTY) {
8912
- console.log(` \x1B[36m◆\x1B[0m ${label}`);
8913
- await sleep(80);
8819
+ if (isTTY && dir) {
8820
+ console.log(` \x1B[32m✓\x1B[0m ${dir}/ \x1B[90m- ${desc}\x1B[0m`);
8914
8821
  }
8915
8822
  }
8916
8823
  }
8917
- if (isTTY) {
8918
- step(3, TOTAL_STEPS, "Configuring neural pathways...");
8919
- await sleep(200);
8920
- }
8921
8824
  writeFileSync4(join6(DATACORE_DIR, "settings.yaml"), `# Datacore Settings
8922
8825
  # Override in settings.local.yaml
8923
8826
 
@@ -8949,62 +8852,82 @@ agents: []
8949
8852
  commands: []
8950
8853
  `);
8951
8854
  result.created.push(join6(DATACORE_DIR, "registry", "commands.yaml"));
8952
- if (isTTY)
8953
- console.log(` \x1B[32m✓\x1B[0m Configuration loaded`);
8855
+ if (isTTY) {
8856
+ console.log();
8857
+ console.log(` \x1B[32m✓\x1B[0m Created settings.yaml`);
8858
+ console.log(" \x1B[90mCustomize in settings.local.yaml (gitignored)\x1B[0m");
8859
+ }
8954
8860
  } else if (isTTY) {
8955
- step(2, TOTAL_STEPS, "Core matrix exists");
8956
- step(3, TOTAL_STEPS, "Configuration loaded");
8861
+ console.log(` \x1B[32m✓\x1B[0m Found existing .datacore/`);
8957
8862
  }
8958
8863
  op.completeStep("create_datacore_dir");
8959
8864
  op.addStep("create_personal_space");
8960
8865
  op.startStep("create_personal_space");
8866
+ if (isTTY) {
8867
+ console.log();
8868
+ section("Creating Personal Space");
8869
+ console.log(" \x1B[90mSpaces are separate knowledge areas (personal, work, projects).\x1B[0m");
8870
+ console.log(" \x1B[90mEach space has its own GTD inbox, notes, and journals.\x1B[0m");
8871
+ console.log();
8872
+ }
8961
8873
  const spaces = listSpaces();
8962
8874
  if (spaces.length === 0) {
8963
- if (isTTY) {
8964
- step(4, TOTAL_STEPS, "Spawning personal consciousness...");
8965
- await sleep(400);
8966
- }
8967
8875
  try {
8968
8876
  const space = createSpace("personal", "personal");
8969
8877
  result.created.push(space.path);
8970
- if (isTTY)
8971
- console.log(` \x1B[35m◉\x1B[0m 0-personal initialized`);
8878
+ if (isTTY) {
8879
+ console.log(` \x1B[32m✓\x1B[0m Created 0-personal/`);
8880
+ console.log(" \x1B[90morg/inbox.org - Capture tasks here\x1B[0m");
8881
+ console.log(" \x1B[90mnotes/ - Your knowledge base\x1B[0m");
8882
+ console.log(" \x1B[90mjournal/ - Daily entries\x1B[0m");
8883
+ }
8972
8884
  } catch (err) {
8973
8885
  result.warnings.push(`Could not create personal space: ${err.message}`);
8974
8886
  }
8975
8887
  } else if (isTTY) {
8976
- step(4, TOTAL_STEPS, `Found ${spaces.length} existing space(s)`);
8888
+ console.log(` \x1B[32m✓\x1B[0m Found ${spaces.length} existing space(s):`);
8889
+ for (const space of spaces) {
8890
+ console.log(` \x1B[90m${space.name}/\x1B[0m`);
8891
+ }
8977
8892
  }
8978
8893
  op.completeStep("create_personal_space");
8979
8894
  op.addStep("create_claude_symlink");
8980
8895
  op.startStep("create_claude_symlink");
8896
+ if (isTTY) {
8897
+ console.log();
8898
+ section("Linking Claude Code");
8899
+ console.log(" \x1B[90mClaude Code looks for .claude/ to find project context.\x1B[0m");
8900
+ console.log(" \x1B[90mThis symlink connects it to your Datacore configuration.\x1B[0m");
8901
+ console.log();
8902
+ }
8981
8903
  const claudeDir = join6(DATA_DIR4, ".claude");
8982
8904
  if (!existsSync6(claudeDir)) {
8983
- if (isTTY) {
8984
- step(5, TOTAL_STEPS, "Establishing AI link...");
8985
- await sleep(300);
8986
- }
8987
8905
  try {
8988
8906
  symlinkSync(DATACORE_DIR, claudeDir);
8989
8907
  result.created.push(claudeDir);
8990
8908
  if (isTTY)
8991
- console.log(` \x1B[32m⚡\x1B[0m Claude Code connected`);
8909
+ console.log(` \x1B[32m✓\x1B[0m Created .claude -> .datacore symlink`);
8992
8910
  } catch {
8993
8911
  result.warnings.push("Could not create .claude symlink");
8912
+ if (isTTY)
8913
+ console.log(` \x1B[33m○\x1B[0m Could not create symlink (run manually if needed)`);
8994
8914
  }
8995
8915
  } else if (isTTY) {
8996
- step(5, TOTAL_STEPS, "AI link established");
8916
+ console.log(` \x1B[32m✓\x1B[0m Found existing .claude/`);
8997
8917
  }
8998
8918
  op.completeStep("create_claude_symlink");
8999
8919
  op.addStep("create_claude_md");
9000
8920
  op.startStep("create_claude_md");
8921
+ if (isTTY) {
8922
+ console.log();
8923
+ section("Creating CLAUDE.md");
8924
+ console.log(" \x1B[90mThis file tells Claude Code about your Datacore system.\x1B[0m");
8925
+ console.log(" \x1B[90mIt auto-loads when you run `claude` in ~/Data.\x1B[0m");
8926
+ console.log();
8927
+ }
9001
8928
  const claudeMd = join6(DATA_DIR4, "CLAUDE.md");
9002
8929
  const claudeBaseMd = join6(DATA_DIR4, "CLAUDE.base.md");
9003
8930
  if (!existsSync6(claudeMd) && !existsSync6(claudeBaseMd)) {
9004
- if (isTTY) {
9005
- step(6, TOTAL_STEPS, "Writing consciousness manifest...");
9006
- await sleep(300);
9007
- }
9008
8931
  writeFileSync4(claudeBaseMd, `# Datacore
9009
8932
 
9010
8933
  AI-powered second brain built on GTD methodology.
@@ -9033,9 +8956,9 @@ See .datacore/specs/ for detailed documentation.
9033
8956
  `);
9034
8957
  result.created.push(claudeBaseMd);
9035
8958
  if (isTTY)
9036
- console.log(` \x1B[32m✓\x1B[0m CLAUDE.md created`);
8959
+ console.log(` \x1B[32m✓\x1B[0m Created CLAUDE.base.md`);
9037
8960
  } else if (isTTY) {
9038
- step(6, TOTAL_STEPS, "Consciousness manifest exists");
8961
+ console.log(` \x1B[32m✓\x1B[0m Found existing CLAUDE.md`);
9039
8962
  }
9040
8963
  op.completeStep("create_claude_md");
9041
8964
  result.success = true;
@@ -9044,11 +8967,19 @@ See .datacore/specs/ for detailed documentation.
9044
8967
  "Start working: `cd ~/Data && claude`"
9045
8968
  ];
9046
8969
  if (isTTY) {
9047
- await sleep(500);
8970
+ console.log();
9048
8971
  console.log(INIT_COMPLETE);
9049
- await typewrite(" Your second brain is ready.", 25);
9050
8972
  console.log();
9051
- console.log(" \x1B[90mNext:\x1B[0m cd ~/Data && claude");
8973
+ console.log(" \x1B[1mNext steps:\x1B[0m");
8974
+ console.log();
8975
+ console.log(" 1. \x1B[36mcd ~/Data && claude\x1B[0m");
8976
+ console.log(" \x1B[90mStart using your second brain with AI assistance\x1B[0m");
8977
+ console.log();
8978
+ console.log(" 2. \x1B[36mdatacore doctor\x1B[0m");
8979
+ console.log(" \x1B[90mVerify everything is set up correctly\x1B[0m");
8980
+ console.log();
8981
+ console.log(" 3. Add tasks to \x1B[36m0-personal/org/inbox.org\x1B[0m");
8982
+ console.log(" \x1B[90mYour GTD capture inbox - process daily\x1B[0m");
9052
8983
  console.log();
9053
8984
  }
9054
8985
  op.complete();
@@ -9202,7 +9133,7 @@ import { execSync as execSync5 } from "child_process";
9202
9133
  import { join as join8 } from "path";
9203
9134
  var DATA_DIR6 = join8(process.env.HOME || "~", "Data");
9204
9135
  var LOCK_FILE = join8(DATA_DIR6, "datacore.lock.yaml");
9205
- var CLI_VERSION = "1.0.3";
9136
+ var CLI_VERSION = "1.0.4";
9206
9137
  function getGitInfo(path) {
9207
9138
  if (!existsSync8(join8(path, ".git"))) {
9208
9139
  return {};
@@ -9421,7 +9352,7 @@ function restoreFromSnapshot(snapshot, options = {}) {
9421
9352
  }
9422
9353
 
9423
9354
  // src/index.ts
9424
- var VERSION = "1.0.3";
9355
+ var VERSION = "1.0.4";
9425
9356
  var args = process.argv.slice(2);
9426
9357
  var parsed = parseArgs(args);
9427
9358
  async function handleMeta(command, cmdArgs, flags, format) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datacore-one/cli",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "CLI for setting up and managing Datacore installations",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",