obsidian-plugin-config
Version:
Global CLI injection tool for Obsidian plugins
158 lines (136 loc) ⢠5.65 kB
text/typescript
import { readFile } from 'fs/promises';
import path from 'path';
import {
analyzePlugin,
ensurePluginConfigClean,
findPluginConfigRoot,
performInjection,
readInjectionInfo,
showInjectionPlan
} from './inject-core.js';
import { isValidPath } from './utils.js';
async function main(): Promise<void> {
try {
// Show version
const configRoot = await findPluginConfigRoot();
let version = 'unknown';
try {
const pkg = JSON.parse(
await readFile(path.join(configRoot, 'package.json'), 'utf8')
);
version = pkg.version || 'unknown';
} catch {
// Ignore
}
console.log(`šÆ Obsidian Plugin Config - Local Injection Tool v${version}`);
console.log(`š„ Inject autonomous configuration from local files\n`);
const args = process.argv.slice(2);
const autoConfirm = args.includes('--yes') || args.includes('-y');
const dryRun = args.includes('--dry-run') || args.includes('--check');
const targetPath = args.find((arg) => !arg.startsWith('-'));
if (!targetPath) {
console.error(`ā Usage: yarn inject-path <plugin-directory> [options]`);
console.error(` Example: yarn inject-path ../my-obsidian-plugin`);
console.error(` Options:`);
console.error(` --yes, -y Auto-confirm injection`);
console.error(` --dry-run Check only (no injection)`);
console.error(` Shortcuts:`);
console.error(` yarn check-plugin ../plugin # Verification only`);
process.exit(1);
}
const resolvedPath = path.resolve(targetPath);
if (!(await isValidPath(resolvedPath))) {
console.error(`ā Directory not found: ${resolvedPath}`);
process.exit(1);
}
// Prevent injecting into obsidian-plugin-config itself
const selfPkg = path.join(resolvedPath, 'package.json');
try {
const pkg = JSON.parse(await readFile(selfPkg, 'utf8'));
if (pkg.name === 'obsidian-plugin-config') {
console.error(`ā Cannot inject into obsidian-plugin-config itself.`);
process.exit(1);
}
} catch {
// No package.json or unreadable - not the self case
}
console.log(`š Target directory: ${resolvedPath}`);
console.log(`\nš Analyzing plugin...`);
const plan = await analyzePlugin(resolvedPath);
if (dryRun) {
console.log(`\nšÆ Injection Plan for: ${plan.targetPath}`);
console.log(`š Target: ${path.basename(plan.targetPath)}`);
console.log(`š¦ Package.json: ${plan.hasPackageJson ? 'ā
' : 'ā'}`);
console.log(`š Manifest.json: ${plan.hasManifest ? 'ā
' : 'ā'}`);
console.log(
`š Scripts folder: ${plan.hasScriptsFolder ? 'ā
(will be updated)' : 'ā (will be created)'}`
);
console.log(`š Obsidian plugin: ${plan.isObsidianPlugin ? 'ā
' : 'ā'}`);
if (!plan.isObsidianPlugin) {
console.log(`\nā ļø Warning: This doesn't appear to be a valid Obsidian plugin`);
console.log(` Missing manifest.json or invalid structure`);
}
console.log(`\nš Would inject:`);
console.log(` ā
Local scripts (utils.ts, esbuild.config.ts, acp.ts, etc.)`);
console.log(` ā
Updated package.json scripts`);
console.log(` ā
Required dependencies`);
const injectionInfo = await readInjectionInfo(resolvedPath);
if (injectionInfo) {
console.log(`\nā
Status: Plugin is already injected`);
console.log(` š¦ Injector: ${injectionInfo.injectorName || 'unknown'}`);
console.log(` š·ļø Version: ${injectionInfo.injectorVersion || 'unknown'}`);
console.log(
` š
Date: ${
injectionInfo.injectionDate
? new Date(injectionInfo.injectionDate).toLocaleDateString()
: 'unknown'
}`
);
try {
const configPackageJson = JSON.parse(
await readFile(path.join(configRoot, 'package.json'), 'utf8')
);
const currentVersion = configPackageJson.version;
if (
currentVersion &&
injectionInfo.injectorVersion &&
currentVersion !== injectionInfo.injectorVersion
) {
console.log(
` š Update available: ${injectionInfo.injectorVersion} ā ${currentVersion}`
);
}
} catch {
// Ignore version comparison errors
}
} else {
const hasInjectedScripts = await isValidPath(
path.join(resolvedPath, 'scripts', 'utils.ts')
);
if (hasInjectedScripts) {
console.log(`\nā ļø Status: Plugin appears to be injected (legacy)`);
console.log(` Found: scripts/utils.ts but no .injection-info.json`);
console.log(` š” Re-inject to add version tracking`);
} else {
console.log(`\nā Status: Plugin not yet injected`);
}
}
console.log(`\nš Dry-run completed - no changes made`);
console.log(` To inject: yarn inject ${targetPath} --yes`);
return;
}
console.log(`\nš Checking plugin-config repository status...`);
await ensurePluginConfigClean();
const confirmed = await showInjectionPlan(plan, autoConfirm);
if (!confirmed) {
console.log(`ā Injection cancelled by user`);
process.exit(0);
}
await performInjection(resolvedPath, autoConfirm);
} catch (error) {
console.error(`š„ Error: ${error instanceof Error ? error.message : String(error)}`);
process.exit(1);
}
}
main().catch(console.error);