arcbridge 0.1.1 → 0.1.3
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/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/sync.ts","../src/project.ts","../src/commands/status.ts","../src/commands/drift.ts","../src/commands/init.ts","../src/commands/generate-configs.ts","../src/commands/update-task.ts","../src/commands/refresh.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport { sync } from \"./commands/sync.js\";\nimport { status } from \"./commands/status.js\";\nimport { drift } from \"./commands/drift.js\";\nimport { init } from \"./commands/init.js\";\nimport { generateConfigs } from \"./commands/generate-configs.js\";\nimport { updateTask } from \"./commands/update-task.js\";\nimport { refresh } from \"./commands/refresh.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n) as { version: string };\n\nconst USAGE = `Usage: arcbridge <command> [options]\n\nCommands:\n init Initialize ArcBridge in a project directory\n sync Run the sync loop: reindex, detect drift, infer tasks, propose updates\n status Show project status (phase, tasks, drift)\n drift Check for architecture drift\n refresh Rebuild the database from YAML/markdown sources\n update-task Update a task's status (e.g. arcbridge update-task task-1.1 done)\n generate-configs Regenerate platform agent configs from .arcbridge/agents/\n\nOptions:\n --dir <path> Project directory (default: current directory)\n --json Output as JSON (for CI integration)\n --help Show this help message\n --version Show version\n\nInit options:\n --name <name> Project name (default: auto-detect from package.json)\n --template <type> Project template: nextjs-app-router, react-vite, api-service\n --platform <name> Target platform (can be repeated, default: claude)\n --spec <file> Path to a requirements/spec file to include\n`;\n\ninterface ParsedArgs {\n command: string | null;\n positional: string[];\n dir: string;\n json: boolean;\n name?: string;\n template?: string;\n platforms?: string[];\n spec?: string;\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n let command: string | null = null;\n const positional: string[] = [];\n let dir = process.cwd();\n let json = false;\n let name: string | undefined;\n let template: string | undefined;\n const platforms: string[] = [];\n let spec: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === \"--dir\" && i + 1 < args.length) {\n dir = resolve(args[++i]!);\n } else if (arg === \"--json\") {\n json = true;\n } else if (arg === \"--name\" && i + 1 < args.length) {\n name = args[++i]!;\n } else if (arg === \"--template\" && i + 1 < args.length) {\n template = args[++i]!;\n } else if (arg === \"--platform\" && i + 1 < args.length) {\n platforms.push(args[++i]!);\n } else if (arg === \"--spec\" && i + 1 < args.length) {\n spec = args[++i]!;\n } else if (arg === \"--help\" || arg === \"-h\") {\n console.log(USAGE);\n process.exit(0);\n } else if (arg === \"--version\" || arg === \"-v\") {\n console.log(`arcbridge ${pkg.version}`);\n process.exit(0);\n } else if (!arg.startsWith(\"-\") && !command) {\n command = arg;\n } else if (!arg.startsWith(\"-\") && command) {\n positional.push(arg);\n }\n }\n\n return {\n command,\n positional,\n dir,\n json,\n name,\n template,\n platforms: platforms.length > 0 ? platforms : undefined,\n spec,\n };\n}\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2));\n const { command, positional, dir, json } = parsed;\n\n if (!command) {\n console.log(USAGE);\n process.exit(1);\n }\n\n try {\n switch (command) {\n case \"init\":\n await init(dir, {\n name: parsed.name,\n template: parsed.template,\n platforms: parsed.platforms,\n spec: parsed.spec,\n }, json);\n break;\n case \"sync\":\n await sync(dir, json);\n break;\n case \"status\":\n await status(dir, json);\n break;\n case \"drift\":\n await drift(dir, json);\n break;\n case \"refresh\":\n await refresh(dir, json);\n break;\n case \"update-task\": {\n const [taskId, taskStatus] = positional;\n if (!taskId || !taskStatus) {\n console.error(\"Usage: arcbridge update-task <task-id> <status>\");\n console.error(\"Status values: todo, in-progress, done, blocked\");\n process.exit(1);\n }\n await updateTask(dir, taskId, taskStatus, json);\n break;\n }\n case \"generate-configs\":\n await generateConfigs(dir, json);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(USAGE);\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (json) {\n console.log(JSON.stringify({ error: message }));\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n }\n}\n\nmain();\n","import {\n indexProject,\n detectDrift,\n writeDriftLog,\n inferTaskStatuses,\n applyInferences,\n getChangedFiles,\n resolveRef,\n getHeadSha,\n setSyncCommit,\n verifyScenarios,\n loadConfig,\n refreshFromDocs,\n type DriftEntry,\n type IndexResult,\n type TaskInferenceResult,\n type ChangedFile,\n type ScenarioTestResult,\n type DriftOptions,\n} from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\ninterface SyncResult {\n reindex: { files: number; symbols: number; dependencies: number };\n drift: DriftEntry[];\n inferences: TaskInferenceResult[];\n scenarios: ScenarioTestResult[];\n changedFiles: ChangedFile[];\n syncCommit: string | null;\n warnings: string[];\n}\n\nexport async function sync(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n // Step 0: Refresh DB from arc42 docs (picks up manual edits to building blocks, scenarios, etc.)\n if (!json) console.log(\"Refreshing from docs...\");\n const docWarnings = refreshFromDocs(db, dir);\n if (!json && docWarnings.length > 0) {\n for (const w of docWarnings) console.log(` ${w}`);\n }\n\n // Step 1: Reindex\n if (!json) console.log(\"Reindexing...\");\n const indexResult: IndexResult = await indexProject(db, { projectRoot: dir });\n if (!json)\n console.log(\n ` Indexed ${indexResult.filesProcessed} files, ${indexResult.symbolsIndexed} symbols, ${indexResult.dependenciesIndexed} deps`,\n );\n\n // Step 2: Detect drift\n if (!json) console.log(\"Checking drift...\");\n const configForDrift = loadConfig(dir);\n const driftOpts: DriftOptions = {\n projectType: configForDrift.config?.project_type,\n ignorePaths: configForDrift.config?.drift?.ignore_paths,\n };\n const driftEntries = detectDrift(db, driftOpts);\n writeDriftLog(db, driftEntries);\n if (!json) {\n if (driftEntries.length === 0) {\n console.log(\" No drift detected.\");\n } else {\n console.log(` Found ${driftEntries.length} drift issue(s)`);\n for (const e of driftEntries) {\n const icon =\n e.severity === \"error\" ? \"[ERROR]\" : e.severity === \"warning\" ? \"[WARN] \" : \"[INFO] \";\n console.log(` ${icon} ${e.kind}: ${e.description}`);\n }\n }\n }\n\n // Step 3: Infer task statuses\n if (!json) console.log(\"Inferring task statuses...\");\n const currentPhase = db\n .prepare(\"SELECT id FROM phases WHERE status = 'in-progress' LIMIT 1\")\n .get() as { id: string } | undefined;\n\n let inferences: TaskInferenceResult[] = [];\n if (currentPhase) {\n inferences = inferTaskStatuses(db, currentPhase.id);\n if (inferences.length > 0) {\n applyInferences(db, inferences, dir);\n if (!json) {\n console.log(` Updated ${inferences.length} task(s):`);\n for (const inf of inferences) {\n console.log(\n ` ${inf.taskId}: ${inf.previousStatus} -> ${inf.inferredStatus} (${inf.reason})`,\n );\n }\n }\n } else {\n if (!json) console.log(\" No task status changes inferred.\");\n }\n } else {\n if (!json) console.log(\" No active phase — skipping task inference.\");\n }\n\n // Step 4: Verify quality scenarios with linked tests\n let scenarios: ScenarioTestResult[] = [];\n const configResult = loadConfig(dir);\n if (configResult.config) {\n const testCommand = configResult.config.testing.test_command;\n const timeoutMs = configResult.config.testing.timeout_ms;\n\n if (!json) console.log(\"Verifying quality scenarios...\");\n const verifyResult = verifyScenarios(db, dir, { testCommand, timeoutMs });\n scenarios = verifyResult.results;\n\n if (!json) {\n if (scenarios.length === 0) {\n console.log(\" No testable scenarios found.\");\n } else {\n const passing = scenarios.filter((r) => r.passed).length;\n console.log(\n ` ${scenarios.length} scenario(s) verified: ${passing} passing, ${scenarios.length - passing} failing`,\n );\n }\n }\n } else {\n if (!json) console.log(\" No config found — skipping scenario verification.\");\n }\n\n // Step 5: Get changed files since last sync\n const warnings: string[] = [];\n let changedFiles: ChangedFile[] = [];\n try {\n const ref = resolveRef(dir, \"last-sync\", db);\n changedFiles = getChangedFiles(dir, ref.sha);\n if (!json && changedFiles.length > 0) {\n console.log(`Changed files since ${ref.label}: ${changedFiles.length}`);\n }\n } catch {\n const msg = \"Could not determine changed files (git not available or no sync point).\";\n warnings.push(msg);\n if (!json) console.log(` ${msg}`);\n }\n\n // Step 6: Update sync point\n let syncCommit: string | null = null;\n try {\n const head = getHeadSha(dir);\n if (head) {\n syncCommit = head;\n setSyncCommit(db, \"last_sync_commit\", head);\n if (!json) console.log(`Sync point updated to ${head.slice(0, 7)}.`);\n }\n } catch {\n const msg = \"Could not update sync point (git not available).\";\n warnings.push(msg);\n if (!json) console.log(` ${msg}`);\n }\n\n // Summary\n const result: SyncResult = {\n reindex: {\n files: indexResult.filesProcessed,\n symbols: indexResult.symbolsIndexed,\n dependencies: indexResult.dependenciesIndexed,\n },\n drift: driftEntries,\n inferences,\n scenarios,\n changedFiles,\n syncCommit,\n warnings,\n };\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(\"\\nSync complete.\");\n const errors = driftEntries.filter((e) => e.severity === \"error\").length;\n if (errors > 0) {\n console.log(`WARNING: ${errors} drift error(s) would block phase completion.`);\n process.exitCode = 1;\n }\n }\n } finally {\n db.close();\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { openDatabase, migrate } from \"@arcbridge/core\";\nimport type Database from \"better-sqlite3\";\n\nexport function openProjectDb(projectDir: string): Database.Database {\n const dbPath = join(projectDir, \".arcbridge\", \"index.db\");\n if (!existsSync(dbPath)) {\n throw new Error(\n `No ArcBridge project found at ${projectDir}. Run \\`arcbridge_init_project\\` via MCP first.`,\n );\n }\n const db = openDatabase(dbPath);\n migrate(db);\n return db;\n}\n\nexport function ensureInitialized(projectDir: string): void {\n const configPath = join(projectDir, \".arcbridge\", \"config.yaml\");\n if (!existsSync(configPath)) {\n throw new Error(\n `No ArcBridge project found at ${projectDir}. Run \\`arcbridge_init_project\\` via MCP first.`,\n );\n }\n}\n","import { openProjectDb } from \"../project.js\";\n\ninterface TaskDetail {\n id: string;\n title: string;\n status: string;\n}\n\ninterface QualitySummary {\n total: number;\n passing: number;\n failing: number;\n untested: number;\n}\n\ninterface StatusResult {\n project_name: string;\n current_phase: { id: string; name: string; status: string } | null;\n tasks: { total: number; done: number; in_progress: number; blocked: number };\n current_tasks: TaskDetail[];\n quality: QualitySummary;\n building_blocks: number;\n symbols: number;\n drift: { total: number; errors: number; warnings: number };\n}\n\nexport async function status(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n const projectName =\n (\n db\n .prepare(\n \"SELECT value FROM arcbridge_meta WHERE key = 'project_name'\",\n )\n .get() as { value: string } | undefined\n )?.value ?? \"Unknown\";\n\n const currentPhase = db\n .prepare(\n \"SELECT id, name, status FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as { id: string; name: string; status: string } | undefined;\n\n const allTasks = db\n .prepare(\"SELECT status FROM tasks\")\n .all() as { status: string }[];\n const tasks = {\n total: allTasks.length,\n done: allTasks.filter((t) => t.status === \"done\").length,\n in_progress: allTasks.filter((t) => t.status === \"in-progress\").length,\n blocked: allTasks.filter((t) => t.status === \"blocked\").length,\n };\n\n const blockCount = (\n db.prepare(\"SELECT COUNT(*) as c FROM building_blocks\").get() as {\n c: number;\n }\n ).c;\n const symbolCount = (\n db.prepare(\"SELECT COUNT(*) as c FROM symbols\").get() as { c: number }\n ).c;\n\n // Current phase tasks\n const currentTasks: TaskDetail[] = currentPhase\n ? (db\n .prepare(\n \"SELECT id, title, status FROM tasks WHERE phase_id = ? ORDER BY id\",\n )\n .all(currentPhase.id) as TaskDetail[])\n : [];\n\n // Quality scenarios summary\n const scenarioStatuses = db\n .prepare(\"SELECT status FROM quality_scenarios\")\n .all() as { status: string }[];\n const quality: QualitySummary = {\n total: scenarioStatuses.length,\n passing: scenarioStatuses.filter((s) => s.status === \"passing\").length,\n failing: scenarioStatuses.filter((s) => s.status === \"failing\").length,\n untested: scenarioStatuses.filter((s) => s.status === \"untested\").length,\n };\n\n const driftEntries = db\n .prepare(\n \"SELECT severity FROM drift_log WHERE resolved_at IS NULL\",\n )\n .all() as { severity: string }[];\n const driftInfo = {\n total: driftEntries.length,\n errors: driftEntries.filter((d) => d.severity === \"error\").length,\n warnings: driftEntries.filter((d) => d.severity === \"warning\").length,\n };\n\n const result: StatusResult = {\n project_name: projectName,\n current_phase: currentPhase ?? null,\n tasks,\n current_tasks: currentTasks,\n quality,\n building_blocks: blockCount,\n symbols: symbolCount,\n drift: driftInfo,\n };\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`Project: ${result.project_name}`);\n console.log(\n `Phase: ${result.current_phase ? `${result.current_phase.name} (${result.current_phase.status})` : \"none active\"}`,\n );\n console.log(\n `Tasks: ${result.tasks.done}/${result.tasks.total} done, ${result.tasks.in_progress} in-progress, ${result.tasks.blocked} blocked`,\n );\n\n if (result.current_tasks.length > 0) {\n console.log(\"\");\n console.log(`Current phase tasks:`);\n for (const task of result.current_tasks) {\n const icon =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[~]\"\n : task.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n console.log(` ${icon} ${task.title}`);\n }\n }\n\n if (result.quality.total > 0) {\n console.log(\"\");\n console.log(\n `Quality: ${result.quality.passing} passing, ${result.quality.failing} failing, ${result.quality.untested} untested (${result.quality.total} total)`,\n );\n }\n\n console.log(\"\");\n console.log(`Blocks: ${result.building_blocks}`);\n console.log(`Symbols: ${result.symbols}`);\n if (result.drift.total > 0) {\n console.log(\n `Drift: ${result.drift.total} issues (${result.drift.errors} errors, ${result.drift.warnings} warnings)`,\n );\n } else {\n console.log(`Drift: none`);\n }\n }\n } finally {\n db.close();\n }\n}\n","import { detectDrift, writeDriftLog, loadConfig, type DriftOptions } from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\nexport async function drift(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n const configResult = loadConfig(dir);\n const driftOpts: DriftOptions = {\n projectType: configResult.config?.project_type,\n ignorePaths: configResult.config?.drift?.ignore_paths,\n };\n const entries = detectDrift(db, driftOpts);\n writeDriftLog(db, entries);\n\n if (json) {\n console.log(JSON.stringify({ drift: entries }, null, 2));\n } else {\n if (entries.length === 0) {\n console.log(\"No drift detected.\");\n } else {\n console.log(`Found ${entries.length} drift issue(s):\\n`);\n for (const e of entries) {\n const icon =\n e.severity === \"error\"\n ? \"[ERROR]\"\n : e.severity === \"warning\"\n ? \"[WARN] \"\n : \"[INFO] \";\n console.log(` ${icon} ${e.kind}: ${e.description}`);\n if (e.affectedBlock) {\n console.log(` Block: ${e.affectedBlock}`);\n }\n if (e.affectedFile) {\n console.log(` File: ${e.affectedFile}`);\n }\n }\n\n const errors = entries.filter((e) => e.severity === \"error\").length;\n if (errors > 0) {\n console.log(`\\n${errors} error(s) found — these block phase completion.`);\n process.exitCode = 1;\n }\n }\n }\n } finally {\n db.close();\n }\n}\n","import { resolve, basename, join } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport {\n generateConfig,\n generateArc42,\n generatePlan,\n generateAgentRoles,\n generateDatabase,\n generateSyncFiles,\n indexProject,\n discoverDotnetServices,\n type InitProjectInput,\n} from \"@arcbridge/core\";\nimport { getAdapter } from \"@arcbridge/adapters\";\n\ninterface InitOptions {\n name?: string;\n template?: string;\n platforms?: string[];\n spec?: string;\n}\n\ntype ProjectTemplate = \"nextjs-app-router\" | \"react-vite\" | \"api-service\" | \"dotnet-webapi\";\n\ninterface DetectedInfo {\n name: string;\n template: ProjectTemplate;\n nameSource: string;\n templateSource: string;\n /** For .sln-based projects: services discovered from solution */\n dotnetServices?: Array<{ name: string; path: string; csprojPath: string; isTestProject: boolean }>;\n}\n\nconst VALID_TEMPLATES: ProjectTemplate[] = [\n \"nextjs-app-router\",\n \"react-vite\",\n \"api-service\",\n \"dotnet-webapi\",\n];\n\n/**\n * Find .csproj files in the project root (non-recursive, just top level).\n */\nfunction findCsproj(projectRoot: string): string | null {\n try {\n const entries = readdirSync(projectRoot);\n return entries.find((e) => e.endsWith(\".csproj\")) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Auto-detect project info from package.json, .csproj, or directory structure.\n */\nfunction detectProjectInfo(projectRoot: string): DetectedInfo {\n const fallbackName = basename(projectRoot);\n let name = fallbackName;\n let nameSource = \"directory name\";\n let template: ProjectTemplate = \"nextjs-app-router\";\n let templateSource = \"default\";\n\n // Check for .NET solution first (multi-project)\n const entries = readdirSync(projectRoot);\n const slnFile = entries.find((e) => e.endsWith(\".sln\"));\n if (slnFile) {\n name = slnFile.replace(\".sln\", \"\");\n nameSource = \".sln file\";\n template = \"dotnet-webapi\";\n templateSource = `detected (${slnFile} found)`;\n const dotnetServices = discoverDotnetServices(projectRoot);\n return { name, template, nameSource, templateSource, dotnetServices };\n }\n\n // Check for single .NET project\n const csproj = findCsproj(projectRoot);\n if (csproj) {\n name = csproj.replace(\".csproj\", \"\");\n nameSource = \".csproj file\";\n template = \"dotnet-webapi\";\n templateSource = `detected (${csproj} found)`;\n return { name, template, nameSource, templateSource };\n }\n\n const pkgPath = join(projectRoot, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n if (pkg.name) {\n name = pkg.name;\n nameSource = \"package.json\";\n }\n\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n if (allDeps[\"next\"]) {\n template = \"nextjs-app-router\";\n templateSource = \"detected (next in dependencies)\";\n } else if (allDeps[\"vite\"] && allDeps[\"react\"]) {\n template = \"react-vite\";\n templateSource = \"detected (vite + react in dependencies)\";\n } else if (\n allDeps[\"express\"] ||\n allDeps[\"fastify\"] ||\n allDeps[\"hono\"] ||\n allDeps[\"@hono/node-server\"]\n ) {\n template = \"api-service\";\n templateSource = \"detected (server framework in dependencies)\";\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return { name, template, nameSource, templateSource };\n}\n\nexport async function init(\n dir: string,\n options: InitOptions,\n json: boolean,\n): Promise<void> {\n const projectRoot = resolve(dir);\n\n // Check if already initialized\n if (existsSync(join(projectRoot, \".arcbridge\", \"config.yaml\"))) {\n const msg = \"ArcBridge is already initialized in this directory. Use `arcbridge status` to see current state.\";\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(msg);\n }\n process.exitCode = 1;\n return;\n }\n\n // Detect project info\n const detected = detectProjectInfo(projectRoot);\n\n // Apply overrides from flags\n const projectName = options.name ?? detected.name;\n const templateStr = options.template ?? detected.template;\n const platforms = options.platforms ?? [\"claude\"];\n\n if (!VALID_TEMPLATES.includes(templateStr as ProjectTemplate)) {\n const msg = `Unknown template \"${templateStr}\". Valid values: ${VALID_TEMPLATES.join(\", \")}`;\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const template = templateStr as ProjectTemplate;\n\n // Show what we detected\n if (!json) {\n console.log(`Initializing ArcBridge in ${projectRoot}\\n`);\n console.log(` Project: ${projectName} (${detected.nameSource})`);\n console.log(` Template: ${template} (${detected.templateSource})`);\n console.log(` Platform: ${platforms.join(\", \")}`);\n if (options.spec) {\n console.log(` Spec: ${options.spec}`);\n }\n if (detected.dotnetServices && detected.dotnetServices.length > 1) {\n const nonTest = detected.dotnetServices.filter((s) => !s.isTestProject);\n const test = detected.dotnetServices.filter((s) => s.isTestProject);\n console.log(` Services: ${nonTest.length} project(s) detected from solution`);\n for (const svc of nonTest) {\n console.log(` - ${svc.name} (${svc.path})`);\n }\n if (test.length > 0) {\n console.log(` Tests: ${test.length} test project(s) (excluded from indexing)`);\n }\n }\n console.log();\n }\n\n // For multi-project .NET solutions, pass non-test services to the template\n const nonTestServices = detected.dotnetServices?.filter((s) => !s.isTestProject);\n\n const input: InitProjectInput = {\n name: projectName,\n template,\n features: [],\n quality_priorities: [\"security\", \"performance\", \"accessibility\"],\n platforms,\n dotnetServices: nonTestServices?.map((s) => ({ name: s.name, path: s.path })),\n };\n\n // 1. Generate config\n if (!json) console.log(\"Creating .arcbridge/config.yaml...\");\n const config = generateConfig(projectRoot, input);\n\n // 2. Generate arc42 documentation\n if (!json) console.log(\"Creating arc42 documentation...\");\n generateArc42(projectRoot, input);\n\n // 3. Generate phase plan\n if (!json) console.log(\"Creating phase plan...\");\n generatePlan(projectRoot, input);\n\n // 4. Generate agent roles\n if (!json) console.log(\"Creating agent roles...\");\n const roles = generateAgentRoles(projectRoot, template);\n\n // 5. Initialize database from generated files\n if (!json) console.log(\"Initializing database...\");\n const { db, warnings } = generateDatabase(projectRoot, input);\n\n // 6. Generate sync loop files\n if (!json) console.log(\"Creating sync triggers...\");\n const syncFiles = generateSyncFiles(projectRoot, config);\n\n // 7. Generate platform-specific configs\n if (!json) console.log(\"Generating platform configs...\");\n const platformWarnings: string[] = [];\n for (const platform of platforms) {\n try {\n const adapter = getAdapter(platform);\n adapter.generateProjectConfig(projectRoot, config);\n adapter.generateAgentConfigs(projectRoot, roles);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n platformWarnings.push(`Platform '${platform}': ${msg}`);\n }\n }\n\n // 8. Copy spec file into .arcbridge/ if provided\n if (options.spec) {\n const specPath = resolve(options.spec);\n if (existsSync(specPath)) {\n const specContent = readFileSync(specPath, \"utf-8\");\n const { writeFileSync } = await import(\"node:fs\");\n writeFileSync(join(projectRoot, \".arcbridge\", \"spec.md\"), specContent, \"utf-8\");\n if (!json) console.log(\"Copied spec file to .arcbridge/spec.md\");\n } else {\n platformWarnings.push(`Spec file not found: ${specPath}`);\n }\n }\n\n // 9. Index codebase\n let indexResult: {\n filesProcessed: number;\n symbolsIndexed: number;\n dependenciesIndexed: number;\n componentsAnalyzed: number;\n routesAnalyzed: number;\n } | null = null;\n try {\n if (!json) console.log(\"Indexing codebase...\");\n\n // Index the whole project/solution as a single unit.\n // For .NET solutions with multiple projects, all symbols are indexed together\n // under the default service (\"main\") to preserve cross-project dependency resolution.\n // Agents can filter by file_path prefix to scope queries to a specific project or layer.\n const result = await indexProject(db, { projectRoot });\n indexResult = {\n filesProcessed: result.filesProcessed,\n symbolsIndexed: result.symbolsIndexed,\n dependenciesIndexed: result.dependenciesIndexed,\n componentsAnalyzed: result.componentsAnalyzed,\n routesAnalyzed: result.routesAnalyzed,\n };\n } catch {\n // Indexing is optional — project may not have tsconfig.json yet\n }\n\n // Get counts\n const blockCount = db\n .prepare(\"SELECT COUNT(*) as count FROM building_blocks\")\n .get() as { count: number };\n const scenarioCount = db\n .prepare(\"SELECT COUNT(*) as count FROM quality_scenarios\")\n .get() as { count: number };\n const phaseCount = db\n .prepare(\"SELECT COUNT(*) as count FROM phases\")\n .get() as { count: number };\n const taskCount = db\n .prepare(\"SELECT COUNT(*) as count FROM tasks\")\n .get() as { count: number };\n\n db.close();\n\n const allWarnings = [...warnings, ...platformWarnings];\n\n if (json) {\n console.log(\n JSON.stringify(\n {\n name: projectName,\n template,\n platforms,\n blocks: blockCount.count,\n scenarios: scenarioCount.count,\n phases: phaseCount.count,\n tasks: taskCount.count,\n roles: roles.length,\n index: indexResult,\n syncFiles,\n warnings: allWarnings,\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(\"\\nArcBridge initialized successfully!\\n\");\n console.log(` Building blocks: ${blockCount.count}`);\n console.log(` Quality scenarios: ${scenarioCount.count}`);\n console.log(` Phases: ${phaseCount.count}`);\n console.log(` Tasks: ${taskCount.count}`);\n console.log(` Agent roles: ${roles.length}`);\n if (indexResult) {\n console.log(\n ` Indexed: ${indexResult.filesProcessed} files, ${indexResult.symbolsIndexed} symbols`,\n );\n } else {\n console.log(\n input.template === \"dotnet-webapi\"\n ? \" Indexed: skipped (ensure .NET SDK is installed and dotnet-indexer is built)\"\n : \" Indexed: skipped (no tsconfig.json)\",\n );\n }\n\n if (allWarnings.length > 0) {\n console.log(\"\\nWarnings:\");\n for (const w of allWarnings) {\n console.log(` - ${w}`);\n }\n }\n\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Review .arcbridge/config.yaml and adjust as needed\");\n console.log(\" 2. Start your AI agent (e.g. Claude Code) in this directory\");\n console.log(\" 3. The agent will see the architecture context and can help\");\n console.log(\" refine building blocks, quality scenarios, and the plan\");\n console.log(\" 4. Run `arcbridge sync` periodically to keep docs in sync with code\");\n }\n}\n","import { resolve } from \"node:path\";\nimport { loadConfig, loadRoles, generateAgentRoles } from \"@arcbridge/core\";\nimport { getAdapter } from \"@arcbridge/adapters\";\n\ninterface GenerateResult {\n platforms: string[];\n roles: string[];\n rolesSource: \"custom\" | \"built-in\";\n errors: string[];\n}\n\nexport async function generateConfigs(\n dir: string,\n json: boolean,\n): Promise<void> {\n const projectRoot = resolve(dir);\n const errors: string[] = [];\n\n // Load config\n const { config, error: configError } = loadConfig(projectRoot);\n if (configError || !config) {\n const msg = configError ?? \"No .arcbridge/config.yaml found\";\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n // Load roles from files, fall back to generating built-in roles\n const loaded = loadRoles(projectRoot);\n let roles = loaded.roles;\n const roleErrors = loaded.errors;\n let rolesSource: \"custom\" | \"built-in\" = \"custom\";\n if (roleErrors.length > 0) {\n errors.push(...roleErrors);\n }\n if (roles.length === 0) {\n // No custom roles found — generate built-in role files and use them\n if (!json) console.log(\"No custom roles found, generating built-in roles...\");\n roles = generateAgentRoles(projectRoot);\n rolesSource = \"built-in\";\n }\n\n // Determine platforms from config\n const platforms = config.platforms ?? [\"claude\", \"copilot\"];\n const generatedPlatforms: string[] = [];\n\n for (const platform of platforms) {\n try {\n const adapter = getAdapter(platform);\n adapter.generateProjectConfig(projectRoot, config);\n if (roles.length > 0) {\n adapter.generateAgentConfigs(projectRoot, roles);\n }\n generatedPlatforms.push(platform);\n } catch (err) {\n errors.push(\n `${platform}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const result: GenerateResult = {\n platforms: generatedPlatforms,\n roles: roles.map((r) => r.role_id),\n rolesSource,\n errors,\n };\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (generatedPlatforms.length > 0) {\n console.log(\n `Generated configs for: ${generatedPlatforms.join(\", \")}`,\n );\n }\n if (roles.length > 0) {\n const source = rolesSource === \"built-in\" ? \" (built-in)\" : \"\";\n console.log(\n `Roles${source}: ${roles.map((r) => r.role_id).join(\", \")}`,\n );\n }\n for (const err of errors) {\n console.error(`Warning: ${err}`);\n }\n }\n}\n","import { syncTaskToYaml } from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\ntype TaskStatus = \"todo\" | \"in-progress\" | \"done\" | \"blocked\";\n\nconst VALID_STATUSES: TaskStatus[] = [\"todo\", \"in-progress\", \"done\", \"blocked\"];\n\nexport async function updateTask(\n dir: string,\n taskId: string,\n newStatus: string,\n json: boolean,\n): Promise<void> {\n if (!VALID_STATUSES.includes(newStatus as TaskStatus)) {\n const msg = `Invalid status \"${newStatus}\". Valid values: ${VALID_STATUSES.join(\", \")}`;\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const db = openProjectDb(dir);\n\n try {\n const task = db\n .prepare(\"SELECT id, title, status, phase_id FROM tasks WHERE id = ?\")\n .get(taskId) as { id: string; title: string; status: string; phase_id: string } | undefined;\n\n if (!task) {\n const msg = `Task \"${taskId}\" not found`;\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const previousStatus = task.status;\n const now = new Date().toISOString();\n\n if (newStatus === \"done\") {\n db.prepare(\"UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?\").run(newStatus, now, taskId);\n } else {\n db.prepare(\"UPDATE tasks SET status = ? WHERE id = ?\").run(newStatus, taskId);\n }\n\n // Write back to YAML\n syncTaskToYaml(dir, task.phase_id, taskId, newStatus, newStatus === \"done\" ? now : null);\n\n if (json) {\n console.log(\n JSON.stringify({\n taskId: task.id,\n title: task.title,\n previousStatus,\n newStatus,\n }),\n );\n } else {\n console.log(`${task.id}: ${previousStatus} → ${newStatus} (${task.title})`);\n }\n } finally {\n db.close();\n }\n}\n","import { refreshFromDocs } from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\nexport async function refresh(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n const warnings = refreshFromDocs(db, dir);\n\n if (json) {\n console.log(JSON.stringify({ refreshed: true, warnings }));\n } else {\n console.log(\"Database refreshed from YAML/markdown sources.\");\n if (warnings.length > 0) {\n console.log(`\\n${warnings.length} warning(s):`);\n for (const w of warnings) {\n console.log(` - ${w}`);\n }\n }\n }\n } finally {\n db.close();\n }\n}\n"],"mappings":"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","names":["resolve","readFileSync","join","detectDrift","writeDriftLog","loadConfig","loadConfig","detectDrift","writeDriftLog","join","existsSync","indexProject","pkg","resolve","loadConfig","generateAgentRoles","getAdapter","refreshFromDocs","refreshFromDocs","readFileSync","join","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/suppress-warnings.ts","../src/index.ts","../src/commands/sync.ts","../src/project.ts","../src/commands/status.ts","../src/commands/drift.ts","../src/commands/init.ts","../src/commands/generate-configs.ts","../src/commands/update-task.ts","../src/commands/refresh.ts"],"sourcesContent":["import { suppressSqliteWarning } from \"@arcbridge/core\";\nsuppressSqliteWarning();\n","import \"./suppress-warnings.js\";\nimport { resolve } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport { sync } from \"./commands/sync.js\";\nimport { status } from \"./commands/status.js\";\nimport { drift } from \"./commands/drift.js\";\nimport { init } from \"./commands/init.js\";\nimport { generateConfigs } from \"./commands/generate-configs.js\";\nimport { updateTask } from \"./commands/update-task.js\";\nimport { refresh } from \"./commands/refresh.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n) as { version: string };\n\nconst USAGE = `Usage: arcbridge <command> [options]\n\nCommands:\n init Initialize ArcBridge in a project directory\n sync Run the sync loop: reindex, detect drift, infer tasks, propose updates\n status Show project status (phase, tasks, drift)\n drift Check for architecture drift\n refresh Rebuild the database from YAML/markdown sources\n update-task Update a task's status (e.g. arcbridge update-task task-1.1 done)\n generate-configs Regenerate platform agent configs from .arcbridge/agents/\n\nOptions:\n --dir <path> Project directory (default: current directory)\n --json Output as JSON (for CI integration)\n --help Show this help message\n --version Show version\n\nInit options:\n --name <name> Project name (default: auto-detect from package.json)\n --template <type> Project template: nextjs-app-router, react-vite, api-service\n --platform <name> Target platform (can be repeated, default: claude)\n --spec <file> Path to a requirements/spec file to include\n`;\n\ninterface ParsedArgs {\n command: string | null;\n positional: string[];\n dir: string;\n json: boolean;\n name?: string;\n template?: string;\n platforms?: string[];\n spec?: string;\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n let command: string | null = null;\n const positional: string[] = [];\n let dir = process.cwd();\n let json = false;\n let name: string | undefined;\n let template: string | undefined;\n const platforms: string[] = [];\n let spec: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === \"--dir\" && i + 1 < args.length) {\n dir = resolve(args[++i]!);\n } else if (arg === \"--json\") {\n json = true;\n } else if (arg === \"--name\" && i + 1 < args.length) {\n name = args[++i]!;\n } else if (arg === \"--template\" && i + 1 < args.length) {\n template = args[++i]!;\n } else if (arg === \"--platform\" && i + 1 < args.length) {\n platforms.push(args[++i]!);\n } else if (arg === \"--spec\" && i + 1 < args.length) {\n spec = args[++i]!;\n } else if (arg === \"--help\" || arg === \"-h\") {\n console.log(USAGE);\n process.exit(0);\n } else if (arg === \"--version\" || arg === \"-v\") {\n console.log(`arcbridge ${pkg.version}`);\n process.exit(0);\n } else if (!arg.startsWith(\"-\") && !command) {\n command = arg;\n } else if (!arg.startsWith(\"-\") && command) {\n positional.push(arg);\n }\n }\n\n return {\n command,\n positional,\n dir,\n json,\n name,\n template,\n platforms: platforms.length > 0 ? platforms : undefined,\n spec,\n };\n}\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2));\n const { command, positional, dir, json } = parsed;\n\n if (!command) {\n console.log(USAGE);\n process.exit(1);\n }\n\n try {\n switch (command) {\n case \"init\":\n await init(dir, {\n name: parsed.name,\n template: parsed.template,\n platforms: parsed.platforms,\n spec: parsed.spec,\n }, json);\n break;\n case \"sync\":\n await sync(dir, json);\n break;\n case \"status\":\n await status(dir, json);\n break;\n case \"drift\":\n await drift(dir, json);\n break;\n case \"refresh\":\n await refresh(dir, json);\n break;\n case \"update-task\": {\n const [taskId, taskStatus] = positional;\n if (!taskId || !taskStatus) {\n console.error(\"Usage: arcbridge update-task <task-id> <status>\");\n console.error(\"Status values: todo, in-progress, done, blocked\");\n process.exit(1);\n }\n await updateTask(dir, taskId, taskStatus, json);\n break;\n }\n case \"generate-configs\":\n await generateConfigs(dir, json);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(USAGE);\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (json) {\n console.log(JSON.stringify({ error: message }));\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n }\n}\n\nmain();\n","import {\n indexProject,\n detectDrift,\n writeDriftLog,\n inferTaskStatuses,\n applyInferences,\n getChangedFiles,\n resolveRef,\n getHeadSha,\n setSyncCommit,\n verifyScenarios,\n loadConfig,\n refreshFromDocs,\n type DriftEntry,\n type IndexResult,\n type TaskInferenceResult,\n type ChangedFile,\n type ScenarioTestResult,\n type DriftOptions,\n} from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\ninterface SyncResult {\n reindex: { files: number; symbols: number; dependencies: number };\n drift: DriftEntry[];\n inferences: TaskInferenceResult[];\n scenarios: ScenarioTestResult[];\n changedFiles: ChangedFile[];\n syncCommit: string | null;\n warnings: string[];\n}\n\nexport async function sync(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n // Step 0: Refresh DB from arc42 docs (picks up manual edits to building blocks, scenarios, etc.)\n if (!json) console.log(\"Refreshing from docs...\");\n const docWarnings = refreshFromDocs(db, dir);\n if (!json && docWarnings.length > 0) {\n for (const w of docWarnings) console.log(` ${w}`);\n }\n\n // Step 1: Reindex\n if (!json) console.log(\"Reindexing...\");\n const indexResult: IndexResult = await indexProject(db, { projectRoot: dir });\n if (!json)\n console.log(\n ` Indexed ${indexResult.filesProcessed} files, ${indexResult.symbolsIndexed} symbols, ${indexResult.dependenciesIndexed} deps`,\n );\n\n // Step 2: Detect drift\n if (!json) console.log(\"Checking drift...\");\n const configForDrift = loadConfig(dir);\n const driftOpts: DriftOptions = {\n projectType: configForDrift.config?.project_type,\n ignorePaths: configForDrift.config?.drift?.ignore_paths,\n };\n const driftEntries = detectDrift(db, driftOpts);\n writeDriftLog(db, driftEntries);\n if (!json) {\n if (driftEntries.length === 0) {\n console.log(\" No drift detected.\");\n } else {\n console.log(` Found ${driftEntries.length} drift issue(s)`);\n for (const e of driftEntries) {\n const icon =\n e.severity === \"error\" ? \"[ERROR]\" : e.severity === \"warning\" ? \"[WARN] \" : \"[INFO] \";\n console.log(` ${icon} ${e.kind}: ${e.description}`);\n }\n }\n }\n\n // Step 3: Infer task statuses\n if (!json) console.log(\"Inferring task statuses...\");\n const currentPhase = db\n .prepare(\"SELECT id FROM phases WHERE status = 'in-progress' LIMIT 1\")\n .get() as { id: string } | undefined;\n\n let inferences: TaskInferenceResult[] = [];\n if (currentPhase) {\n inferences = inferTaskStatuses(db, currentPhase.id);\n if (inferences.length > 0) {\n applyInferences(db, inferences, dir);\n if (!json) {\n console.log(` Updated ${inferences.length} task(s):`);\n for (const inf of inferences) {\n console.log(\n ` ${inf.taskId}: ${inf.previousStatus} -> ${inf.inferredStatus} (${inf.reason})`,\n );\n }\n }\n } else {\n if (!json) console.log(\" No task status changes inferred.\");\n }\n } else {\n if (!json) console.log(\" No active phase — skipping task inference.\");\n }\n\n // Step 4: Verify quality scenarios with linked tests\n let scenarios: ScenarioTestResult[] = [];\n const configResult = loadConfig(dir);\n if (configResult.config) {\n const testCommand = configResult.config.testing.test_command;\n const timeoutMs = configResult.config.testing.timeout_ms;\n\n if (!json) console.log(\"Verifying quality scenarios...\");\n const verifyResult = verifyScenarios(db, dir, { testCommand, timeoutMs });\n scenarios = verifyResult.results;\n\n if (!json) {\n if (scenarios.length === 0) {\n console.log(\" No testable scenarios found.\");\n } else {\n const passing = scenarios.filter((r) => r.passed).length;\n console.log(\n ` ${scenarios.length} scenario(s) verified: ${passing} passing, ${scenarios.length - passing} failing`,\n );\n }\n }\n } else {\n if (!json) console.log(\" No config found — skipping scenario verification.\");\n }\n\n // Step 5: Get changed files since last sync\n const warnings: string[] = [];\n let changedFiles: ChangedFile[] = [];\n try {\n const ref = resolveRef(dir, \"last-sync\", db);\n changedFiles = getChangedFiles(dir, ref.sha);\n if (!json && changedFiles.length > 0) {\n console.log(`Changed files since ${ref.label}: ${changedFiles.length}`);\n }\n } catch {\n const msg = \"Could not determine changed files (git not available or no sync point).\";\n warnings.push(msg);\n if (!json) console.log(` ${msg}`);\n }\n\n // Step 6: Update sync point\n let syncCommit: string | null = null;\n try {\n const head = getHeadSha(dir);\n if (head) {\n syncCommit = head;\n setSyncCommit(db, \"last_sync_commit\", head);\n if (!json) console.log(`Sync point updated to ${head.slice(0, 7)}.`);\n }\n } catch {\n const msg = \"Could not update sync point (git not available).\";\n warnings.push(msg);\n if (!json) console.log(` ${msg}`);\n }\n\n // Summary\n const result: SyncResult = {\n reindex: {\n files: indexResult.filesProcessed,\n symbols: indexResult.symbolsIndexed,\n dependencies: indexResult.dependenciesIndexed,\n },\n drift: driftEntries,\n inferences,\n scenarios,\n changedFiles,\n syncCommit,\n warnings,\n };\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(\"\\nSync complete.\");\n const errors = driftEntries.filter((e) => e.severity === \"error\").length;\n if (errors > 0) {\n console.log(`WARNING: ${errors} drift error(s) would block phase completion.`);\n process.exitCode = 1;\n }\n }\n } finally {\n db.close();\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { openDatabase, migrate } from \"@arcbridge/core\";\nimport type { Database } from \"@arcbridge/core\";\n\nexport function openProjectDb(projectDir: string): Database {\n const dbPath = join(projectDir, \".arcbridge\", \"index.db\");\n if (!existsSync(dbPath)) {\n throw new Error(\n `No ArcBridge project found at ${projectDir}. Run \\`arcbridge_init_project\\` via MCP first.`,\n );\n }\n const db = openDatabase(dbPath);\n migrate(db);\n return db;\n}\n\nexport function ensureInitialized(projectDir: string): void {\n const configPath = join(projectDir, \".arcbridge\", \"config.yaml\");\n if (!existsSync(configPath)) {\n throw new Error(\n `No ArcBridge project found at ${projectDir}. Run \\`arcbridge_init_project\\` via MCP first.`,\n );\n }\n}\n","import { openProjectDb } from \"../project.js\";\n\ninterface TaskDetail {\n id: string;\n title: string;\n status: string;\n}\n\ninterface QualitySummary {\n total: number;\n passing: number;\n failing: number;\n untested: number;\n}\n\ninterface StatusResult {\n project_name: string;\n current_phase: { id: string; name: string; status: string } | null;\n tasks: { total: number; done: number; in_progress: number; blocked: number };\n current_tasks: TaskDetail[];\n quality: QualitySummary;\n building_blocks: number;\n symbols: number;\n drift: { total: number; errors: number; warnings: number };\n}\n\nexport async function status(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n const projectName =\n (\n db\n .prepare(\n \"SELECT value FROM arcbridge_meta WHERE key = 'project_name'\",\n )\n .get() as { value: string } | undefined\n )?.value ?? \"Unknown\";\n\n const currentPhase = db\n .prepare(\n \"SELECT id, name, status FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as { id: string; name: string; status: string } | undefined;\n\n const allTasks = db\n .prepare(\"SELECT status FROM tasks\")\n .all() as { status: string }[];\n const tasks = {\n total: allTasks.length,\n done: allTasks.filter((t) => t.status === \"done\").length,\n in_progress: allTasks.filter((t) => t.status === \"in-progress\").length,\n blocked: allTasks.filter((t) => t.status === \"blocked\").length,\n };\n\n const blockCount = (\n db.prepare(\"SELECT COUNT(*) as c FROM building_blocks\").get() as {\n c: number;\n }\n ).c;\n const symbolCount = (\n db.prepare(\"SELECT COUNT(*) as c FROM symbols\").get() as { c: number }\n ).c;\n\n // Current phase tasks\n const currentTasks: TaskDetail[] = currentPhase\n ? (db\n .prepare(\n \"SELECT id, title, status FROM tasks WHERE phase_id = ? ORDER BY id\",\n )\n .all(currentPhase.id) as TaskDetail[])\n : [];\n\n // Quality scenarios summary\n const scenarioStatuses = db\n .prepare(\"SELECT status FROM quality_scenarios\")\n .all() as { status: string }[];\n const quality: QualitySummary = {\n total: scenarioStatuses.length,\n passing: scenarioStatuses.filter((s) => s.status === \"passing\").length,\n failing: scenarioStatuses.filter((s) => s.status === \"failing\").length,\n untested: scenarioStatuses.filter((s) => s.status === \"untested\").length,\n };\n\n const driftEntries = db\n .prepare(\n \"SELECT severity FROM drift_log WHERE resolved_at IS NULL\",\n )\n .all() as { severity: string }[];\n const driftInfo = {\n total: driftEntries.length,\n errors: driftEntries.filter((d) => d.severity === \"error\").length,\n warnings: driftEntries.filter((d) => d.severity === \"warning\").length,\n };\n\n const result: StatusResult = {\n project_name: projectName,\n current_phase: currentPhase ?? null,\n tasks,\n current_tasks: currentTasks,\n quality,\n building_blocks: blockCount,\n symbols: symbolCount,\n drift: driftInfo,\n };\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`Project: ${result.project_name}`);\n console.log(\n `Phase: ${result.current_phase ? `${result.current_phase.name} (${result.current_phase.status})` : \"none active\"}`,\n );\n console.log(\n `Tasks: ${result.tasks.done}/${result.tasks.total} done, ${result.tasks.in_progress} in-progress, ${result.tasks.blocked} blocked`,\n );\n\n if (result.current_tasks.length > 0) {\n console.log(\"\");\n console.log(`Current phase tasks:`);\n for (const task of result.current_tasks) {\n const icon =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[~]\"\n : task.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n console.log(` ${icon} ${task.title}`);\n }\n }\n\n if (result.quality.total > 0) {\n console.log(\"\");\n console.log(\n `Quality: ${result.quality.passing} passing, ${result.quality.failing} failing, ${result.quality.untested} untested (${result.quality.total} total)`,\n );\n }\n\n console.log(\"\");\n console.log(`Blocks: ${result.building_blocks}`);\n console.log(`Symbols: ${result.symbols}`);\n if (result.drift.total > 0) {\n console.log(\n `Drift: ${result.drift.total} issues (${result.drift.errors} errors, ${result.drift.warnings} warnings)`,\n );\n } else {\n console.log(`Drift: none`);\n }\n }\n } finally {\n db.close();\n }\n}\n","import { detectDrift, writeDriftLog, loadConfig, type DriftOptions } from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\nexport async function drift(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n const configResult = loadConfig(dir);\n const driftOpts: DriftOptions = {\n projectType: configResult.config?.project_type,\n ignorePaths: configResult.config?.drift?.ignore_paths,\n };\n const entries = detectDrift(db, driftOpts);\n writeDriftLog(db, entries);\n\n if (json) {\n console.log(JSON.stringify({ drift: entries }, null, 2));\n } else {\n if (entries.length === 0) {\n console.log(\"No drift detected.\");\n } else {\n console.log(`Found ${entries.length} drift issue(s):\\n`);\n for (const e of entries) {\n const icon =\n e.severity === \"error\"\n ? \"[ERROR]\"\n : e.severity === \"warning\"\n ? \"[WARN] \"\n : \"[INFO] \";\n console.log(` ${icon} ${e.kind}: ${e.description}`);\n if (e.affectedBlock) {\n console.log(` Block: ${e.affectedBlock}`);\n }\n if (e.affectedFile) {\n console.log(` File: ${e.affectedFile}`);\n }\n }\n\n const errors = entries.filter((e) => e.severity === \"error\").length;\n if (errors > 0) {\n console.log(`\\n${errors} error(s) found — these block phase completion.`);\n process.exitCode = 1;\n }\n }\n }\n } finally {\n db.close();\n }\n}\n","import { resolve, basename, join } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport {\n generateConfig,\n generateArc42,\n generatePlan,\n generateAgentRoles,\n generateDatabase,\n generateSyncFiles,\n indexProject,\n discoverDotnetServices,\n type InitProjectInput,\n} from \"@arcbridge/core\";\nimport { getAdapter } from \"@arcbridge/adapters\";\n\ninterface InitOptions {\n name?: string;\n template?: string;\n platforms?: string[];\n spec?: string;\n}\n\ntype ProjectTemplate = \"nextjs-app-router\" | \"react-vite\" | \"api-service\" | \"dotnet-webapi\";\n\ninterface DetectedInfo {\n name: string;\n template: ProjectTemplate;\n nameSource: string;\n templateSource: string;\n /** For .sln-based projects: services discovered from solution */\n dotnetServices?: Array<{ name: string; path: string; csprojPath: string; isTestProject: boolean }>;\n}\n\nconst VALID_TEMPLATES: ProjectTemplate[] = [\n \"nextjs-app-router\",\n \"react-vite\",\n \"api-service\",\n \"dotnet-webapi\",\n];\n\n/**\n * Find .csproj files in the project root (non-recursive, just top level).\n */\nfunction findCsproj(projectRoot: string): string | null {\n try {\n const entries = readdirSync(projectRoot);\n return entries.find((e) => e.endsWith(\".csproj\")) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Auto-detect project info from package.json, .csproj, or directory structure.\n */\nfunction detectProjectInfo(projectRoot: string): DetectedInfo {\n const fallbackName = basename(projectRoot);\n let name = fallbackName;\n let nameSource = \"directory name\";\n let template: ProjectTemplate = \"nextjs-app-router\";\n let templateSource = \"default\";\n\n // Check for .NET solution first (multi-project)\n const entries = readdirSync(projectRoot);\n const slnFile = entries.find((e) => e.endsWith(\".sln\"));\n if (slnFile) {\n name = slnFile.replace(\".sln\", \"\");\n nameSource = \".sln file\";\n template = \"dotnet-webapi\";\n templateSource = `detected (${slnFile} found)`;\n const dotnetServices = discoverDotnetServices(projectRoot);\n return { name, template, nameSource, templateSource, dotnetServices };\n }\n\n // Check for single .NET project\n const csproj = findCsproj(projectRoot);\n if (csproj) {\n name = csproj.replace(\".csproj\", \"\");\n nameSource = \".csproj file\";\n template = \"dotnet-webapi\";\n templateSource = `detected (${csproj} found)`;\n return { name, template, nameSource, templateSource };\n }\n\n const pkgPath = join(projectRoot, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n if (pkg.name) {\n name = pkg.name;\n nameSource = \"package.json\";\n }\n\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n if (allDeps[\"next\"]) {\n template = \"nextjs-app-router\";\n templateSource = \"detected (next in dependencies)\";\n } else if (allDeps[\"vite\"] && allDeps[\"react\"]) {\n template = \"react-vite\";\n templateSource = \"detected (vite + react in dependencies)\";\n } else if (\n allDeps[\"express\"] ||\n allDeps[\"fastify\"] ||\n allDeps[\"hono\"] ||\n allDeps[\"@hono/node-server\"]\n ) {\n template = \"api-service\";\n templateSource = \"detected (server framework in dependencies)\";\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return { name, template, nameSource, templateSource };\n}\n\nexport async function init(\n dir: string,\n options: InitOptions,\n json: boolean,\n): Promise<void> {\n const projectRoot = resolve(dir);\n\n // Check if already initialized\n if (existsSync(join(projectRoot, \".arcbridge\", \"config.yaml\"))) {\n const msg = \"ArcBridge is already initialized in this directory. Use `arcbridge status` to see current state.\";\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(msg);\n }\n process.exitCode = 1;\n return;\n }\n\n // Detect project info\n const detected = detectProjectInfo(projectRoot);\n\n // Apply overrides from flags\n const projectName = options.name ?? detected.name;\n const templateStr = options.template ?? detected.template;\n const platforms = options.platforms ?? [\"claude\"];\n\n if (!VALID_TEMPLATES.includes(templateStr as ProjectTemplate)) {\n const msg = `Unknown template \"${templateStr}\". Valid values: ${VALID_TEMPLATES.join(\", \")}`;\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const template = templateStr as ProjectTemplate;\n\n // Show what we detected\n if (!json) {\n console.log(`Initializing ArcBridge in ${projectRoot}\\n`);\n console.log(` Project: ${projectName} (${detected.nameSource})`);\n console.log(` Template: ${template} (${detected.templateSource})`);\n console.log(` Platform: ${platforms.join(\", \")}`);\n if (options.spec) {\n console.log(` Spec: ${options.spec}`);\n }\n if (detected.dotnetServices && detected.dotnetServices.length > 1) {\n const nonTest = detected.dotnetServices.filter((s) => !s.isTestProject);\n const test = detected.dotnetServices.filter((s) => s.isTestProject);\n console.log(` Services: ${nonTest.length} project(s) detected from solution`);\n for (const svc of nonTest) {\n console.log(` - ${svc.name} (${svc.path})`);\n }\n if (test.length > 0) {\n console.log(` Tests: ${test.length} test project(s) (excluded from indexing)`);\n }\n }\n console.log();\n }\n\n // For multi-project .NET solutions, pass non-test services to the template\n const nonTestServices = detected.dotnetServices?.filter((s) => !s.isTestProject);\n\n const input: InitProjectInput = {\n name: projectName,\n template,\n features: [],\n quality_priorities: [\"security\", \"performance\", \"accessibility\"],\n platforms,\n dotnetServices: nonTestServices?.map((s) => ({ name: s.name, path: s.path })),\n };\n\n // 1. Generate config\n if (!json) console.log(\"Creating .arcbridge/config.yaml...\");\n const config = generateConfig(projectRoot, input);\n\n // 2. Generate arc42 documentation\n if (!json) console.log(\"Creating arc42 documentation...\");\n generateArc42(projectRoot, input);\n\n // 3. Generate phase plan\n if (!json) console.log(\"Creating phase plan...\");\n generatePlan(projectRoot, input);\n\n // 4. Generate agent roles\n if (!json) console.log(\"Creating agent roles...\");\n const roles = generateAgentRoles(projectRoot, template);\n\n // 5. Initialize database from generated files\n if (!json) console.log(\"Initializing database...\");\n const { db, warnings } = generateDatabase(projectRoot, input);\n\n // 6. Generate sync loop files\n if (!json) console.log(\"Creating sync triggers...\");\n const syncFiles = generateSyncFiles(projectRoot, config);\n\n // 7. Generate platform-specific configs\n if (!json) console.log(\"Generating platform configs...\");\n const platformWarnings: string[] = [];\n for (const platform of platforms) {\n try {\n const adapter = getAdapter(platform);\n adapter.generateProjectConfig(projectRoot, config);\n adapter.generateAgentConfigs(projectRoot, roles);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n platformWarnings.push(`Platform '${platform}': ${msg}`);\n }\n }\n\n // 8. Copy spec file into .arcbridge/ if provided\n if (options.spec) {\n const specPath = resolve(options.spec);\n if (existsSync(specPath)) {\n const specContent = readFileSync(specPath, \"utf-8\");\n const { writeFileSync } = await import(\"node:fs\");\n writeFileSync(join(projectRoot, \".arcbridge\", \"spec.md\"), specContent, \"utf-8\");\n if (!json) console.log(\"Copied spec file to .arcbridge/spec.md\");\n } else {\n platformWarnings.push(`Spec file not found: ${specPath}`);\n }\n }\n\n // 9. Index codebase\n let indexResult: {\n filesProcessed: number;\n symbolsIndexed: number;\n dependenciesIndexed: number;\n componentsAnalyzed: number;\n routesAnalyzed: number;\n } | null = null;\n try {\n if (!json) console.log(\"Indexing codebase...\");\n\n // Index the whole project/solution as a single unit.\n // For .NET solutions with multiple projects, all symbols are indexed together\n // under the default service (\"main\") to preserve cross-project dependency resolution.\n // Agents can filter by file_path prefix to scope queries to a specific project or layer.\n const result = await indexProject(db, { projectRoot });\n indexResult = {\n filesProcessed: result.filesProcessed,\n symbolsIndexed: result.symbolsIndexed,\n dependenciesIndexed: result.dependenciesIndexed,\n componentsAnalyzed: result.componentsAnalyzed,\n routesAnalyzed: result.routesAnalyzed,\n };\n } catch {\n // Indexing is optional — project may not have tsconfig.json yet\n }\n\n // Get counts\n const blockCount = db\n .prepare(\"SELECT COUNT(*) as count FROM building_blocks\")\n .get() as { count: number };\n const scenarioCount = db\n .prepare(\"SELECT COUNT(*) as count FROM quality_scenarios\")\n .get() as { count: number };\n const phaseCount = db\n .prepare(\"SELECT COUNT(*) as count FROM phases\")\n .get() as { count: number };\n const taskCount = db\n .prepare(\"SELECT COUNT(*) as count FROM tasks\")\n .get() as { count: number };\n\n db.close();\n\n const allWarnings = [...warnings, ...platformWarnings];\n\n if (json) {\n console.log(\n JSON.stringify(\n {\n name: projectName,\n template,\n platforms,\n blocks: blockCount.count,\n scenarios: scenarioCount.count,\n phases: phaseCount.count,\n tasks: taskCount.count,\n roles: roles.length,\n index: indexResult,\n syncFiles,\n warnings: allWarnings,\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(\"\\nArcBridge initialized successfully!\\n\");\n console.log(` Building blocks: ${blockCount.count}`);\n console.log(` Quality scenarios: ${scenarioCount.count}`);\n console.log(` Phases: ${phaseCount.count}`);\n console.log(` Tasks: ${taskCount.count}`);\n console.log(` Agent roles: ${roles.length}`);\n if (indexResult) {\n console.log(\n ` Indexed: ${indexResult.filesProcessed} files, ${indexResult.symbolsIndexed} symbols`,\n );\n } else {\n console.log(\n input.template === \"dotnet-webapi\"\n ? \" Indexed: skipped (ensure .NET SDK is installed and dotnet-indexer is built)\"\n : \" Indexed: skipped (no tsconfig.json)\",\n );\n }\n\n if (allWarnings.length > 0) {\n console.log(\"\\nWarnings:\");\n for (const w of allWarnings) {\n console.log(` - ${w}`);\n }\n }\n\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Review .arcbridge/config.yaml and adjust as needed\");\n console.log(\" 2. Start your AI agent (e.g. Claude Code) in this directory\");\n console.log(\" 3. The agent will see the architecture context and can help\");\n console.log(\" refine building blocks, quality scenarios, and the plan\");\n console.log(\" 4. Run `arcbridge sync` periodically to keep docs in sync with code\");\n }\n}\n","import { resolve } from \"node:path\";\nimport { loadConfig, loadRoles, generateAgentRoles } from \"@arcbridge/core\";\nimport { getAdapter } from \"@arcbridge/adapters\";\n\ninterface GenerateResult {\n platforms: string[];\n roles: string[];\n rolesSource: \"custom\" | \"built-in\";\n errors: string[];\n}\n\nexport async function generateConfigs(\n dir: string,\n json: boolean,\n): Promise<void> {\n const projectRoot = resolve(dir);\n const errors: string[] = [];\n\n // Load config\n const { config, error: configError } = loadConfig(projectRoot);\n if (configError || !config) {\n const msg = configError ?? \"No .arcbridge/config.yaml found\";\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n // Load roles from files, fall back to generating built-in roles\n const loaded = loadRoles(projectRoot);\n let roles = loaded.roles;\n const roleErrors = loaded.errors;\n let rolesSource: \"custom\" | \"built-in\" = \"custom\";\n if (roleErrors.length > 0) {\n errors.push(...roleErrors);\n }\n if (roles.length === 0) {\n // No custom roles found — generate built-in role files and use them\n if (!json) console.log(\"No custom roles found, generating built-in roles...\");\n roles = generateAgentRoles(projectRoot);\n rolesSource = \"built-in\";\n }\n\n // Determine platforms from config\n const platforms = config.platforms ?? [\"claude\", \"copilot\"];\n const generatedPlatforms: string[] = [];\n\n for (const platform of platforms) {\n try {\n const adapter = getAdapter(platform);\n adapter.generateProjectConfig(projectRoot, config);\n if (roles.length > 0) {\n adapter.generateAgentConfigs(projectRoot, roles);\n }\n generatedPlatforms.push(platform);\n } catch (err) {\n errors.push(\n `${platform}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const result: GenerateResult = {\n platforms: generatedPlatforms,\n roles: roles.map((r) => r.role_id),\n rolesSource,\n errors,\n };\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (generatedPlatforms.length > 0) {\n console.log(\n `Generated configs for: ${generatedPlatforms.join(\", \")}`,\n );\n }\n if (roles.length > 0) {\n const source = rolesSource === \"built-in\" ? \" (built-in)\" : \"\";\n console.log(\n `Roles${source}: ${roles.map((r) => r.role_id).join(\", \")}`,\n );\n }\n for (const err of errors) {\n console.error(`Warning: ${err}`);\n }\n }\n}\n","import { syncTaskToYaml } from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\ntype TaskStatus = \"todo\" | \"in-progress\" | \"done\" | \"blocked\";\n\nconst VALID_STATUSES: TaskStatus[] = [\"todo\", \"in-progress\", \"done\", \"blocked\"];\n\nexport async function updateTask(\n dir: string,\n taskId: string,\n newStatus: string,\n json: boolean,\n): Promise<void> {\n if (!VALID_STATUSES.includes(newStatus as TaskStatus)) {\n const msg = `Invalid status \"${newStatus}\". Valid values: ${VALID_STATUSES.join(\", \")}`;\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const db = openProjectDb(dir);\n\n try {\n const task = db\n .prepare(\"SELECT id, title, status, phase_id FROM tasks WHERE id = ?\")\n .get(taskId) as { id: string; title: string; status: string; phase_id: string } | undefined;\n\n if (!task) {\n const msg = `Task \"${taskId}\" not found`;\n if (json) {\n console.log(JSON.stringify({ error: msg }));\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const previousStatus = task.status;\n const now = new Date().toISOString();\n\n if (newStatus === \"done\") {\n db.prepare(\"UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?\").run(newStatus, now, taskId);\n } else {\n db.prepare(\"UPDATE tasks SET status = ? WHERE id = ?\").run(newStatus, taskId);\n }\n\n // Write back to YAML\n syncTaskToYaml(dir, task.phase_id, taskId, newStatus, newStatus === \"done\" ? now : null);\n\n if (json) {\n console.log(\n JSON.stringify({\n taskId: task.id,\n title: task.title,\n previousStatus,\n newStatus,\n }),\n );\n } else {\n console.log(`${task.id}: ${previousStatus} → ${newStatus} (${task.title})`);\n }\n } finally {\n db.close();\n }\n}\n","import { refreshFromDocs } from \"@arcbridge/core\";\nimport { openProjectDb } from \"../project.js\";\n\nexport async function refresh(dir: string, json: boolean): Promise<void> {\n const db = openProjectDb(dir);\n\n try {\n const warnings = refreshFromDocs(db, dir);\n\n if (json) {\n console.log(JSON.stringify({ refreshed: true, warnings }));\n } else {\n console.log(\"Database refreshed from YAML/markdown sources.\");\n if (warnings.length > 0) {\n console.log(`\\n${warnings.length} warning(s):`);\n for (const w of warnings) {\n console.log(` - ${w}`);\n }\n }\n }\n } finally {\n db.close();\n }\n}\n"],"mappings":"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","names":["resolve","readFileSync","join","detectDrift","writeDriftLog","loadConfig","loadConfig","detectDrift","writeDriftLog","join","existsSync","indexProject","pkg","resolve","loadConfig","generateAgentRoles","getAdapter","refreshFromDocs","refreshFromDocs","readFileSync","join","resolve"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arcbridge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "CLI for ArcBridge — architectural awareness for AI coding agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -36,8 +36,11 @@
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@arcbridge/
|
|
40
|
-
"@arcbridge/
|
|
39
|
+
"@arcbridge/core": "0.1.3",
|
|
40
|
+
"@arcbridge/adapters": "0.1.3"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.16.0"
|
|
41
44
|
},
|
|
42
45
|
"scripts": {
|
|
43
46
|
"build": "tsup",
|