devworkspace 0.0.0-stage → 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/CHANGELOG.md +32 -0
- package/LICENSE +21 -0
- package/README.md +128 -3
- package/dist/agents/claude/adapter.d.ts +15 -0
- package/dist/agents/claude/adapter.js +107 -0
- package/dist/agents/claude/adapter.js.map +1 -0
- package/dist/agents/claude/content.d.ts +7 -0
- package/dist/agents/claude/content.js +136 -0
- package/dist/agents/claude/content.js.map +1 -0
- package/dist/agents/types.d.ts +26 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/args.d.ts +197 -0
- package/dist/cli/args.js +94 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/help.d.ts +10 -0
- package/dist/cli/help.js +181 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +19 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/render.d.ts +41 -0
- package/dist/cli/render.js +220 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/run.d.ts +10 -0
- package/dist/cli/run.js +339 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/config/schemas.d.ts +76 -0
- package/dist/config/schemas.js +83 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/validate.d.ts +22 -0
- package/dist/config/validate.js +76 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/core/migrations.d.ts +15 -0
- package/dist/core/migrations.js +34 -0
- package/dist/core/migrations.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.js +12 -0
- package/dist/core/version.js.map +1 -0
- package/dist/core/versioned.d.ts +13 -0
- package/dist/core/versioned.js +16 -0
- package/dist/core/versioned.js.map +1 -0
- package/dist/core/workspace.d.ts +34 -0
- package/dist/core/workspace.js +92 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/decisions/decision.d.ts +31 -0
- package/dist/decisions/decision.js +123 -0
- package/dist/decisions/decision.js.map +1 -0
- package/dist/discovery/commands.d.ts +12 -0
- package/dist/discovery/commands.js +92 -0
- package/dist/discovery/commands.js.map +1 -0
- package/dist/discovery/detect.d.ts +72 -0
- package/dist/discovery/detect.js +421 -0
- package/dist/discovery/detect.js.map +1 -0
- package/dist/discovery/ignore.d.ts +6 -0
- package/dist/discovery/ignore.js +76 -0
- package/dist/discovery/ignore.js.map +1 -0
- package/dist/discovery/scan.d.ts +24 -0
- package/dist/discovery/scan.js +132 -0
- package/dist/discovery/scan.js.map +1 -0
- package/dist/errors/index.d.ts +25 -0
- package/dist/errors/index.js +39 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/git/git.d.ts +27 -0
- package/dist/git/git.js +97 -0
- package/dist/git/git.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/agent-skills.d.ts +10 -0
- package/dist/integrations/agent-skills.js +45 -0
- package/dist/integrations/agent-skills.js.map +1 -0
- package/dist/integrations/graphify.d.ts +7 -0
- package/dist/integrations/graphify.js +54 -0
- package/dist/integrations/graphify.js.map +1 -0
- package/dist/integrations/index.d.ts +6 -0
- package/dist/integrations/index.js +30 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/omniroute.d.ts +7 -0
- package/dist/integrations/omniroute.js +24 -0
- package/dist/integrations/omniroute.js.map +1 -0
- package/dist/integrations/ponytail.d.ts +10 -0
- package/dist/integrations/ponytail.js +58 -0
- package/dist/integrations/ponytail.js.map +1 -0
- package/dist/integrations/probe.d.ts +6 -0
- package/dist/integrations/probe.js +41 -0
- package/dist/integrations/probe.js.map +1 -0
- package/dist/integrations/types.d.ts +25 -0
- package/dist/integrations/types.js +2 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/knowledge/facts.d.ts +43 -0
- package/dist/knowledge/facts.js +195 -0
- package/dist/knowledge/facts.js.map +1 -0
- package/dist/portability/bundle.d.ts +22 -0
- package/dist/portability/bundle.js +102 -0
- package/dist/portability/bundle.js.map +1 -0
- package/dist/prompts/onboarding.d.ts +19 -0
- package/dist/prompts/onboarding.js +53 -0
- package/dist/prompts/onboarding.js.map +1 -0
- package/dist/prompts/refresh.d.ts +15 -0
- package/dist/prompts/refresh.js +33 -0
- package/dist/prompts/refresh.js.map +1 -0
- package/dist/prompts/requirements.d.ts +9 -0
- package/dist/prompts/requirements.js +34 -0
- package/dist/prompts/requirements.js.map +1 -0
- package/dist/security/files.d.ts +5 -0
- package/dist/security/files.js +44 -0
- package/dist/security/files.js.map +1 -0
- package/dist/security/redact.d.ts +13 -0
- package/dist/security/redact.js +43 -0
- package/dist/security/redact.js.map +1 -0
- package/dist/services/agent.d.ts +11 -0
- package/dist/services/agent.js +42 -0
- package/dist/services/agent.js.map +1 -0
- package/dist/services/analysis.d.ts +45 -0
- package/dist/services/analysis.js +151 -0
- package/dist/services/analysis.js.map +1 -0
- package/dist/services/common.d.ts +18 -0
- package/dist/services/common.js +18 -0
- package/dist/services/common.js.map +1 -0
- package/dist/services/doctor.d.ts +27 -0
- package/dist/services/doctor.js +223 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/init.d.ts +18 -0
- package/dist/services/init.js +135 -0
- package/dist/services/init.js.map +1 -0
- package/dist/services/knowledge.d.ts +40 -0
- package/dist/services/knowledge.js +72 -0
- package/dist/services/knowledge.js.map +1 -0
- package/dist/services/migrate.d.ts +16 -0
- package/dist/services/migrate.js +54 -0
- package/dist/services/migrate.js.map +1 -0
- package/dist/services/portability.d.ts +27 -0
- package/dist/services/portability.js +155 -0
- package/dist/services/portability.js.map +1 -0
- package/dist/services/records.d.ts +8 -0
- package/dist/services/records.js +26 -0
- package/dist/services/records.js.map +1 -0
- package/dist/services/refresh.d.ts +22 -0
- package/dist/services/refresh.js +64 -0
- package/dist/services/refresh.js.map +1 -0
- package/dist/services/reset.d.ts +23 -0
- package/dist/services/reset.js +96 -0
- package/dist/services/reset.js.map +1 -0
- package/dist/services/status.d.ts +57 -0
- package/dist/services/status.js +111 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/tasks.d.ts +44 -0
- package/dist/services/tasks.js +136 -0
- package/dist/services/tasks.js.map +1 -0
- package/dist/sessions/session.d.ts +19 -0
- package/dist/sessions/session.js +53 -0
- package/dist/sessions/session.js.map +1 -0
- package/dist/tasks/routing.d.ts +27 -0
- package/dist/tasks/routing.js +206 -0
- package/dist/tasks/routing.js.map +1 -0
- package/dist/tasks/task.d.ts +90 -0
- package/dist/tasks/task.js +275 -0
- package/dist/tasks/task.js.map +1 -0
- package/dist/utils/cleanup.d.ts +3 -0
- package/dist/utils/cleanup.js +18 -0
- package/dist/utils/cleanup.js.map +1 -0
- package/dist/utils/fs.d.ts +17 -0
- package/dist/utils/fs.js +164 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/lock.d.ts +6 -0
- package/dist/utils/lock.js +77 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.js +18 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +18 -0
- package/dist/utils/paths.js +95 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/proc.d.ts +22 -0
- package/dist/utils/proc.js +74 -0
- package/dist/utils/proc.js.map +1 -0
- package/docs/architecture.md +53 -0
- package/docs/benchmarking.md +33 -0
- package/docs/claude.md +46 -0
- package/docs/contributing.md +64 -0
- package/docs/getting-started.md +79 -0
- package/docs/integrations.md +51 -0
- package/docs/knowledge.md +66 -0
- package/docs/portability.md +40 -0
- package/docs/routing.md +51 -0
- package/docs/security.md +44 -0
- package/docs/testing.md +58 -0
- package/docs/troubleshooting.md +27 -0
- package/package.json +68 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { DevWorkspaceError, EXIT, formatError, isDevWorkspaceError } from '../errors/index.js';\nimport { packageVersion } from '../core/version.js';\nimport { createLogger } from '../utils/logger.js';\nimport { bool, int, list, parseCli, str, type ParsedArgs } from './args.js';\nimport { COMMANDS, commandHelp, topHelp } from './help.js';\nimport {\n makeStyle,\n renderAgentInstall,\n renderAnalyze,\n renderContext,\n renderDoctor,\n renderExport,\n renderImport,\n renderInit,\n renderMigrate,\n renderRefresh,\n renderReset,\n renderStatus,\n renderTask,\n type Style,\n} from './render.js';\nimport { requireWorkspace } from '../core/workspace.js';\nimport { analyzeWorkspace } from '../services/analysis.js';\nimport { installAgent } from '../services/agent.js';\nimport { mutate, type ServiceOptions } from '../services/common.js';\nimport { runDoctor } from '../services/doctor.js';\nimport { initWorkspace } from '../services/init.js';\nimport { addFact, getContext, removeFactByKey, verifyFactByKey } from '../services/knowledge.js';\nimport { migrateWorkspace } from '../services/migrate.js';\nimport { exportWorkspace, importWorkspace } from '../services/portability.js';\nimport { getDecision, getDecisions, getSessions, recordDecision, recordSession } from '../services/records.js';\nimport { refreshWorkspace } from '../services/refresh.js';\nimport { resetWorkspace } from '../services/reset.js';\nimport { getStatus } from '../services/status.js';\nimport {\n attestTask,\n createTask,\n listTasksService,\n recordTests,\n recordVerification,\n setTaskStatus,\n showTask,\n updateTask,\n} from '../services/tasks.js';\nimport { CONFIDENCE, FACT_STATUS, SOURCE_TYPES, type Confidence, type FactStatus, type SourceType } from '../config/schemas.js';\nimport { loadFacts } from '../knowledge/facts.js';\n\nexport interface CliIO {\n stdout: (s: string) => void;\n stderr: (s: string) => void;\n cwd: string;\n env: NodeJS.ProcessEnv;\n isTTY: boolean;\n}\n\nexport function defaultIO(): CliIO {\n return {\n stdout: (s) => process.stdout.write(s),\n stderr: (s) => process.stderr.write(s),\n cwd: process.cwd(),\n env: process.env,\n isTTY: !!process.stdout.isTTY,\n };\n}\n\ninterface Ctx {\n args: ParsedArgs;\n rest: string[];\n svc: ServiceOptions;\n json: boolean;\n style: Style;\n out(text: string): void;\n data(value: unknown, text: string): void;\n exit: number;\n}\n\nfunction need(v: string | undefined, flag: string): string {\n if (!v) throw new DevWorkspaceError('USAGE', `Missing required option --${flag}.`, { hint: 'Run \"devworkspace <command> --help\".' });\n return v;\n}\n\nfunction oneOf<T extends string>(v: string | undefined, allowed: readonly T[], flag: string, fallback?: T): T {\n const x = v ?? fallback;\n if (x === undefined || !(allowed as readonly string[]).includes(x)) {\n throw new DevWorkspaceError('USAGE', `--${flag} must be one of: ${allowed.join(', ')}.`);\n }\n return x as T;\n}\n\ntype Handler = (c: Ctx) => Promise<void>;\n\nconst handlers: Record<string, Handler> = {\n async init(c) {\n const r = await initWorkspace({ ...c.svc, root: str(c.args.values, 'root') });\n c.data(r, renderInit(c.style, r));\n },\n async analyze(c) {\n const ws = await requireWorkspace(c.svc.cwd);\n const r = c.svc.dryRun ? await analyzeWorkspace(ws, c.svc) : await mutate(c.svc, (w) => analyzeWorkspace(w, c.svc));\n c.data(r, renderAnalyze(c.style, r));\n },\n async status(c) {\n const r = await getStatus(c.svc);\n c.data(r, renderStatus(c.style, r));\n if (!r.initialized || r.workspace === 'Unreadable') c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && (r.workspace !== 'Healthy' || r.knowledge.stale > 0 || !r.onboarding.ready)) c.exit = EXIT.WARNINGS;\n },\n async doctor(c) {\n const r = await runDoctor({ ...c.svc, fix: bool(c.args.values, 'fix') });\n c.data(r, renderDoctor(c.style, r));\n if (!r.healthy) c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && r.counts.warn > 0) c.exit = EXIT.WARNINGS;\n },\n async refresh(c) {\n const r = await refreshWorkspace(c.svc);\n c.data(r, renderRefresh(c.style, r));\n },\n async context(c) {\n const r = await getContext(c.svc, { topic: str(c.args.values, 'topic'), full: bool(c.args.values, 'full') });\n c.data(r, renderContext(c.style, r));\n },\n async fact(c) {\n const sub = c.rest[0];\n const v = c.args.values;\n if (sub === 'add') {\n const sourceType = oneOf<SourceType>(str(v, 'source-type'), SOURCE_TYPES, 'source-type', 'ai');\n const input = {\n key: need(str(v, 'key'), 'key'),\n value: need(str(v, 'value'), 'value'),\n source: need(str(v, 'source'), 'source'),\n sourceType,\n sources: list(v, 'file'),\n confidence: oneOf<Confidence>(str(v, 'confidence')?.toUpperCase(), CONFIDENCE, 'confidence', 'MEDIUM'),\n status: str(v, 'status') ? oneOf<FactStatus>(str(v, 'status')!.toUpperCase(), FACT_STATUS, 'status') : undefined,\n };\n const r = await addFact(c.svc, input);\n c.data(r, `${c.style.ok(c.style.sym.ok)} Fact ${r.action}: ${r.fact.key} [${r.fact.status}/${r.fact.confidence}]`);\n } else if (sub === 'verify') {\n const f = await verifyFactByKey(c.svc, need(c.rest[1], 'key (positional)'));\n c.data(f, `${c.style.ok(c.style.sym.ok)} Verified ${f.key} [${f.status}]`);\n } else if (sub === 'remove') {\n const key = need(c.rest[1], 'key (positional)');\n const removed = await removeFactByKey(c.svc, key);\n if (!removed) throw new DevWorkspaceError('NOT_FOUND', `No fact with key \"${key}\".`);\n c.data({ removed: key }, `${c.style.ok(c.style.sym.ok)} Removed ${key}`);\n } else if (sub === 'list' || sub === undefined) {\n const ws = await requireWorkspace(c.svc.cwd);\n const facts = (await loadFacts(ws)).facts;\n c.data(facts, facts.length ? facts.map((f) => `${f.key} [${f.status}] ${f.value}`).join('\\n') : 'No facts recorded yet.');\n } else throw new DevWorkspaceError('USAGE', `Unknown fact subcommand \"${sub}\".`, { hint: 'Use: add, verify, remove, list.' });\n },\n async task(c) {\n const v = c.args.values;\n let sub = c.rest[0];\n const known = ['new', 'list', 'show', 'status', 'update', 'verify', 'tests', 'attest'];\n // `devworkspace task \"<description>\"` is shorthand for `task new`.\n if (sub !== undefined && !known.includes(sub)) {\n c.rest.unshift('new');\n sub = 'new';\n }\n const id = c.rest[1];\n switch (sub) {\n case 'new': {\n const text = c.rest.slice(1).join(' ').trim();\n if (!text) throw new DevWorkspaceError('USAGE', 'Describe the task: devworkspace task new \"<request>\"');\n const r = await createTask(c.svc, { text, type: str(v, 'type'), title: str(v, 'title') });\n const checks = r.task.verification.map((x) => `${x.check}${x.status === 'SKIPPED' ? ' (skipped: user override)' : ''}`).join(', ') || 'none';\n c.data(r, [\n `${c.style.ok(c.style.sym.ok)} Created ${r.task.id}`,\n ` type: ${r.task.type} (${r.classification.confidence === 'high' ? 'classified' : 'low confidence - confirm with the user'})${r.classification.readOnly ? ' - read-only request' : ''}`,\n ` required verification: ${checks}`,\n ` workflow: ${r.workflow.steps[0]}`,\n ].join('\\n'));\n break;\n }\n case 'list': {\n const { tasks, corrupt } = await listTasksService(c.svc, bool(v, 'all'));\n const text = tasks.length ? tasks.map((t) => `${t.id} ${t.status.padEnd(11)} ${t.type.padEnd(13)} ${t.title}`).join('\\n') : 'No tasks.';\n c.data({ tasks, corrupt }, text + (corrupt.length ? `\\n${c.style.sym.warn} ${corrupt.length} unreadable task file(s); run: devworkspace doctor` : ''));\n break;\n }\n case 'show': {\n const r = await showTask(c.svc, need(id, 'id (positional)'));\n c.data(r, renderTask(c.style, r.task, r.gate));\n break;\n }\n case 'status': {\n const r = await setTaskStatus(c.svc, need(id, 'id (positional)'), need(c.rest[2], 'status (positional)'), str(v, 'note'));\n const warn = r.gate?.warnings.map((w) => `\\n ${c.style.sym.warn} ${w}`).join('') ?? '';\n c.data(r, `${c.style.ok(c.style.sym.ok)} ${r.task.id} is now ${r.task.status}${warn}`);\n break;\n }\n case 'update': {\n const t = await updateTask(c.svc, need(id, 'id (positional)'), {\n title: str(v, 'title'),\n summary: str(v, 'summary'),\n criteria: list(v, 'criteria'),\n plan: list(v, 'plan'),\n areas: list(v, 'area'),\n decisions: list(v, 'decision-note'),\n blockers: list(v, 'blocker'),\n clearBlockers: bool(v, 'clear-blockers'),\n require: list(v, 'require'),\n });\n c.data(t, renderTask(c.style, t));\n break;\n }\n case 'verify': {\n const t = await recordVerification(c.svc, need(id, 'id (positional)'), need(c.rest[2], 'check (positional)'), need(c.rest[3], 'result (positional: pass|fail|skip|pending)'), {\n reason: str(v, 'reason'),\n detail: str(v, 'detail'),\n });\n c.data(t, renderTask(c.style, t));\n break;\n }\n case 'tests': {\n const phase = oneOf(str(v, 'phase'), ['baseline', 'after'] as const, 'phase');\n const t = await recordTests(c.svc, need(id, 'id (positional)'), phase, int(v, 'passed') ?? NaN, int(v, 'failed') ?? NaN);\n c.data(t, renderTask(c.style, t));\n break;\n }\n case 'attest': {\n const t = await attestTask(c.svc, need(id, 'id (positional)'), {\n userWorkIntact: bool(v, 'user-work-intact') || undefined,\n knowledgeReviewed: bool(v, 'knowledge-reviewed') || undefined,\n finalStateInspected: bool(v, 'final-state-inspected') || undefined,\n });\n c.data(t, renderTask(c.style, t));\n break;\n }\n default:\n throw new DevWorkspaceError('USAGE', 'Missing task subcommand.', { hint: 'Run \"devworkspace task --help\".' });\n }\n },\n async decision(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'add') {\n const d = await recordDecision(c.svc, {\n title: need(str(v, 'title'), 'title'),\n context: need(str(v, 'context'), 'context'),\n decision: need(str(v, 'decision'), 'decision'),\n consequences: need(str(v, 'consequences'), 'consequences'),\n supersedes: int(v, 'supersedes'),\n });\n c.data(d, `${c.style.ok(c.style.sym.ok)} Recorded decision ${String(d.number).padStart(4, '0')}: ${d.title}`);\n } else if (sub === 'list') {\n const ds = await getDecisions(c.svc);\n c.data(ds, ds.length ? ds.map((d) => `${String(d.number).padStart(4, '0')} [${d.status}] ${d.date} ${d.title}`).join('\\n') : 'No decisions recorded.');\n } else if (sub === 'show') {\n const d = await getDecision(c.svc, Number(need(c.rest[1], 'number (positional)')));\n c.data(d, `# ${d.number}. ${d.title} [${d.status}] ${d.date}\\n\\nContext:\\n${d.context}\\n\\nDecision:\\n${d.decision}\\n\\nConsequences:\\n${d.consequences}`);\n } else throw new DevWorkspaceError('USAGE', `Unknown decision subcommand \"${sub}\".`, { hint: 'Use: add, list, show.' });\n },\n async session(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'save') {\n const s = await recordSession(c.svc, {\n goal: need(str(v, 'goal'), 'goal'),\n completed: list(v, 'done'),\n areas: list(v, 'area'),\n testsRun: list(v, 'tests-run'),\n decisions: list(v, 'decision-note'),\n remaining: list(v, 'remaining'),\n next: str(v, 'next') ?? '',\n taskId: str(v, 'task'),\n });\n c.data(s, `${c.style.ok(c.style.sym.ok)} Saved session ${s.id}`);\n } else if (sub === 'list') {\n const ss = await getSessions(c.svc, int(v, 'limit') ?? 10);\n c.data(ss, ss.length ? ss.map((s) => `${s.id} ${s.goal} ${c.style.sym.arrow} ${s.next || '(no next step)'}`).join('\\n') : 'No sessions saved.');\n } else throw new DevWorkspaceError('USAGE', `Unknown session subcommand \"${sub}\".`, { hint: 'Use: save, list.' });\n },\n async agent(c) {\n if (c.rest[0] !== 'install') throw new DevWorkspaceError('USAGE', 'Usage: devworkspace agent install [--agent claude]');\n const r = await installAgent(c.svc, str(c.args.values, 'agent') ?? 'claude');\n c.data(r, renderAgentInstall(c.style, r));\n },\n async export(c) {\n const r = await exportWorkspace(c.svc, str(c.args.values, 'out'));\n c.data(r, renderExport(c.style, r));\n },\n async import(c) {\n const file = need(c.rest[0], 'file (positional)');\n const r = await importWorkspace({ ...c.svc, overwrite: bool(c.args.values, 'overwrite'), allowDifferentProject: bool(c.args.values, 'allow-different-project') }, file);\n c.data(r, renderImport(c.style, r));\n },\n async reset(c) {\n const r = await resetWorkspace({ ...c.svc, confirm: bool(c.args.values, 'yes'), includeAgentFiles: bool(c.args.values, 'include-agent-files') });\n c.data(r, renderReset(c.style, r));\n if (!r.executed && !c.svc.dryRun) {\n if (!c.json) c.out('\\nNothing was deleted. Re-run with --yes to confirm.');\n c.exit = EXIT.USAGE;\n }\n },\n async migrate(c) {\n const r = await migrateWorkspace(c.svc);\n c.data(r, renderMigrate(c.style, r));\n },\n};\n\nconst ALIASES: Record<string, string> = { tasks: 'task' };\n\n/** Run the CLI and return the process exit code. Never calls process.exit, so it is directly testable. */\nexport async function run(argv: string[], io: CliIO = defaultIO()): Promise<number> {\n let debug = argv.includes('--debug');\n let json = argv.includes('--json');\n try {\n const args = parseCli(argv);\n const v = args.values;\n debug = bool(v, 'debug');\n json = bool(v, 'json');\n const color = io.isTTY && !io.env.NO_COLOR && !bool(v, 'no-color') && io.env.TERM !== 'dumb';\n const ascii = bool(v, 'ascii') || !!io.env.DEVWORKSPACE_ASCII;\n const style = makeStyle({ color, ascii });\n const logger = createLogger(debug ? 'debug' : 'warn', (l) => io.stderr(l + '\\n'));\n\n if (bool(v, 'version') || args.positionals[0] === 'version') {\n io.stdout(packageVersion() + '\\n');\n return EXIT.OK;\n }\n const [rawCmd, ...rest] = args.positionals;\n const cmd = rawCmd ? (ALIASES[rawCmd] ?? rawCmd) : undefined;\n if (rawCmd === 'tasks') rest.unshift('list');\n if (!cmd || cmd === 'help') {\n const target = cmd === 'help' ? COMMANDS.find((c) => c.name === rest[0]) : undefined;\n io.stdout((target ? commandHelp(target) : topHelp(packageVersion())) + '\\n');\n return EXIT.OK;\n }\n const help = COMMANDS.find((c) => c.name === cmd);\n const handler = handlers[cmd];\n if (!help || !handler) {\n throw new DevWorkspaceError('USAGE', `Unknown command \"${rawCmd}\".`, { hint: 'Run \"devworkspace --help\" to see available commands.' });\n }\n if (bool(v, 'help')) {\n io.stdout(commandHelp(help) + '\\n');\n return EXIT.OK;\n }\n\n const cwd = path.resolve(io.cwd, str(v, 'cwd') ?? '.');\n const ctx: Ctx = {\n args,\n rest,\n svc: { cwd, dryRun: bool(v, 'dry-run'), env: io.env, ...(io.env.DEVWORKSPACE_HOME ? { homeDir: io.env.DEVWORKSPACE_HOME } : {}) },\n json,\n style,\n exit: EXIT.OK,\n out: (t) => io.stdout(t + '\\n'),\n data: (value, text) => io.stdout((json ? JSON.stringify(value, null, 2) : text) + '\\n'),\n };\n logger.debug(`command=${cmd} cwd=${cwd}`);\n await handler(ctx);\n return ctx.exit;\n } catch (e) {\n if (json) {\n const err = isDevWorkspaceError(e)\n ? { code: e.code, message: e.message, hint: e.hint ?? null, stateChanged: e.stateChanged }\n : { code: 'INTERNAL', message: e instanceof Error ? e.message : String(e), hint: null, stateChanged: false };\n io.stdout(JSON.stringify({ error: err }, null, 2) + '\\n');\n } else {\n io.stderr(formatError(e, debug) + '\\n');\n }\n return isDevWorkspaceError(e) ? e.exitCode : EXIT.FAILURE;\n }\n}\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare const SCHEMA_VERSION = 1;
|
|
2
|
+
export declare const CONFIDENCE: readonly ["HIGH", "MEDIUM", "LOW"];
|
|
3
|
+
export declare const FACT_STATUS: readonly ["VERIFIED", "DETECTED", "INFERRED", "USER_DECISION", "UNKNOWN", "STALE"];
|
|
4
|
+
export declare const SOURCE_TYPES: readonly ["detector", "file", "git", "user", "ai"];
|
|
5
|
+
export declare const REVIEW_LEVELS: readonly ["off", "light", "strict"];
|
|
6
|
+
export type Confidence = (typeof CONFIDENCE)[number];
|
|
7
|
+
export type FactStatus = (typeof FACT_STATUS)[number];
|
|
8
|
+
export type SourceType = (typeof SOURCE_TYPES)[number];
|
|
9
|
+
export type ReviewLevel = (typeof REVIEW_LEVELS)[number];
|
|
10
|
+
export interface ManagedFile {
|
|
11
|
+
path: string;
|
|
12
|
+
mode: 'owned' | 'section';
|
|
13
|
+
agent?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ProjectConfig {
|
|
16
|
+
schemaVersion: number;
|
|
17
|
+
projectId: string;
|
|
18
|
+
name: string;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
devworkspaceVersion: string;
|
|
22
|
+
settings: {
|
|
23
|
+
review: ReviewLevel;
|
|
24
|
+
maxFiles: number;
|
|
25
|
+
};
|
|
26
|
+
managedFiles: ManagedFile[];
|
|
27
|
+
}
|
|
28
|
+
export declare function validateProject(v: unknown, file?: string): ProjectConfig;
|
|
29
|
+
export interface Fact {
|
|
30
|
+
id: string;
|
|
31
|
+
key: string;
|
|
32
|
+
value: string;
|
|
33
|
+
source: string;
|
|
34
|
+
sourceType: SourceType;
|
|
35
|
+
sources: string[];
|
|
36
|
+
sourceHashes: Record<string, string>;
|
|
37
|
+
confidence: Confidence;
|
|
38
|
+
status: FactStatus;
|
|
39
|
+
createdAt: string;
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
lastVerifiedAt: string | null;
|
|
42
|
+
staleReason?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface FactsFile {
|
|
45
|
+
schemaVersion: number;
|
|
46
|
+
facts: Fact[];
|
|
47
|
+
}
|
|
48
|
+
export declare function validateFacts(v: unknown, file?: string): FactsFile;
|
|
49
|
+
export declare const CHECK_IDS: readonly ["typecheck", "unit", "integration", "e2e", "lint", "format", "build", "migrations", "security"];
|
|
50
|
+
export type CheckId = (typeof CHECK_IDS)[number];
|
|
51
|
+
export declare const REQUIRED_LEVELS: readonly ["yes", "context", "no"];
|
|
52
|
+
export interface CommandEntry {
|
|
53
|
+
id: CheckId;
|
|
54
|
+
available: boolean;
|
|
55
|
+
command: string | null;
|
|
56
|
+
required: (typeof REQUIRED_LEVELS)[number];
|
|
57
|
+
source: string | null;
|
|
58
|
+
/** 'repository-script' = defined by repo config (untrusted input); 'inferred' = guessed from tooling; 'user' = set by a human. */
|
|
59
|
+
origin: 'repository-script' | 'inferred' | 'user';
|
|
60
|
+
}
|
|
61
|
+
export interface CommandsFile {
|
|
62
|
+
schemaVersion: number;
|
|
63
|
+
checks: CommandEntry[];
|
|
64
|
+
trustNote: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function validateCommands(v: unknown, file?: string): CommandsFile;
|
|
67
|
+
export interface AnalysisState {
|
|
68
|
+
schemaVersion: number;
|
|
69
|
+
analyzedAt: string;
|
|
70
|
+
refreshedAt: string | null;
|
|
71
|
+
gitHead: string | null;
|
|
72
|
+
fileCount: number;
|
|
73
|
+
truncated: boolean;
|
|
74
|
+
discoveryHash: string;
|
|
75
|
+
}
|
|
76
|
+
export declare function validateAnalysisState(v: unknown, file?: string): AnalysisState;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Check } from './validate.js';
|
|
2
|
+
export const SCHEMA_VERSION = 1;
|
|
3
|
+
export const CONFIDENCE = ['HIGH', 'MEDIUM', 'LOW'];
|
|
4
|
+
export const FACT_STATUS = ['VERIFIED', 'DETECTED', 'INFERRED', 'USER_DECISION', 'UNKNOWN', 'STALE'];
|
|
5
|
+
export const SOURCE_TYPES = ['detector', 'file', 'git', 'user', 'ai'];
|
|
6
|
+
export const REVIEW_LEVELS = ['off', 'light', 'strict'];
|
|
7
|
+
export function validateProject(v, file = 'project.json') {
|
|
8
|
+
const c = new Check(file);
|
|
9
|
+
const o = c.obj(v);
|
|
10
|
+
c.at_('schemaVersion').int(o.schemaVersion, 1);
|
|
11
|
+
c.at_('projectId').str(o.projectId, { min: 8, max: 64 });
|
|
12
|
+
c.at_('name').str(o.name, { min: 1, max: 200 });
|
|
13
|
+
c.at_('createdAt').iso(o.createdAt);
|
|
14
|
+
c.at_('updatedAt').iso(o.updatedAt);
|
|
15
|
+
c.at_('devworkspaceVersion').str(o.devworkspaceVersion, { max: 40 });
|
|
16
|
+
const s = c.at_('settings').obj(o.settings);
|
|
17
|
+
c.at_('settings.review').oneOf(s.review, REVIEW_LEVELS);
|
|
18
|
+
c.at_('settings.maxFiles').int(s.maxFiles, 100);
|
|
19
|
+
const mf = c.at_('managedFiles').arr(o.managedFiles, 200);
|
|
20
|
+
mf.forEach((m, i) => {
|
|
21
|
+
const mc = c.at_(`managedFiles.${i}`);
|
|
22
|
+
const mo = mc.obj(m);
|
|
23
|
+
mc.at_('path').str(mo.path, { max: 240 });
|
|
24
|
+
mc.at_('mode').oneOf(mo.mode, ['owned', 'section']);
|
|
25
|
+
});
|
|
26
|
+
return o;
|
|
27
|
+
}
|
|
28
|
+
export function validateFacts(v, file = 'facts.json') {
|
|
29
|
+
const c = new Check(file);
|
|
30
|
+
const o = c.obj(v);
|
|
31
|
+
c.at_('schemaVersion').int(o.schemaVersion, 1);
|
|
32
|
+
const facts = c.at_('facts').arr(o.facts, 5000);
|
|
33
|
+
facts.forEach((f, i) => {
|
|
34
|
+
const fc = c.at_(`facts.${i}`);
|
|
35
|
+
const fo = fc.obj(f);
|
|
36
|
+
fc.at_('id').str(fo.id, { max: 64 });
|
|
37
|
+
fc.at_('key').str(fo.key, { min: 1, max: 100 });
|
|
38
|
+
fc.at_('value').str(fo.value, { max: 4000 });
|
|
39
|
+
fc.at_('source').str(fo.source, { max: 500 });
|
|
40
|
+
fc.at_('sourceType').oneOf(fo.sourceType, SOURCE_TYPES);
|
|
41
|
+
fc.at_('sources').strArr(fo.sources, 100);
|
|
42
|
+
fc.at_('sourceHashes').obj(fo.sourceHashes);
|
|
43
|
+
fc.at_('confidence').oneOf(fo.confidence, CONFIDENCE);
|
|
44
|
+
fc.at_('status').oneOf(fo.status, FACT_STATUS);
|
|
45
|
+
fc.at_('createdAt').iso(fo.createdAt);
|
|
46
|
+
fc.at_('updatedAt').iso(fo.updatedAt);
|
|
47
|
+
if (fo.lastVerifiedAt !== null)
|
|
48
|
+
fc.at_('lastVerifiedAt').iso(fo.lastVerifiedAt);
|
|
49
|
+
});
|
|
50
|
+
return o;
|
|
51
|
+
}
|
|
52
|
+
export const CHECK_IDS = ['typecheck', 'unit', 'integration', 'e2e', 'lint', 'format', 'build', 'migrations', 'security'];
|
|
53
|
+
export const REQUIRED_LEVELS = ['yes', 'context', 'no'];
|
|
54
|
+
export function validateCommands(v, file = 'commands.json') {
|
|
55
|
+
const c = new Check(file);
|
|
56
|
+
const o = c.obj(v);
|
|
57
|
+
c.at_('schemaVersion').int(o.schemaVersion, 1);
|
|
58
|
+
c.at_('trustNote').str(o.trustNote);
|
|
59
|
+
c.at_('checks')
|
|
60
|
+
.arr(o.checks, 100)
|
|
61
|
+
.forEach((e, i) => {
|
|
62
|
+
const ec = c.at_(`checks.${i}`);
|
|
63
|
+
const eo = ec.obj(e);
|
|
64
|
+
ec.at_('id').oneOf(eo.id, CHECK_IDS);
|
|
65
|
+
ec.at_('available').bool(eo.available);
|
|
66
|
+
if (eo.command !== null)
|
|
67
|
+
ec.at_('command').str(eo.command, { max: 500 });
|
|
68
|
+
ec.at_('required').oneOf(eo.required, REQUIRED_LEVELS);
|
|
69
|
+
ec.at_('origin').oneOf(eo.origin, ['repository-script', 'inferred', 'user']);
|
|
70
|
+
});
|
|
71
|
+
return o;
|
|
72
|
+
}
|
|
73
|
+
export function validateAnalysisState(v, file = 'analysis.json') {
|
|
74
|
+
const c = new Check(file);
|
|
75
|
+
const o = c.obj(v);
|
|
76
|
+
c.at_('schemaVersion').int(o.schemaVersion, 1);
|
|
77
|
+
c.at_('analyzedAt').iso(o.analyzedAt);
|
|
78
|
+
c.at_('fileCount').int(o.fileCount);
|
|
79
|
+
c.at_('truncated').bool(o.truncated);
|
|
80
|
+
c.at_('discoveryHash').str(o.discoveryHash, { max: 100 });
|
|
81
|
+
return o;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAC;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAC9G,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAU,CAAC;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAwBjE,MAAM,UAAU,eAAe,CAAC,CAAU,EAAE,IAAI,GAAG,cAAc;IAC/D,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC1D,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,OAAO,CAA6B,CAAC;AACvC,CAAC;AAuBD,MAAM,UAAU,aAAa,CAAC,CAAU,EAAE,IAAI,GAAG,YAAY;IAC3D,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACxD,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC5C,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACtD,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/C,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,cAAc,KAAK,IAAI;YAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,OAAO,CAAyB,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AAEnI,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAU,CAAC;AAkBjE,MAAM,UAAU,gBAAgB,CAAC,CAAU,EAAE,IAAI,GAAG,eAAe;IACjE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACrC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,OAAO,KAAK,IAAI;YAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACvD,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,mBAAmB,EAAE,UAAU,EAAE,MAAM,CAAU,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IACL,OAAO,CAA4B,CAAC;AACtC,CAAC;AAYD,MAAM,UAAU,qBAAqB,CAAC,CAAU,EAAE,IAAI,GAAG,eAAe;IACtE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,CAA6B,CAAC;AACvC,CAAC","sourcesContent":["import { Check } from './validate.js';\n\nexport const SCHEMA_VERSION = 1;\n\nexport const CONFIDENCE = ['HIGH', 'MEDIUM', 'LOW'] as const;\nexport const FACT_STATUS = ['VERIFIED', 'DETECTED', 'INFERRED', 'USER_DECISION', 'UNKNOWN', 'STALE'] as const;\nexport const SOURCE_TYPES = ['detector', 'file', 'git', 'user', 'ai'] as const;\nexport const REVIEW_LEVELS = ['off', 'light', 'strict'] as const;\n\nexport type Confidence = (typeof CONFIDENCE)[number];\nexport type FactStatus = (typeof FACT_STATUS)[number];\nexport type SourceType = (typeof SOURCE_TYPES)[number];\nexport type ReviewLevel = (typeof REVIEW_LEVELS)[number];\n\nexport interface ManagedFile {\n path: string;\n mode: 'owned' | 'section';\n agent?: string;\n}\n\nexport interface ProjectConfig {\n schemaVersion: number;\n projectId: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n devworkspaceVersion: string;\n settings: { review: ReviewLevel; maxFiles: number };\n managedFiles: ManagedFile[];\n}\n\nexport function validateProject(v: unknown, file = 'project.json'): ProjectConfig {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('projectId').str(o.projectId, { min: 8, max: 64 });\n c.at_('name').str(o.name, { min: 1, max: 200 });\n c.at_('createdAt').iso(o.createdAt);\n c.at_('updatedAt').iso(o.updatedAt);\n c.at_('devworkspaceVersion').str(o.devworkspaceVersion, { max: 40 });\n const s = c.at_('settings').obj(o.settings);\n c.at_('settings.review').oneOf(s.review, REVIEW_LEVELS);\n c.at_('settings.maxFiles').int(s.maxFiles, 100);\n const mf = c.at_('managedFiles').arr(o.managedFiles, 200);\n mf.forEach((m, i) => {\n const mc = c.at_(`managedFiles.${i}`);\n const mo = mc.obj(m);\n mc.at_('path').str(mo.path, { max: 240 });\n mc.at_('mode').oneOf(mo.mode, ['owned', 'section'] as const);\n });\n return o as unknown as ProjectConfig;\n}\n\nexport interface Fact {\n id: string;\n key: string;\n value: string;\n source: string;\n sourceType: SourceType;\n sources: string[];\n sourceHashes: Record<string, string>;\n confidence: Confidence;\n status: FactStatus;\n createdAt: string;\n updatedAt: string;\n lastVerifiedAt: string | null;\n staleReason?: string;\n}\n\nexport interface FactsFile {\n schemaVersion: number;\n facts: Fact[];\n}\n\nexport function validateFacts(v: unknown, file = 'facts.json'): FactsFile {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n const facts = c.at_('facts').arr(o.facts, 5000);\n facts.forEach((f, i) => {\n const fc = c.at_(`facts.${i}`);\n const fo = fc.obj(f);\n fc.at_('id').str(fo.id, { max: 64 });\n fc.at_('key').str(fo.key, { min: 1, max: 100 });\n fc.at_('value').str(fo.value, { max: 4000 });\n fc.at_('source').str(fo.source, { max: 500 });\n fc.at_('sourceType').oneOf(fo.sourceType, SOURCE_TYPES);\n fc.at_('sources').strArr(fo.sources, 100);\n fc.at_('sourceHashes').obj(fo.sourceHashes);\n fc.at_('confidence').oneOf(fo.confidence, CONFIDENCE);\n fc.at_('status').oneOf(fo.status, FACT_STATUS);\n fc.at_('createdAt').iso(fo.createdAt);\n fc.at_('updatedAt').iso(fo.updatedAt);\n if (fo.lastVerifiedAt !== null) fc.at_('lastVerifiedAt').iso(fo.lastVerifiedAt);\n });\n return o as unknown as FactsFile;\n}\n\nexport const CHECK_IDS = ['typecheck', 'unit', 'integration', 'e2e', 'lint', 'format', 'build', 'migrations', 'security'] as const;\nexport type CheckId = (typeof CHECK_IDS)[number];\nexport const REQUIRED_LEVELS = ['yes', 'context', 'no'] as const;\n\nexport interface CommandEntry {\n id: CheckId;\n available: boolean;\n command: string | null;\n required: (typeof REQUIRED_LEVELS)[number];\n source: string | null;\n /** 'repository-script' = defined by repo config (untrusted input); 'inferred' = guessed from tooling; 'user' = set by a human. */\n origin: 'repository-script' | 'inferred' | 'user';\n}\n\nexport interface CommandsFile {\n schemaVersion: number;\n checks: CommandEntry[];\n trustNote: string;\n}\n\nexport function validateCommands(v: unknown, file = 'commands.json'): CommandsFile {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('trustNote').str(o.trustNote);\n c.at_('checks')\n .arr(o.checks, 100)\n .forEach((e, i) => {\n const ec = c.at_(`checks.${i}`);\n const eo = ec.obj(e);\n ec.at_('id').oneOf(eo.id, CHECK_IDS);\n ec.at_('available').bool(eo.available);\n if (eo.command !== null) ec.at_('command').str(eo.command, { max: 500 });\n ec.at_('required').oneOf(eo.required, REQUIRED_LEVELS);\n ec.at_('origin').oneOf(eo.origin, ['repository-script', 'inferred', 'user'] as const);\n });\n return o as unknown as CommandsFile;\n}\n\nexport interface AnalysisState {\n schemaVersion: number;\n analyzedAt: string;\n refreshedAt: string | null;\n gitHead: string | null;\n fileCount: number;\n truncated: boolean;\n discoveryHash: string;\n}\n\nexport function validateAnalysisState(v: unknown, file = 'analysis.json'): AnalysisState {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('analyzedAt').iso(o.analyzedAt);\n c.at_('fileCount').int(o.fileCount);\n c.at_('truncated').bool(o.truncated);\n c.at_('discoveryHash').str(o.discoveryHash, { max: 100 });\n return o as unknown as AnalysisState;\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Minimal runtime validation helpers. Validators return the input so unknown fields survive round-trips. */
|
|
2
|
+
export declare class Check {
|
|
3
|
+
private readonly file;
|
|
4
|
+
private readonly at;
|
|
5
|
+
constructor(file: string, at?: string);
|
|
6
|
+
private fail;
|
|
7
|
+
at_(key: string | number): Check;
|
|
8
|
+
obj(v: unknown): Record<string, unknown>;
|
|
9
|
+
str(v: unknown, opts?: {
|
|
10
|
+
max?: number;
|
|
11
|
+
min?: number;
|
|
12
|
+
}): string;
|
|
13
|
+
optStr(v: unknown, max?: number): string | undefined;
|
|
14
|
+
num(v: unknown): number;
|
|
15
|
+
int(v: unknown, min?: number): number;
|
|
16
|
+
bool(v: unknown): boolean;
|
|
17
|
+
oneOf<T extends string>(v: unknown, allowed: readonly T[]): T;
|
|
18
|
+
iso(v: unknown): string;
|
|
19
|
+
arr(v: unknown, max?: number): unknown[];
|
|
20
|
+
strArr(v: unknown, max?: number): string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function isRecord(v: unknown): v is Record<string, unknown>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { DevWorkspaceError } from '../errors/index.js';
|
|
2
|
+
/** Minimal runtime validation helpers. Validators return the input so unknown fields survive round-trips. */
|
|
3
|
+
export class Check {
|
|
4
|
+
file;
|
|
5
|
+
at;
|
|
6
|
+
constructor(file, at = '$') {
|
|
7
|
+
this.file = file;
|
|
8
|
+
this.at = at;
|
|
9
|
+
}
|
|
10
|
+
fail(msg) {
|
|
11
|
+
throw new DevWorkspaceError('SCHEMA', `Invalid ${this.file}: ${this.at} ${msg}.`, {
|
|
12
|
+
hint: 'Fix the field by hand, restore the file from Git, or recreate it with the matching devworkspace command.',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
at_(key) {
|
|
16
|
+
return new Check(this.file, `${this.at}.${key}`);
|
|
17
|
+
}
|
|
18
|
+
obj(v) {
|
|
19
|
+
if (typeof v !== 'object' || v === null || Array.isArray(v))
|
|
20
|
+
this.fail('must be an object');
|
|
21
|
+
return v;
|
|
22
|
+
}
|
|
23
|
+
str(v, opts = {}) {
|
|
24
|
+
if (typeof v !== 'string')
|
|
25
|
+
this.fail('must be a string');
|
|
26
|
+
if (opts.min !== undefined && v.length < opts.min)
|
|
27
|
+
this.fail(`must be at least ${opts.min} characters`);
|
|
28
|
+
if (v.length > (opts.max ?? 10_000))
|
|
29
|
+
this.fail(`is too long (max ${opts.max ?? 10_000})`);
|
|
30
|
+
return v;
|
|
31
|
+
}
|
|
32
|
+
optStr(v, max) {
|
|
33
|
+
return v === undefined || v === null ? undefined : this.str(v, { max });
|
|
34
|
+
}
|
|
35
|
+
num(v) {
|
|
36
|
+
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
37
|
+
this.fail('must be a number');
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
int(v, min = 0) {
|
|
41
|
+
const n = this.num(v);
|
|
42
|
+
if (!Number.isInteger(n) || n < min)
|
|
43
|
+
this.fail(`must be an integer >= ${min}`);
|
|
44
|
+
return n;
|
|
45
|
+
}
|
|
46
|
+
bool(v) {
|
|
47
|
+
if (typeof v !== 'boolean')
|
|
48
|
+
this.fail('must be a boolean');
|
|
49
|
+
return v;
|
|
50
|
+
}
|
|
51
|
+
oneOf(v, allowed) {
|
|
52
|
+
if (typeof v !== 'string' || !allowed.includes(v))
|
|
53
|
+
this.fail(`must be one of ${allowed.join(', ')}`);
|
|
54
|
+
return v;
|
|
55
|
+
}
|
|
56
|
+
iso(v) {
|
|
57
|
+
const s = this.str(v, { max: 40 });
|
|
58
|
+
if (Number.isNaN(Date.parse(s)))
|
|
59
|
+
this.fail('must be an ISO date string');
|
|
60
|
+
return s;
|
|
61
|
+
}
|
|
62
|
+
arr(v, max = 10_000) {
|
|
63
|
+
if (!Array.isArray(v))
|
|
64
|
+
this.fail('must be an array');
|
|
65
|
+
if (v.length > max)
|
|
66
|
+
this.fail(`has too many items (max ${max})`);
|
|
67
|
+
return v;
|
|
68
|
+
}
|
|
69
|
+
strArr(v, max = 1000) {
|
|
70
|
+
return this.arr(v, max).map((x, i) => this.at_(i).str(x));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function isRecord(v) {
|
|
74
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/config/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import { DevWorkspaceError } from '../errors/index.js';\n\n/** Minimal runtime validation helpers. Validators return the input so unknown fields survive round-trips. */\nexport class Check {\n constructor(\n private readonly file: string,\n private readonly at: string = '$',\n ) {}\n\n private fail(msg: string): never {\n throw new DevWorkspaceError('SCHEMA', `Invalid ${this.file}: ${this.at} ${msg}.`, {\n hint: 'Fix the field by hand, restore the file from Git, or recreate it with the matching devworkspace command.',\n });\n }\n\n at_(key: string | number): Check {\n return new Check(this.file, `${this.at}.${key}`);\n }\n\n obj(v: unknown): Record<string, unknown> {\n if (typeof v !== 'object' || v === null || Array.isArray(v)) this.fail('must be an object');\n return v as Record<string, unknown>;\n }\n\n str(v: unknown, opts: { max?: number; min?: number } = {}): string {\n if (typeof v !== 'string') this.fail('must be a string');\n if (opts.min !== undefined && v.length < opts.min) this.fail(`must be at least ${opts.min} characters`);\n if (v.length > (opts.max ?? 10_000)) this.fail(`is too long (max ${opts.max ?? 10_000})`);\n return v;\n }\n\n optStr(v: unknown, max?: number): string | undefined {\n return v === undefined || v === null ? undefined : this.str(v, { max });\n }\n\n num(v: unknown): number {\n if (typeof v !== 'number' || !Number.isFinite(v)) this.fail('must be a number');\n return v;\n }\n\n int(v: unknown, min = 0): number {\n const n = this.num(v);\n if (!Number.isInteger(n) || n < min) this.fail(`must be an integer >= ${min}`);\n return n;\n }\n\n bool(v: unknown): boolean {\n if (typeof v !== 'boolean') this.fail('must be a boolean');\n return v;\n }\n\n oneOf<T extends string>(v: unknown, allowed: readonly T[]): T {\n if (typeof v !== 'string' || !allowed.includes(v as T)) this.fail(`must be one of ${allowed.join(', ')}`);\n return v as T;\n }\n\n iso(v: unknown): string {\n const s = this.str(v, { max: 40 });\n if (Number.isNaN(Date.parse(s))) this.fail('must be an ISO date string');\n return s;\n }\n\n arr(v: unknown, max = 10_000): unknown[] {\n if (!Array.isArray(v)) this.fail('must be an array');\n if (v.length > max) this.fail(`has too many items (max ${max})`);\n return v;\n }\n\n strArr(v: unknown, max = 1000): string[] {\n return this.arr(v, max).map((x, i) => this.at_(i).str(x));\n }\n}\n\nexport function isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface Migration {
|
|
2
|
+
from: number;
|
|
3
|
+
to: number;
|
|
4
|
+
migrate(data: Record<string, unknown>): Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
/** Registered migrations per file kind. Schema v1 is the first release, so none exist yet. */
|
|
7
|
+
export declare const MIGRATIONS: Record<string, Migration[]>;
|
|
8
|
+
export interface MigrationResult {
|
|
9
|
+
data: Record<string, unknown>;
|
|
10
|
+
from: number;
|
|
11
|
+
to: number;
|
|
12
|
+
migrated: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Pure, in-memory migration. Refuses data written by a newer schema so unknown future data is never mangled. */
|
|
15
|
+
export declare function migrateData(data: unknown, current: number, migrations: Migration[], label?: string): MigrationResult;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DevWorkspaceError } from '../errors/index.js';
|
|
2
|
+
/** Registered migrations per file kind. Schema v1 is the first release, so none exist yet. */
|
|
3
|
+
export const MIGRATIONS = {};
|
|
4
|
+
/** Pure, in-memory migration. Refuses data written by a newer schema so unknown future data is never mangled. */
|
|
5
|
+
export function migrateData(data, current, migrations, label = 'data') {
|
|
6
|
+
if (typeof data !== 'object' || data === null || Array.isArray(data)) {
|
|
7
|
+
throw new DevWorkspaceError('SCHEMA', `${label} is not a JSON object.`);
|
|
8
|
+
}
|
|
9
|
+
let obj = data;
|
|
10
|
+
const from = obj.schemaVersion;
|
|
11
|
+
if (typeof from !== 'number' || !Number.isInteger(from) || from < 1) {
|
|
12
|
+
throw new DevWorkspaceError('SCHEMA', `${label} has no valid schemaVersion.`, {
|
|
13
|
+
hint: 'Persistent DevWorkspace files must carry a numeric schemaVersion.',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
if (from > current) {
|
|
17
|
+
throw new DevWorkspaceError('SCHEMA_TOO_NEW', `${label} uses schema v${from}, but this DevWorkspace understands up to v${current}.`, {
|
|
18
|
+
hint: 'Upgrade DevWorkspace (npm install -g devworkspace@latest). The file was left untouched.',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
let version = from;
|
|
22
|
+
while (version < current) {
|
|
23
|
+
const step = migrations.find((m) => m.from === version);
|
|
24
|
+
if (!step) {
|
|
25
|
+
throw new DevWorkspaceError('SCHEMA', `No migration path for ${label} from schema v${version} to v${current}.`, {
|
|
26
|
+
hint: 'Install a DevWorkspace release that includes this migration.',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
obj = { ...step.migrate({ ...obj }), schemaVersion: step.to };
|
|
30
|
+
version = step.to;
|
|
31
|
+
}
|
|
32
|
+
return { data: obj, from, to: version, migrated: version !== from };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAQvD,8FAA8F;AAC9F,MAAM,CAAC,MAAM,UAAU,GAAgC,EAAE,CAAC;AAS1D,iHAAiH;AACjH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,OAAe,EAAE,UAAuB,EAAE,KAAK,GAAG,MAAM;IACjG,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,GAAG,KAAK,wBAAwB,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,GAAG,GAAG,IAA+B,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC;IAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,GAAG,KAAK,8BAA8B,EAAE;YAC5E,IAAI,EAAE,mEAAmE;SAC1E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,GAAG,KAAK,iBAAiB,IAAI,8CAA8C,OAAO,GAAG,EAAE;YACnI,IAAI,EAAE,yFAAyF;SAChG,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,GAAG,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,yBAAyB,KAAK,iBAAiB,OAAO,QAAQ,OAAO,GAAG,EAAE;gBAC9G,IAAI,EAAE,8DAA8D;aACrE,CAAC,CAAC;QACL,CAAC;QACD,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9D,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;AACtE,CAAC","sourcesContent":["import { DevWorkspaceError } from '../errors/index.js';\n\nexport interface Migration {\n from: number;\n to: number;\n migrate(data: Record<string, unknown>): Record<string, unknown>;\n}\n\n/** Registered migrations per file kind. Schema v1 is the first release, so none exist yet. */\nexport const MIGRATIONS: Record<string, Migration[]> = {};\n\nexport interface MigrationResult {\n data: Record<string, unknown>;\n from: number;\n to: number;\n migrated: boolean;\n}\n\n/** Pure, in-memory migration. Refuses data written by a newer schema so unknown future data is never mangled. */\nexport function migrateData(data: unknown, current: number, migrations: Migration[], label = 'data'): MigrationResult {\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new DevWorkspaceError('SCHEMA', `${label} is not a JSON object.`);\n }\n let obj = data as Record<string, unknown>;\n const from = obj.schemaVersion;\n if (typeof from !== 'number' || !Number.isInteger(from) || from < 1) {\n throw new DevWorkspaceError('SCHEMA', `${label} has no valid schemaVersion.`, {\n hint: 'Persistent DevWorkspace files must carry a numeric schemaVersion.',\n });\n }\n if (from > current) {\n throw new DevWorkspaceError('SCHEMA_TOO_NEW', `${label} uses schema v${from}, but this DevWorkspace understands up to v${current}.`, {\n hint: 'Upgrade DevWorkspace (npm install -g devworkspace@latest). The file was left untouched.',\n });\n }\n let version = from;\n while (version < current) {\n const step = migrations.find((m) => m.from === version);\n if (!step) {\n throw new DevWorkspaceError('SCHEMA', `No migration path for ${label} from schema v${version} to v${current}.`, {\n hint: 'Install a DevWorkspace release that includes this migration.',\n });\n }\n obj = { ...step.migrate({ ...obj }), schemaVersion: step.to };\n version = step.to;\n }\n return { data: obj, from, to: version, migrated: version !== from };\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
let cached;
|
|
3
|
+
/** The package version, read from package.json so the CLI and the package can never drift apart. */
|
|
4
|
+
export function packageVersion() {
|
|
5
|
+
if (cached)
|
|
6
|
+
return cached;
|
|
7
|
+
const url = new URL('../../package.json', import.meta.url);
|
|
8
|
+
const pkg = JSON.parse(readFileSync(url, 'utf8'));
|
|
9
|
+
cached = pkg.version;
|
|
10
|
+
return cached;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,IAAI,MAA0B,CAAC;AAE/B,oGAAoG;AACpG,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAwB,CAAC;IACzE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { readFileSync } from 'node:fs';\n\nlet cached: string | undefined;\n\n/** The package version, read from package.json so the CLI and the package can never drift apart. */\nexport function packageVersion(): string {\n if (cached) return cached;\n const url = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(url, 'utf8')) as { version: string };\n cached = pkg.version;\n return cached;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Migration } from './migrations.js';
|
|
2
|
+
import { type Ws } from './workspace.js';
|
|
3
|
+
export interface VersionedRead<T> {
|
|
4
|
+
data: T;
|
|
5
|
+
from: number;
|
|
6
|
+
migrated: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Read a schema-versioned JSON file, migrating in memory when it is older than the CLI's schema. */
|
|
9
|
+
export declare function readVersioned<T>(file: string, kind: string, current: number, validate: (v: unknown, file: string) => T, migrations?: Migration[]): Promise<VersionedRead<T>>;
|
|
10
|
+
/** Write a versioned file atomically, backing up the previous file first when its schema version differs. */
|
|
11
|
+
export declare function writeVersioned(ws: Ws, file: string, data: {
|
|
12
|
+
schemaVersion: number;
|
|
13
|
+
}, backupStamp?: string): Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { atomicWriteJson, readJsonFile } from '../utils/fs.js';
|
|
2
|
+
import { MIGRATIONS, migrateData } from './migrations.js';
|
|
3
|
+
import { backupIfVersionChanges } from './workspace.js';
|
|
4
|
+
/** Read a schema-versioned JSON file, migrating in memory when it is older than the CLI's schema. */
|
|
5
|
+
export async function readVersioned(file, kind, current, validate, migrations = MIGRATIONS[kind] ?? []) {
|
|
6
|
+
const raw = await readJsonFile(file);
|
|
7
|
+
const label = file.split(/[\\/]/).slice(-2).join('/');
|
|
8
|
+
const r = migrateData(raw, current, migrations, label);
|
|
9
|
+
return { data: validate(r.data, label), from: r.from, migrated: r.migrated };
|
|
10
|
+
}
|
|
11
|
+
/** Write a versioned file atomically, backing up the previous file first when its schema version differs. */
|
|
12
|
+
export async function writeVersioned(ws, file, data, backupStamp) {
|
|
13
|
+
await backupIfVersionChanges(ws, file, data.schemaVersion, backupStamp);
|
|
14
|
+
await atomicWriteJson(file, data);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=versioned.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioned.js","sourceRoot":"","sources":["../../src/core/versioned.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAW,MAAM,gBAAgB,CAAC;AAQjE,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,QAAyC,EACzC,aAA0B,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;IAEhD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC/E,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAM,EAAE,IAAY,EAAE,IAA+B,EAAE,WAAoB;IAC9G,MAAM,sBAAsB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import { atomicWriteJson, readJsonFile } from '../utils/fs.js';\nimport { MIGRATIONS, migrateData, type Migration } from './migrations.js';\nimport { backupIfVersionChanges, type Ws } from './workspace.js';\n\nexport interface VersionedRead<T> {\n data: T;\n from: number;\n migrated: boolean;\n}\n\n/** Read a schema-versioned JSON file, migrating in memory when it is older than the CLI's schema. */\nexport async function readVersioned<T>(\n file: string,\n kind: string,\n current: number,\n validate: (v: unknown, file: string) => T,\n migrations: Migration[] = MIGRATIONS[kind] ?? [],\n): Promise<VersionedRead<T>> {\n const raw = await readJsonFile(file);\n const label = file.split(/[\\\\/]/).slice(-2).join('/');\n const r = migrateData(raw, current, migrations, label);\n return { data: validate(r.data, label), from: r.from, migrated: r.migrated };\n}\n\n/** Write a versioned file atomically, backing up the previous file first when its schema version differs. */\nexport async function writeVersioned(ws: Ws, file: string, data: { schemaVersion: number }, backupStamp?: string): Promise<void> {\n await backupIfVersionChanges(ws, file, data.schemaVersion, backupStamp);\n await atomicWriteJson(file, data);\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ProjectConfig } from '../config/schemas.js';
|
|
2
|
+
import { type Migration } from './migrations.js';
|
|
3
|
+
export declare const WORKSPACE_DIR = ".devworkspace";
|
|
4
|
+
export interface Ws {
|
|
5
|
+
root: string;
|
|
6
|
+
dir: string;
|
|
7
|
+
projectJson: string;
|
|
8
|
+
contextDir: string;
|
|
9
|
+
facts: string;
|
|
10
|
+
commands: string;
|
|
11
|
+
decisionsDir: string;
|
|
12
|
+
tasksActive: string;
|
|
13
|
+
tasksCompleted: string;
|
|
14
|
+
sessionsDir: string;
|
|
15
|
+
analysisDir: string;
|
|
16
|
+
discovery: string;
|
|
17
|
+
onboardingPrompt: string;
|
|
18
|
+
refreshPrompt: string;
|
|
19
|
+
stateDir: string;
|
|
20
|
+
analysisState: string;
|
|
21
|
+
localDir: string;
|
|
22
|
+
integrationsState: string;
|
|
23
|
+
backupsDir: string;
|
|
24
|
+
gitignore: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function wsPaths(root: string): Ws;
|
|
27
|
+
/** Walk upward from start looking for an initialised workspace. The workspace location is never stored in it. */
|
|
28
|
+
export declare function findWorkspaceRoot(start: string): Promise<string | null>;
|
|
29
|
+
export declare function requireWorkspace(cwd: string): Promise<Ws>;
|
|
30
|
+
export declare function loadProject(ws: Ws, migrations?: Migration[]): Promise<ProjectConfig>;
|
|
31
|
+
export declare function saveProject(ws: Ws, cfg: ProjectConfig): Promise<void>;
|
|
32
|
+
/** Before a write that upgrades a file's schemaVersion on disk, keep a copy of the old file. */
|
|
33
|
+
export declare function backupIfVersionChanges(ws: Ws, file: string, newVersion: number, stamp?: string): Promise<string | null>;
|
|
34
|
+
export declare const LOCAL_GITIGNORE: string;
|