Flatten the repo: move everything out of app/ to the root
Now that the CLI and the Next.js app are one package, nesting it inside app/ served no purpose - the repo root itself becomes the published npm package. Merges app/.gitignore and app/README.md into the root versions, drops the now-duplicate app/LICENSE, and updates path references (README, docs/ARCHITECTURE.md, docs/CONFIG_REFERENCE.md, package.json's repository.directory) that assumed the app/ nesting. Also fixes a real bug this surfaced: the in-app docs viewer resolved docs/ relative to process.cwd(), which only worked by accident when the CLI happened to be invoked from app/'s parent directory. A first attempt at fixing it with import.meta.dirname broke instead, for the same cross-module-graph reason config-path resolution already documented - Next compiles Route Handlers through a separate module graph that doesn't preserve source-relative import.meta paths. Fixed by exposing the app root via TRIGGERSHELL_APP_ROOT (set once in server.ts, where import.meta *does* resolve correctly), the same pattern already used for TRIGGERSHELL_CONFIG_PATH. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import fs from "node:fs";
|
||||
import { ConfigError, loadConfig } from "../../lib/config/load";
|
||||
import { isPortFree } from "../lib/network";
|
||||
import { resolveConfigPath } from "../lib/paths";
|
||||
|
||||
export interface DoctorOptions {
|
||||
config?: string;
|
||||
}
|
||||
|
||||
export async function doctorCommand(opts: DoctorOptions): Promise<void> {
|
||||
const rows: [string, string][] = [];
|
||||
|
||||
rows.push(["Node.js", process.version]);
|
||||
|
||||
const configPath = resolveConfigPath(opts.config);
|
||||
const exists = fs.existsSync(configPath);
|
||||
rows.push(["Config path", `${configPath} ${exists ? "(exists)" : "(not found)"}`]);
|
||||
|
||||
if (exists) {
|
||||
try {
|
||||
const { config } = loadConfig(configPath);
|
||||
const portFree = await isPortFree(config.server.host, config.server.port);
|
||||
rows.push([
|
||||
"Port available",
|
||||
portFree ? "yes" : `no (${config.server.host}:${config.server.port} in use)`,
|
||||
]);
|
||||
rows.push(["Scripts configured", String(config.scripts.length)]);
|
||||
rows.push(["Auth enabled", String(config.auth.enabled)]);
|
||||
} catch (error) {
|
||||
if (error instanceof ConfigError) {
|
||||
rows.push(["Config", error.message]);
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const labelWidth = Math.max(...rows.map(([label]) => label.length));
|
||||
for (const [label, value] of rows) {
|
||||
console.log(`${label.padEnd(labelWidth)} ${value}`);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user