feat(KB-503): add multi-project CLI support with project subcommands

- Add project subcommands: list, add, remove, show, set-default, detect
- Add --project flag support for all task commands
- Create project-context.ts utilities for project resolution
- Add defaultProjectId to GlobalSettings type
- Implement project auto-detection from cwd
- Update CLI argument parsing for global --project flag
- Add multi-project CLI documentation to AGENTS.md
This commit is contained in:
gsxdsm
2026-04-01 07:02:15 -07:00
parent 1ee99b8729
commit d2d32acce8
81 changed files with 4130 additions and 2320 deletions

View File

@@ -4,17 +4,22 @@ import {
runBackupCommand,
TaskStore,
} from "@fusion/core";
import { resolveProject } from "../project-context.js";
/**
* Find the project root and create a backup manager.
*/
async function getBackupManager(): Promise<{
async function getBackupManager(projectName?: string): Promise<{
manager: BackupManager;
store: TaskStore;
kbDir: string;
}> {
const store = new TaskStore(process.cwd());
await store.init();
const store = projectName
? (await resolveProject(projectName)).store
: new TaskStore(process.cwd());
if (!projectName) {
await store.init();
}
// Access the private kbDir property via type assertion
const kbDir = (store as unknown as { kbDir: string }).kbDir;
const settings = await store.getSettings();
@@ -26,8 +31,8 @@ async function getBackupManager(): Promise<{
* Create a database backup immediately.
* Usage: kb backup --create
*/
export async function runBackupCreate(): Promise<void> {
const { manager, kbDir, store } = await getBackupManager();
export async function runBackupCreate(projectName?: string): Promise<void> {
const { manager, kbDir, store } = await getBackupManager(projectName);
const settings = await store.getSettings();
console.log("Creating database backup...");
@@ -47,8 +52,8 @@ export async function runBackupCreate(): Promise<void> {
* List all database backups.
* Usage: kb backup --list
*/
export async function runBackupList(): Promise<void> {
const { manager } = await getBackupManager();
export async function runBackupList(projectName?: string): Promise<void> {
const { manager } = await getBackupManager(projectName);
const backups = await manager.listBackups();
@@ -80,8 +85,8 @@ export async function runBackupList(): Promise<void> {
* Restore database from a backup file.
* Usage: kb backup --restore <filename>
*/
export async function runBackupRestore(filename: string): Promise<void> {
const { manager } = await getBackupManager();
export async function runBackupRestore(filename: string, projectName?: string): Promise<void> {
const { manager } = await getBackupManager(projectName);
console.log(`Restoring backup: ${filename}`);
console.log("A pre-restore backup will be created first.\n");
@@ -100,8 +105,8 @@ export async function runBackupRestore(filename: string): Promise<void> {
* Remove old backups exceeding retention limit.
* Usage: kb backup --cleanup
*/
export async function runBackupCleanup(): Promise<void> {
const { manager } = await getBackupManager();
export async function runBackupCleanup(projectName?: string): Promise<void> {
const { manager } = await getBackupManager(projectName);
console.log("Cleaning up old backups...");