@hasna/configs 0.1.0 → 0.1.1
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.
- package/dist/cli/index.js +164 -118
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +225 -111
- package/dist/lib/sync-dir.d.ts +13 -0
- package/dist/lib/sync-dir.d.ts.map +1 -0
- package/dist/lib/sync.d.ts +24 -8
- package/dist/lib/sync.d.ts.map +1 -1
- package/dist/mcp/index.js +82 -88
- package/dist/server/index.js +82 -88
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -2073,7 +2073,7 @@ var {
|
|
|
2073
2073
|
import chalk from "chalk";
|
|
2074
2074
|
import { existsSync as existsSync6, readFileSync as readFileSync4 } from "fs";
|
|
2075
2075
|
import { homedir as homedir3 } from "os";
|
|
2076
|
-
import { join as join5, resolve as
|
|
2076
|
+
import { join as join5, resolve as resolve5 } from "path";
|
|
2077
2077
|
|
|
2078
2078
|
// src/types/index.ts
|
|
2079
2079
|
class ConfigNotFoundError extends Error {
|
|
@@ -2503,138 +2503,120 @@ async function applyConfigs(configs, opts = {}) {
|
|
|
2503
2503
|
}
|
|
2504
2504
|
|
|
2505
2505
|
// src/lib/sync.ts
|
|
2506
|
-
import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync2
|
|
2507
|
-
import { extname, join as join2
|
|
2506
|
+
import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync2 } from "fs";
|
|
2507
|
+
import { extname, join as join2 } from "path";
|
|
2508
2508
|
import { homedir as homedir2 } from "os";
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
}
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
return "claude";
|
|
2531
|
-
if (p.includes("/.codex/") || p.endsWith("agents.md"))
|
|
2532
|
-
return "codex";
|
|
2533
|
-
if (p.includes("/.gemini/") || p.endsWith("gemini.md"))
|
|
2534
|
-
return "gemini";
|
|
2535
|
-
if (p.includes(".zshrc") || p.includes(".zprofile") || p.includes(".bashrc"))
|
|
2536
|
-
return "zsh";
|
|
2537
|
-
if (p.includes(".gitconfig") || p.includes(".gitignore"))
|
|
2538
|
-
return "git";
|
|
2539
|
-
if (p.includes(".npmrc"))
|
|
2540
|
-
return "npm";
|
|
2541
|
-
return "global";
|
|
2542
|
-
}
|
|
2543
|
-
function detectFormat(filePath) {
|
|
2544
|
-
const ext = extname(filePath).toLowerCase();
|
|
2545
|
-
if (ext === ".json")
|
|
2546
|
-
return "json";
|
|
2547
|
-
if (ext === ".toml")
|
|
2548
|
-
return "toml";
|
|
2549
|
-
if (ext === ".yaml" || ext === ".yml")
|
|
2550
|
-
return "yaml";
|
|
2551
|
-
if (ext === ".md" || ext === ".markdown")
|
|
2552
|
-
return "markdown";
|
|
2553
|
-
if (ext === ".ini" || ext === ".cfg")
|
|
2554
|
-
return "ini";
|
|
2555
|
-
return "text";
|
|
2556
|
-
}
|
|
2557
|
-
var SKIP_PATTERNS = [".db", ".db-shm", ".db-wal", ".log", ".lock", ".DS_Store", "node_modules", ".git"];
|
|
2558
|
-
function shouldSkip(p) {
|
|
2559
|
-
return SKIP_PATTERNS.some((pat) => p.includes(pat));
|
|
2560
|
-
}
|
|
2561
|
-
function walkDir(dir, files = []) {
|
|
2562
|
-
const entries = readdirSync(dir, { withFileTypes: true });
|
|
2563
|
-
for (const entry of entries) {
|
|
2564
|
-
const full = join2(dir, entry.name);
|
|
2565
|
-
if (shouldSkip(full))
|
|
2566
|
-
continue;
|
|
2567
|
-
if (entry.isDirectory()) {
|
|
2568
|
-
walkDir(full, files);
|
|
2569
|
-
} else if (entry.isFile()) {
|
|
2570
|
-
files.push(full);
|
|
2571
|
-
}
|
|
2572
|
-
}
|
|
2573
|
-
return files;
|
|
2574
|
-
}
|
|
2575
|
-
async function syncFromDir(dir, opts = {}) {
|
|
2509
|
+
var KNOWN_CONFIGS = [
|
|
2510
|
+
{ path: "~/.claude/CLAUDE.md", name: "claude-claude-md", category: "rules", agent: "claude", format: "markdown" },
|
|
2511
|
+
{ path: "~/.claude/settings.json", name: "claude-settings", category: "agent", agent: "claude", format: "json" },
|
|
2512
|
+
{ path: "~/.claude/settings.local.json", name: "claude-settings-local", category: "agent", agent: "claude", format: "json" },
|
|
2513
|
+
{ path: "~/.claude/keybindings.json", name: "claude-keybindings", category: "agent", agent: "claude", format: "json" },
|
|
2514
|
+
{ path: "~/.claude/rules", name: "claude-rules", category: "rules", agent: "claude", rulesDir: "~/.claude/rules" },
|
|
2515
|
+
{ path: "~/.codex/config.toml", name: "codex-config", category: "agent", agent: "codex", format: "toml" },
|
|
2516
|
+
{ path: "~/.codex/AGENTS.md", name: "codex-agents-md", category: "rules", agent: "codex", format: "markdown" },
|
|
2517
|
+
{ path: "~/.gemini/settings.json", name: "gemini-settings", category: "agent", agent: "gemini", format: "json" },
|
|
2518
|
+
{ path: "~/.gemini/GEMINI.md", name: "gemini-gemini-md", category: "rules", agent: "gemini", format: "markdown" },
|
|
2519
|
+
{ path: "~/.claude.json", name: "claude-json", category: "mcp", agent: "claude", format: "json", description: "Claude Code global config (includes MCP server entries)" },
|
|
2520
|
+
{ path: "~/.zshrc", name: "zshrc", category: "shell", agent: "zsh" },
|
|
2521
|
+
{ path: "~/.zprofile", name: "zprofile", category: "shell", agent: "zsh" },
|
|
2522
|
+
{ path: "~/.bashrc", name: "bashrc", category: "shell", agent: "zsh" },
|
|
2523
|
+
{ path: "~/.bash_profile", name: "bash-profile", category: "shell", agent: "zsh" },
|
|
2524
|
+
{ path: "~/.gitconfig", name: "gitconfig", category: "git", agent: "git", format: "ini" },
|
|
2525
|
+
{ path: "~/.gitignore_global", name: "gitignore-global", category: "git", agent: "git" },
|
|
2526
|
+
{ path: "~/.npmrc", name: "npmrc", category: "tools", agent: "npm", format: "ini" },
|
|
2527
|
+
{ path: "~/.bunfig.toml", name: "bunfig", category: "tools", agent: "global", format: "toml" }
|
|
2528
|
+
];
|
|
2529
|
+
async function syncKnown(opts = {}) {
|
|
2576
2530
|
const d = opts.db || getDatabase();
|
|
2577
|
-
const absDir = expandPath(dir);
|
|
2578
|
-
if (!existsSync3(absDir)) {
|
|
2579
|
-
return { added: 0, updated: 0, unchanged: 0, skipped: [`Directory not found: ${absDir}`] };
|
|
2580
|
-
}
|
|
2581
|
-
const files = opts.recursive !== false ? walkDir(absDir) : readdirSync(absDir).map((f) => join2(absDir, f)).filter((f) => statSync(f).isFile());
|
|
2582
2531
|
const result = { added: 0, updated: 0, unchanged: 0, skipped: [] };
|
|
2532
|
+
const home = homedir2();
|
|
2533
|
+
let targets = KNOWN_CONFIGS;
|
|
2534
|
+
if (opts.agent)
|
|
2535
|
+
targets = targets.filter((k) => k.agent === opts.agent);
|
|
2536
|
+
if (opts.category)
|
|
2537
|
+
targets = targets.filter((k) => k.category === opts.category);
|
|
2583
2538
|
const allConfigs = listConfigs(undefined, d);
|
|
2584
|
-
for (const
|
|
2585
|
-
if (
|
|
2586
|
-
|
|
2539
|
+
for (const known of targets) {
|
|
2540
|
+
if (known.rulesDir) {
|
|
2541
|
+
const absDir = expandPath(known.rulesDir);
|
|
2542
|
+
if (!existsSync3(absDir)) {
|
|
2543
|
+
result.skipped.push(known.rulesDir);
|
|
2544
|
+
continue;
|
|
2545
|
+
}
|
|
2546
|
+
const mdFiles = readdirSync(absDir).filter((f) => f.endsWith(".md"));
|
|
2547
|
+
for (const f of mdFiles) {
|
|
2548
|
+
const abs2 = join2(absDir, f);
|
|
2549
|
+
const targetPath = abs2.replace(home, "~");
|
|
2550
|
+
const content = readFileSync2(abs2, "utf-8");
|
|
2551
|
+
const name = `claude-rules-${f}`;
|
|
2552
|
+
const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-");
|
|
2553
|
+
const existing = allConfigs.find((c) => c.target_path === targetPath || c.slug === slug);
|
|
2554
|
+
if (!existing) {
|
|
2555
|
+
if (!opts.dryRun)
|
|
2556
|
+
createConfig({ name, category: "rules", agent: "claude", format: "markdown", content, target_path: targetPath }, d);
|
|
2557
|
+
result.added++;
|
|
2558
|
+
} else if (existing.content !== content) {
|
|
2559
|
+
if (!opts.dryRun)
|
|
2560
|
+
updateConfig(existing.id, { content }, d);
|
|
2561
|
+
result.updated++;
|
|
2562
|
+
} else {
|
|
2563
|
+
result.unchanged++;
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
2566
|
+
continue;
|
|
2567
|
+
}
|
|
2568
|
+
const abs = expandPath(known.path);
|
|
2569
|
+
if (!existsSync3(abs)) {
|
|
2570
|
+
result.skipped.push(known.path);
|
|
2587
2571
|
continue;
|
|
2588
2572
|
}
|
|
2589
2573
|
try {
|
|
2590
|
-
const content = readFileSync2(
|
|
2591
|
-
|
|
2592
|
-
|
|
2574
|
+
const content = readFileSync2(abs, "utf-8");
|
|
2575
|
+
if (content.length > 500000) {
|
|
2576
|
+
result.skipped.push(known.path + " (too large)");
|
|
2577
|
+
continue;
|
|
2578
|
+
}
|
|
2579
|
+
const targetPath = abs.replace(home, "~");
|
|
2580
|
+
const existing = allConfigs.find((c) => c.target_path === targetPath || c.slug === known.name);
|
|
2593
2581
|
if (!existing) {
|
|
2594
2582
|
if (!opts.dryRun) {
|
|
2595
|
-
const name = relative(absDir, file);
|
|
2596
2583
|
createConfig({
|
|
2597
|
-
name,
|
|
2598
|
-
category:
|
|
2599
|
-
agent:
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2584
|
+
name: known.name,
|
|
2585
|
+
category: known.category,
|
|
2586
|
+
agent: known.agent,
|
|
2587
|
+
format: known.format ?? detectFormat(abs),
|
|
2588
|
+
content,
|
|
2589
|
+
target_path: known.kind === "reference" ? null : targetPath,
|
|
2590
|
+
kind: known.kind ?? "file",
|
|
2591
|
+
description: known.description
|
|
2603
2592
|
}, d);
|
|
2604
2593
|
}
|
|
2605
2594
|
result.added++;
|
|
2606
2595
|
} else if (existing.content !== content) {
|
|
2607
|
-
if (!opts.dryRun)
|
|
2596
|
+
if (!opts.dryRun)
|
|
2608
2597
|
updateConfig(existing.id, { content }, d);
|
|
2609
|
-
}
|
|
2610
2598
|
result.updated++;
|
|
2611
2599
|
} else {
|
|
2612
2600
|
result.unchanged++;
|
|
2613
2601
|
}
|
|
2614
2602
|
} catch {
|
|
2615
|
-
result.skipped.push(
|
|
2603
|
+
result.skipped.push(known.path);
|
|
2616
2604
|
}
|
|
2617
2605
|
}
|
|
2618
2606
|
return result;
|
|
2619
2607
|
}
|
|
2620
|
-
async function
|
|
2608
|
+
async function syncToDisk(opts = {}) {
|
|
2621
2609
|
const d = opts.db || getDatabase();
|
|
2622
|
-
const absDir = expandPath(dir);
|
|
2623
|
-
const normalizedDir = dir.startsWith("~/") ? dir : absDir.replace(homedir2(), "~");
|
|
2624
|
-
const configs = listConfigs(undefined, d).filter((c) => c.target_path && (c.target_path.startsWith(normalizedDir) || c.target_path.startsWith(absDir)));
|
|
2625
2610
|
const result = { added: 0, updated: 0, unchanged: 0, skipped: [] };
|
|
2611
|
+
let configs = listConfigs({ kind: "file", ...opts.agent ? { agent: opts.agent } : {}, ...opts.category ? { category: opts.category } : {} }, d);
|
|
2626
2612
|
for (const config of configs) {
|
|
2627
|
-
if (config.
|
|
2613
|
+
if (!config.target_path)
|
|
2628
2614
|
continue;
|
|
2629
2615
|
try {
|
|
2630
2616
|
const r = await applyConfig(config, { dryRun: opts.dryRun, db: d });
|
|
2631
|
-
|
|
2632
|
-
existsSync3(expandPath(config.target_path)) ? result.updated++ : result.added++;
|
|
2633
|
-
} else {
|
|
2634
|
-
result.unchanged++;
|
|
2635
|
-
}
|
|
2617
|
+
r.changed ? result.updated++ : result.unchanged++;
|
|
2636
2618
|
} catch {
|
|
2637
|
-
result.skipped.push(config.target_path
|
|
2619
|
+
result.skipped.push(config.target_path);
|
|
2638
2620
|
}
|
|
2639
2621
|
}
|
|
2640
2622
|
return result;
|
|
@@ -2656,29 +2638,77 @@ function diffConfig(config) {
|
|
|
2656
2638
|
const maxLen = Math.max(stored.length, disk.length);
|
|
2657
2639
|
for (let i = 0;i < maxLen; i++) {
|
|
2658
2640
|
const s = stored[i];
|
|
2659
|
-
const
|
|
2660
|
-
if (s ===
|
|
2641
|
+
const dk = disk[i];
|
|
2642
|
+
if (s === dk) {
|
|
2661
2643
|
if (s !== undefined)
|
|
2662
2644
|
lines.push(` ${s}`);
|
|
2663
2645
|
} else {
|
|
2664
2646
|
if (s !== undefined)
|
|
2665
2647
|
lines.push(`-${s}`);
|
|
2666
|
-
if (
|
|
2667
|
-
lines.push(`+${
|
|
2648
|
+
if (dk !== undefined)
|
|
2649
|
+
lines.push(`+${dk}`);
|
|
2668
2650
|
}
|
|
2669
2651
|
}
|
|
2670
2652
|
return lines.join(`
|
|
2671
2653
|
`);
|
|
2672
2654
|
}
|
|
2655
|
+
function detectCategory(filePath) {
|
|
2656
|
+
const p = filePath.toLowerCase().replace(homedir2(), "~");
|
|
2657
|
+
if (p.includes("/.claude/rules/") || p.endsWith("claude.md") || p.endsWith("agents.md") || p.endsWith("gemini.md"))
|
|
2658
|
+
return "rules";
|
|
2659
|
+
if (p.includes("/.claude/") || p.includes("/.codex/") || p.includes("/.gemini/") || p.includes("/.cursor/"))
|
|
2660
|
+
return "agent";
|
|
2661
|
+
if (p.includes(".mcp.json") || p.includes("mcp"))
|
|
2662
|
+
return "mcp";
|
|
2663
|
+
if (p.includes(".zshrc") || p.includes(".zprofile") || p.includes(".bashrc") || p.includes(".bash_profile"))
|
|
2664
|
+
return "shell";
|
|
2665
|
+
if (p.includes(".gitconfig") || p.includes(".gitignore"))
|
|
2666
|
+
return "git";
|
|
2667
|
+
if (p.includes(".npmrc") || p.includes("tsconfig") || p.includes("bunfig"))
|
|
2668
|
+
return "tools";
|
|
2669
|
+
if (p.includes(".secrets"))
|
|
2670
|
+
return "secrets_schema";
|
|
2671
|
+
return "tools";
|
|
2672
|
+
}
|
|
2673
|
+
function detectAgent(filePath) {
|
|
2674
|
+
const p = filePath.toLowerCase().replace(homedir2(), "~");
|
|
2675
|
+
if (p.includes("/.claude/") || p.endsWith("claude.md"))
|
|
2676
|
+
return "claude";
|
|
2677
|
+
if (p.includes("/.codex/") || p.endsWith("agents.md"))
|
|
2678
|
+
return "codex";
|
|
2679
|
+
if (p.includes("/.gemini/") || p.endsWith("gemini.md"))
|
|
2680
|
+
return "gemini";
|
|
2681
|
+
if (p.includes(".zshrc") || p.includes(".zprofile") || p.includes(".bashrc"))
|
|
2682
|
+
return "zsh";
|
|
2683
|
+
if (p.includes(".gitconfig") || p.includes(".gitignore"))
|
|
2684
|
+
return "git";
|
|
2685
|
+
if (p.includes(".npmrc"))
|
|
2686
|
+
return "npm";
|
|
2687
|
+
return "global";
|
|
2688
|
+
}
|
|
2689
|
+
function detectFormat(filePath) {
|
|
2690
|
+
const ext = extname(filePath).toLowerCase();
|
|
2691
|
+
if (ext === ".json")
|
|
2692
|
+
return "json";
|
|
2693
|
+
if (ext === ".toml")
|
|
2694
|
+
return "toml";
|
|
2695
|
+
if (ext === ".yaml" || ext === ".yml")
|
|
2696
|
+
return "yaml";
|
|
2697
|
+
if (ext === ".md" || ext === ".markdown")
|
|
2698
|
+
return "markdown";
|
|
2699
|
+
if (ext === ".ini" || ext === ".cfg")
|
|
2700
|
+
return "ini";
|
|
2701
|
+
return "text";
|
|
2702
|
+
}
|
|
2673
2703
|
|
|
2674
2704
|
// src/lib/export.ts
|
|
2675
2705
|
import { existsSync as existsSync4, mkdirSync as mkdirSync3, rmSync, writeFileSync as writeFileSync2 } from "fs";
|
|
2676
|
-
import { join as join3, resolve as
|
|
2706
|
+
import { join as join3, resolve as resolve3 } from "path";
|
|
2677
2707
|
import { tmpdir } from "os";
|
|
2678
2708
|
async function exportConfigs(outputPath, opts = {}) {
|
|
2679
2709
|
const d = opts.db || getDatabase();
|
|
2680
2710
|
const configs = listConfigs(opts.filter, d);
|
|
2681
|
-
const absOutput =
|
|
2711
|
+
const absOutput = resolve3(outputPath);
|
|
2682
2712
|
const tmpDir = join3(tmpdir(), `configs-export-${Date.now()}`);
|
|
2683
2713
|
const contentsDir = join3(tmpDir, "contents");
|
|
2684
2714
|
try {
|
|
@@ -2712,12 +2742,12 @@ async function exportConfigs(outputPath, opts = {}) {
|
|
|
2712
2742
|
|
|
2713
2743
|
// src/lib/import.ts
|
|
2714
2744
|
import { existsSync as existsSync5, mkdirSync as mkdirSync4, readFileSync as readFileSync3, rmSync as rmSync2 } from "fs";
|
|
2715
|
-
import { join as join4, resolve as
|
|
2745
|
+
import { join as join4, resolve as resolve4 } from "path";
|
|
2716
2746
|
import { tmpdir as tmpdir2 } from "os";
|
|
2717
2747
|
async function importConfigs(bundlePath, opts = {}) {
|
|
2718
2748
|
const d = opts.db || getDatabase();
|
|
2719
2749
|
const conflict = opts.conflict ?? "skip";
|
|
2720
|
-
const absPath =
|
|
2750
|
+
const absPath = resolve4(bundlePath);
|
|
2721
2751
|
const tmpDir = join4(tmpdir2(), `configs-import-${Date.now()}`);
|
|
2722
2752
|
const result = { created: 0, updated: 0, skipped: 0, errors: [] };
|
|
2723
2753
|
try {
|
|
@@ -2855,7 +2885,7 @@ program.command("show <id>").description("Show a config's content and metadata")
|
|
|
2855
2885
|
}
|
|
2856
2886
|
});
|
|
2857
2887
|
program.command("add <path>").description("Ingest a file into the config DB").option("-n, --name <name>", "config name (defaults to filename)").option("-c, --category <cat>", "category override").option("-a, --agent <agent>", "agent override").option("-k, --kind <kind>", "kind: file|reference", "file").option("--template", "mark as template (has {{VAR}} placeholders)").action(async (filePath, opts) => {
|
|
2858
|
-
const abs =
|
|
2888
|
+
const abs = resolve5(filePath);
|
|
2859
2889
|
if (!existsSync6(abs)) {
|
|
2860
2890
|
console.error(chalk.red(`File not found: ${abs}`));
|
|
2861
2891
|
process.exit(1);
|
|
@@ -2897,14 +2927,30 @@ program.command("diff <id>").description("Show diff between stored config and di
|
|
|
2897
2927
|
process.exit(1);
|
|
2898
2928
|
}
|
|
2899
2929
|
});
|
|
2900
|
-
program.command("sync").description("
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2930
|
+
program.command("sync").description("Sync known AI coding configs from disk into DB (claude, codex, gemini, zsh, git, npm)").option("-a, --agent <agent>", "only sync configs for this agent (claude|codex|gemini|zsh|git|npm)").option("-c, --category <cat>", "only sync configs in this category").option("--to-disk", "apply DB configs back to disk instead").option("--dry-run", "preview without writing").option("--list", "show which files would be synced without doing anything").action(async (opts) => {
|
|
2931
|
+
if (opts.list) {
|
|
2932
|
+
const targets = KNOWN_CONFIGS.filter((k) => {
|
|
2933
|
+
if (opts.agent && k.agent !== opts.agent)
|
|
2934
|
+
return false;
|
|
2935
|
+
if (opts.category && k.category !== opts.category)
|
|
2936
|
+
return false;
|
|
2937
|
+
return true;
|
|
2938
|
+
});
|
|
2939
|
+
console.log(chalk.bold(`Known configs (${targets.length}):`));
|
|
2940
|
+
for (const k of targets) {
|
|
2941
|
+
console.log(` ${chalk.cyan(k.rulesDir ? k.rulesDir + "/*.md" : k.path)} ${chalk.dim(`[${k.category}/${k.agent}]`)}`);
|
|
2942
|
+
}
|
|
2943
|
+
return;
|
|
2944
|
+
}
|
|
2945
|
+
if (opts.toDisk) {
|
|
2946
|
+
const result = await syncToDisk({ dryRun: opts.dryRun, agent: opts.agent, category: opts.category });
|
|
2947
|
+
console.log(chalk.green("\u2713") + ` Written to disk: updated:${result.updated} unchanged:${result.unchanged} skipped:${result.skipped.length}`);
|
|
2905
2948
|
} else {
|
|
2906
|
-
const result = await
|
|
2907
|
-
console.log(chalk.green(
|
|
2949
|
+
const result = await syncKnown({ dryRun: opts.dryRun, agent: opts.agent, category: opts.category });
|
|
2950
|
+
console.log(chalk.green("\u2713") + ` Synced: +${result.added} updated:${result.updated} unchanged:${result.unchanged} skipped:${result.skipped.length}`);
|
|
2951
|
+
if (result.skipped.length > 0) {
|
|
2952
|
+
console.log(chalk.dim(" skipped (not found): " + result.skipped.join(", ")));
|
|
2953
|
+
}
|
|
2908
2954
|
}
|
|
2909
2955
|
});
|
|
2910
2956
|
program.command("export").description("Export configs as a tar.gz bundle").option("-o, --output <path>", "output file", "./configs-export.tar.gz").option("-c, --category <cat>", "filter by category").action(async (opts) => {
|
package/dist/index.d.ts
CHANGED
|
@@ -6,8 +6,10 @@ export { registerMachine, updateMachineApplied, listMachines, currentHostname, c
|
|
|
6
6
|
export { getDatabase, resetDatabase, uuid, now, slugify } from "./db/database.js";
|
|
7
7
|
export { applyConfig, applyConfigs, expandPath } from "./lib/apply.js";
|
|
8
8
|
export type { ApplyOptions } from "./lib/apply.js";
|
|
9
|
-
export {
|
|
10
|
-
export
|
|
9
|
+
export { syncKnown, syncToDisk, diffConfig, detectCategory, detectAgent, detectFormat, KNOWN_CONFIGS } from "./lib/sync.js";
|
|
10
|
+
export { syncFromDir, syncToDir } from "./lib/sync-dir.js";
|
|
11
|
+
export type { SyncKnownOptions, SyncToDiskOptions } from "./lib/sync.js";
|
|
12
|
+
export type { SyncFromDirOptions } from "./lib/sync-dir.js";
|
|
11
13
|
export { exportConfigs } from "./lib/export.js";
|
|
12
14
|
export { importConfigs } from "./lib/import.js";
|
|
13
15
|
export type { ExportOptions } from "./lib/export.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGlI,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGrH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGzK,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGnH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGlI,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGrH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGzK,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGnH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACzE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGnE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvG,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|