oreshnik-cli 0.1.0 → 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/dist/cli.js +14 -4
- package/dist/cli.js.map +1 -1
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/git.service.ts","../src/types/index.ts","../src/core/zone-engine.ts","../src/core/state-manager.ts","../src/core/canonical.service.ts","../src/core/sync.service.ts","../src/core/vault-guard.ts","../src/core/portfolio.service.ts","../src/types/schemas.ts","../src/core/notes-ingestion.service.ts","../src/core/injection.service.ts","../src/utils/helpers.ts","../src/core/evidence-gate.service.ts","../src/core/bootstrap.service.ts","../src/core/dashboard.service.ts","../src/core/lock.service.ts","../src/core/zone-check.service.ts","../src/core/audit.service.ts","../src/utils/logger.ts","../src/utils/exec.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\r\nimport { ok, err } from \"../types/index.js\";\r\nimport type {\r\n Result,\r\n GitError,\r\n MotherRef,\r\n MergeOptions,\r\n PorcelainEntry,\r\n} from \"../types/index.js\";\r\n\r\nexport class GitService {\r\n constructor(private readonly cwd: string) {}\r\n\r\n exec(args: string[]): { ok: boolean; output: string; error: string; status: number } {\r\n const result = spawnSync(\"git\", args, { cwd: this.cwd, encoding: \"utf8\", timeout: 30000 });\r\n return {\r\n ok: result.status === 0,\r\n output: (result.stdout || \"\").trim(),\r\n error: (result.stderr || \"\").trim(),\r\n status: result.status ?? 1,\r\n };\r\n }\r\n\r\n private fail(message: string, args: string[], stderr?: string): GitError {\r\n return {\r\n code: \"GIT_ERROR\",\r\n message,\r\n exitCode: 1,\r\n gitCommand: `git ${args.join(\" \")}`,\r\n gitStderr: stderr,\r\n };\r\n }\r\n\r\n // Read Operations\n\r\n currentBranch(): Result<string, GitError> {\r\n const r = this.exec([\"branch\", \"--show-current\"]);\r\n if (!r.ok) return err(this.fail(\"Failed to get current branch\", [\"branch\", \"--show-current\"], r.error));\r\n return ok(r.output || \"DETACHED\");\r\n }\r\n\r\n refExists(ref: string): boolean {\r\n return this.exec([\"rev-parse\", \"--verify\", ref]).ok;\r\n }\r\n\r\n resolveRef(ref: string): Result<string, GitError> {\r\n const r = this.exec([\"rev-parse\", \"--verify\", ref]);\r\n if (!r.ok) return err(this.fail(`Ref not found: ${ref}`, [\"rev-parse\", \"--verify\", ref], r.error));\r\n return ok(r.output);\r\n }\r\n\r\n statusPorcelain(): Result<PorcelainEntry[], GitError> {\r\n const r = this.exec([\"status\", \"--porcelain\"]);\r\n if (!r.ok) return err(this.fail(\"Failed to get working tree status\", [\"status\", \"--porcelain\"], r.error));\r\n const lines = r.output.split(/\\r?\\n/).filter(Boolean);\r\n const entries: PorcelainEntry[] = lines.map((line) => ({\r\n status: line.slice(0, 2).trim(),\r\n path: line.slice(3).replace(/^.* -> /, \"\"),\r\n }));\r\n return ok(entries);\r\n }\r\n\r\n fetch(remote = \"origin\"): Result<void, GitError> {\r\n const r = this.exec([\"fetch\", remote, \"--prune\", \"--quiet\"]);\r\n if (!r.ok) return err(this.fail(`Failed to fetch from ${remote}`, [\"fetch\", remote, \"--prune\"], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n getMergeBase(a: string, b: string): Result<string, GitError> {\r\n const r = this.exec([\"merge-base\", a, b]);\r\n if (!r.ok) return err(this.fail(`No merge base between ${a} and ${b}`, [\"merge-base\", a, b], r.error));\r\n return ok(r.output);\r\n }\r\n\r\n discoverLatestMother(prefix = \"MADRE\"): Result<MotherRef | null, GitError> {\r\n const r = this.exec([\r\n \"for-each-ref\",\r\n \"--format=%(refname:short)\",\r\n `refs/heads/${prefix}`,\r\n `refs/remotes/origin/${prefix}`,\r\n ]);\r\n if (!r.ok) {\r\n return err(this.fail(`Failed to discover latest ${prefix} branch`, [\r\n \"for-each-ref\",\r\n \"--format=%(refname:short)\",\r\n `refs/heads/${prefix}`,\r\n `refs/remotes/origin/${prefix}`,\r\n ], r.error));\r\n }\r\n\r\n const refs = r.output.split(/\\r?\\n/).filter(Boolean).map((ref) => ({\r\n name: ref.replace(/^origin\\//, \"\"),\r\n remote: ref.startsWith(\"origin/\"),\r\n }));\r\n\r\n const latest = refs\r\n .map((ref) => {\r\n const v = Number(ref.name.match(new RegExp(`^${prefix}/v(\\\\d+)`, \"i\"))?.[1] || 0);\r\n return { ...ref, version: v };\r\n })\r\n .filter((item) => item.version > 0)\r\n .sort((a, b) => b.version - a.version || a.name.localeCompare(b.name))[0] || null;\r\n\r\n if (!latest) return ok(null);\r\n return ok({ name: latest.name, version: latest.version, remote: latest.remote });\r\n }\r\n\r\n diffNames(base: string, target: string, paths?: string[]): Result<string[], GitError> {\n const args = [\"diff\", \"--name-only\", `${base}...${target}`];\n if (paths) args.push(\"--\", ...paths);\n const r = this.exec(args);\n if (!r.ok) return err(this.fail(`Failed to diff ${base}...${target}`, args, r.error));\n return ok(r.output.split(/\\r?\\n/).filter(Boolean));\n }\n\n unmergedFiles(): Result<string[], GitError> {\n const args = [\"diff\", \"--name-only\", \"--diff-filter=U\"];\n const r = this.exec(args);\n if (!r.ok) return err(this.fail(\"Failed to inspect unmerged files\", args, r.error));\n return ok(r.output.split(/\\r?\\n/).filter(Boolean));\n }\n\r\n showRef(ref: string, file: string): Result<string | null, GitError> {\r\n const r = this.exec([\"show\", `${ref}:${file}`]);\r\n if (!r.ok) return ok(null);\r\n return ok(r.output);\r\n }\r\n\r\n // Write Operations\n\r\n createBranch(name: string, from?: string): Result<void, GitError> {\r\n const args = [\"checkout\", \"-b\", name];\r\n if (from) args.push(from);\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to create branch ${name}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n checkout(branch: string): Result<void, GitError> {\r\n const r = this.exec([\"checkout\", branch]);\r\n if (!r.ok) return err(this.fail(`Failed to checkout ${branch}`, [\"checkout\", branch], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n merge(ref: string, options?: MergeOptions): Result<void, GitError> {\r\n const args = [\"merge\"];\r\n if (options?.noCommit) args.push(\"--no-commit\");\r\n if (options?.noFF) args.push(\"--no-ff\");\r\n if (options?.strategy) args.push(\"--strategy\", options.strategy);\r\n if (options?.message) args.push(\"-m\", options.message);\r\n args.push(ref);\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to merge ${ref}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n push(remote: string, branch: string, force = false): Result<void, GitError> {\r\n const args = [\"push\", remote, branch];\r\n if (force) args.push(\"--force\");\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to push ${branch} to ${remote}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n pushTag(remote: string, tag: string): Result<void, GitError> {\r\n const args = [\"push\", remote, tag];\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to push tag ${tag} to ${remote}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n stage(files: string[]): Result<void, GitError> {\r\n const r = this.exec([\"add\", \"--\", ...files]);\r\n if (!r.ok) return err(this.fail(\"Failed to stage files\", [\"add\", ...files], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n commit(message: string): Result<void, GitError> {\r\n const r = this.exec([\"commit\", \"-m\", message]);\r\n if (!r.ok) return err(this.fail(\"Failed to commit\", [\"commit\", \"-m\", message], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n createTag(name: string, message: string): Result<void, GitError> {\r\n const r = this.exec([\"tag\", \"-a\", name, \"-m\", message]);\r\n if (!r.ok) return err(this.fail(`Failed to create tag ${name}`, [\"tag\", \"-a\", name, \"-m\", message], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n deleteTag(name: string): Result<void, GitError> {\r\n const r = this.exec([\"tag\", \"-d\", name]);\r\n if (!r.ok) return err(this.fail(`Failed to delete tag ${name}`, [\"tag\", \"-d\", name], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n // Destructive Operations\n\r\n resetHard(ref: string): Result<void, GitError> {\r\n const r = this.exec([\"reset\", \"--hard\", ref]);\r\n if (!r.ok) return err(this.fail(`Failed to reset to ${ref}`, [\"reset\", \"--hard\", ref], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n deleteBranch(branch: string, force = false): Result<void, GitError> {\r\n const args = [\"branch\", \"-d\", branch];\r\n if (force) args.splice(1, 0, \"-D\");\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to delete branch ${branch}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n stashPush(message?: string): Result<string | null, GitError> {\r\n const args = [\"stash\", \"push\"];\r\n if (message) args.push(\"-m\", message);\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(\"Failed to stash\", args, r.error));\r\n return ok(r.output || null);\r\n }\r\n\r\n stashPop(): Result<void, GitError> {\r\n const r = this.exec([\"stash\", \"pop\"]);\r\n if (!r.ok) return err(this.fail(\"Failed to pop stash\", [\"stash\", \"pop\"], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n // Lock Operations (remote git locks)\n\r\n pushLockRef(zone: string, _lockContent: string): Result<void, GitError> {\r\n return err(this.fail(`Remote lock acquisition is not implemented for ${zone}`, [\"push\", \"origin\", `refs/oreshnik/locks/${zone}`]));\r\n }\r\n\r\n deleteLockRef(zone: string): Result<void, GitError> {\r\n return err(this.fail(`Remote lock release is not implemented for ${zone}`, [\"push\", \"origin\", \"--delete\", `refs/oreshnik/locks/${zone}`]));\r\n }\r\n\r\n fetchLockRefs(): Result<string[], GitError> {\r\n return err(this.fail(\"Remote lock listing is not implemented\", [\"for-each-ref\", \"refs/remotes/origin/oreshnik/locks/\"]));\r\n }\r\n\r\n getLockContent(ref: string): Result<string | null, GitError> {\r\n return err(this.fail(`Remote lock content is not implemented for ${ref}`, [\"show\", ref]));\r\n }\r\n\r\n // Cherry-pick (for sync)\n\r\n cherryPick(commit: string): Result<void, GitError> {\r\n const r = this.exec([\"cherry-pick\", commit]);\r\n if (!r.ok) return err(this.fail(`Failed to cherry-pick ${commit}`, [\"cherry-pick\", commit], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n restoreFromHead(pattern: string): Result<void, GitError> {\r\n const r = this.exec([\"checkout\", \"HEAD\", \"--\", pattern]);\r\n if (!r.ok) return err(this.fail(`Failed to restore ${pattern} from HEAD`, [\"checkout\", \"HEAD\", \"--\", pattern], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n // Utility\n\r\n userConfig(key: string): Result<string, GitError> {\r\n const r = this.exec([\"config\", key]);\r\n if (!r.ok) return err(this.fail(`Git config ${key} not set`, [\"config\", key]));\r\n return ok(r.output);\r\n }\r\n\r\n mergeFileUnion(currentFile: string, baseFile: string, sourceFile: string): Result<string, GitError> {\r\n const r = spawnSync(\"git\", [\"merge-file\", \"--union\", \"-p\", currentFile, baseFile, sourceFile], {\r\n cwd: this.cwd,\r\n encoding: \"utf8\",\r\n timeout: 10000,\r\n });\r\n if (r.status !== 0) {\r\n return err(this.fail(\"Failed to merge file with union strategy\", [\"merge-file\", \"--union\", \"-p\", currentFile, baseFile, sourceFile], r.stderr || \"\"));\r\n }\r\n return ok((r.stdout || \"\").trim());\r\n }\r\n}\r\n\r\nexport function createGitService(cwd: string): GitService {\r\n return new GitService(cwd);\r\n}\r\n\r\n","import type { z } from \"zod\";\r\n\r\n// Result Type\n\r\nexport type Result<T, E = OreshnikError> =\r\n | { ok: true; value: T }\r\n | { ok: false; error: E };\r\n\r\nexport interface OreshnikError {\r\n code: string;\r\n message: string;\r\n exitCode: number;\r\n suggestion?: string;\r\n}\r\n\r\nexport function ok<T>(value: T): Result<T, never> {\r\n return { ok: true, value };\r\n}\r\n\r\nexport function err<E extends OreshnikError>(error: E): Result<never, E> {\r\n return { ok: false, error };\r\n}\r\n\r\n// Git\n\r\nexport interface PorcelainEntry {\r\n status: string;\r\n path: string;\r\n}\r\n\r\nexport interface MergeOptions {\r\n noCommit?: boolean;\r\n noFF?: boolean;\r\n strategy?: \"union\" | \"ort\" | \"recursive\";\r\n message?: string;\r\n}\r\n\r\nexport interface MotherRef {\r\n name: string;\r\n version: number;\r\n remote: boolean;\r\n}\r\n\r\nexport interface GitError extends OreshnikError {\r\n code: \"GIT_ERROR\";\r\n gitCommand?: string;\r\n gitStderr?: string;\r\n}\r\n\r\n// Task Board\n\r\nexport type TaskStatus = \"ready\" | \"active\" | \"pending\" | \"blocked\" | \"done\" | \"rolled_back\";\r\n\r\nexport interface Task {\r\n id: string;\r\n title: string;\r\n owner: string;\r\n backupOwner?: string;\r\n status: TaskStatus;\r\n track?: string;\r\n zone?: string[];\r\n dependsOn?: string[];\r\n acceptance?: string[];\r\n handoff?: string;\r\n history?: TaskHistoryEntry[];\r\n}\r\n\r\nexport interface TaskHistoryEntry {\r\n at: string;\r\n action: string;\r\n operator?: string;\r\n from?: string;\r\n to?: string;\r\n reason?: string;\r\n branch?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface Reassignment {\r\n at: string;\r\n task: string;\r\n from: string;\r\n to: string;\r\n reason: string;\r\n}\r\n\r\nexport interface TaskBoard {\r\n project: string;\r\n updatedAt: string;\r\n resiliencePolicy?: string;\r\n closurePolicy?: string;\r\n baseTestMatrix?: string[];\r\n currentExecutionOrder: string[];\r\n tasks: Task[];\r\n reassignments?: Reassignment[];\r\n}\r\n\r\n// Mother Version\n\r\nexport interface MotherBranchEntry {\r\n version: number;\r\n name: string;\r\n sprint: string;\r\n operator: string;\r\n date: string;\r\n at: string;\r\n previous: string;\r\n description: string;\r\n}\r\n\r\nexport interface MotherVersion {\r\n version: number;\r\n current: string;\r\n branches: MotherBranchEntry[];\r\n}\r\n\r\n// Zone Map\n\r\nexport type LockType =\r\n | \"operator_exclusive\"\r\n | \"operator_double\"\r\n | \"shared\"\r\n | \"forbidden\"\r\n | \"owner_per_sprint\";\r\n\r\nexport interface ZoneEntry {\r\n owner: string;\r\n lock: LockType;\r\n sprints: string[];\r\n criticality?: \"low\" | \"medium\" | \"high\" | \"critical\";\r\n}\r\n\r\nexport interface ZoneMap {\r\n zones: Record<string, ZoneEntry>;\r\n}\r\n\r\nexport interface ZoneViolation {\r\n file: string;\r\n zone: string;\r\n reason: string;\r\n}\r\n\r\nexport interface ZoneWarning {\r\n file: string;\r\n reason: string;\r\n}\r\n\r\nexport interface ZoneCheckResult {\r\n violations: ZoneViolation[];\r\n warnings: ZoneWarning[];\r\n filesChecked: number;\r\n}\r\n\r\n// Checkpoints\n\r\nexport interface Checkpoint {\r\n id: string;\r\n tag: string;\r\n timestamp: string;\r\n operator: string;\r\n sprint?: string;\r\n type: \"auto\" | \"manual\" | \"pre-rollback\";\r\n git: {\r\n tag: string;\r\n commit: string;\r\n branch: string;\r\n motherBranch?: string;\r\n motherVersion?: number;\r\n };\r\n state: {\r\n taskBoard: TaskBoard;\r\n motherVersion: MotherVersion;\r\n workingTreeDirty: boolean;\r\n stashRef: string | null;\r\n };\r\n validation?: {\r\n typecheck?: \"passed\" | \"failed\" | \"skipped\";\r\n build?: \"passed\" | \"failed\" | \"skipped\";\r\n tests?: string;\r\n zoneCheck?: \"clean\" | \"violations\";\r\n canonicalCheck?: \"aligned\" | \"drift\";\r\n };\r\n}\r\n\r\n// Distributed Lock\n\r\nexport interface DistributedLock {\r\n zone: string;\r\n owner: string;\r\n acquiredAt: string;\r\n expiresAt: string;\r\n ttlMinutes: number;\r\n sprint?: string;\r\n reason: string;\r\n}\r\n\r\nexport interface LockAcquisition {\r\n lock: DistributedLock;\r\n ref: string;\r\n}\r\n\r\n// Configuration\n\r\nexport interface GateDefinition {\r\n name: string;\r\n command: string;\r\n args?: string[];\r\n timeoutSeconds: number;\r\n}\r\n\r\nexport interface OreshnikConfig {\r\n version: 1;\r\n project: {\r\n name: string;\r\n mainBranch: string;\r\n };\r\n operators: Array<{\r\n id: string;\r\n name: string;\r\n email?: string;\r\n }>;\r\n branching: {\r\n motherPrefix: string;\r\n childFormat: string;\r\n integrationPrefix: string;\r\n };\r\n validation: {\r\n gates: GateDefinition[];\r\n };\r\n hardStops: {\r\n forbiddenPatterns: string[];\r\n doubleLockPatterns: string[];\r\n };\r\n vault: {\r\n enabled: boolean;\r\n path: string;\r\n centralDoc: string;\r\n };\r\n canonical?: {\r\n derivedDocs?: DerivedDocConfig[];\r\n knownLegacyTasks?: string[];\r\n knownAssignmentTasks?: string[];\r\n };\r\n sync?: {\r\n canonicalAutoConflicts?: string[];\r\n };\r\n checkpoints: {\r\n autoOnClose: boolean;\r\n autoPreRollback: boolean;\r\n snapshotDir: string;\r\n };\r\n security: {\r\n requireCleanTree: boolean;\r\n secretScanning: boolean;\r\n blockEnvDiffs: boolean;\r\n };\r\n}\r\n\r\n// Preflight\n\r\n// Portfolio\n\nexport type InjectionPolicy = \"proposal_only\" | \"direct_with_approval\";\n\nexport interface PortfolioProject {\n projectId: string;\n displayName: string;\n repoPath: string;\n defaultBranch: string;\n operators: string[];\n taskBoardPath: string;\n zoneMapPath: string;\n validationGates: GateDefinition[];\n injectionPolicy: InjectionPolicy;\n priority: \"low\" | \"medium\" | \"high\" | \"critical\";\n}\n\nexport interface PortfolioConfig {\n version: 1;\n portfolio: {\n id: string;\n name: string;\n sourceNote?: string;\n continuityDocPath?: string;\n };\n projects: PortfolioProject[];\n}\n\nexport interface PortfolioProjectStatus {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n taskBoardExists: boolean;\n zoneMapExists: boolean;\n validationGateCount: number;\n injectionPolicy: InjectionPolicy;\n warnings: string[];\n}\n\nexport interface PortfolioInspection {\n configPath: string;\n portfolioId: string;\n portfolioName: string;\n projectCount: number;\n continuityDocPath?: string;\n projects: PortfolioProjectStatus[];\n}\n\nexport interface PreflightResult {\n sprint: string | null;\r\n operator: string;\r\n branch: string;\r\n mother: string;\r\n effectiveMother: string;\r\n dirtyCount: number;\r\n blockers: number;\r\n warnings: number;\r\n checks: PreflightCheck[];\r\n at: string;\r\n}\r\n\r\nexport interface PreflightCheck {\r\n step: number;\r\n name: string;\r\n status: \"ok\" | \"fail\" | \"warn\" | \"skip\";\r\n message: string;\r\n}\r\n\r\n// Sprint Event\n\r\nexport type EventType =\r\n | \"created\"\r\n | \"started\"\r\n | \"checkpoint\"\r\n | \"gate_passed\"\r\n | \"gate_failed\"\r\n | \"closed\"\r\n | \"rolled_back\"\r\n | \"reassigned\";\r\n\r\nexport interface SprintEvent {\r\n sprint: string;\r\n operator: string;\r\n type: EventType;\r\n date: string;\r\n at: string;\r\n branch?: string;\r\n previousMother?: string;\r\n nextMother?: string;\r\n description?: string;\r\n changedFiles?: string[];\r\n gateResults?: Record<string, \"passed\" | \"failed\">;\r\n}\r\n\r\n// Merge\n\r\nexport interface MergeResult {\r\n resolved: boolean;\r\n content: string | null;\r\n conflicts: string[];\r\n}\r\n\r\n// State Manager\n\r\nexport interface LockHandle {\r\n path: string;\r\n fd: number;\r\n}\r\n\r\nexport interface StateError extends OreshnikError {\r\n code: \"STATE_ERROR\";\r\n}\r\n\r\n// Metrics\n\r\nexport interface OperationalMetrics {\r\n sprintsClosed: number;\r\n sprintsRolledBack: number;\r\n conflictsAvoided: number;\r\n zoneFalsePositives: number;\r\n zoneFalseNegatives: number;\r\n avgTimePreflightToClose: number;\r\n filesOutOfZone: number;\r\n gatesFailedByCategory: Record<string, number>;\r\n parallelSprintsNoConflict: number;\r\n incompleteHandoffs: number;\r\n recoveryTimeAfterBlock: number;\r\n updatedAt: string;\r\n}\r\n\r\n// Canonical Documents\n\r\nexport interface DerivedDocConfig {\r\n path: string;\r\n type: \"central\" | \"collaborator\" | \"status-board\";\r\n source: \"task-board\";\r\n filter?: { owner?: string };\r\n extra?: Record<string, string>;\r\n}\r\n\r\nexport interface CanonicalIssue {\r\n file: string;\r\n severity: \"blocker\" | \"warn\";\r\n reason: string;\r\n}\r\n\r\nexport interface CanonicalCheckResult {\r\n aligned: boolean;\r\n issues: CanonicalIssue[];\r\n boardUpdatedAt: string;\r\n}\r\n\r\n// Sync\n\r\nexport interface SyncResult {\r\n success: boolean;\r\n merged: boolean;\r\n latestMother: string;\r\n conflicts: string[];\r\n autoResolved: string[];\r\n manualRequired: string[];\r\n}\r\n\r\nexport interface TaskBoardMergeResult {\r\n merged: TaskBoard;\r\n oursOnly: string[];\r\n theirsOnly: string[];\r\n}\r\n\r\n// Vault Guard\n\r\nexport interface VaultGuardResult {\r\n clean: boolean;\r\n configDirty: string[];\r\n configRestored: boolean;\r\n contentDirty: string[];\r\n unstagedStagedOverlap: string[];\r\n untracked: string[];\r\n errors: string[];\r\n}\r\n\r\n// Extended Config\n\r\nexport interface DerivedDocsConfig {\r\n derivedDocs: DerivedDocConfig[];\r\n}\r\n\r\nexport interface CanonicalConfig {\r\n autoFix: boolean;\r\n derivedDocs: DerivedDocConfig[];\r\n knownLegacyTasks: string[];\r\n knownAssignmentTasks: string[];\r\n}\r\n\r\nexport interface SyncConfig {\r\n canonicalAutoConflicts: string[];\r\n derivedDocPaths: string[];\r\n}\r\n\r\n// Notes Ingestion\r\n\r\nexport type TaskType = \"feature\" | \"bug\" | \"qa\" | \"docs\" | \"architecture\" | \"migration\" | \"ops\";\r\n\r\nexport type EvidenceType = \"code\" | \"ui\" | \"docs\" | \"integration\" | \"prod\";\r\n\r\nexport interface NoteTask {\r\n rawLine: string;\r\n lineNumber: number;\r\n checked: boolean;\r\n projectIds: string[];\r\n proposedType: TaskType;\r\n proposedOwner: string;\r\n proposedPriority: \"low\" | \"medium\" | \"high\" | \"critical\";\r\n proposedSprintPrefix: string;\r\n evidenceType: EvidenceType;\r\n evidenceExpectation: string;\r\n}\r\n\r\nexport interface NotesIngestionResult {\r\n sourcePath: string;\r\n portfolioId: string;\r\n parsedAt: string;\r\n dryRun: boolean;\r\n totalLines: number;\r\n taskLines: number;\r\n pendingCount: number;\r\n doneCount: number;\r\n tasksByProject: Record<string, NoteTask[]>;\r\n unclassifiedTasks: NoteTask[];\r\n warnings: string[];\r\n}\r\n\r\n// Injection\r\n\r\nexport interface ProjectInjectionResult {\r\n projectId: string;\r\n displayName: string;\r\n injectionPolicy: InjectionPolicy;\r\n repoPath: string;\r\n tasksInjected: number;\r\n tasksSkipped: number;\r\n checkpointTag?: string;\r\n handoffPath?: string;\r\n proposalPath?: string;\r\n blocked: boolean;\r\n blockReason?: string;\r\n warnings: string[];\r\n}\r\n\r\nexport interface InjectionResult {\r\n portfolioId: string;\r\n injectedAt: string;\r\n dryRun: boolean;\r\n confirmed: boolean;\r\n projects: ProjectInjectionResult[];\r\n summary: {\r\n totalProjects: number;\r\n projectsBlocked: number;\r\n projectsInjected: number;\r\n proposalsGenerated: number;\r\n totalTasksInjected: number;\r\n totalTasksSkipped: number;\r\n };\r\n errors: string[];\r\n}\r\n\r\n// Evidence Gates\r\n\r\nexport interface EvidenceRecord {\r\n taskId: string;\r\n evidenceType: EvidenceType;\r\n validatedAt: string;\r\n validator: string;\r\n result: \"passed\" | \"failed\" | \"pending\";\r\n details: string;\r\n artifacts?: string[];\r\n}\r\n\r\nexport interface TaskEvidenceCheck {\r\n taskId: string;\r\n taskTitle: string;\r\n evidenceType: EvidenceType;\r\n hasEvidence: boolean;\r\n requiredEvidence: string;\r\n currentStatus: TaskStatus;\r\n missing: string[];\r\n}\r\n\r\nexport interface EvidenceGateResult {\r\n checkedAt: string;\r\n sprint?: string;\r\n operator: string;\r\n totalTasks: number;\r\n doneTasks: number;\r\n tasksWithEvidence: number;\r\n tasksWithoutEvidence: number;\r\n tasks: TaskEvidenceCheck[];\r\n passed: boolean;\r\n blockers: string[];\r\n}\r\n\r\n// Distributed Locks\r\n\r\nexport interface ZoneLock {\r\n zone: string;\r\n operator: string;\r\n sprint: string;\r\n acquiredAt: string;\r\n ttl: number;\r\n expiresAt: string;\r\n}\r\n\r\nexport interface LockResult {\r\n zone: string;\r\n acquired: boolean;\r\n existingLock?: ZoneLock;\r\n error?: string;\r\n}\r\n\r\nexport interface LockList {\r\n fetchedAt: string;\r\n locks: ZoneLock[];\r\n active: ZoneLock[];\r\n expired: ZoneLock[];\r\n}\r\n","import { ok, err } from \"../types/index.js\";\nimport type { Result, ZoneMap, ZoneCheckResult, ZoneViolation, ZoneWarning, LockType } from \"../types/index.js\";\n\nexport class ZoneEngine {\n private globToRegex(glob: string): RegExp {\n const doubleStarToken = \"__DOUBLE_STAR__\";\n const escaped = glob\n .replaceAll(\"**\", doubleStarToken)\n .replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replaceAll(\"*\", \"[^/]*\")\n .replaceAll(doubleStarToken, \".*\");\n return new RegExp(`^${escaped}$`);\n }\n\n findMatchingZone(file: string, zoneMap: ZoneMap): { pattern: string; zone: ZoneMap[\"zones\"][string] } | null {\n for (const [pattern, zone] of Object.entries(zoneMap.zones)) {\n if (this.globToRegex(pattern).test(file)) {\n return { pattern, zone };\n }\n }\n return null;\n }\n\n check(\n files: string[],\n operator: string,\n sprint: string,\n zoneMap: ZoneMap\n ): ZoneCheckResult {\n const violations: ZoneViolation[] = [];\n const warnings: ZoneWarning[] = [];\n\n for (const file of files) {\n const match = this.findMatchingZone(file, zoneMap);\n\n if (!match) {\n warnings.push({ file, reason: `no-zone-entry: ${file} not mapped in zone-map.json` });\n continue;\n }\n\n const { pattern, zone } = match;\n const allowed = zone.sprints.includes(\"*\") || zone.sprints.includes(sprint);\n\n if (!allowed) {\n warnings.push({ file, reason: `sprint-not-allowed: ${pattern} not mapped to sprint ${sprint}` });\n }\n\n const result = this.checkLock(file, pattern, zone.lock, zone.owner, operator);\n if (result.violation) violations.push(result.violation);\n if (result.warning) warnings.push(result.warning);\n }\n\n return { violations, warnings, filesChecked: files.length };\n }\n\n private checkLock(\n file: string,\n zonePattern: string,\n lock: LockType,\n zoneOwner: string,\n operator: string\n ): { violation?: ZoneViolation; warning?: ZoneWarning } {\n switch (lock) {\n case \"forbidden\":\n return {\n violation: { file, zone: zonePattern, reason: \"forbidden-zone: no operator may modify this zone\" },\n };\n case \"operator_exclusive\":\n if (zoneOwner !== operator) {\n return {\n violation: { file, zone: zonePattern, reason: `exclusive-zone: owned by ${zoneOwner}, operator is ${operator}` },\n };\n }\n break;\n case \"operator_double\":\n return {\n warning: { file, reason: `double-lock-required: ${zonePattern} needs coordination with ${zoneOwner}` },\n };\n case \"shared\":\n break;\n case \"owner_per_sprint\":\n break;\n }\n return {};\n }\n\n getModifiedZones(files: string[], zoneMap: ZoneMap): Set<string> {\n const zones = new Set<string>();\n for (const file of files) {\n const match = this.findMatchingZone(file, zoneMap);\n if (match) zones.add(match.pattern);\n }\n return zones;\n }\n}\n\nexport function createZoneEngine(): ZoneEngine {\n return new ZoneEngine();\n}\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { ok, err } from \"../types/index.js\";\nimport type { Result, MergeResult, StateError, LockHandle } from \"../types/index.js\";\n\nexport class StateManager {\n private readonly runsDir: string;\n\n constructor(private readonly root: string) {\n this.runsDir = join(root, \"var\", \"oreshnik\");\n mkdirSync(this.runsDir, { recursive: true });\n }\n\n // ─── File Operations ───────────────────────────────────────\n\n readJson<T>(filePath: string): Result<T, StateError> {\n try {\n if (!existsSync(filePath)) {\n return err({ code: \"STATE_ERROR\", message: `File not found: ${filePath}`, exitCode: 1 });\n }\n const content = readFileSync(filePath, \"utf8\").replace(/^\\uFEFF/, \"\");\n return ok(JSON.parse(content) as T);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to read/parse ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n writeJson<T>(filePath: string, value: T): Result<void, StateError> {\n try {\n mkdirSync(join(filePath, \"..\"), { recursive: true });\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n return ok(undefined);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to write ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n readText(filePath: string): Result<string, StateError> {\n try {\n if (!existsSync(filePath)) return ok(\"\");\n return ok(readFileSync(filePath, \"utf8\"));\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to read ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n writeText(filePath: string, content: string): Result<void, StateError> {\n try {\n mkdirSync(join(filePath, \"..\"), { recursive: true });\n writeFileSync(filePath, content, \"utf8\");\n return ok(undefined);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to write ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n // ─── Merge Helpers ─────────────────────────────────────────\n\n mergeTextUnion(file: string, base: string, current: string, source: string): Result<string, StateError> {\n const tmpDir = join(this.runsDir, \".merge-tmp\");\n mkdirSync(tmpDir, { recursive: true });\n const id = randomBytes(8).toString(\"hex\");\n const basePath = join(tmpDir, `base-${id}`);\n const curPath = join(tmpDir, `current-${id}`);\n const srcPath = join(tmpDir, `source-${id}`);\n\n try {\n writeFileSync(basePath, base, \"utf8\");\n writeFileSync(curPath, current, \"utf8\");\n writeFileSync(srcPath, source, \"utf8\");\n\n const result = spawnSync(\"git\", [\"merge-file\", \"--union\", \"-p\", curPath, basePath, srcPath], {\n cwd: this.root,\n encoding: \"utf8\",\n timeout: 10000,\n });\n\n return ok(result.stdout || \"\");\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Merge failed for ${file}: ${String(e)}`,\n exitCode: 1,\n });\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n }\n\n mergeJsonSmart(base: unknown, current: unknown, source: unknown): Result<unknown, StateError> {\n try {\n const merged = this.mergeValue(base, current, source);\n return ok(merged);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `JSON merge failed: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n private mergeValue(base: unknown, current: unknown, source: unknown): unknown {\n const key = (v: unknown) => JSON.stringify(v);\n\n if (key(current) === key(source)) return current;\n if (key(current) === key(base)) return source;\n if (key(source) === key(base)) return current;\n\n if (\n current && source &&\n typeof current === \"object\" && typeof source === \"object\" &&\n !Array.isArray(current) && !Array.isArray(source)\n ) {\n const result: Record<string, unknown> = { ...current as Record<string, unknown> };\n const allKeys = new Set([\n ...Object.keys((base as Record<string, unknown>) || {}),\n ...Object.keys(current as Record<string, unknown>),\n ...Object.keys(source as Record<string, unknown>),\n ]);\n for (const k of allKeys) {\n result[k] = this.mergeValue(\n (base as Record<string, unknown>)?.[k],\n (current as Record<string, unknown>)[k],\n (source as Record<string, unknown>)[k]\n );\n }\n return result;\n }\n\n if (Array.isArray(current) && Array.isArray(source)) {\n const seen = new Set<string>();\n const merged = [...current, ...source].filter((item) => {\n const k = key(item);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n return merged;\n }\n\n return source;\n }\n\n // ─── Lock Management ───────────────────────────────────────\n\n acquireLocalLock(lockName: string, timeoutMs = 5000): Result<LockHandle, StateError> {\n const lockPath = join(this.runsDir, `.lock-${lockName}`);\n const start = Date.now();\n\n while (Date.now() - start < timeoutMs) {\n try {\n const fd = this.openExclusive(lockPath);\n if (fd !== null) {\n return ok({ path: lockPath, fd });\n }\n } catch {\n // Lock held by another process, retry\n }\n const waited = Date.now() - start;\n if (waited < timeoutMs) {\n // Busy-wait short intervals\n const waitUntil = Date.now() + 50;\n while (Date.now() < waitUntil) { /* spin */ }\n }\n }\n\n return err({\n code: \"STATE_ERROR\",\n message: `Could not acquire lock ${lockName} within ${timeoutMs}ms`,\n exitCode: 1,\n });\n }\n\n private openExclusive(path: string): number | null {\n try {\n const fs = require(\"node:fs\");\n const fd = fs.openSync(path, \"wx\");\n return fd;\n } catch {\n return null;\n }\n }\n\n releaseLocalLock(handle: LockHandle): Result<void, StateError> {\n try {\n const fs = require(\"node:fs\");\n fs.closeSync(handle.fd);\n fs.unlinkSync(handle.path);\n return ok(undefined);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to release lock: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n}\n\nexport function createStateManager(root: string): StateManager {\n return new StateManager(root);\n}\n","import { join } from \"node:path\";\r\nimport type { Result, TaskBoard, Task, CanonicalIssue, CanonicalCheckResult, DerivedDocConfig, MotherVersion, OreshnikError } from \"../types/index.js\";\r\nimport { ok, err } from \"../types/index.js\";\r\nimport type { StateManager } from \"./state-manager.js\";\r\n\r\nexport class CanonicalService {\r\n private readonly root: string;\r\n\r\n constructor(\r\n private readonly state: StateManager,\r\n root: string\r\n ) {\r\n this.root = root;\r\n }\r\n\r\n checkCanonicalAlignment(\r\n taskBoard: TaskBoard,\r\n derivedDocs: DerivedDocConfig[],\r\n mother: MotherVersion,\r\n relicTaskIds: string[] = [],\r\n assignmentTaskIds: string[] = []\r\n ): CanonicalCheckResult {\r\n const issues: CanonicalIssue[] = [];\r\n const tasks = taskBoard.tasks;\r\n const taskById = new Map(tasks.map((t) => [t.id, t]));\r\n const openTasks = tasks.filter((t) => t.status !== \"done\");\r\n const statusBoardDoc = derivedDocs.find((d) => d.type === \"status-board\");\r\n\r\n for (const doc of derivedDocs) {\r\n const fullPath = join(this.root, doc.path);\r\n const content = this.state.readText(fullPath);\r\n if (!content.ok || !content.value) {\r\n issues.push({\r\n file: doc.path,\r\n severity: \"blocker\",\r\n reason: `${doc.path} is missing or empty.`,\r\n });\r\n continue;\r\n }\r\n\r\n const text = content.value;\r\n\r\n for (const taskId of relicTaskIds) {\r\n if (this.hasLegacyClosureConflict(text, taskId, taskById)) {\r\n issues.push({\r\n file: doc.path,\r\n severity: \"blocker\",\r\n reason: `${doc.path} still reports stale ${taskId} no-closure state, but task-board marks it done.`,\r\n });\r\n }\r\n }\r\n\r\n for (const taskId of assignmentTaskIds) {\r\n if (this.hasAssignmentConflict(text, taskId, taskById)) {\r\n const task = taskById.get(taskId);\r\n issues.push({\r\n file: doc.path,\r\n severity: \"blocker\",\r\n reason: `${doc.path} assigns ${taskId} away from canonical owner ${task?.owner}.`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (statusBoardDoc) {\r\n const statusPath = join(this.root, statusBoardDoc.path);\r\n const statusText = this.state.readText(statusPath);\r\n if (statusText.ok && statusText.value) {\r\n for (const task of openTasks) {\r\n if (!statusText.value.includes(task.id)) {\r\n issues.push({\r\n file: statusBoardDoc.path,\r\n severity: \"warn\",\r\n reason: `Status board does not include open task ${task.id}: ${task.title}.`,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n aligned: issues.filter((i) => i.severity === \"blocker\").length === 0,\r\n issues,\r\n boardUpdatedAt: taskBoard.updatedAt,\r\n };\r\n }\r\n\r\n regenerateAllDerivedDocs(\r\n taskBoard: TaskBoard,\r\n derivedDocs: DerivedDocConfig[],\r\n mother: MotherVersion,\r\n projectName: string\r\n ): Result<void, OreshnikError> {\r\n for (const doc of derivedDocs) {\r\n let content: string;\r\n if (doc.type === \"central\") {\r\n content = this.generateCentral(taskBoard, mother, projectName, doc.extra);\r\n } else if (doc.type === \"collaborator\" && doc.filter?.owner) {\r\n content = this.generateCollaborator(taskBoard, doc.filter.owner, projectName);\n } else if (doc.type === \"status-board\") {\r\n content = this.generateStatusBoard(taskBoard, projectName);\r\n } else {\r\n continue;\r\n }\r\n\r\n const fullPath = join(this.root, doc.path);\r\n const writeResult = this.state.writeText(fullPath, content);\r\n if (!writeResult.ok) return writeResult;\r\n }\r\n\r\n return ok(undefined);\r\n }\r\n\r\n generateCentral(\r\n taskBoard: TaskBoard,\r\n mother: MotherVersion,\r\n projectName: string,\r\n extra?: Record<string, string>\r\n ): string {\r\n const openTasks = taskBoard.tasks.filter((t) => t.status !== \"done\");\r\n const readyTasks = openTasks.filter((t) => t.status === \"ready\");\r\n const pendingTasks = openTasks.filter((t) => t.status === \"pending\");\r\n const taskRows = (list: Task[]) =>\r\n list.length === 0\r\n ? \"| Ninguno | - | - | - |\\n\"\r\n : list\r\n .map((t) => `| ${t.id} | ${t.status} | ${t.owner} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`)\r\n .join(\"\\n\");\r\n\r\n const extraFields = extra\r\n ? Object.entries(extra)\r\n .map(([k, v]) => `| ${k} | ${v} |`)\r\n .join(\"\\n\")\r\n : \"\";\r\n\r\n return [\r\n \"---\",\r\n `type: master-dashboard`,\r\n `project: \"${projectName}\"`,\r\n `status: active-production`,\r\n `phase: \"Canonical Oreshnik task board governs current assignments\"`,\r\n `last_updated: \"${this.nowISO()}\"`,\r\n `mother_branch: \"${mother.current || \"unknown\"}\"`,\r\n \"tags:\",\r\n \" - \\\"#central\\\"\",\r\n \" - \\\"#status/live-source\\\"\",\r\n \"---\",\r\n \"\",\r\n `# ${projectName} - Dashboard Canonico`,\r\n \"\",\r\n \"> Fuente operativa: `var/oreshnik/task-board.json`. Los documentos de colaborador y status son derivados y deben ser regenerados si cambian las asignaciones.\",\r\n \"\",\r\n \"## Estado Actual\",\r\n \"\",\r\n \"| Campo | Valor |\",\r\n \"|---|---|\",\r\n `| Task board actualizado | ${taskBoard.updatedAt || \"unknown\"} |`,\r\n `| Rama madre | ${mother.current || \"unknown\"} |`,\r\n extraFields,\r\n \"\",\r\n \"## Orden de Ejecucion\",\r\n \"\",\r\n ...taskBoard.currentExecutionOrder.map((item) => `- ${item}`),\r\n \"\",\r\n \"## Tareas Abiertas\",\r\n \"\",\r\n \"| Sprint | Estado | Owner | Scope | Depende de |\",\r\n \"|---|---|---|---|---|\",\r\n taskRows(openTasks),\r\n \"\",\r\n \"## Ready Ahora\",\r\n \"\",\r\n \"| Sprint | Owner | Scope |\",\r\n \"|---|---|---|\",\r\n readyTasks.length\r\n ? readyTasks.map((t) => `| ${t.id} | ${t.owner} | ${t.title} |`).join(\"\\n\")\r\n : \"| Ninguno | - | - |\",\r\n \"\",\r\n \"## Pendientes Bloqueados por Dependencias\",\r\n \"\",\r\n \"| Sprint | Owner | Scope | Depende de |\",\r\n \"|---|---|---|---|\",\r\n pendingTasks.length\r\n ? pendingTasks.map((t) => `| ${t.id} | ${t.owner} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`).join(\"\\n\")\r\n : \"| Ninguno | - | - | - |\",\r\n \"\",\r\n ].join(\"\\n\");\r\n }\r\n\r\n generateCollaborator(taskBoard: TaskBoard, owner: string, projectName: string): string {\n const assigned = taskBoard.tasks.filter(\r\n (t) => t.status !== \"done\" && (t.owner === owner || String(t.owner).includes(`${owner}+`) || String(t.owner).includes(`+${owner}`))\r\n );\r\n const ready = assigned.filter((t) => t.status === \"ready\");\r\n const pending = assigned.filter((t) => t.status === \"pending\");\r\n\r\n const acceptanceRows = (task: Task) =>\r\n (task.acceptance || []).map((item) => `- ${item}`).join(\"\\n\");\r\n\r\n const taskRows = (list: Task[]) =>\r\n list.length === 0\r\n ? \"| Ninguno | - | - |\"\r\n : list.map((t) => `| ${t.id} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`).join(\"\\n\");\r\n\r\n return [\r\n \"---\",\r\n `type: collaborator-status`,\r\n `project: \"${projectName}\"`,\n `operator: \"${owner}\"`,\r\n `last_updated: \"${this.nowISO()}\"`,\r\n `generated_by: \"Oreshnik canonical-check\"`,\r\n `source: \"var/oreshnik/task-board.json\"`,\r\n \"---\",\r\n \"\",\r\n `# Estado ${owner}`,\r\n \"\",\r\n \"> Documento derivado. La fuente operativa es `var/oreshnik/task-board.json`.\",\r\n \"\",\r\n \"## Ready\",\r\n \"\",\r\n \"| Sprint | Scope | Depende de |\",\r\n \"|---|---|---|\",\r\n taskRows(ready),\r\n \"\",\r\n \"## Pending\",\r\n \"\",\r\n \"| Sprint | Scope | Depende de |\",\r\n \"|---|---|---|\",\r\n taskRows(pending),\r\n \"\",\r\n \"## Detalle de Aceptacion\",\r\n \"\",\r\n assigned.length\r\n ? assigned\r\n .map(\r\n (t) =>\r\n `### ${t.id} - ${t.title}\\n\\nEstado: \\`${t.status}\\`\\n\\n${acceptanceRows(t)}\\n\\nZonas: ${(t.zone || []).map((z) => `\\`${z}\\``).join(\", \") || \"-\"}\\n`\r\n )\r\n .join(\"\\n\")\r\n : \"Sin tareas abiertas asignadas.\",\r\n \"\",\r\n ].join(\"\\n\");\r\n }\r\n\r\n generateStatusBoard(taskBoard: TaskBoard, projectName: string): string {\r\n const openTasks = taskBoard.tasks.filter((t) => t.status !== \"done\");\r\n const doneTasks = taskBoard.tasks.filter((t) => t.status === \"done\");\r\n const ownerRows = (owner: string) => {\r\n const owned = openTasks.filter((t) => t.owner === owner || String(t.owner).includes(`${owner}+`) || String(t.owner).includes(`+${owner}`));\r\n return owned.length\r\n ? owned.map((t) => `| ${t.id} | ${t.status} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`).join(\"\\n\")\r\n : \"| Ninguno | - | - | - |\";\r\n };\r\n\r\n return [\r\n \"---\",\r\n `type: status-board`,\r\n `project: \"${projectName}\"`,\r\n `last_updated: \"${this.nowISO()}\"`,\r\n `generated_by: \"Oreshnik canonical-check\"`,\r\n `source: \"var/oreshnik/task-board.json\"`,\r\n \"---\",\r\n \"\",\r\n \"# STATUS BOARD - Realidad Canonica del Repositorio\",\r\n \"\",\r\n \"> Fuente operativa: `var/oreshnik/task-board.json`. Si este documento contradice el task board, el preflight debe bloquear.\",\r\n \"\",\r\n \"## Orden de Ejecucion Actual\",\r\n \"\",\r\n ...taskBoard.currentExecutionOrder.map((item) => `- ${item}`),\r\n \"\",\r\n \"## Tareas Ready/Pending\",\r\n \"\",\r\n \"| Sprint | Estado | Owner | Scope | Depende de |\",\r\n \"|---|---|---|---|---|\",\r\n openTasks\r\n .map((t) => `| ${t.id} | ${t.status} | ${t.owner} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`)\r\n .join(\"\\n\"),\r\n \"\",\r\n \"## Hard Stops Vigentes\",\r\n \"\",\r\n \"- No credenciales en git.\",\r\n \"- No sprint closure sin vault, handoff y validaciones.\",\r\n \"\",\r\n \"## Sprints Cerrados Segun Task Board\",\r\n \"\",\r\n \"| Sprint | Owner | Scope |\",\r\n \"|---|---|---|\",\r\n doneTasks.map((t) => `| ${t.id} | ${t.owner} | ${t.title} |`).join(\"\\n\"),\r\n \"\",\r\n ].join(\"\\n\");\r\n }\r\n\r\n private hasLegacyClosureConflict(\r\n content: string,\r\n taskId: string,\r\n taskById: Map<string, Task>\r\n ): boolean {\r\n const task = taskById.get(taskId);\r\n if (task?.status !== \"done\") return false;\r\n const pattern = new RegExp(\r\n `${taskId}[\\\\s\\\\S]{0,700}(SIN CLOSURE|sin closure|NO EXISTE|CERO commits|sin codigo visible|no code visible)`,\n \"i\"\r\n );\r\n return pattern.test(content);\r\n }\r\n\r\n private hasAssignmentConflict(\r\n content: string,\r\n taskId: string,\r\n taskById: Map<string, Task>\r\n ): boolean {\r\n const task = taskById.get(taskId);\n if (!task || task.status === \"done\") return false;\n\n // Free-text assignment detection is unsafe without a structured marker.\n // Avoid project-specific operator assumptions and false blockers.\n return false;\n }\n\r\n private nowISO(): string {\r\n return new Date().toISOString();\r\n }\r\n}\r\n\r\nexport function createCanonicalService(state: StateManager, root: string): CanonicalService {\r\n return new CanonicalService(state, root);\r\n}\r\n","import { join } from \"node:path\";\r\nimport type { Result, TaskBoard, SyncResult, TaskBoardMergeResult, MotherVersion, Reassignment, OreshnikError } from \"../types/index.js\";\r\nimport { ok, err } from \"../types/index.js\";\r\nimport type { GitService } from \"./git.service.js\";\r\nimport type { StateManager } from \"./state-manager.js\";\r\nimport type { CanonicalService } from \"./canonical.service.js\";\r\n\r\nexport class SyncService {\r\n private readonly root: string;\r\n\r\n constructor(\r\n private readonly git: GitService,\r\n private readonly state: StateManager,\r\n private readonly canonical: CanonicalService,\r\n root: string\r\n ) {\r\n this.root = root;\r\n }\r\n\r\n syncLatestMother(args: {\n motherPrefix: string;\r\n derivedDocPaths: string[];\r\n canonicalAutoConflicts?: string[];\r\n projectName: string;\r\n derivedDocs: Array<{ path: string; type: \"central\" | \"collaborator\" | \"status-board\"; filter?: { owner?: string }; extra?: Record<string, string> }>;\r\n operator: string;\r\n }): SyncResult {\r\n const result: SyncResult = {\r\n success: false,\r\n merged: false,\r\n latestMother: \"\",\r\n conflicts: [],\r\n autoResolved: [],\r\n manualRequired: [],\r\n };\n\n const taskBoardRel = \"var/oreshnik/task-board.json\";\n const derivedDocPaths = args.derivedDocPaths.map((p) => this.toGitPath(p));\n const autoConflicts = new Set([\n ...(args.canonicalAutoConflicts || []).map((p) => this.toGitPath(p)),\n ...derivedDocPaths,\n taskBoardRel,\n ]);\n\r\n const fetchResult = this.git.fetch();\r\n if (!fetchResult.ok) {\r\n result.conflicts.push(`Fetch failed: ${fetchResult.error.message}`);\r\n return result;\r\n }\r\n\r\n const motherResult = this.readMother();\r\n if (!motherResult.ok) return result;\r\n\r\n const currentMother = motherResult.value;\r\n const latest = this.git.discoverLatestMother(args.motherPrefix);\r\n if (!latest.ok || !latest.value) {\r\n result.success = true;\r\n result.latestMother = currentMother.current;\r\n return result;\r\n }\r\n\r\n const latestRef = this.git.refExists(`origin/${latest.value.name}`)\r\n ? `origin/${latest.value.name}`\r\n : latest.value.name;\r\n\r\n result.latestMother = latest.value.name;\r\n\r\n if (latest.value.version <= (currentMother.version || 0)) {\r\n result.success = true;\r\n result.latestMother = currentMother.current;\r\n return result;\r\n }\r\n\r\n const dirty = this.git.statusPorcelain();\n if (!dirty.ok) {\n result.conflicts.push(`Failed to inspect working tree: ${dirty.error.message}`);\n return result;\n }\n const dirtyFiles = dirty.value\n .filter((e) => !this.toGitPath(e.path).startsWith(\"var/oreshnik/\") && !this.toGitPath(e.path).startsWith(\"output/\"))\n .map((e) => this.toGitPath(e.path));\n if (dirtyFiles.length > 0) {\n result.conflicts.push(`Working tree has ${dirtyFiles.length} changed file(s).`);\n return result;\n }\r\n\r\n const merge = this.git.merge(latestRef, {\r\n noFF: true,\r\n message: `chore(oreshnik): sync from ${latest.value.name}`,\r\n });\r\n\r\n if (merge.ok) {\r\n result.success = true;\r\n result.merged = true;\r\n return result;\r\n }\r\n\r\n const conflictFiles = this.git.unmergedFiles();\n if (!conflictFiles.ok) {\n result.conflicts.push(`Failed to inspect merge conflicts: ${conflictFiles.error.message}`);\n return result;\n }\n\n const conflicts = conflictFiles.value.map((p) => this.toGitPath(p));\n const manual = conflicts.filter((f) => !autoConflicts.has(f));\n\r\n if (manual.length > 0) {\r\n result.manualRequired = manual;\r\n return result;\r\n }\r\n\r\n const taskBoardPath = taskBoardRel;\n\n if (conflicts.includes(taskBoardRel)) {\n const mergeResult = this.mergeTaskBoardById(taskBoardPath);\n if (!mergeResult.ok) {\n result.conflicts.push(mergeResult.error.message);\n return result;\n }\n result.autoResolved.push(taskBoardRel);\n }\n\r\n const motherVersion = this.readMother();\r\n const mother = motherVersion.ok ? motherVersion.value : { version: 0, current: \"unknown\", branches: [] };\r\n\r\n const boardData = this.state.readJson<TaskBoard>(taskBoardPath);\r\n const board: TaskBoard = boardData.ok\r\n ? boardData.value\r\n : { project: args.projectName, updatedAt: new Date().toISOString(), currentExecutionOrder: [], tasks: [] };\r\n\r\n const regenResult = this.canonical.regenerateAllDerivedDocs(\r\n board,\r\n args.derivedDocs.map((d) => ({ ...d, source: \"task-board\" as const })),\r\n mother,\r\n args.projectName\r\n );\r\n if (!regenResult.ok) {\r\n result.conflicts.push(`Derived doc regeneration failed: ${regenResult.error.message}`);\r\n return result;\r\n }\r\n\r\n const stageFiles = [taskBoardRel, ...derivedDocPaths];\n const stageResult = this.git.stage(stageFiles);\n if (!stageResult.ok) {\n result.conflicts.push(`Failed to stage auto-resolved files: ${stageResult.error.message}`);\n return result;\n }\n result.autoResolved.push(...derivedDocPaths);\n\n const remaining = this.git.unmergedFiles();\n if (!remaining.ok) {\n result.conflicts.push(`Failed to inspect remaining merge conflicts: ${remaining.error.message}`);\n return result;\n }\n if (remaining.value.length > 0) {\n result.manualRequired = remaining.value.map((p) => this.toGitPath(p));\n return result;\n }\n\n const commitResult = this.git.commit(\"chore(oreshnik): auto-resolve canonical conflicts\");\n if (!commitResult.ok) {\n result.conflicts.push(`Failed to commit auto-resolved conflicts: ${commitResult.error.message}`);\n return result;\n }\n result.success = true;\n result.merged = true;\n\r\n return result;\r\n }\r\n\r\n private mergeTaskBoardById(fileRel: string): Result<TaskBoardMergeResult, OreshnikError> {\n const fullPath = join(this.root, ...fileRel.split(\"/\"));\r\n\r\n const oursRaw = this.git.showRef(\":2\", fileRel);\r\n const theirsRaw = this.git.showRef(\":3\", fileRel);\r\n\r\n if (!oursRaw.ok && !theirsRaw.ok) {\r\n return err({ code: \"STATE_ERROR\", message: `Cannot read conflict stages for ${fileRel}`, exitCode: 1 });\r\n }\r\n\r\n try {\r\n const ours: TaskBoard = oursRaw.ok && oursRaw.value ? JSON.parse(oursRaw.value.replace(/^\\uFEFF/, \"\")) : { project: \"\", updatedAt: \"\", currentExecutionOrder: [], tasks: [] };\r\n const theirs: TaskBoard = theirsRaw.ok && theirsRaw.value ? JSON.parse(theirsRaw.value.replace(/^\\uFEFF/, \"\")) : { project: \"\", updatedAt: \"\", currentExecutionOrder: [], tasks: [] };\r\n\r\n const merged: TaskBoard = {\r\n project: theirs.project || ours.project,\r\n updatedAt: new Date().toISOString(),\r\n currentExecutionOrder: theirs.currentExecutionOrder || ours.currentExecutionOrder,\r\n tasks: structuredClone(theirs.tasks),\r\n reassignments: this.mergeUniqueReassignments(ours.reassignments || [], theirs.reassignments || []),\r\n };\r\n\r\n const mergedIds = new Set(merged.tasks.map((t) => t.id));\r\n const oursOnly: string[] = [];\r\n\r\n for (const task of ours.tasks || []) {\r\n if (!mergedIds.has(task.id)) {\r\n const releaseIdx = merged.tasks.findIndex((t) => t.id.includes(\"RELEASE\"));\r\n if (releaseIdx >= 0) merged.tasks.splice(releaseIdx, 0, task);\r\n else merged.tasks.push(task);\r\n mergedIds.add(task.id);\r\n oursOnly.push(task.id);\r\n }\r\n }\r\n\r\n const theirsOnly = (theirs.tasks || []).filter((t) => !new Set((ours.tasks || []).map((o) => o.id)).has(t.id)).map((t) => t.id);\r\n const writeResult = this.state.writeJson(fullPath, merged);\n if (!writeResult.ok) return writeResult;\n\r\n return ok({ merged, oursOnly, theirsOnly });\r\n } catch (e) {\r\n return err({ code: \"STATE_ERROR\", message: `Failed to merge task board: ${String(e)}`, exitCode: 1 });\r\n }\r\n }\r\n\r\n private mergeUniqueReassignments(a: Reassignment[], b: Reassignment[]): Reassignment[] {\r\n const seen = new Set<string>();\r\n return [...a, ...b].filter((item) => {\r\n const key = JSON.stringify(item);\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n }\r\n\r\n private readMother(): Result<MotherVersion, OreshnikError> {\r\n const path = join(this.root, \"var\", \"oreshnik\", \".mother-version.json\");\r\n return this.state.readJson<MotherVersion>(path);\r\n }\r\n\r\n private runsDir(file: string): string {\n return `var/oreshnik/${file}`;\n }\n\n private toGitPath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n }\n}\n\r\nexport function createSyncService(\r\n git: GitService,\r\n state: StateManager,\r\n canonical: CanonicalService,\r\n root: string\r\n): SyncService {\r\n return new SyncService(git, state, canonical, root);\r\n}\r\n","import type { Result, VaultGuardResult, OreshnikError, GitError } from \"../types/index.js\";\r\nimport type { GitService } from \"./git.service.js\";\r\n\r\nexport class VaultGuard {\r\n constructor(private readonly git: GitService) {}\r\n\r\n check(vaultPath: string, obsidianConfigDir: string, force = false): VaultGuardResult {\r\n const result: VaultGuardResult = {\r\n clean: true,\r\n configDirty: [],\r\n configRestored: false,\r\n contentDirty: [],\r\n unstagedStagedOverlap: [],\r\n untracked: [],\r\n errors: [],\r\n };\r\n\r\n const configDirty = this.gitDirtyFiles(`${obsidianConfigDir}/`, vaultPath);\r\n if (!configDirty.ok) {\r\n result.clean = false;\r\n result.errors.push(configDirty.error.message);\r\n } else if (configDirty.value.length > 0) {\r\n result.configDirty = configDirty.value;\r\n\r\n if (force) {\r\n const restore = this.git.restoreFromHead(`${obsidianConfigDir}/`);\r\n if (restore.ok) {\r\n result.configRestored = true;\r\n } else {\r\n result.clean = false;\r\n }\r\n } else {\r\n result.clean = false;\r\n }\r\n }\r\n\r\n const vaultDirty = this.gitDirtyFiles(`${vaultPath}/`, vaultPath, `:!${obsidianConfigDir}`);\r\n if (!vaultDirty.ok) {\r\n result.clean = false;\r\n result.errors.push(vaultDirty.error.message);\r\n } else if (vaultDirty.value.length > 0) {\r\n result.contentDirty = vaultDirty.value;\r\n }\r\n\r\n const unstaged = this.gitDiffFiles(`${vaultPath}/`);\r\n const staged = this.gitDiffFiles(`${vaultPath}/`, true);\r\n\r\n if (!unstaged.ok) {\r\n result.clean = false;\r\n result.errors.push(unstaged.error.message);\r\n }\r\n if (!staged.ok) {\r\n result.clean = false;\r\n result.errors.push(staged.error.message);\r\n }\r\n if (unstaged.ok && staged.ok && unstaged.value.length > 0 && staged.value.length > 0) {\r\n const both = unstaged.value.filter((f) => staged.value.includes(f));\r\n if (both.length > 0) {\r\n result.unstagedStagedOverlap = both;\r\n }\r\n }\r\n\r\n const untracked = this.gitUntrackedFiles(`${obsidianConfigDir}/`);\r\n if (!untracked.ok) {\r\n result.clean = false;\r\n result.errors.push(untracked.error.message);\r\n } else if (untracked.value.length > 0) {\r\n result.untracked = untracked.value;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n restoreConfig(obsidianConfigDir: string): Result<void, OreshnikError> {\r\n return this.git.restoreFromHead(`${obsidianConfigDir}/`);\r\n }\r\n\r\n private gitDirtyFiles(pattern: string, _vaultPath: string, excludePattern?: string): Result<string[], GitError> {\r\n const args = [\"diff\", \"--name-only\", \"--\", pattern];\r\n if (excludePattern) args.push(excludePattern);\r\n const r = this.git.exec(args);\r\n if (!r.ok) {\r\n return {\r\n ok: false,\r\n error: {\r\n code: \"GIT_ERROR\",\r\n message: `Failed to inspect dirty files for ${pattern}`,\r\n exitCode: 1,\r\n gitCommand: `git ${args.join(\" \")}`,\r\n gitStderr: r.error,\r\n },\r\n };\r\n }\r\n return { ok: true, value: r.output.split(/\\r?\\n/).filter(Boolean) };\r\n }\r\n\r\n private gitDiffFiles(pattern: string, cached = false): Result<string[], GitError> {\r\n const args = [\"diff\", \"--name-only\"];\r\n if (cached) args.push(\"--cached\");\r\n args.push(\"--\", pattern);\r\n const r = this.git.exec(args);\r\n if (!r.ok) {\r\n return {\r\n ok: false,\r\n error: {\r\n code: \"GIT_ERROR\",\r\n message: `Failed to inspect diff files for ${pattern}`,\r\n exitCode: 1,\r\n gitCommand: `git ${args.join(\" \")}`,\r\n gitStderr: r.error,\r\n },\r\n };\r\n }\r\n return { ok: true, value: r.output.split(/\\r?\\n/).filter(Boolean) };\r\n }\r\n\r\n private gitUntrackedFiles(pattern: string): Result<string[], GitError> {\r\n const r = this.git.exec([\"ls-files\", \"--others\", \"--exclude-standard\", \"--\", pattern]);\r\n if (!r.ok) {\r\n return {\r\n ok: false,\r\n error: {\r\n code: \"GIT_ERROR\",\r\n message: `Failed to inspect untracked files for ${pattern}`,\r\n exitCode: 1,\r\n gitCommand: `git ls-files --others --exclude-standard -- ${pattern}`,\r\n gitStderr: r.error,\r\n },\r\n };\r\n }\r\n return { ok: true, value: r.output.split(/\\r?\\n/).filter(Boolean) };\r\n }\r\n}\r\n\r\nexport function createVaultGuard(git: GitService): VaultGuard {\r\n return new VaultGuard(git);\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, PortfolioInspection, PortfolioProject, PortfolioProjectStatus, Result, StateError } from \"../types/index.js\";\nimport { PortfolioConfigSchema } from \"../types/schemas.js\";\n\nexport class PortfolioService {\n constructor(private readonly root: string) {}\n\n load(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config ${configPath}: ${String(e)}`));\n }\n }\n\n inspect(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioInspection, StateError> {\n const config = this.load(configPath);\n if (!config.ok) return config;\n\n const projects = config.value.projects.map((project) => this.inspectProject(project));\n return ok({\n configPath,\n portfolioId: config.value.portfolio.id,\n portfolioName: config.value.portfolio.name,\n projectCount: config.value.projects.length,\n continuityDocPath: config.value.portfolio.continuityDocPath,\n projects,\n });\n }\n\n private inspectProject(project: PortfolioProject): PortfolioProjectStatus {\n const repoPath = this.resolvePath(project.repoPath);\n const repoExists = existsSync(repoPath);\n const taskBoardExists = repoExists && existsSync(join(repoPath, ...project.taskBoardPath.split(\"/\")));\n const zoneMapExists = repoExists && existsSync(join(repoPath, ...project.zoneMapPath.split(\"/\")));\n const warnings: string[] = [];\n\n if (!repoExists) warnings.push(\"repo path not found\");\n if (repoExists && !taskBoardExists) warnings.push(\"task-board missing\");\n if (repoExists && !zoneMapExists) warnings.push(\"zone-map missing\");\n if (project.validationGates.length === 0) warnings.push(\"validation gates missing\");\n if (project.injectionPolicy === \"direct_with_approval\" && !taskBoardExists) warnings.push(\"direct injection blocked until task-board exists\");\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists,\n taskBoardExists,\n zoneMapExists,\n validationGateCount: project.validationGates.length,\n injectionPolicy: project.injectionPolicy,\n warnings,\n };\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createPortfolioService(root: string): PortfolioService {\n return new PortfolioService(root);\n}\n","import { z } from \"zod\";\r\n\r\n// Task Board\n\r\nexport const TaskHistoryEntrySchema = z.object({\r\n at: z.string(),\r\n action: z.string(),\r\n operator: z.string().optional(),\r\n from: z.string().optional(),\r\n to: z.string().optional(),\r\n reason: z.string().optional(),\r\n branch: z.string().optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const TaskSchema = z.object({\r\n id: z.string().min(1).max(120),\r\n title: z.string().min(1).max(500),\r\n owner: z.string().min(1).max(50),\r\n backupOwner: z.string().optional(),\r\n status: z.enum([\"ready\", \"active\", \"pending\", \"blocked\", \"done\", \"rolled_back\"]),\r\n track: z.string().optional(),\r\n zone: z.array(z.string()).optional(),\r\n dependsOn: z.array(z.string()).optional(),\r\n acceptance: z.array(z.string()).optional(),\r\n handoff: z.string().optional(),\r\n history: z.array(TaskHistoryEntrySchema).optional(),\r\n});\r\n\r\nexport const ReassignmentSchema = z.object({\r\n at: z.string(),\r\n task: z.string(),\r\n from: z.string(),\r\n to: z.string(),\r\n reason: z.string(),\r\n});\r\n\r\nexport const TaskBoardSchema = z.object({\r\n project: z.string(),\r\n updatedAt: z.string(),\r\n resiliencePolicy: z.string().optional(),\r\n closurePolicy: z.string().optional(),\r\n baseTestMatrix: z.array(z.string()).optional(),\r\n currentExecutionOrder: z.array(z.string()),\r\n tasks: z.array(TaskSchema),\r\n reassignments: z.array(ReassignmentSchema).optional(),\r\n});\r\n\r\n// Mother Version\n\r\nexport const MotherBranchEntrySchema = z.object({\r\n version: z.number(),\r\n name: z.string(),\r\n sprint: z.string(),\r\n operator: z.string(),\r\n date: z.string(),\r\n at: z.string(),\r\n previous: z.string(),\r\n description: z.string(),\r\n});\r\n\r\nexport const MotherVersionSchema = z.object({\r\n version: z.number(),\r\n current: z.string(),\r\n branches: z.array(MotherBranchEntrySchema),\r\n});\r\n\r\n// Zone Map\n\r\nexport const ZoneEntrySchema = z.object({\r\n owner: z.string(),\r\n lock: z.enum([\"operator_exclusive\", \"operator_double\", \"shared\", \"forbidden\", \"owner_per_sprint\"]),\r\n sprints: z.array(z.string()),\r\n criticality: z.enum([\"low\", \"medium\", \"high\", \"critical\"]).optional(),\r\n});\r\n\r\nexport const ZoneMapSchema = z.object({\r\n zones: z.record(z.string(), ZoneEntrySchema),\r\n});\r\n\r\n// Canonical Documents\n\r\nexport const DerivedDocConfigSchema = z.object({\r\n path: z.string().min(1),\r\n type: z.enum([\"central\", \"collaborator\", \"status-board\"]),\r\n source: z.literal(\"task-board\"),\r\n filter: z.object({ owner: z.string() }).optional(),\r\n extra: z.record(z.string()).optional(),\r\n});\r\n\r\nexport const CanonicalIssueSchema = z.object({\r\n file: z.string(),\r\n severity: z.enum([\"blocker\", \"warn\"]),\r\n reason: z.string(),\r\n});\r\n\r\n// Configuration\n\r\nexport const GateDefinitionSchema = z.object({\r\n name: z.string().min(1).max(100),\r\n command: z.string().min(1).max(500),\r\n args: z.array(z.string()).optional(),\r\n timeoutSeconds: z.number().min(10).max(3600).default(300),\r\n});\r\n\r\nexport const OreshnikConfigSchema = z.object({\r\n version: z.literal(1),\r\n project: z.object({\r\n name: z.string().min(1).max(100),\r\n mainBranch: z.string().min(1).max(100).default(\"main\"),\r\n }),\r\n operators: z.array(z.object({\r\n id: z.string().regex(/^[a-z0-9_-]+$/),\r\n name: z.string().min(1).max(100),\r\n email: z.string().email().optional(),\r\n })).min(1),\r\n branching: z.object({\r\n motherPrefix: z.string().default(\"MADRE\"),\r\n childFormat: z.string().default(\"{operator}/{sprint}-{desc}-{date}\"),\r\n integrationPrefix: z.string().default(\"integration\"),\r\n }).optional().default({}),\r\n validation: z.object({\r\n gates: z.array(GateDefinitionSchema).default([]),\r\n }).optional().default({}),\r\n hardStops: z.object({\r\n forbiddenPatterns: z.array(z.string()).default([]),\r\n doubleLockPatterns: z.array(z.string()).default([]),\r\n }).optional().default({}),\r\n vault: z.object({\r\n enabled: z.boolean().default(true),\r\n path: z.string().default(\"docs/obsidian-vault\"),\r\n centralDoc: z.string().default(\"00_CENTRAL.md\"),\r\n }).optional().default({}),\r\n canonical: z.object({\r\n derivedDocs: z.array(DerivedDocConfigSchema).optional(),\r\n knownLegacyTasks: z.array(z.string()).optional(),\r\n knownAssignmentTasks: z.array(z.string()).optional(),\r\n }).optional(),\r\n sync: z.object({\r\n canonicalAutoConflicts: z.array(z.string()).optional(),\r\n }).optional(),\r\n checkpoints: z.object({\r\n autoOnClose: z.boolean().default(true),\r\n autoPreRollback: z.boolean().default(true),\r\n snapshotDir: z.string().default(\"var/oreshnik/checkpoints\"),\r\n }).optional().default({}),\r\n security: z.object({\r\n requireCleanTree: z.boolean().default(true),\r\n secretScanning: z.boolean().default(true),\r\n blockEnvDiffs: z.boolean().default(true),\r\n }).optional().default({}),\r\n});\r\n\r\n// Distributed Lock\n\r\n// Portfolio\n\nexport const PortfolioProjectSchema = z.object({\n projectId: z.string().min(1).max(50).regex(/^[a-z0-9_-]+$/),\n displayName: z.string().min(1).max(100),\n repoPath: z.string().min(1),\n defaultBranch: z.string().min(1).max(100),\n operators: z.array(z.string().min(1).max(50)).default([]),\n taskBoardPath: z.string().min(1).default(\"var/oreshnik/task-board.json\"),\n zoneMapPath: z.string().min(1).default(\"docs/07_handoffs/zone-map.json\"),\n validationGates: z.array(GateDefinitionSchema).default([]),\n injectionPolicy: z.enum([\"proposal_only\", \"direct_with_approval\"]).default(\"proposal_only\"),\n priority: z.enum([\"low\", \"medium\", \"high\", \"critical\"]).default(\"medium\"),\n});\n\nexport const PortfolioConfigSchema = z.object({\n version: z.literal(1),\n portfolio: z.object({\n id: z.string().min(1).max(50).regex(/^[a-z0-9_-]+$/),\n name: z.string().min(1).max(100),\n sourceNote: z.string().optional(),\n continuityDocPath: z.string().min(1).optional(),\n }),\n projects: z.array(PortfolioProjectSchema).min(1),\n});\n\nexport const DistributedLockSchema = z.object({\n zone: z.string().min(1),\r\n owner: z.string().min(1),\r\n acquiredAt: z.string(),\r\n expiresAt: z.string(),\r\n ttlMinutes: z.number().min(1).max(1440),\r\n sprint: z.string().optional(),\r\n reason: z.string().min(1).max(500),\r\n});\r\n\r\n// Checkpoint\n\r\nexport const CheckpointSchema = z.object({\r\n id: z.string(),\r\n tag: z.string(),\r\n timestamp: z.string(),\r\n operator: z.string(),\r\n sprint: z.string().optional(),\r\n type: z.enum([\"auto\", \"manual\", \"pre-rollback\"]),\r\n git: z.object({\r\n tag: z.string(),\r\n commit: z.string(),\r\n branch: z.string(),\r\n motherBranch: z.string().optional(),\r\n motherVersion: z.number().optional(),\r\n }),\r\n state: z.object({\r\n taskBoard: TaskBoardSchema,\r\n motherVersion: MotherVersionSchema,\r\n workingTreeDirty: z.boolean(),\r\n stashRef: z.string().nullable(),\r\n }),\r\n validation: z.object({\r\n typecheck: z.enum([\"passed\", \"failed\", \"skipped\"]).optional(),\r\n build: z.enum([\"passed\", \"failed\", \"skipped\"]).optional(),\r\n tests: z.string().optional(),\r\n zoneCheck: z.enum([\"clean\", \"violations\"]).optional(),\r\n canonicalCheck: z.enum([\"aligned\", \"drift\"]).optional(),\r\n }).optional(),\r\n});\r\n\r\n// Sprint Event\n\r\nexport const SprintEventSchema = z.object({\r\n sprint: z.string(),\r\n operator: z.string(),\r\n type: z.enum([\"created\", \"started\", \"checkpoint\", \"gate_passed\", \"gate_failed\", \"closed\", \"rolled_back\", \"reassigned\"]),\r\n date: z.string(),\r\n at: z.string(),\r\n branch: z.string().optional(),\r\n previousMother: z.string().optional(),\r\n nextMother: z.string().optional(),\r\n description: z.string().optional(),\r\n changedFiles: z.array(z.string()).optional(),\r\n gateResults: z.record(z.enum([\"passed\", \"failed\"])).optional(),\r\n});\r\n\r\n// Input Sanitizers\n\r\nexport const SprintIdSchema = z.string().min(1).max(50).regex(\r\n /^[a-zA-Z0-9_-]+$/,\r\n \"Sprint ID must contain only alphanumeric characters, hyphens, and underscores\"\r\n);\r\n\r\nexport const OperatorIdSchema = z.string().min(1).max(50).regex(\r\n /^[a-zA-Z0-9_-]+$/,\r\n \"Operator ID must contain only alphanumeric characters, hyphens, and underscores\"\r\n);\r\n\r\nexport const DescriptionSchema = z.string().min(1).max(500);\r\n\r\nexport const TagNameSchema = z.string().min(1).max(100).regex(\r\n /^[a-zA-Z0-9._/-]+$/,\r\n \"Tag name must contain only alphanumeric characters, dots, underscores, hyphens, and slashes\"\r\n);\r\n\r\n// Vault Guard\n\r\nexport const VaultGuardResultSchema = z.object({\r\n clean: z.boolean(),\r\n configDirty: z.array(z.string()),\r\n configRestored: z.boolean(),\r\n contentDirty: z.array(z.string()),\r\n unstagedStagedOverlap: z.array(z.string()),\r\n untracked: z.array(z.string()),\r\n errors: z.array(z.string()),\r\n});\r\n\r\n// Notes Ingestion\r\n\r\nexport const NoteTaskSchema = z.object({\r\n rawLine: z.string(),\r\n lineNumber: z.number(),\r\n checked: z.boolean(),\r\n projectIds: z.array(z.string()),\r\n proposedType: z.enum([\"feature\", \"bug\", \"qa\", \"docs\", \"architecture\", \"migration\", \"ops\"]),\r\n proposedOwner: z.string(),\r\n proposedPriority: z.enum([\"low\", \"medium\", \"high\", \"critical\"]),\r\n proposedSprintPrefix: z.string(),\r\n evidenceType: z.enum([\"code\", \"ui\", \"docs\", \"integration\", \"prod\"]),\r\n evidenceExpectation: z.string(),\r\n});\r\n\r\nexport const NotesIngestionResultSchema = z.object({\r\n sourcePath: z.string(),\r\n portfolioId: z.string(),\r\n parsedAt: z.string(),\r\n dryRun: z.boolean(),\r\n totalLines: z.number(),\r\n taskLines: z.number(),\r\n pendingCount: z.number(),\r\n doneCount: z.number(),\r\n tasksByProject: z.record(z.string(), z.array(NoteTaskSchema)),\r\n unclassifiedTasks: z.array(NoteTaskSchema),\r\n warnings: z.array(z.string()),\r\n});\r\n\r\n// Injection\r\n\r\nexport const ProjectInjectionResultSchema = z.object({\r\n projectId: z.string(),\r\n displayName: z.string(),\r\n injectionPolicy: z.enum([\"proposal_only\", \"direct_with_approval\"]),\r\n repoPath: z.string(),\r\n tasksInjected: z.number(),\r\n tasksSkipped: z.number(),\r\n checkpointTag: z.string().optional(),\r\n handoffPath: z.string().optional(),\r\n proposalPath: z.string().optional(),\r\n blocked: z.boolean(),\r\n blockReason: z.string().optional(),\r\n warnings: z.array(z.string()),\r\n});\r\n\r\nexport const InjectionResultSchema = z.object({\r\n portfolioId: z.string(),\r\n injectedAt: z.string(),\r\n dryRun: z.boolean(),\r\n confirmed: z.boolean(),\r\n projects: z.array(ProjectInjectionResultSchema),\r\n summary: z.object({\r\n totalProjects: z.number(),\r\n projectsBlocked: z.number(),\r\n projectsInjected: z.number(),\r\n proposalsGenerated: z.number(),\r\n totalTasksInjected: z.number(),\r\n totalTasksSkipped: z.number(),\r\n }),\r\n errors: z.array(z.string()),\r\n});\r\n\r\n// Evidence Gates\r\n\r\nexport const EvidenceRecordSchema = z.object({\r\n taskId: z.string(),\r\n evidenceType: z.enum([\"code\", \"ui\", \"docs\", \"integration\", \"prod\"]),\r\n validatedAt: z.string(),\r\n validator: z.string(),\r\n result: z.enum([\"passed\", \"failed\", \"pending\"]),\r\n details: z.string(),\r\n artifacts: z.array(z.string()).optional(),\r\n});\r\n\r\nexport const TaskEvidenceCheckSchema = z.object({\r\n taskId: z.string(),\r\n taskTitle: z.string(),\r\n evidenceType: z.enum([\"code\", \"ui\", \"docs\", \"integration\", \"prod\"]),\r\n hasEvidence: z.boolean(),\r\n requiredEvidence: z.string(),\r\n currentStatus: z.enum([\"ready\", \"active\", \"pending\", \"blocked\", \"done\", \"rolled_back\"]),\r\n missing: z.array(z.string()),\r\n});\r\n\r\nexport const EvidenceGateResultSchema = z.object({\r\n checkedAt: z.string(),\r\n sprint: z.string().optional(),\r\n operator: z.string(),\r\n totalTasks: z.number(),\r\n doneTasks: z.number(),\r\n tasksWithEvidence: z.number(),\r\n tasksWithoutEvidence: z.number(),\r\n tasks: z.array(TaskEvidenceCheckSchema),\r\n passed: z.boolean(),\r\n blockers: z.array(z.string()),\r\n});\r\n\r\n// Distributed Locks\r\n\r\nexport const ZoneLockSchema = z.object({\r\n zone: z.string(),\r\n operator: z.string(),\r\n sprint: z.string(),\r\n acquiredAt: z.string(),\r\n ttl: z.number().min(60).max(86400),\r\n expiresAt: z.string(),\r\n});\r\n\r\nexport const LockResultSchema = z.object({\r\n zone: z.string(),\r\n acquired: z.boolean(),\r\n existingLock: ZoneLockSchema.optional(),\r\n error: z.string().optional(),\r\n});\r\n\r\nexport const LockListSchema = z.object({\r\n fetchedAt: z.string(),\r\n locks: z.array(ZoneLockSchema),\r\n active: z.array(ZoneLockSchema),\r\n expired: z.array(ZoneLockSchema),\r\n});\r\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { NoteTask, NotesIngestionResult, PortfolioConfig, Result, StateError } from \"../types/index.js\";\nimport { NotesIngestionResultSchema, PortfolioConfigSchema } from \"../types/schemas.js\";\n\nconst PROJECT_KEYWORDS: Record<string, string[]> = {\n heptacore: [\"heptacore\", \"heptacor\", \"eptacor\"],\n oreshnik: [\"oreshnik\", \"oresnick\", \"ornik\"],\n turpialsound: [\"turpialsound\", \"turpial sound\", \"turpial zone\"],\n turpialmarket: [\"turpialmarket\", \"turpial market\", \"marketplace\"],\n dropsocial: [\"dropsocial\", \"drop social\"],\n smsmantis: [\"mantis\", \"smsmantis\"],\n};\n\nconst OPERATOR_KEYWORDS: Record<string, string> = {\n jean: \"jean\",\n};\n\nconst TASK_LINE_RE = /^\\s*[-*]\\s+\\[([ xX])\\]\\s+(.+)$/;\n\nexport class NotesIngestionService {\n constructor(private readonly root: string) {}\n\n ingest(options: {\n sourcePath: string;\n configPath?: string;\n dryRun?: boolean;\n }): Result<NotesIngestionResult, StateError> {\n const configResult = this.loadPortfolio(options.configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const fullSourcePath = this.resolvePath(options.sourcePath);\n\n if (!existsSync(fullSourcePath)) {\n return err(this.fail(`Source file not found: ${options.sourcePath}`));\n }\n\n let content: string;\n try {\n content = readFileSync(fullSourcePath, \"utf8\");\n } catch (e) {\n return err(this.fail(`Failed to read source file: ${String(e)}`));\n }\n\n const lines = content.split(\"\\n\");\n const now = new Date().toISOString();\n const validProjectIds = new Set(config.projects.map((p) => p.projectId));\n\n const allTasks: NoteTask[] = [];\n const warnings: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line) continue;\n const match = line.match(TASK_LINE_RE);\n if (!match) continue;\n\n const checked = match[1]!.toLowerCase() === \"x\";\n const rawLine = match[2]!.trim();\n if (!rawLine) continue;\n\n const projectIds = this.classifyProject(rawLine, validProjectIds);\n const proposedOwner = this.classifyOwner(rawLine);\n const proposedType = this.classifyTaskType(rawLine);\n const proposedPriority = this.classifyPriority(rawLine);\n const proposedSprintPrefix = this.resolveSprintPrefix(projectIds);\n const evidence = this.classifyEvidence(rawLine);\n\n const task: NoteTask = {\n rawLine,\n lineNumber: i + 1,\n checked,\n projectIds,\n proposedType,\n proposedOwner,\n proposedPriority,\n proposedSprintPrefix,\n evidenceType: evidence.type,\n evidenceExpectation: evidence.expectation,\n };\n\n allTasks.push(task);\n\n if (projectIds.length === 0) {\n warnings.push(`Line ${i + 1}: could not classify project for task, moved to unclassified`);\n }\n }\n\n const tasksByProject: Record<string, NoteTask[]> = {};\n for (const pid of validProjectIds) {\n tasksByProject[pid] = [];\n }\n\n const unclassifiedTasks: NoteTask[] = [];\n\n for (const task of allTasks) {\n if (task.projectIds.length === 0) {\n unclassifiedTasks.push(task);\n continue;\n }\n for (const pid of task.projectIds) {\n if (validProjectIds.has(pid) && tasksByProject[pid]) {\n tasksByProject[pid].push(task);\n }\n }\n }\n\n const pendingTasks = allTasks.filter((t) => !t.checked);\n const doneTasks = allTasks.filter((t) => t.checked);\n\n const result: NotesIngestionResult = {\n sourcePath: options.sourcePath,\n portfolioId: config.portfolio.id,\n parsedAt: now,\n dryRun: options.dryRun !== false,\n totalLines: lines.length,\n taskLines: allTasks.length,\n pendingCount: pendingTasks.length,\n doneCount: doneTasks.length,\n tasksByProject,\n unclassifiedTasks,\n warnings,\n };\n\n const parsed = NotesIngestionResultSchema.safeParse(result);\n if (!parsed.success) {\n return err(this.fail(`Invalid ingestion result: ${parsed.error.message}`));\n }\n\n return ok(result);\n }\n\n private loadPortfolio(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private classifyProject(text: string, validIds: Set<string>): string[] {\n const lower = text.toLowerCase();\n const ids: string[] = [];\n for (const [pid, keywords] of Object.entries(PROJECT_KEYWORDS)) {\n if (!validIds.has(pid)) continue;\n for (const kw of keywords) {\n if (lower.includes(kw)) {\n ids.push(pid);\n break;\n }\n }\n }\n return ids;\n }\n\n private classifyOwner(text: string): string {\n const lower = text.toLowerCase();\n for (const [keyword, owner] of Object.entries(OPERATOR_KEYWORDS)) {\n if (lower.includes(keyword)) return owner;\n }\n return \"architect\";\n }\n\n private classifyTaskType(text: string): NoteTask[\"proposedType\"] {\n const lower = text.toLowerCase();\n if (/\\bbug\\b|error|falla|roto|corregir|arreglar|fix\\b/.test(lower)) return \"bug\";\n if (/revisar\\b|qa\\b|test\\b|validar\\b|verificar\\b/.test(lower)) return \"qa\";\n if (/documentar\\b|doc\\b|gu[ií]a\\b|readme|notas\\b/.test(lower)) return \"docs\";\n if (/arquitectura|dise[ñn]o\\b|estructura|decisi[óo]n/.test(lower)) return \"architecture\";\n if (/separar\\b|mover\\b|migrar\\b|aislar\\b|extraer|split/.test(lower)) return \"migration\";\n if (/publicar\\b|deploy\\b|producci[óo]n|server|entorno/.test(lower)) return \"ops\";\n return \"feature\";\n }\n\n private classifyPriority(text: string): NoteTask[\"proposedPriority\"] {\n const lower = text.toLowerCase();\n if (/cr[ií]tico|urgente|bloquea|crash\\b|roto\\b|prioridad alta/.test(lower)) return \"critical\";\n if (/importante|alto impacto|prioridad/.test(lower)) return \"high\";\n if (/bajo|menor|opcional|low priority/.test(lower)) return \"low\";\n return \"medium\";\n }\n\n private resolveSprintPrefix(projectIds: string[]): string {\n const prefixes: Record<string, string> = {\n heptacore: \"S-HC\",\n oreshnik: \"S-ORESHNIK\",\n turpialsound: \"S-TS\",\n turpialmarket: \"S-TM\",\n dropsocial: \"S-DS\",\n smsmantis: \"S-SM\",\n };\n for (const pid of projectIds) {\n if (prefixes[pid]) return prefixes[pid];\n }\n return \"S-GEN\";\n }\n\n private classifyEvidence(text: string): { type: NoteTask[\"evidenceType\"]; expectation: string } {\n const lower = text.toLowerCase();\n if (/implementar|crear\\b|construir|c[óo]digo|funcionalidad|backend|api\\b|endpoint/.test(lower)) {\n return { type: \"code\", expectation: \"diff verificable, tests\" };\n }\n if (/click|bot[óo]n|tarjeta|card\\b|ui\\b|dashboard|modal|interfaz|visual|landing|p[áa]gina/.test(lower)) {\n return { type: \"ui\", expectation: \"QA manual o test automatizado de UI\" };\n }\n if (/documentar|doc\\b|leer\\b|documentaci[óo]n|gu[ií]a|readme/.test(lower)) {\n return { type: \"docs\", expectation: \"documentos actualizados en vault\" };\n }\n if (/integrar|conectar|webhook|deploy\\b|publicar|producci[óo]n/.test(lower)) {\n return { type: \"integration\", expectation: \"dry-run verificable o test e2e\" };\n }\n if (/producci[óo]n\\b|release\\b|publish\\b|lanzar/.test(lower)) {\n return { type: \"prod\", expectation: \"checklist manual, rollback plan y confirmaci[óo]n humana\" };\n }\n return { type: \"code\", expectation: \"diff verificable\" };\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createNotesIngestionService(root: string): NotesIngestionService {\n return new NotesIngestionService(root);\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type {\n InjectionResult,\n NoteTask,\n NotesIngestionResult,\n PortfolioConfig,\n PortfolioProject,\n ProjectInjectionResult,\n Result,\n StateError,\n Task,\n TaskBoard,\n} from \"../types/index.js\";\nimport { InjectionResultSchema, PortfolioConfigSchema } from \"../types/schemas.js\";\nimport { sanitize } from \"../utils/helpers.js\";\nimport { GitService } from \"./git.service.js\";\nimport { StateManager } from \"./state-manager.js\";\n\nexport class InjectionService {\n constructor(private readonly root: string) {}\n\n inject(options: {\n ingestion: NotesIngestionResult;\n configPath?: string;\n dryRun?: boolean;\n confirm?: boolean;\n projectFilter?: string[];\n }): Result<InjectionResult, StateError> {\n const configResult = this.loadPortfolio(options.configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const projectResults: ProjectInjectionResult[] = [];\n const errors: string[] = [];\n\n const projectsToProcess = options.projectFilter\n ? config.projects.filter((p) => options.projectFilter!.includes(p.projectId))\n : config.projects;\n\n for (const project of projectsToProcess) {\n const tasks = options.ingestion.tasksByProject[project.projectId];\n if (!tasks || tasks.length === 0) continue;\n\n const pendingTasks = tasks.filter((t) => !t.checked);\n if (pendingTasks.length === 0) continue;\n\n const result = this.injectIntoProject(project, pendingTasks, options);\n projectResults.push(result);\n\n if (result.blocked && result.blockReason) {\n errors.push(`${project.projectId}: ${result.blockReason}`);\n }\n }\n\n const blocked = projectResults.filter((r) => r.blocked);\n const injected = projectResults.filter((r) => !r.blocked && r.injectionPolicy === \"direct_with_approval\");\n const proposals = projectResults.filter((r) => !r.blocked && r.injectionPolicy === \"proposal_only\");\n\n const summary = {\n totalProjects: projectResults.length,\n projectsBlocked: blocked.length,\n projectsInjected: injected.length,\n proposalsGenerated: proposals.length,\n totalTasksInjected: injected.reduce((sum, r) => sum + r.tasksInjected, 0),\n totalTasksSkipped: projectResults.reduce((sum, r) => sum + r.tasksSkipped, 0),\n };\n\n const result: InjectionResult = {\n portfolioId: config.portfolio.id,\n injectedAt: now,\n dryRun: options.dryRun !== false,\n confirmed: options.confirm === true,\n projects: projectResults,\n summary,\n errors,\n };\n\n const parsed = InjectionResultSchema.safeParse(result);\n if (!parsed.success) {\n return err(this.fail(`Invalid injection result: ${parsed.error.message}`));\n }\n\n return ok(result);\n }\n\n private injectIntoProject(\n project: PortfolioProject,\n tasks: NoteTask[],\n options: { dryRun?: boolean; confirm?: boolean },\n ): ProjectInjectionResult {\n const repoPath = this.resolveProjectPath(project.repoPath);\n const warnings: string[] = [];\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: project.injectionPolicy,\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: \"repo path not found\",\n warnings,\n };\n }\n\n if (project.injectionPolicy === \"proposal_only\") {\n const proposal = this.generateProposal(project, tasks, options.dryRun !== false);\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"proposal_only\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n proposalPath: proposal,\n blocked: false,\n warnings,\n };\n }\n\n if (project.injectionPolicy === \"direct_with_approval\") {\n if (!options.confirm) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: \"confirmation required (use --confirm)\",\n warnings,\n };\n }\n\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n if (!existsSync(zoneMapPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: \"zone-map missing\",\n warnings,\n };\n }\n\n // Read zone-map to distribute tasks among operators\n let zoneOperators: string[] = [];\n try {\n const zoneRaw = JSON.parse(readFileSync(zoneMapPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const owners = new Set<string>();\n for (const [, zone] of Object.entries(zoneRaw.zones || {})) {\n const lock = (zone as { lock?: string; owner?: string }).lock || \"\";\n const owner = (zone as { owner?: string }).owner || \"\";\n if (lock.includes(\"exclusive\") || lock === \"operator_double\") {\n if (owner) owners.add(owner);\n }\n }\n // If no exclusive zones found, use shared operators from project config\n if (owners.size === 0) {\n for (const op of (project as any).operators || []) {\n owners.add(op);\n }\n }\n zoneOperators = [...owners].filter(o => o && o !== \"none\");\n } catch {\n zoneOperators = [];\n }\n\n // Fallback: use project operators or default to architect\n if (zoneOperators.length === 0) {\n zoneOperators = (project as any).operators?.length ? (project as any).operators : [\"architect\"];\n }\n\n // Determine owner distribution: round-robin across zone operators\n const getOwner = (taskIndex: number): string => {\n return zoneOperators[taskIndex % zoneOperators.length] || \"architect\";\n };\n\n const git = new GitService(repoPath);\n const statusResult = git.statusPorcelain();\n if (statusResult.ok && statusResult.value.length > 0) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: `working tree dirty (${statusResult.value.length} files)`,\n warnings,\n };\n }\n\n if (options.dryRun !== false) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: tasks.length,\n tasksSkipped: 0,\n blocked: false,\n warnings: [\"dry-run: no task-board was modified\"],\n };\n }\n\n const checkpointTag = this.createPreInjectionCheckpoint(git, project);\n const checkpointResult = git.createTag(checkpointTag, `pre-injection checkpoint for ${project.projectId}`);\n if (!checkpointResult.ok) {\n warnings.push(`checkpoint creation failed: ${checkpointResult.error.message}`);\n }\n\n const state = new StateManager(repoPath);\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const existingBoard = state.readJson<TaskBoard>(taskBoardPath);\n\n const board: TaskBoard = existingBoard.ok\n ? existingBoard.value\n : {\n project: project.projectId,\n updatedAt: new Date().toISOString(),\n currentExecutionOrder: [],\n tasks: [],\n };\n\n let injected = 0;\n let skipped = 0;\n\n let taskIndex = 0;\n for (const noteTask of tasks) {\n const taskId = this.generateTaskId(noteTask);\n const existingTask = board.tasks.find((t) => t.id === taskId);\n if (existingTask) {\n skipped++;\n continue;\n }\n\n const owner = getOwner(taskIndex);\n taskIndex++;\n\n const task: Task = {\n id: taskId,\n title: noteTask.rawLine.slice(0, 200),\n owner,\n status: \"ready\",\n track: noteTask.proposedSprintPrefix,\n zone: [],\n acceptance: [noteTask.evidenceExpectation],\n handoff: `docs/07_handoffs/handoff-${owner}-${new Date().toISOString().slice(0, 10)}.md`,\n history: [\n {\n at: new Date().toISOString(),\n action: \"injected\",\n operator: owner,\n description: `Injected from notes ingestion. Evidence: ${noteTask.evidenceType}`,\n },\n ],\n };\n\n board.tasks.push(task);\n injected++;\n }\n\n board.updatedAt = new Date().toISOString();\n board.currentExecutionOrder = [...board.currentExecutionOrder, ...tasks.map((t) => this.generateTaskId(t))];\n\n const writeResult = state.writeJson(taskBoardPath, board);\n if (!writeResult.ok) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: `failed to write task-board: ${writeResult.error.message}`,\n warnings,\n };\n }\n\n const handoffPath = this.generateHandoff(project, tasks, repoPath);\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: injected,\n tasksSkipped: skipped,\n checkpointTag: checkpointResult.ok ? checkpointTag : undefined,\n handoffPath,\n blocked: false,\n warnings,\n };\n }\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: project.injectionPolicy,\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: `unknown injection policy: ${project.injectionPolicy}`,\n warnings,\n };\n }\n\n private generateProposal(project: PortfolioProject, tasks: NoteTask[], dryRun: boolean): string {\n const repoPath = this.resolveProjectPath(project.repoPath);\n const proposalDir = join(repoPath, \"var\", \"oreshnik\");\n mkdirSync(proposalDir, { recursive: true });\n const proposalPath = join(proposalDir, \"injection-proposal.json\");\n\n const proposal = {\n projectId: project.projectId,\n generatedAt: new Date().toISOString(),\n dryRun,\n injectionPolicy: \"proposal_only\",\n proposedTasks: tasks.map((t) => ({\n taskId: this.generateTaskId(t),\n title: t.rawLine.slice(0, 200),\n owner: t.proposedOwner,\n priority: t.proposedPriority,\n evidenceType: t.evidenceType,\n evidenceExpectation: t.evidenceExpectation,\n })),\n };\n\n if (!dryRun) {\n writeFileSync(proposalPath, JSON.stringify(proposal, null, 2), \"utf8\");\n }\n\n return `var/oreshnik/injection-proposal.json`;\n }\n\n private generateHandoff(project: PortfolioProject, tasks: NoteTask[], repoPath: string): string {\n const handoffDir = join(repoPath, \"docs\", \"07_handoffs\");\n mkdirSync(handoffDir, { recursive: true });\n\n const owners = new Set(tasks.map((t) => t.proposedOwner));\n\n for (const owner of owners) {\n const ownerTasks = tasks.filter((t) => t.proposedOwner === owner);\n const date = new Date().toISOString().slice(0, 10);\n const handoffPath = join(handoffDir, `handoff-${owner}-${date}.md`);\n\n const lines = [\n `# Handoff — ${owner}`,\n `Date: ${date}`,\n `Project: ${project.displayName} (${project.projectId})`,\n ``,\n `## Tasks Injected`,\n ``,\n ];\n\n for (const task of ownerTasks) {\n lines.push(`- [ ] **${task.proposedSprintPrefix}** ${task.rawLine.slice(0, 150)}`);\n lines.push(` - Type: ${task.proposedType}`);\n lines.push(` - Priority: ${task.proposedPriority}`);\n lines.push(` - Evidence: ${task.evidenceType} — ${task.evidenceExpectation}`);\n lines.push(``);\n }\n\n writeFileSync(handoffPath, lines.join(\"\\n\"), \"utf8\");\n }\n\n return `docs/07_handoffs/`;\n }\n\n private createPreInjectionCheckpoint(git: GitService, project: PortfolioProject): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n return `oreshnik/pre-inject-${project.projectId}-${timestamp}`;\n }\n\n private generateTaskId(noteTask: NoteTask): string {\n const base = sanitize(noteTask.rawLine.slice(0, 48));\n return base || `task-${Date.now()}`;\n }\n\n private loadPortfolio(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolveLocalPath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolveProjectPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private resolveLocalPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createInjectionService(root: string): InjectionService {\n return new InjectionService(root);\n}\n","export function sanitize(value: string, maxLength = 48): string {\n return String(value || \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, maxLength);\n}\n\nexport function today(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\nexport function nowDisplay(timeZone = \"America/Caracas\"): { display: string; iso: string; date: string } {\n const now = new Date();\n const formatter = new Intl.DateTimeFormat(\"es-VE\", {\n timeZone,\n year: \"2-digit\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n return {\n display: formatter.format(now).replace(\",\", \"\"),\n iso: now.toISOString(),\n date: now.toISOString().slice(0, 10),\n };\n}\n\nexport function formatBranchName(\n template: string,\n vars: Record<string, string>\n): string {\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replace(`{${key}}`, sanitize(value));\n }\n return result;\n}\n\nexport function nonIgnoredDirtyFiles(porcelain: Array<{ status: string; path: string }>): string[] {\n return porcelain\n .filter((entry) => !entry.path.startsWith(\"var/oreshnik/\") && !entry.path.startsWith(\"output/\"))\n .map((entry) => entry.path);\n}\n\nexport function isMotherBranch(branch: string): boolean {\n return /^(main|master|MADRE\\/|integration\\/|prod\\/)/i.test(branch);\n}\n\nexport function isChildBranch(branch: string, operator: string): boolean {\n return new RegExp(`^${operator}/`, \"i\").test(branch);\n}\n","import { err, ok } from \"../types/index.js\";\nimport type { EvidenceGateResult, Result, StateError, Task, TaskBoard, TaskEvidenceCheck, EvidenceType, TaskStatus } from \"../types/index.js\";\nimport { EvidenceGateResultSchema } from \"../types/schemas.js\";\n\nconst EVIDENCE_REQUIREMENTS: Record<EvidenceType, { minimum: string; items: string[] }> = {\n code: {\n minimum: \"diff verificable, tests o build\",\n items: [\"changed files diff\", \"typecheck passed\", \"tests passed\"],\n },\n ui: {\n minimum: \"QA manual o test automatizado de UI\",\n items: [\"UI change description\", \"screenshot or test result\", \"operator confirmation\"],\n },\n docs: {\n minimum: \"documentos actualizados en vault\",\n items: [\"updated doc paths\", \"references in vault\", \"canonical alignment check\"],\n },\n integration: {\n minimum: \"dry-run verificable o test e2e\",\n items: [\"integration test output\", \"dry-run summary\", \"endpoint verification\"],\n },\n prod: {\n minimum: \"checklist manual, rollback plan y confirmacion humana\",\n items: [\"deployment checklist\", \"rollback plan\", \"human approval signature\"],\n },\n};\n\nexport class EvidenceGateService {\n check(taskBoard: TaskBoard, operator: string, sprint?: string): Result<EvidenceGateResult, StateError> {\n const now = new Date().toISOString();\n const tasks: TaskEvidenceCheck[] = [];\n const blockers: string[] = [];\n\n let doneTasks = 0;\n let tasksWithEvidence = 0;\n let tasksWithoutEvidence = 0;\n\n for (const task of taskBoard.tasks) {\n if (task.status === \"done\") {\n doneTasks++;\n }\n\n const evidenceType = this.inferEvidenceType(task);\n const required = EVIDENCE_REQUIREMENTS[evidenceType];\n const check = this.evaluateTaskEvidence(task, evidenceType, required);\n\n tasks.push(check);\n\n if (task.status === \"done\" && !check.hasEvidence) {\n tasksWithoutEvidence++;\n blockers.push(`${task.id}: ${check.missing.join(\"; \")}`);\n } else if (task.status === \"done\" && check.hasEvidence) {\n tasksWithEvidence++;\n }\n }\n\n const result: EvidenceGateResult = {\n checkedAt: now,\n sprint,\n operator,\n totalTasks: taskBoard.tasks.length,\n doneTasks,\n tasksWithEvidence,\n tasksWithoutEvidence,\n tasks,\n passed: blockers.length === 0,\n blockers,\n };\n\n const parsed = EvidenceGateResultSchema.safeParse(result);\n if (!parsed.success) {\n return err(this.fail(`Invalid evidence gate result: ${parsed.error.message}`));\n }\n\n return ok(result);\n }\n\n generateChecklist(taskBoard: TaskBoard, operator: string): string {\n const lines: string[] = [\n `# QA Evidence Checklist`,\n `Operator: ${operator}`,\n `Project: ${taskBoard.project}`,\n `Generated: ${new Date().toISOString()}`,\n ``,\n `## Instructions`,\n `Verify each task below. Mark [x] when evidence is confirmed. If a task lacks evidence, it will block sprint closure.`,\n ``,\n ];\n\n for (const task of taskBoard.tasks) {\n if (task.status !== \"done\") continue;\n\n const evidenceType = this.inferEvidenceType(task);\n const required = EVIDENCE_REQUIREMENTS[evidenceType];\n\n lines.push(`### ${task.id}`);\n lines.push(`**Title:** ${task.title}`);\n lines.push(`**Evidence Type:** ${evidenceType}`);\n lines.push(`**Minimum Required:** ${required.minimum}`);\n lines.push(``);\n\n for (const item of required.items) {\n lines.push(`- [ ] ${item}`);\n }\n\n lines.push(`- [ ] Operator confirms task is complete`);\n lines.push(``);\n }\n\n return lines.join(\"\\n\");\n }\n\n private evaluateTaskEvidence(\n task: Task,\n evidenceType: EvidenceType,\n required: { minimum: string; items: string[] },\n ): TaskEvidenceCheck {\n const missing: string[] = [];\n const hardMissing: string[] = [];\n const history = task.history || [];\n const acceptance = task.acceptance || [];\n\n const hasValidation = history.some(\n (h) => h.action === \"validated\" || h.action === \"done\" || h.action === \"qa_passed\",\n );\n if (!hasValidation) {\n hardMissing.push(\"no validation history entry found\");\n }\n\n if (acceptance.length === 0) {\n hardMissing.push(\"no acceptance criteria defined\");\n }\n\n if (task.status === \"done\" && !task.handoff) {\n hardMissing.push(\"no handoff path defined\");\n }\n\n if (task.status === \"done\") {\n const combinedText = [...history.map((h) => h.description || \"\"), ...acceptance].join(\" \").toLowerCase();\n let matchedItems = 0;\n for (const item of required.items) {\n if (combinedText.includes(item.toLowerCase())) {\n matchedItems++;\n }\n }\n\n for (const item of required.items) {\n if (!combinedText.includes(item.toLowerCase())) {\n missing.push(`evidence item not verified: ${item}`);\n }\n }\n\n if (matchedItems === 0) {\n hardMissing.push(\"no evidence items matched the task\");\n }\n }\n\n const allMissing = [...hardMissing, ...missing];\n\n return {\n taskId: task.id,\n taskTitle: task.title,\n evidenceType,\n hasEvidence: task.status !== \"done\" || hardMissing.length === 0,\n requiredEvidence: required.minimum,\n currentStatus: task.status,\n missing: allMissing,\n };\n }\n\n private inferEvidenceType(task: Task): EvidenceType {\n const text = `${task.title} ${task.track || \"\"} ${(task.acceptance || []).join(\" \")}`.toLowerCase();\n\n if (/ui\\b|dashboard|modal|interfaz|visual|landing|p[áa]gina|card|bot[óo]n|click|css|style/.test(text)) return \"ui\";\n if (/documentar|doc\\b|gu[ií]a|readme|vault|notas/.test(text)) return \"docs\";\n if (/integrar|conectar|webhook|deploy\\b|publicar|api\\b|endpoint/.test(text)) return \"integration\";\n if (/producci[óo]n\\b|release\\b|publish\\b|lanzar|prod\\b/.test(text)) return \"prod\";\n\n return \"code\";\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createEvidenceGateService(): EvidenceGateService {\n return new EvidenceGateService();\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, PortfolioProject, Result, StateError } from \"../types/index.js\";\nimport { PortfolioConfigSchema } from \"../types/schemas.js\";\n\nexport interface BootstrapProjectResult {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n taskBoardCreated: boolean;\n zoneMapCreated: boolean;\n gatesDocCreated: boolean;\n errors: string[];\n}\n\nexport interface BootstrapResult {\n portfolioId: string;\n bootstrappedAt: string;\n projects: BootstrapProjectResult[];\n}\n\nexport class BootstrapService {\n constructor(private readonly root: string) {}\n\n bootstrap(configPath = \".oreshnik.portfolio.json\", projectFilter?: string[]): Result<BootstrapResult, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const projects: BootstrapProjectResult[] = [];\n\n const targets = projectFilter\n ? config.projects.filter((p) => projectFilter.includes(p.projectId))\n : config.projects;\n\n for (const project of targets) {\n projects.push(this.bootstrapProject(project));\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n bootstrappedAt: now,\n projects,\n });\n }\n\n private bootstrapProject(project: PortfolioProject): BootstrapProjectResult {\n const repoPath = this.resolveProjectPath(project.repoPath);\n const errors: string[] = [];\n let taskBoardCreated = false;\n let zoneMapCreated = false;\n let gatesDocCreated = false;\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: false,\n taskBoardCreated: false,\n zoneMapCreated: false,\n gatesDocCreated: false,\n errors: [\"repo path not found\"],\n };\n }\n\n const varDir = join(repoPath, \"var\", \"oreshnik\");\n const handoffsDir = join(repoPath, \"docs\", \"07_handoffs\");\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n\n try {\n mkdirSync(varDir, { recursive: true });\n mkdirSync(handoffsDir, { recursive: true });\n } catch (e) {\n errors.push(`failed to create directories: ${String(e)}`);\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: true,\n taskBoardCreated: false,\n zoneMapCreated: false,\n gatesDocCreated: false,\n errors,\n };\n }\n\n if (!existsSync(taskBoardPath)) {\n try {\n const taskBoard = {\n project: project.projectId,\n updatedAt: new Date().toISOString(),\n currentExecutionOrder: [],\n tasks: [],\n };\n writeFileSync(taskBoardPath, JSON.stringify(taskBoard, null, 2) + \"\\n\", \"utf8\");\n taskBoardCreated = true;\n } catch (e) {\n errors.push(`failed to create task-board: ${String(e)}`);\n }\n }\n\n if (!existsSync(zoneMapPath)) {\n try {\n const zoneMap = {\n zones: {\n \"docs/**\": { owner: \"shared\", lock: \"shared\", sprints: [\"*\"] },\n \"var/oreshnik/**\": { owner: \"shared\", lock: \"shared\", sprints: [\"*\"] },\n \"src/**\": { owner: \"architect\", lock: \"operator_exclusive\", sprints: [\"*\"] },\n \".env\": { owner: \"none\", lock: \"forbidden\", sprints: [\"*\"], criticality: \"critical\" },\n \".env.*\": { owner: \"none\", lock: \"forbidden\", sprints: [\"*\"], criticality: \"critical\" },\n },\n };\n writeFileSync(zoneMapPath, JSON.stringify(zoneMap, null, 2) + \"\\n\", \"utf8\");\n zoneMapCreated = true;\n } catch (e) {\n errors.push(`failed to create zone-map: ${String(e)}`);\n }\n }\n\n if (project.validationGates.length === 0) {\n try {\n const gatesDocPath = join(repoPath, \"var\", \"oreshnik\", \"gates.json\");\n const defaultGates = {\n project: project.projectId,\n gates: [\n { name: \"typecheck\", command: \"npm\", args: [\"run\", \"typecheck\"], timeoutSeconds: 120 },\n { name: \"build\", command: \"npm\", args: [\"run\", \"build\"], timeoutSeconds: 300 },\n { name: \"test\", command: \"npm\", args: [\"run\", \"test\"], timeoutSeconds: 300 },\n ],\n };\n writeFileSync(gatesDocPath, JSON.stringify(defaultGates, null, 2) + \"\\n\", \"utf8\");\n gatesDocCreated = true;\n } catch (e) {\n errors.push(`failed to create gates doc: ${String(e)}`);\n }\n }\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: true,\n taskBoardCreated,\n zoneMapCreated,\n gatesDocCreated,\n errors,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolveLocalPath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolveProjectPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private resolveLocalPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createBootstrapService(root: string): BootstrapService {\n return new BootstrapService(root);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, PortfolioProject, Result, StateError, TaskBoard, ZoneLock } from \"../types/index.js\";\nimport { PortfolioConfigSchema, TaskBoardSchema, ZoneLockSchema } from \"../types/schemas.js\";\nimport { LockService } from \"./lock.service.js\";\n\nexport interface OperatorBreakdown {\n operator: string;\n ready: number;\n active: number;\n done: number;\n blocked: number;\n pending: number;\n total: number;\n}\n\nexport interface TaskEntry {\n id: string;\n title: string;\n owner: string;\n status: string;\n dependsOn: string[];\n}\n\nexport interface LockSummary {\n zone: string;\n operator: string;\n sprint: string;\n expiresAt: string;\n remainingMinutes: number;\n}\n\nexport interface ProjectDashboard {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n taskBoardExists: boolean;\n zoneMapExists: boolean;\n injectionPolicy: string;\n priority: string;\n taskCounts: {\n total: number;\n ready: number;\n active: number;\n done: number;\n blocked: number;\n pending: number;\n };\n operatorBreakdown: OperatorBreakdown[];\n tasks: TaskEntry[];\n locks: LockSummary[];\n lastUpdated?: string;\n warnings: string[];\n}\n\nexport interface PortfolioDashboard {\n portfolioId: string;\n portfolioName: string;\n generatedAt: string;\n projectCount: number;\n projectsWithRepo: number;\n projectsReady: number;\n projectsBlocked: number;\n totalTasks: number;\n totalDone: number;\n totalPending: number;\n projects: ProjectDashboard[];\n}\n\nexport class DashboardService {\n private lockService: LockService;\n\n constructor(private readonly root: string) {\n this.lockService = new LockService(root);\n }\n\n generate(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioDashboard, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const projects: ProjectDashboard[] = [];\n let totalTasks = 0;\n let totalDone = 0;\n let totalPending = 0;\n let projectsWithRepo = 0;\n let projectsReady = 0;\n let projectsBlocked = 0;\n\n for (const project of config.projects) {\n const dash = this.inspectProject(project);\n projects.push(dash);\n\n if (dash.repoExists) {\n projectsWithRepo++;\n if (dash.warnings.length === 0) projectsReady++;\n else projectsBlocked++;\n } else {\n projectsBlocked++;\n }\n\n totalTasks += dash.taskCounts.total;\n totalDone += dash.taskCounts.done;\n totalPending += dash.taskCounts.total - dash.taskCounts.done;\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n portfolioName: config.portfolio.name,\n generatedAt: now,\n projectCount: config.projects.length,\n projectsWithRepo,\n projectsReady,\n projectsBlocked,\n totalTasks,\n totalDone,\n totalPending,\n projects,\n });\n }\n\n toMarkdown(dashboard: PortfolioDashboard): string {\n const lines: string[] = [\n `# ${dashboard.portfolioName}`,\n `Generated: ${dashboard.generatedAt}`,\n ``,\n `## Summary`,\n ``,\n `| Metric | Value |`,\n `|---|---|`,\n `| Projects | ${dashboard.projectCount} |`,\n `| With repo | ${dashboard.projectsWithRepo} |`,\n `| Ready | ${dashboard.projectsReady} |`,\n `| Blocked | ${dashboard.projectsBlocked} |`,\n `| Total tasks | ${dashboard.totalTasks} |`,\n `| Done | ${dashboard.totalDone} |`,\n `| Pending | ${dashboard.totalPending} |`,\n ``,\n `## Projects`,\n ``,\n ];\n\n for (const project of dashboard.projects) {\n const status = project.repoExists\n ? (project.warnings.length === 0 ? \"ready\" : \"needs-attention\")\n : \"missing\";\n const icon = project.repoExists ? (project.warnings.length === 0 ? \"v\" : \"~\") : \"x\";\n\n lines.push(`### ${icon} ${project.displayName} (\\`${project.projectId}\\`) — ${status}`);\n lines.push(``);\n lines.push(`| Field | Value |`);\n lines.push(`|---|---|`);\n lines.push(`| Repo | ${project.repoExists ? project.repoPath : \"not found\"} |`);\n lines.push(`| Task-board | ${project.taskBoardExists ? \"found\" : \"missing\"} |`);\n lines.push(`| Zone-map | ${project.zoneMapExists ? \"found\" : \"missing\"} |`);\n lines.push(`| Injection | ${project.injectionPolicy} |`);\n lines.push(`| Priority | ${project.priority} |`);\n lines.push(``);\n\n if (project.repoExists) {\n lines.push(`### Task Status`);\n lines.push(``);\n lines.push(`| Status | Count |`);\n lines.push(`|---|---|`);\n lines.push(`| Total | ${project.taskCounts.total} |`);\n lines.push(`| Ready | ${project.taskCounts.ready} |`);\n lines.push(`| Active | ${project.taskCounts.active} |`);\n lines.push(`| Done | ${project.taskCounts.done} |`);\n lines.push(`| Blocked | ${project.taskCounts.blocked} |`);\n lines.push(`| Pending | ${project.taskCounts.pending} |`);\n lines.push(``);\n\n if (project.operatorBreakdown.length > 0) {\n lines.push(`### Operator Breakdown`);\n lines.push(``);\n lines.push(`| Operator | Total | Ready | Active | Done | Blocked | Pending |`);\n lines.push(`|---|---|---|---|---|---|---|`);\n for (const ob of project.operatorBreakdown) {\n lines.push(`| ${ob.operator} | ${ob.total} | ${ob.ready} | ${ob.active} | ${ob.done} | ${ob.blocked} | ${ob.pending} |`);\n }\n lines.push(``);\n }\n\n if (project.locks.length > 0) {\n lines.push(`### Active Locks`);\n lines.push(``);\n lines.push(`| Zone | Operator | Sprint | Expires | Remaining |`);\n lines.push(`|---|---|---|---|---|`);\n for (const l of project.locks) {\n lines.push(`| ${l.zone} | ${l.operator} | ${l.sprint} | ${l.expiresAt} | ${l.remainingMinutes}m |`);\n }\n lines.push(``);\n }\n\n if (project.lastUpdated) {\n lines.push(`Last updated: ${project.lastUpdated}`);\n lines.push(``);\n }\n }\n\n for (const warning of project.warnings) {\n lines.push(`- **Warning:** ${warning}`);\n }\n\n lines.push(``);\n }\n\n return lines.join(\"\\n\");\n }\n\n private inspectProject(project: PortfolioProject): ProjectDashboard {\n const repoPath = this.resolvePath(project.repoPath);\n const repoExists = existsSync(repoPath);\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n const taskBoardExists = repoExists && existsSync(taskBoardPath);\n const zoneMapExists = repoExists && existsSync(zoneMapPath);\n const warnings: string[] = [];\n\n const taskCounts = {\n total: 0,\n ready: 0,\n active: 0,\n done: 0,\n blocked: 0,\n pending: 0,\n };\n\n const operatorMap = new Map<string, OperatorBreakdown>();\n const tasks: TaskEntry[] = [];\n let lastUpdated: string | undefined;\n\n if (taskBoardExists) {\n try {\n const raw = JSON.parse(readFileSync(taskBoardPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = TaskBoardSchema.safeParse(raw);\n if (parsed.success) {\n const board: TaskBoard = parsed.data;\n taskCounts.total = board.tasks.length;\n lastUpdated = board.updatedAt;\n for (const task of board.tasks) {\n if (task.status === \"ready\") taskCounts.ready++;\n else if (task.status === \"active\") taskCounts.active++;\n else if (task.status === \"done\") taskCounts.done++;\n else if (task.status === \"blocked\") taskCounts.blocked++;\n else taskCounts.pending++;\n\n const owner = task.owner || \"unassigned\";\n let ob = operatorMap.get(owner);\n if (!ob) {\n ob = { operator: owner, ready: 0, active: 0, done: 0, blocked: 0, pending: 0, total: 0 };\n operatorMap.set(owner, ob);\n }\n ob.total++;\n if (task.status === \"ready\") ob.ready++;\n else if (task.status === \"active\") ob.active++;\n else if (task.status === \"done\") ob.done++;\n else if (task.status === \"blocked\") ob.blocked++;\n else ob.pending++;\n\n tasks.push({\n id: task.id,\n title: task.title.slice(0, 100),\n owner: task.owner || \"unassigned\",\n status: task.status,\n dependsOn: task.dependsOn || [],\n });\n }\n } else {\n warnings.push(\"task-board parse error\");\n }\n } catch {\n warnings.push(\"task-board read error\");\n }\n }\n\n const operatorBreakdown = Array.from(operatorMap.values())\n .sort((a, b) => b.total - a.total);\n\n const locks: LockSummary[] = [];\n try {\n const lockResult = this.lockService.check();\n if (lockResult.ok) {\n for (const l of lockResult.value.active) {\n const expiresAt = new Date(l.expiresAt);\n const remainingMinutes = Math.max(0, Math.ceil((expiresAt.getTime() - Date.now()) / 60000));\n if (l.zone.includes(project.projectId) || l.zone.startsWith(\"**\") || l.zone.startsWith(\"repo\")) {\n locks.push({\n zone: l.zone,\n operator: l.operator,\n sprint: l.sprint,\n expiresAt: l.expiresAt,\n remainingMinutes,\n });\n }\n }\n }\n } catch { /* lock check optional — skip if network unavailable */ }\n\n if (!repoExists) warnings.push(\"repo missing\");\n if (repoExists && !taskBoardExists) warnings.push(\"task-board missing\");\n if (repoExists && !zoneMapExists) warnings.push(\"zone-map missing\");\n if (project.validationGates.length === 0) warnings.push(\"validation gates missing\");\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists,\n taskBoardExists,\n zoneMapExists,\n injectionPolicy: project.injectionPolicy,\n priority: project.priority,\n taskCounts,\n operatorBreakdown,\n tasks,\n locks,\n lastUpdated,\n warnings,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createDashboardService(root: string): DashboardService {\n return new DashboardService(root);\n}\n","import { err, ok } from \"../types/index.js\";\nimport type { LockList, LockResult, Result, StateError, ZoneLock } from \"../types/index.js\";\nimport { LockListSchema, ZoneLockSchema } from \"../types/schemas.js\";\nimport { GitService } from \"./git.service.js\";\n\nconst LOCK_TAG_PREFIX = \"oreshnik-lock/\";\n\nexport class LockService {\n private git: GitService;\n\n constructor(repoPath: string) {\n this.git = new GitService(repoPath);\n }\n\n acquire(zone: string, operator: string, sprint: string, ttl = 3600): Result<LockResult, StateError> {\n const sanitized = this.sanitizeRef(zone);\n\n const existingResult = this.check(zone);\n if (existingResult.ok && existingResult.value.active.length > 0) {\n const existing = existingResult.value.active[0];\n if (!existing) {\n return err(this.fail(\"Unexpected: active lock array element is undefined\"));\n }\n return ok({\n zone,\n acquired: false,\n existingLock: existing,\n error: `Zone locked by ${existing.operator} until ${existing.expiresAt}`,\n });\n }\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttl * 1000);\n\n const lock: ZoneLock = {\n zone,\n operator,\n sprint,\n acquiredAt: now.toISOString(),\n ttl,\n expiresAt: expiresAt.toISOString(),\n };\n\n const parsed = ZoneLockSchema.safeParse(lock);\n if (!parsed.success) {\n return err(this.fail(`Invalid lock: ${parsed.error.message}`));\n }\n\n const tagName = `${LOCK_TAG_PREFIX}${sanitized}`;\n const annotation = JSON.stringify(parsed.data);\n\n // Create annotated tag locally with lock data as message\n const tagResult = this.git.createTag(tagName, annotation);\n if (!tagResult.ok) {\n return err(this.fail(`Failed to create lock tag: ${tagResult.error.message}`));\n }\n\n // Push tag to origin\n const pushResult = this.git.exec([\"push\", \"origin\", tagName]);\n if (!pushResult.ok) {\n const msg = pushResult.error || pushResult.output || \"unknown error\";\n if (typeof msg === \"string\" && (msg.includes(\"rejected\") || msg.includes(\"failed\"))) {\n this.git.deleteTag(tagName);\n return ok({\n zone,\n acquired: false,\n error: \"Failed to push lock: another operator may have acquired it\",\n });\n }\n this.git.deleteTag(tagName);\n return err(this.fail(`Failed to push lock: ${msg}`));\n }\n\n return ok({ zone, acquired: true });\n }\n\n release(zone: string): Result<LockResult, StateError> {\n const sanitized = this.sanitizeRef(zone);\n const tagName = `${LOCK_TAG_PREFIX}${sanitized}`;\n\n const deleteResult = this.git.exec([\"push\", \"origin\", `:refs/tags/${tagName}`]);\n if (!deleteResult.ok) {\n const msg = deleteResult.error || deleteResult.output || \"unknown error\";\n return err(this.fail(`Failed to release lock: ${msg}`));\n }\n\n this.git.deleteTag(tagName);\n return ok({ zone, acquired: false });\n }\n\n check(zone?: string): Result<LockList, StateError> {\n const now = new Date();\n const locks: ZoneLock[] = [];\n const active: ZoneLock[] = [];\n const expired: ZoneLock[] = [];\n\n // Fetch all lock tags from origin\n const fetchResult = this.git.exec([\"ls-remote\", \"origin\", `refs/tags/${LOCK_TAG_PREFIX}*`]);\n if (!fetchResult.ok) {\n return err(this.fail(`Failed to fetch locks: ${fetchResult.error || fetchResult.output}`));\n }\n\n const lines = (fetchResult.output || \"\").split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const parts = line.split(\"\\t\");\n if (parts.length < 2) continue;\n const refName = parts[1];\n if (!refName) continue;\n const tagName = refName.replace(\"refs/tags/\", \"\");\n\n // Try to read tag annotation (lock data)\n const contentResult = this.git.exec([\"tag\", \"-l\", \"--format=%(contents)\", tagName]);\n if (!contentResult.ok || !contentResult.output) continue;\n\n try {\n const raw = JSON.parse(contentResult.output.trim());\n const parsed = ZoneLockSchema.safeParse(raw);\n if (!parsed.success) continue;\n\n const lock = parsed.data;\n locks.push(lock);\n\n const expiresAt = new Date(lock.expiresAt);\n if (expiresAt > now) {\n active.push(lock);\n } else {\n expired.push(lock);\n }\n } catch {\n continue;\n }\n }\n\n if (zone) {\n const zoneActive = active.filter((l) => l.zone === zone);\n const zoneExpired = expired.filter((l) => l.zone === zone);\n\n return ok({\n fetchedAt: now.toISOString(),\n locks: [...zoneActive, ...zoneExpired],\n active: zoneActive,\n expired: zoneExpired,\n });\n }\n\n const result: LockList = {\n fetchedAt: now.toISOString(),\n locks,\n active,\n expired,\n };\n\n const parsedResult = LockListSchema.safeParse(result);\n if (!parsedResult.success) {\n return err(this.fail(`Invalid lock list: ${parsedResult.error.message}`));\n }\n\n return ok(result);\n }\n\n private sanitizeRef(path: string): string {\n return path\n .replace(/\\\\/g, \"/\")\n .replace(/\\/\\//g, \"/\")\n .replace(/^\\//, \"\")\n .replace(/\\/$/, \"\")\n .replace(/\\//g, \"_\")\n .replace(/\\*\\*/g, \"--\")\n .replace(/[^a-zA-Z0-9_.-]/g, \"_\");\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createLockService(repoPath: string): LockService {\n return new LockService(repoPath);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, Result, StateError, ZoneCheckResult, ZoneMap, ZoneViolation, ZoneWarning } from \"../types/index.js\";\nimport { PortfolioConfigSchema, ZoneMapSchema } from \"../types/schemas.js\";\nimport { createZoneEngine } from \"./zone-engine.js\";\nimport { GitService } from \"./git.service.js\";\n\nexport interface ProjectZoneCheck {\n projectId: string;\n displayName: string;\n repoPath: string;\n zoneMapExists: boolean;\n zoneMapValid: boolean;\n branch: string;\n filesChecked: number;\n violations: ZoneViolation[];\n warnings: ZoneWarning[];\n passed: boolean;\n errors: string[];\n}\n\nexport interface PortfolioZoneCheck {\n portfolioId: string;\n checkedAt: string;\n operator: string;\n sprint?: string;\n projects: ProjectZoneCheck[];\n summary: {\n totalProjects: number;\n projectsWithZoneMap: number;\n projectsWithViolations: number;\n projectsPassed: number;\n totalViolations: number;\n totalWarnings: number;\n };\n}\n\nexport class ZoneCheckService {\n constructor(private readonly root: string) {}\n\n checkAll(\n configPath: string,\n operator: string,\n sprint?: string,\n projectFilter?: string[],\n ): Result<PortfolioZoneCheck, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const targets = projectFilter\n ? config.projects.filter((p) => projectFilter.includes(p.projectId))\n : config.projects;\n\n const projects: ProjectZoneCheck[] = [];\n let projectsWithZoneMap = 0;\n let projectsWithViolations = 0;\n let projectsPassed = 0;\n let totalViolations = 0;\n let totalWarnings = 0;\n\n for (const project of targets) {\n const check = this.checkProject(project, operator, sprint);\n projects.push(check);\n\n if (check.zoneMapExists && check.zoneMapValid) {\n projectsWithZoneMap++;\n if (check.passed) projectsPassed++;\n if (check.violations.length > 0) projectsWithViolations++;\n totalViolations += check.violations.length;\n totalWarnings += check.warnings.length;\n }\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n checkedAt: now,\n operator,\n sprint,\n projects,\n summary: {\n totalProjects: projects.length,\n projectsWithZoneMap,\n projectsWithViolations,\n projectsPassed,\n totalViolations,\n totalWarnings,\n },\n });\n }\n\n private checkProject(\n project: PortfolioConfig[\"projects\"][number],\n operator: string,\n sprint?: string,\n ): ProjectZoneCheck {\n const repoPath = this.resolvePath(project.repoPath);\n const errors: string[] = [];\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: false,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [\"repo not found\"],\n };\n }\n\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n const zoneMapExists = existsSync(zoneMapPath);\n\n if (!zoneMapExists) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: false,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [\"zone-map not found\"],\n };\n }\n\n let zoneMap: ZoneMap;\n try {\n const raw = JSON.parse(readFileSync(zoneMapPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = ZoneMapSchema.safeParse(raw);\n if (!parsed.success) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: true,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [`invalid zone-map: ${parsed.error.message}`],\n };\n }\n zoneMap = parsed.data;\n } catch (e) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: true,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [`failed to read zone-map: ${String(e)}`],\n };\n }\n\n const git = new GitService(repoPath);\n const branchResult = git.currentBranch();\n const branch = branchResult.ok ? branchResult.value : \"unknown\";\n\n const statusResult = git.statusPorcelain();\n if (!statusResult.ok) {\n errors.push(`git status failed: ${statusResult.error.message}`);\n }\n\n const modifiedFiles = statusResult.ok\n ? statusResult.value.map((e) => e.path)\n : [];\n\n const zoneEngine = createZoneEngine();\n const checkResult = zoneEngine.check(\n modifiedFiles,\n operator,\n sprint || \"*\",\n zoneMap,\n );\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: true,\n zoneMapValid: true,\n branch,\n filesChecked: checkResult.filesChecked,\n violations: checkResult.violations,\n warnings: checkResult.warnings,\n passed: checkResult.violations.length === 0,\n errors,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createZoneCheckService(root: string): ZoneCheckService {\n return new ZoneCheckService(root);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, Result, StateError } from \"../types/index.js\";\nimport { PortfolioConfigSchema } from \"../types/schemas.js\";\nimport { GitService } from \"./git.service.js\";\nimport { createZoneEngine } from \"./zone-engine.js\";\n\nexport interface ProjectAudit {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n branch: string;\n lastCommit?: { hash: string; message: string; date: string; author: string };\n checkpointTags: string[];\n taskBoardExists: boolean;\n taskCount: number;\n zoneMapExists: boolean;\n zoneMapValid: boolean;\n modifiedFiles: number;\n errors: string[];\n}\n\nexport interface PortfolioAudit {\n portfolioId: string;\n auditedAt: string;\n projects: ProjectAudit[];\n summary: {\n totalProjects: number;\n projectsWithRepo: number;\n projectsDirty: number;\n projectsClean: number;\n totalTasks: number;\n totalCheckpoints: number;\n };\n}\n\nexport class AuditService {\n constructor(private readonly root: string) {}\n\n audit(configPath = \".oreshnik.portfolio.json\", projectFilter?: string[]): Result<PortfolioAudit, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const targets = projectFilter\n ? config.projects.filter((p) => projectFilter.includes(p.projectId))\n : config.projects;\n\n const projects: ProjectAudit[] = [];\n let projectsWithRepo = 0;\n let projectsDirty = 0;\n let projectsClean = 0;\n let totalTasks = 0;\n let totalCheckpoints = 0;\n\n for (const project of targets) {\n const audit = this.auditProject(project);\n projects.push(audit);\n\n if (audit.repoExists) {\n projectsWithRepo++;\n if (audit.modifiedFiles > 0) projectsDirty++;\n else projectsClean++;\n totalTasks += audit.taskCount;\n totalCheckpoints += audit.checkpointTags.length;\n }\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n auditedAt: now,\n projects,\n summary: {\n totalProjects: projects.length,\n projectsWithRepo,\n projectsDirty,\n projectsClean,\n totalTasks,\n totalCheckpoints,\n },\n });\n }\n\n secretScan(configPath = \".oreshnik.portfolio.json\"): Result<string[], StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const findings: string[] = [];\n const sensitivePatterns = [\n { pattern: /\\.env$/i, reason: \"env file detected (should be in .gitignore)\" },\n { pattern: /credentials\\.json$/i, reason: \"credentials file detected\" },\n { pattern: /secret/i, reason: \"file with 'secret' in name\" },\n { pattern: /\\.pem$/i, reason: \"private key file detected\" },\n ];\n\n for (const project of config.projects) {\n const repoPath = this.resolvePath(project.repoPath);\n if (!existsSync(repoPath)) continue;\n\n try {\n const git = new GitService(repoPath);\n const statusResult = git.statusPorcelain();\n if (!statusResult.ok) continue;\n\n for (const entry of statusResult.value) {\n for (const { pattern, reason } of sensitivePatterns) {\n if (pattern.test(entry.path)) {\n findings.push(`${project.projectId}: ${entry.path} — ${reason}`);\n }\n }\n }\n } catch {\n // ignore errors for individual projects\n }\n }\n\n return ok(findings);\n }\n\n private auditProject(project: PortfolioConfig[\"projects\"][number]): ProjectAudit {\n const repoPath = this.resolvePath(project.repoPath);\n const errors: string[] = [];\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: false,\n branch: \"unknown\",\n checkpointTags: [],\n taskBoardExists: false,\n taskCount: 0,\n zoneMapExists: false,\n zoneMapValid: false,\n modifiedFiles: 0,\n errors: [\"repo not found\"],\n };\n }\n\n const git = new GitService(repoPath);\n\n const branchResult = git.currentBranch();\n const branch = branchResult.ok ? branchResult.value : \"unknown\";\n\n let lastCommit: ProjectAudit[\"lastCommit\"];\n try {\n const logResult = git.exec([\"log\", \"-1\", \"--format=%H|%s|%ai|%an\"]);\n if (logResult.ok && logResult.output) {\n const parts = logResult.output.split(\"|\");\n const hash = parts[0];\n if (hash) lastCommit = {\n hash: hash.slice(0, 8),\n message: parts[1] || \"\",\n date: parts[2] || \"\",\n author: parts[3] || \"\",\n };\n }\n } catch {\n // ignore\n }\n\n const tagsResult = git.exec([\n \"tag\", \"-l\", \"oreshnik/*\", \"--sort=-creatordate\",\n ]);\n const checkpointTags = tagsResult.ok\n ? tagsResult.output.split(\"\\n\").filter(Boolean)\n : [];\n\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const taskBoardExists = existsSync(taskBoardPath);\n let taskCount = 0;\n if (taskBoardExists) {\n try {\n const raw = JSON.parse(readFileSync(taskBoardPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n taskCount = raw.tasks?.length || 0;\n } catch {\n // ignore\n }\n }\n\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n const zoneMapExists = existsSync(zoneMapPath);\n let zoneMapValid = false;\n if (zoneMapExists) {\n try {\n const raw = JSON.parse(readFileSync(zoneMapPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n zoneMapValid = raw.zones && Object.keys(raw.zones).length > 0;\n } catch {\n // ignore\n }\n }\n\n const statusResult = git.statusPorcelain();\n const modifiedFiles = statusResult.ok ? statusResult.value.length : 0;\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: true,\n branch,\n lastCommit,\n checkpointTags,\n taskBoardExists,\n taskCount,\n zoneMapExists,\n zoneMapValid,\n modifiedFiles,\n errors,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createAuditService(root: string): AuditService {\n return new AuditService(root);\n}\n","import chalk from \"chalk\";\r\n\r\nexport type LogLevel = \"OK\" | \"FAIL\" | \"WARN\" | \"INFO\";\r\n\r\nexport function log(level: LogLevel, message: string): void {\r\n const color = level === \"OK\" ? chalk.green :\r\n level === \"FAIL\" ? chalk.red :\r\n level === \"WARN\" ? chalk.yellow :\r\n chalk.cyan;\r\n console.log(` [ ${color(level.padEnd(4))} ] ${message}`);\r\n}\r\n\r\nexport function header(title: string, subtitle?: string): void {\r\n console.log(\"\");\r\n console.log(chalk.bold(\"=\".repeat(50)));\r\n console.log(chalk.bold(` ${title}`));\r\n if (subtitle) console.log(chalk.bold(` ${subtitle}`));\r\n console.log(chalk.bold(\"=\".repeat(50)));\r\n console.log(\"\");\r\n}\r\n\r\nexport function statusBox(lines: Array<[string, string]>): void {\r\n const maxKey = Math.max(...lines.map(([k]) => k.length));\r\n console.log(\"\");\r\n console.log(chalk.bold(\"+\" + \"=\".repeat(maxKey + 42) + \"+\"));\r\n const title = \"ORESHNIK STATUS\";\r\n const padLeft = Math.floor((maxKey + 42 - title.length) / 2);\r\n console.log(chalk.bold(\"|\" + \" \".repeat(padLeft) + title + \" \".repeat(maxKey + 42 - padLeft - title.length) + \"|\"));\r\n console.log(chalk.bold(\"+\" + \"=\".repeat(maxKey + 42) + \"+\"));\r\n for (const [key, value] of lines) {\r\n console.log(chalk.bold(\"| \") + chalk.cyan(key.padEnd(maxKey)) + chalk.bold(\" \") + value.padEnd(40) + chalk.bold(\"|\"));\r\n }\r\n console.log(chalk.bold(\"+\" + \"=\".repeat(maxKey + 42) + \"+\"));\r\n console.log(\"\");\r\n}\r\n\r\nexport function resultSummary(blockers: number, warnings: number, operator: string, sprint: string, branch: string, mother: string): void {\r\n console.log(\"\");\r\n console.log(chalk.bold(\"PRE-FLIGHT RESULT\"));\r\n console.log(` Blockers: ${blockers}`);\r\n console.log(` Warnings: ${warnings}`);\r\n console.log(` Operator: ${operator}`);\r\n console.log(` Sprint: ${sprint || \"not specified\"}`);\r\n console.log(` Branch: ${branch}`);\r\n console.log(` Mother: ${mother}`);\r\n console.log(\"\");\r\n\r\n if (blockers > 0) {\r\n console.log(chalk.red.bold(\"[ORESHNIK] BLOCKED\"));\r\n } else {\r\n console.log((warnings > 0 ? chalk.yellow : chalk.green).bold(\"[ORESHNIK] OK\"));\r\n }\r\n}","import { spawnSync } from \"node:child_process\";\nimport type { Result, GitError } from \"../types/index.js\";\nimport { err } from \"../types/index.js\";\n\nexport function execCommand(\n command: string,\n args: string[],\n options?: { cwd?: string; timeout?: number }\n): Result<{ output: string; exitCode: number }, GitError> {\n const result = spawnSync(command, args, {\n cwd: options?.cwd,\n encoding: \"utf8\",\n timeout: options?.timeout ?? 30000,\n stdio: \"pipe\",\n shell: true,\n });\n\n if (result.status !== 0) {\n return err({\n code: \"GIT_ERROR\",\n message: `Command failed: ${command} ${args.join(\" \")}`,\n exitCode: result.status ?? 1,\n gitCommand: `${command} ${args.join(\" \")}`,\n gitStderr: (result.stderr || \"\").trim(),\n });\n }\n\n return { ok: true, value: { output: (result.stdout || \"\").trim(), exitCode: result.status } };\n}\n\nexport function execCommandInherit(\n command: string,\n args: string[],\n options?: { cwd?: string; timeout?: number }\n): Result<{ exitCode: number }, GitError> {\n const result = spawnSync(command, args, {\n cwd: options?.cwd,\n encoding: \"utf8\",\n timeout: options?.timeout ?? 30000,\n stdio: \"inherit\",\n shell: true,\n });\n\n if (result.status !== 0) {\n return err({\n code: \"GIT_ERROR\",\n message: `Command failed: ${command} ${args.join(\" \")} (exit ${result.status})`,\n exitCode: result.status ?? 1,\n });\n }\n\n return { ok: true, value: { exitCode: result.status ?? 0 } };\n}\n"],"mappings":"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","names":["spawnSync","spawnSync","join","join","z","join","join","existsSync","readFileSync","join","existsSync","readFileSync","join","existsSync","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","isAbsolute","join","resolve","result","existsSync","join","readFileSync","taskIndex","mkdirSync","writeFileSync","isAbsolute","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","isAbsolute","join","resolve","existsSync","join","mkdirSync","writeFileSync","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","join","resolve","existsSync","join","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","join","resolve","existsSync","join","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","join","resolve","existsSync","join","readFileSync","isAbsolute","resolve","spawnSync","spawnSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/git.service.ts","../src/types/index.ts","../src/core/zone-engine.ts","../src/core/state-manager.ts","../src/core/canonical.service.ts","../src/core/sync.service.ts","../src/core/vault-guard.ts","../src/core/portfolio.service.ts","../src/types/schemas.ts","../src/core/notes-ingestion.service.ts","../src/core/injection.service.ts","../src/utils/helpers.ts","../src/core/evidence-gate.service.ts","../src/core/bootstrap.service.ts","../src/core/dashboard.service.ts","../src/core/lock.service.ts","../src/core/zone-check.service.ts","../src/core/audit.service.ts","../src/utils/logger.ts","../src/utils/exec.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\r\nimport { ok, err } from \"../types/index.js\";\r\nimport type {\r\n Result,\r\n GitError,\r\n MotherRef,\r\n MergeOptions,\r\n PorcelainEntry,\r\n} from \"../types/index.js\";\r\n\r\nexport class GitService {\r\n constructor(private readonly cwd: string) {}\r\n\r\n exec(args: string[]): { ok: boolean; output: string; error: string; status: number } {\r\n const result = spawnSync(\"git\", args, { cwd: this.cwd, encoding: \"utf8\", timeout: 30000 });\r\n return {\r\n ok: result.status === 0,\r\n output: (result.stdout || \"\").trim(),\r\n error: (result.stderr || \"\").trim(),\r\n status: result.status ?? 1,\r\n };\r\n }\r\n\r\n private fail(message: string, args: string[], stderr?: string): GitError {\r\n return {\r\n code: \"GIT_ERROR\",\r\n message,\r\n exitCode: 1,\r\n gitCommand: `git ${args.join(\" \")}`,\r\n gitStderr: stderr,\r\n };\r\n }\r\n\r\n // Read Operations\n\r\n currentBranch(): Result<string, GitError> {\r\n const r = this.exec([\"branch\", \"--show-current\"]);\r\n if (!r.ok) return err(this.fail(\"Failed to get current branch\", [\"branch\", \"--show-current\"], r.error));\r\n return ok(r.output || \"DETACHED\");\r\n }\r\n\r\n refExists(ref: string): boolean {\r\n return this.exec([\"rev-parse\", \"--verify\", ref]).ok;\r\n }\r\n\r\n resolveRef(ref: string): Result<string, GitError> {\r\n const r = this.exec([\"rev-parse\", \"--verify\", ref]);\r\n if (!r.ok) return err(this.fail(`Ref not found: ${ref}`, [\"rev-parse\", \"--verify\", ref], r.error));\r\n return ok(r.output);\r\n }\r\n\r\n statusPorcelain(): Result<PorcelainEntry[], GitError> {\r\n const r = this.exec([\"status\", \"--porcelain\"]);\r\n if (!r.ok) return err(this.fail(\"Failed to get working tree status\", [\"status\", \"--porcelain\"], r.error));\r\n const lines = r.output.split(/\\r?\\n/).filter(Boolean);\r\n const entries: PorcelainEntry[] = lines.map((line) => ({\r\n status: line.slice(0, 2).trim(),\r\n path: line.slice(3).replace(/^.* -> /, \"\"),\r\n }));\r\n return ok(entries);\r\n }\r\n\r\n fetch(remote = \"origin\"): Result<void, GitError> {\r\n const r = this.exec([\"fetch\", remote, \"--prune\", \"--quiet\"]);\r\n if (!r.ok) return err(this.fail(`Failed to fetch from ${remote}`, [\"fetch\", remote, \"--prune\"], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n getMergeBase(a: string, b: string): Result<string, GitError> {\r\n const r = this.exec([\"merge-base\", a, b]);\r\n if (!r.ok) return err(this.fail(`No merge base between ${a} and ${b}`, [\"merge-base\", a, b], r.error));\r\n return ok(r.output);\r\n }\r\n\r\n discoverLatestMother(prefix = \"MADRE\"): Result<MotherRef | null, GitError> {\r\n const r = this.exec([\r\n \"for-each-ref\",\r\n \"--format=%(refname:short)\",\r\n `refs/heads/${prefix}`,\r\n `refs/remotes/origin/${prefix}`,\r\n ]);\r\n if (!r.ok) {\r\n return err(this.fail(`Failed to discover latest ${prefix} branch`, [\r\n \"for-each-ref\",\r\n \"--format=%(refname:short)\",\r\n `refs/heads/${prefix}`,\r\n `refs/remotes/origin/${prefix}`,\r\n ], r.error));\r\n }\r\n\r\n const refs = r.output.split(/\\r?\\n/).filter(Boolean).map((ref) => ({\r\n name: ref.replace(/^origin\\//, \"\"),\r\n remote: ref.startsWith(\"origin/\"),\r\n }));\r\n\r\n const latest = refs\r\n .map((ref) => {\r\n const v = Number(ref.name.match(new RegExp(`^${prefix}/v(\\\\d+)`, \"i\"))?.[1] || 0);\r\n return { ...ref, version: v };\r\n })\r\n .filter((item) => item.version > 0)\r\n .sort((a, b) => b.version - a.version || a.name.localeCompare(b.name))[0] || null;\r\n\r\n if (!latest) return ok(null);\r\n return ok({ name: latest.name, version: latest.version, remote: latest.remote });\r\n }\r\n\r\n diffNames(base: string, target: string, paths?: string[]): Result<string[], GitError> {\n const args = [\"diff\", \"--name-only\", `${base}...${target}`];\n if (paths) args.push(\"--\", ...paths);\n const r = this.exec(args);\n if (!r.ok) return err(this.fail(`Failed to diff ${base}...${target}`, args, r.error));\n return ok(r.output.split(/\\r?\\n/).filter(Boolean));\n }\n\n unmergedFiles(): Result<string[], GitError> {\n const args = [\"diff\", \"--name-only\", \"--diff-filter=U\"];\n const r = this.exec(args);\n if (!r.ok) return err(this.fail(\"Failed to inspect unmerged files\", args, r.error));\n return ok(r.output.split(/\\r?\\n/).filter(Boolean));\n }\n\r\n showRef(ref: string, file: string): Result<string | null, GitError> {\r\n const r = this.exec([\"show\", `${ref}:${file}`]);\r\n if (!r.ok) return ok(null);\r\n return ok(r.output);\r\n }\r\n\r\n // Write Operations\n\r\n createBranch(name: string, from?: string): Result<void, GitError> {\r\n const args = [\"checkout\", \"-b\", name];\r\n if (from) args.push(from);\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to create branch ${name}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n checkout(branch: string): Result<void, GitError> {\r\n const r = this.exec([\"checkout\", branch]);\r\n if (!r.ok) return err(this.fail(`Failed to checkout ${branch}`, [\"checkout\", branch], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n merge(ref: string, options?: MergeOptions): Result<void, GitError> {\r\n const args = [\"merge\"];\r\n if (options?.noCommit) args.push(\"--no-commit\");\r\n if (options?.noFF) args.push(\"--no-ff\");\r\n if (options?.strategy) args.push(\"--strategy\", options.strategy);\r\n if (options?.message) args.push(\"-m\", options.message);\r\n args.push(ref);\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to merge ${ref}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n push(remote: string, branch: string, force = false): Result<void, GitError> {\r\n const args = [\"push\", remote, branch];\r\n if (force) args.push(\"--force\");\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to push ${branch} to ${remote}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n pushTag(remote: string, tag: string): Result<void, GitError> {\r\n const args = [\"push\", remote, tag];\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to push tag ${tag} to ${remote}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n stage(files: string[]): Result<void, GitError> {\r\n const r = this.exec([\"add\", \"--\", ...files]);\r\n if (!r.ok) return err(this.fail(\"Failed to stage files\", [\"add\", ...files], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n commit(message: string): Result<void, GitError> {\r\n const r = this.exec([\"commit\", \"-m\", message]);\r\n if (!r.ok) return err(this.fail(\"Failed to commit\", [\"commit\", \"-m\", message], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n createTag(name: string, message: string): Result<void, GitError> {\r\n const r = this.exec([\"tag\", \"-a\", name, \"-m\", message]);\r\n if (!r.ok) return err(this.fail(`Failed to create tag ${name}`, [\"tag\", \"-a\", name, \"-m\", message], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n deleteTag(name: string): Result<void, GitError> {\r\n const r = this.exec([\"tag\", \"-d\", name]);\r\n if (!r.ok) return err(this.fail(`Failed to delete tag ${name}`, [\"tag\", \"-d\", name], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n // Destructive Operations\n\r\n resetHard(ref: string): Result<void, GitError> {\r\n const r = this.exec([\"reset\", \"--hard\", ref]);\r\n if (!r.ok) return err(this.fail(`Failed to reset to ${ref}`, [\"reset\", \"--hard\", ref], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n deleteBranch(branch: string, force = false): Result<void, GitError> {\r\n const args = [\"branch\", \"-d\", branch];\r\n if (force) args.splice(1, 0, \"-D\");\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(`Failed to delete branch ${branch}`, args, r.error));\r\n return ok(undefined);\r\n }\r\n\r\n stashPush(message?: string): Result<string | null, GitError> {\r\n const args = [\"stash\", \"push\"];\r\n if (message) args.push(\"-m\", message);\r\n const r = this.exec(args);\r\n if (!r.ok) return err(this.fail(\"Failed to stash\", args, r.error));\r\n return ok(r.output || null);\r\n }\r\n\r\n stashPop(): Result<void, GitError> {\r\n const r = this.exec([\"stash\", \"pop\"]);\r\n if (!r.ok) return err(this.fail(\"Failed to pop stash\", [\"stash\", \"pop\"], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n // Lock Operations (remote git locks)\n\r\n pushLockRef(zone: string, _lockContent: string): Result<void, GitError> {\r\n return err(this.fail(`Remote lock acquisition is not implemented for ${zone}`, [\"push\", \"origin\", `refs/oreshnik/locks/${zone}`]));\r\n }\r\n\r\n deleteLockRef(zone: string): Result<void, GitError> {\r\n return err(this.fail(`Remote lock release is not implemented for ${zone}`, [\"push\", \"origin\", \"--delete\", `refs/oreshnik/locks/${zone}`]));\r\n }\r\n\r\n fetchLockRefs(): Result<string[], GitError> {\r\n return err(this.fail(\"Remote lock listing is not implemented\", [\"for-each-ref\", \"refs/remotes/origin/oreshnik/locks/\"]));\r\n }\r\n\r\n getLockContent(ref: string): Result<string | null, GitError> {\r\n return err(this.fail(`Remote lock content is not implemented for ${ref}`, [\"show\", ref]));\r\n }\r\n\r\n // Cherry-pick (for sync)\n\r\n cherryPick(commit: string): Result<void, GitError> {\r\n const r = this.exec([\"cherry-pick\", commit]);\r\n if (!r.ok) return err(this.fail(`Failed to cherry-pick ${commit}`, [\"cherry-pick\", commit], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n restoreFromHead(pattern: string): Result<void, GitError> {\r\n const r = this.exec([\"checkout\", \"HEAD\", \"--\", pattern]);\r\n if (!r.ok) return err(this.fail(`Failed to restore ${pattern} from HEAD`, [\"checkout\", \"HEAD\", \"--\", pattern], r.error));\r\n return ok(undefined);\r\n }\r\n\r\n // Utility\n\r\n userConfig(key: string): Result<string, GitError> {\r\n const r = this.exec([\"config\", key]);\r\n if (!r.ok) return err(this.fail(`Git config ${key} not set`, [\"config\", key]));\r\n return ok(r.output);\r\n }\r\n\r\n mergeFileUnion(currentFile: string, baseFile: string, sourceFile: string): Result<string, GitError> {\r\n const r = spawnSync(\"git\", [\"merge-file\", \"--union\", \"-p\", currentFile, baseFile, sourceFile], {\r\n cwd: this.cwd,\r\n encoding: \"utf8\",\r\n timeout: 10000,\r\n });\r\n if (r.status !== 0) {\r\n return err(this.fail(\"Failed to merge file with union strategy\", [\"merge-file\", \"--union\", \"-p\", currentFile, baseFile, sourceFile], r.stderr || \"\"));\r\n }\r\n return ok((r.stdout || \"\").trim());\r\n }\r\n}\r\n\r\nexport function createGitService(cwd: string): GitService {\r\n return new GitService(cwd);\r\n}\r\n\r\n","import type { z } from \"zod\";\r\n\r\n// Result Type\n\r\nexport type Result<T, E = OreshnikError> =\r\n | { ok: true; value: T }\r\n | { ok: false; error: E };\r\n\r\nexport interface OreshnikError {\r\n code: string;\r\n message: string;\r\n exitCode: number;\r\n suggestion?: string;\r\n}\r\n\r\nexport function ok<T>(value: T): Result<T, never> {\r\n return { ok: true, value };\r\n}\r\n\r\nexport function err<E extends OreshnikError>(error: E): Result<never, E> {\r\n return { ok: false, error };\r\n}\r\n\r\n// Git\n\r\nexport interface PorcelainEntry {\r\n status: string;\r\n path: string;\r\n}\r\n\r\nexport interface MergeOptions {\r\n noCommit?: boolean;\r\n noFF?: boolean;\r\n strategy?: \"union\" | \"ort\" | \"recursive\";\r\n message?: string;\r\n}\r\n\r\nexport interface MotherRef {\r\n name: string;\r\n version: number;\r\n remote: boolean;\r\n}\r\n\r\nexport interface GitError extends OreshnikError {\r\n code: \"GIT_ERROR\";\r\n gitCommand?: string;\r\n gitStderr?: string;\r\n}\r\n\r\n// Task Board\n\r\nexport type TaskStatus = \"ready\" | \"active\" | \"pending\" | \"blocked\" | \"done\" | \"rolled_back\";\r\n\r\nexport interface Task {\r\n id: string;\r\n title: string;\r\n owner: string;\r\n backupOwner?: string;\r\n status: TaskStatus;\r\n track?: string;\r\n zone?: string[];\r\n dependsOn?: string[];\r\n acceptance?: string[];\r\n handoff?: string;\r\n history?: TaskHistoryEntry[];\r\n}\r\n\r\nexport interface TaskHistoryEntry {\r\n at: string;\r\n action: string;\r\n operator?: string;\r\n from?: string;\r\n to?: string;\r\n reason?: string;\r\n branch?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface Reassignment {\r\n at: string;\r\n task: string;\r\n from: string;\r\n to: string;\r\n reason: string;\r\n}\r\n\r\nexport interface TaskBoard {\r\n project: string;\r\n updatedAt: string;\r\n resiliencePolicy?: string;\r\n closurePolicy?: string;\r\n baseTestMatrix?: string[];\r\n currentExecutionOrder: string[];\r\n tasks: Task[];\r\n reassignments?: Reassignment[];\r\n}\r\n\r\n// Mother Version\n\r\nexport interface MotherBranchEntry {\r\n version: number;\r\n name: string;\r\n sprint: string;\r\n operator: string;\r\n date: string;\r\n at: string;\r\n previous: string;\r\n description: string;\r\n}\r\n\r\nexport interface MotherVersion {\r\n version: number;\r\n current: string;\r\n branches: MotherBranchEntry[];\r\n}\r\n\r\n// Zone Map\n\r\nexport type LockType =\r\n | \"operator_exclusive\"\r\n | \"operator_double\"\r\n | \"shared\"\r\n | \"forbidden\"\r\n | \"owner_per_sprint\";\r\n\r\nexport interface ZoneEntry {\r\n owner: string;\r\n lock: LockType;\r\n sprints: string[];\r\n criticality?: \"low\" | \"medium\" | \"high\" | \"critical\";\r\n}\r\n\r\nexport interface ZoneMap {\r\n zones: Record<string, ZoneEntry>;\r\n}\r\n\r\nexport interface ZoneViolation {\r\n file: string;\r\n zone: string;\r\n reason: string;\r\n}\r\n\r\nexport interface ZoneWarning {\r\n file: string;\r\n reason: string;\r\n}\r\n\r\nexport interface ZoneCheckResult {\r\n violations: ZoneViolation[];\r\n warnings: ZoneWarning[];\r\n filesChecked: number;\r\n}\r\n\r\n// Checkpoints\n\r\nexport interface Checkpoint {\r\n id: string;\r\n tag: string;\r\n timestamp: string;\r\n operator: string;\r\n sprint?: string;\r\n type: \"auto\" | \"manual\" | \"pre-rollback\";\r\n git: {\r\n tag: string;\r\n commit: string;\r\n branch: string;\r\n motherBranch?: string;\r\n motherVersion?: number;\r\n };\r\n state: {\r\n taskBoard: TaskBoard;\r\n motherVersion: MotherVersion;\r\n workingTreeDirty: boolean;\r\n stashRef: string | null;\r\n };\r\n validation?: {\r\n typecheck?: \"passed\" | \"failed\" | \"skipped\";\r\n build?: \"passed\" | \"failed\" | \"skipped\";\r\n tests?: string;\r\n zoneCheck?: \"clean\" | \"violations\";\r\n canonicalCheck?: \"aligned\" | \"drift\";\r\n };\r\n}\r\n\r\n// Distributed Lock\n\r\nexport interface DistributedLock {\r\n zone: string;\r\n owner: string;\r\n acquiredAt: string;\r\n expiresAt: string;\r\n ttlMinutes: number;\r\n sprint?: string;\r\n reason: string;\r\n}\r\n\r\nexport interface LockAcquisition {\r\n lock: DistributedLock;\r\n ref: string;\r\n}\r\n\r\n// Configuration\n\r\nexport interface GateDefinition {\r\n name: string;\r\n command: string;\r\n args?: string[];\r\n timeoutSeconds: number;\r\n}\r\n\r\nexport interface OreshnikConfig {\r\n version: 1;\r\n project: {\r\n name: string;\r\n mainBranch: string;\r\n };\r\n operators: Array<{\r\n id: string;\r\n name: string;\r\n email?: string;\r\n }>;\r\n branching: {\r\n motherPrefix: string;\r\n childFormat: string;\r\n integrationPrefix: string;\r\n };\r\n validation: {\r\n gates: GateDefinition[];\r\n };\r\n hardStops: {\r\n forbiddenPatterns: string[];\r\n doubleLockPatterns: string[];\r\n };\r\n vault: {\r\n enabled: boolean;\r\n path: string;\r\n centralDoc: string;\r\n };\r\n canonical?: {\r\n derivedDocs?: DerivedDocConfig[];\r\n knownLegacyTasks?: string[];\r\n knownAssignmentTasks?: string[];\r\n };\r\n sync?: {\r\n canonicalAutoConflicts?: string[];\r\n };\r\n checkpoints: {\r\n autoOnClose: boolean;\r\n autoPreRollback: boolean;\r\n snapshotDir: string;\r\n };\r\n security: {\r\n requireCleanTree: boolean;\r\n secretScanning: boolean;\r\n blockEnvDiffs: boolean;\r\n };\r\n}\r\n\r\n// Preflight\n\r\n// Portfolio\n\nexport type InjectionPolicy = \"proposal_only\" | \"direct_with_approval\";\n\nexport interface PortfolioProject {\n projectId: string;\n displayName: string;\n repoPath: string;\n defaultBranch: string;\n operators: string[];\n taskBoardPath: string;\n zoneMapPath: string;\n validationGates: GateDefinition[];\n injectionPolicy: InjectionPolicy;\n priority: \"low\" | \"medium\" | \"high\" | \"critical\";\n}\n\nexport interface PortfolioConfig {\n version: 1;\n portfolio: {\n id: string;\n name: string;\n sourceNote?: string;\n continuityDocPath?: string;\n };\n projects: PortfolioProject[];\n}\n\nexport interface PortfolioProjectStatus {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n taskBoardExists: boolean;\n zoneMapExists: boolean;\n validationGateCount: number;\n injectionPolicy: InjectionPolicy;\n warnings: string[];\n}\n\nexport interface PortfolioInspection {\n configPath: string;\n portfolioId: string;\n portfolioName: string;\n projectCount: number;\n continuityDocPath?: string;\n projects: PortfolioProjectStatus[];\n}\n\nexport interface PreflightResult {\n sprint: string | null;\r\n operator: string;\r\n branch: string;\r\n mother: string;\r\n effectiveMother: string;\r\n dirtyCount: number;\r\n blockers: number;\r\n warnings: number;\r\n checks: PreflightCheck[];\r\n at: string;\r\n}\r\n\r\nexport interface PreflightCheck {\r\n step: number;\r\n name: string;\r\n status: \"ok\" | \"fail\" | \"warn\" | \"skip\";\r\n message: string;\r\n}\r\n\r\n// Sprint Event\n\r\nexport type EventType =\r\n | \"created\"\r\n | \"started\"\r\n | \"checkpoint\"\r\n | \"gate_passed\"\r\n | \"gate_failed\"\r\n | \"closed\"\r\n | \"rolled_back\"\r\n | \"reassigned\";\r\n\r\nexport interface SprintEvent {\r\n sprint: string;\r\n operator: string;\r\n type: EventType;\r\n date: string;\r\n at: string;\r\n branch?: string;\r\n previousMother?: string;\r\n nextMother?: string;\r\n description?: string;\r\n changedFiles?: string[];\r\n gateResults?: Record<string, \"passed\" | \"failed\">;\r\n}\r\n\r\n// Merge\n\r\nexport interface MergeResult {\r\n resolved: boolean;\r\n content: string | null;\r\n conflicts: string[];\r\n}\r\n\r\n// State Manager\n\r\nexport interface LockHandle {\r\n path: string;\r\n fd: number;\r\n}\r\n\r\nexport interface StateError extends OreshnikError {\r\n code: \"STATE_ERROR\";\r\n}\r\n\r\n// Metrics\n\r\nexport interface OperationalMetrics {\r\n sprintsClosed: number;\r\n sprintsRolledBack: number;\r\n conflictsAvoided: number;\r\n zoneFalsePositives: number;\r\n zoneFalseNegatives: number;\r\n avgTimePreflightToClose: number;\r\n filesOutOfZone: number;\r\n gatesFailedByCategory: Record<string, number>;\r\n parallelSprintsNoConflict: number;\r\n incompleteHandoffs: number;\r\n recoveryTimeAfterBlock: number;\r\n updatedAt: string;\r\n}\r\n\r\n// Canonical Documents\n\r\nexport interface DerivedDocConfig {\r\n path: string;\r\n type: \"central\" | \"collaborator\" | \"status-board\";\r\n source: \"task-board\";\r\n filter?: { owner?: string };\r\n extra?: Record<string, string>;\r\n}\r\n\r\nexport interface CanonicalIssue {\r\n file: string;\r\n severity: \"blocker\" | \"warn\";\r\n reason: string;\r\n}\r\n\r\nexport interface CanonicalCheckResult {\r\n aligned: boolean;\r\n issues: CanonicalIssue[];\r\n boardUpdatedAt: string;\r\n}\r\n\r\n// Sync\n\r\nexport interface SyncResult {\r\n success: boolean;\r\n merged: boolean;\r\n latestMother: string;\r\n conflicts: string[];\r\n autoResolved: string[];\r\n manualRequired: string[];\r\n}\r\n\r\nexport interface TaskBoardMergeResult {\r\n merged: TaskBoard;\r\n oursOnly: string[];\r\n theirsOnly: string[];\r\n}\r\n\r\n// Vault Guard\n\r\nexport interface VaultGuardResult {\r\n clean: boolean;\r\n configDirty: string[];\r\n configRestored: boolean;\r\n contentDirty: string[];\r\n unstagedStagedOverlap: string[];\r\n untracked: string[];\r\n errors: string[];\r\n}\r\n\r\n// Extended Config\n\r\nexport interface DerivedDocsConfig {\r\n derivedDocs: DerivedDocConfig[];\r\n}\r\n\r\nexport interface CanonicalConfig {\r\n autoFix: boolean;\r\n derivedDocs: DerivedDocConfig[];\r\n knownLegacyTasks: string[];\r\n knownAssignmentTasks: string[];\r\n}\r\n\r\nexport interface SyncConfig {\r\n canonicalAutoConflicts: string[];\r\n derivedDocPaths: string[];\r\n}\r\n\r\n// Notes Ingestion\r\n\r\nexport type TaskType = \"feature\" | \"bug\" | \"qa\" | \"docs\" | \"architecture\" | \"migration\" | \"ops\";\r\n\r\nexport type EvidenceType = \"code\" | \"ui\" | \"docs\" | \"integration\" | \"prod\";\r\n\r\nexport interface NoteTask {\r\n rawLine: string;\r\n lineNumber: number;\r\n checked: boolean;\r\n projectIds: string[];\r\n proposedType: TaskType;\r\n proposedOwner: string;\r\n proposedPriority: \"low\" | \"medium\" | \"high\" | \"critical\";\r\n proposedSprintPrefix: string;\r\n evidenceType: EvidenceType;\r\n evidenceExpectation: string;\r\n}\r\n\r\nexport interface NotesIngestionResult {\r\n sourcePath: string;\r\n portfolioId: string;\r\n parsedAt: string;\r\n dryRun: boolean;\r\n totalLines: number;\r\n taskLines: number;\r\n pendingCount: number;\r\n doneCount: number;\r\n tasksByProject: Record<string, NoteTask[]>;\r\n unclassifiedTasks: NoteTask[];\r\n warnings: string[];\r\n}\r\n\r\n// Injection\r\n\r\nexport interface ProjectInjectionResult {\r\n projectId: string;\r\n displayName: string;\r\n injectionPolicy: InjectionPolicy;\r\n repoPath: string;\r\n tasksInjected: number;\r\n tasksSkipped: number;\r\n checkpointTag?: string;\r\n handoffPath?: string;\r\n proposalPath?: string;\r\n blocked: boolean;\r\n blockReason?: string;\r\n warnings: string[];\r\n}\r\n\r\nexport interface InjectionResult {\r\n portfolioId: string;\r\n injectedAt: string;\r\n dryRun: boolean;\r\n confirmed: boolean;\r\n projects: ProjectInjectionResult[];\r\n summary: {\r\n totalProjects: number;\r\n projectsBlocked: number;\r\n projectsInjected: number;\r\n proposalsGenerated: number;\r\n totalTasksInjected: number;\r\n totalTasksSkipped: number;\r\n };\r\n errors: string[];\r\n}\r\n\r\n// Evidence Gates\r\n\r\nexport interface EvidenceRecord {\r\n taskId: string;\r\n evidenceType: EvidenceType;\r\n validatedAt: string;\r\n validator: string;\r\n result: \"passed\" | \"failed\" | \"pending\";\r\n details: string;\r\n artifacts?: string[];\r\n}\r\n\r\nexport interface TaskEvidenceCheck {\r\n taskId: string;\r\n taskTitle: string;\r\n evidenceType: EvidenceType;\r\n hasEvidence: boolean;\r\n requiredEvidence: string;\r\n currentStatus: TaskStatus;\r\n missing: string[];\r\n}\r\n\r\nexport interface EvidenceGateResult {\r\n checkedAt: string;\r\n sprint?: string;\r\n operator: string;\r\n totalTasks: number;\r\n doneTasks: number;\r\n tasksWithEvidence: number;\r\n tasksWithoutEvidence: number;\r\n tasks: TaskEvidenceCheck[];\r\n passed: boolean;\r\n blockers: string[];\r\n}\r\n\r\n// Distributed Locks\r\n\r\nexport interface ZoneLock {\r\n zone: string;\r\n operator: string;\r\n sprint: string;\r\n acquiredAt: string;\r\n ttl: number;\r\n expiresAt: string;\r\n}\r\n\r\nexport interface LockResult {\r\n zone: string;\r\n acquired: boolean;\r\n existingLock?: ZoneLock;\r\n error?: string;\r\n}\r\n\r\nexport interface LockList {\r\n fetchedAt: string;\r\n locks: ZoneLock[];\r\n active: ZoneLock[];\r\n expired: ZoneLock[];\r\n}\r\n","import { ok, err } from \"../types/index.js\";\nimport type { Result, ZoneMap, ZoneCheckResult, ZoneViolation, ZoneWarning, LockType } from \"../types/index.js\";\n\nexport class ZoneEngine {\n private globToRegex(glob: string): RegExp {\n const doubleStarToken = \"__DOUBLE_STAR__\";\n const escaped = glob\n .replaceAll(\"**\", doubleStarToken)\n .replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replaceAll(\"*\", \"[^/]*\")\n .replaceAll(doubleStarToken, \".*\");\n return new RegExp(`^${escaped}$`);\n }\n\n findMatchingZone(file: string, zoneMap: ZoneMap): { pattern: string; zone: ZoneMap[\"zones\"][string] } | null {\n for (const [pattern, zone] of Object.entries(zoneMap.zones)) {\n if (this.globToRegex(pattern).test(file)) {\n return { pattern, zone };\n }\n }\n return null;\n }\n\n check(\n files: string[],\n operator: string,\n sprint: string,\n zoneMap: ZoneMap\n ): ZoneCheckResult {\n const violations: ZoneViolation[] = [];\n const warnings: ZoneWarning[] = [];\n\n for (const file of files) {\n const match = this.findMatchingZone(file, zoneMap);\n\n if (!match) {\n warnings.push({ file, reason: `no-zone-entry: ${file} not mapped in zone-map.json` });\n continue;\n }\n\n const { pattern, zone } = match;\n const allowed = zone.sprints.includes(\"*\") || zone.sprints.includes(sprint);\n\n if (!allowed) {\n warnings.push({ file, reason: `sprint-not-allowed: ${pattern} not mapped to sprint ${sprint}` });\n }\n\n const result = this.checkLock(file, pattern, zone.lock, zone.owner, operator);\n if (result.violation) violations.push(result.violation);\n if (result.warning) warnings.push(result.warning);\n }\n\n return { violations, warnings, filesChecked: files.length };\n }\n\n private checkLock(\n file: string,\n zonePattern: string,\n lock: LockType,\n zoneOwner: string,\n operator: string\n ): { violation?: ZoneViolation; warning?: ZoneWarning } {\n switch (lock) {\n case \"forbidden\":\n return {\n violation: { file, zone: zonePattern, reason: \"forbidden-zone: no operator may modify this zone\" },\n };\n case \"operator_exclusive\":\n if (zoneOwner !== operator) {\n return {\n violation: { file, zone: zonePattern, reason: `exclusive-zone: owned by ${zoneOwner}, operator is ${operator}` },\n };\n }\n break;\n case \"operator_double\":\n return {\n warning: { file, reason: `double-lock-required: ${zonePattern} needs coordination with ${zoneOwner}` },\n };\n case \"shared\":\n break;\n case \"owner_per_sprint\":\n break;\n }\n return {};\n }\n\n getModifiedZones(files: string[], zoneMap: ZoneMap): Set<string> {\n const zones = new Set<string>();\n for (const file of files) {\n const match = this.findMatchingZone(file, zoneMap);\n if (match) zones.add(match.pattern);\n }\n return zones;\n }\n}\n\nexport function createZoneEngine(): ZoneEngine {\n return new ZoneEngine();\n}\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { ok, err } from \"../types/index.js\";\nimport type { Result, MergeResult, StateError, LockHandle } from \"../types/index.js\";\n\nexport class StateManager {\n private readonly runsDir: string;\n\n constructor(private readonly root: string) {\n this.runsDir = join(root, \"var\", \"oreshnik\");\n mkdirSync(this.runsDir, { recursive: true });\n }\n\n // ─── File Operations ───────────────────────────────────────\n\n readJson<T>(filePath: string): Result<T, StateError> {\n try {\n if (!existsSync(filePath)) {\n return err({ code: \"STATE_ERROR\", message: `File not found: ${filePath}`, exitCode: 1 });\n }\n const content = readFileSync(filePath, \"utf8\").replace(/^\\uFEFF/, \"\");\n return ok(JSON.parse(content) as T);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to read/parse ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n writeJson<T>(filePath: string, value: T): Result<void, StateError> {\n try {\n mkdirSync(join(filePath, \"..\"), { recursive: true });\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n return ok(undefined);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to write ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n readText(filePath: string): Result<string, StateError> {\n try {\n if (!existsSync(filePath)) return ok(\"\");\n return ok(readFileSync(filePath, \"utf8\"));\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to read ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n writeText(filePath: string, content: string): Result<void, StateError> {\n try {\n mkdirSync(join(filePath, \"..\"), { recursive: true });\n writeFileSync(filePath, content, \"utf8\");\n return ok(undefined);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to write ${filePath}: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n // ─── Merge Helpers ─────────────────────────────────────────\n\n mergeTextUnion(file: string, base: string, current: string, source: string): Result<string, StateError> {\n const tmpDir = join(this.runsDir, \".merge-tmp\");\n mkdirSync(tmpDir, { recursive: true });\n const id = randomBytes(8).toString(\"hex\");\n const basePath = join(tmpDir, `base-${id}`);\n const curPath = join(tmpDir, `current-${id}`);\n const srcPath = join(tmpDir, `source-${id}`);\n\n try {\n writeFileSync(basePath, base, \"utf8\");\n writeFileSync(curPath, current, \"utf8\");\n writeFileSync(srcPath, source, \"utf8\");\n\n const result = spawnSync(\"git\", [\"merge-file\", \"--union\", \"-p\", curPath, basePath, srcPath], {\n cwd: this.root,\n encoding: \"utf8\",\n timeout: 10000,\n });\n\n return ok(result.stdout || \"\");\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Merge failed for ${file}: ${String(e)}`,\n exitCode: 1,\n });\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n }\n\n mergeJsonSmart(base: unknown, current: unknown, source: unknown): Result<unknown, StateError> {\n try {\n const merged = this.mergeValue(base, current, source);\n return ok(merged);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `JSON merge failed: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n\n private mergeValue(base: unknown, current: unknown, source: unknown): unknown {\n const key = (v: unknown) => JSON.stringify(v);\n\n if (key(current) === key(source)) return current;\n if (key(current) === key(base)) return source;\n if (key(source) === key(base)) return current;\n\n if (\n current && source &&\n typeof current === \"object\" && typeof source === \"object\" &&\n !Array.isArray(current) && !Array.isArray(source)\n ) {\n const result: Record<string, unknown> = { ...current as Record<string, unknown> };\n const allKeys = new Set([\n ...Object.keys((base as Record<string, unknown>) || {}),\n ...Object.keys(current as Record<string, unknown>),\n ...Object.keys(source as Record<string, unknown>),\n ]);\n for (const k of allKeys) {\n result[k] = this.mergeValue(\n (base as Record<string, unknown>)?.[k],\n (current as Record<string, unknown>)[k],\n (source as Record<string, unknown>)[k]\n );\n }\n return result;\n }\n\n if (Array.isArray(current) && Array.isArray(source)) {\n const seen = new Set<string>();\n const merged = [...current, ...source].filter((item) => {\n const k = key(item);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n return merged;\n }\n\n return source;\n }\n\n // ─── Lock Management ───────────────────────────────────────\n\n acquireLocalLock(lockName: string, timeoutMs = 5000): Result<LockHandle, StateError> {\n const lockPath = join(this.runsDir, `.lock-${lockName}`);\n const start = Date.now();\n\n while (Date.now() - start < timeoutMs) {\n try {\n const fd = this.openExclusive(lockPath);\n if (fd !== null) {\n return ok({ path: lockPath, fd });\n }\n } catch {\n // Lock held by another process, retry\n }\n const waited = Date.now() - start;\n if (waited < timeoutMs) {\n // Busy-wait short intervals\n const waitUntil = Date.now() + 50;\n while (Date.now() < waitUntil) { /* spin */ }\n }\n }\n\n return err({\n code: \"STATE_ERROR\",\n message: `Could not acquire lock ${lockName} within ${timeoutMs}ms`,\n exitCode: 1,\n });\n }\n\n private openExclusive(path: string): number | null {\n try {\n const fs = require(\"node:fs\");\n const fd = fs.openSync(path, \"wx\");\n return fd;\n } catch {\n return null;\n }\n }\n\n releaseLocalLock(handle: LockHandle): Result<void, StateError> {\n try {\n const fs = require(\"node:fs\");\n fs.closeSync(handle.fd);\n fs.unlinkSync(handle.path);\n return ok(undefined);\n } catch (e) {\n return err({\n code: \"STATE_ERROR\",\n message: `Failed to release lock: ${String(e)}`,\n exitCode: 1,\n });\n }\n }\n}\n\nexport function createStateManager(root: string): StateManager {\n return new StateManager(root);\n}\n","import { join } from \"node:path\";\r\nimport type { Result, TaskBoard, Task, CanonicalIssue, CanonicalCheckResult, DerivedDocConfig, MotherVersion, OreshnikError } from \"../types/index.js\";\r\nimport { ok, err } from \"../types/index.js\";\r\nimport type { StateManager } from \"./state-manager.js\";\r\n\r\nexport class CanonicalService {\r\n private readonly root: string;\r\n\r\n constructor(\r\n private readonly state: StateManager,\r\n root: string\r\n ) {\r\n this.root = root;\r\n }\r\n\r\n checkCanonicalAlignment(\r\n taskBoard: TaskBoard,\r\n derivedDocs: DerivedDocConfig[],\r\n mother: MotherVersion,\r\n relicTaskIds: string[] = [],\r\n assignmentTaskIds: string[] = []\r\n ): CanonicalCheckResult {\r\n const issues: CanonicalIssue[] = [];\r\n const tasks = taskBoard.tasks;\r\n const taskById = new Map(tasks.map((t) => [t.id, t]));\r\n const openTasks = tasks.filter((t) => t.status !== \"done\");\r\n const statusBoardDoc = derivedDocs.find((d) => d.type === \"status-board\");\r\n\r\n for (const doc of derivedDocs) {\r\n const fullPath = join(this.root, doc.path);\r\n const content = this.state.readText(fullPath);\r\n if (!content.ok || !content.value) {\r\n issues.push({\r\n file: doc.path,\r\n severity: \"blocker\",\r\n reason: `${doc.path} is missing or empty.`,\r\n });\r\n continue;\r\n }\r\n\r\n const text = content.value;\r\n\r\n for (const taskId of relicTaskIds) {\r\n if (this.hasLegacyClosureConflict(text, taskId, taskById)) {\r\n issues.push({\r\n file: doc.path,\r\n severity: \"blocker\",\r\n reason: `${doc.path} still reports stale ${taskId} no-closure state, but task-board marks it done.`,\r\n });\r\n }\r\n }\r\n\r\n for (const taskId of assignmentTaskIds) {\r\n if (this.hasAssignmentConflict(text, taskId, taskById)) {\r\n const task = taskById.get(taskId);\r\n issues.push({\r\n file: doc.path,\r\n severity: \"blocker\",\r\n reason: `${doc.path} assigns ${taskId} away from canonical owner ${task?.owner}.`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (statusBoardDoc) {\r\n const statusPath = join(this.root, statusBoardDoc.path);\r\n const statusText = this.state.readText(statusPath);\r\n if (statusText.ok && statusText.value) {\r\n for (const task of openTasks) {\r\n if (!statusText.value.includes(task.id)) {\r\n issues.push({\r\n file: statusBoardDoc.path,\r\n severity: \"warn\",\r\n reason: `Status board does not include open task ${task.id}: ${task.title}.`,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n aligned: issues.filter((i) => i.severity === \"blocker\").length === 0,\r\n issues,\r\n boardUpdatedAt: taskBoard.updatedAt,\r\n };\r\n }\r\n\r\n regenerateAllDerivedDocs(\r\n taskBoard: TaskBoard,\r\n derivedDocs: DerivedDocConfig[],\r\n mother: MotherVersion,\r\n projectName: string\r\n ): Result<void, OreshnikError> {\r\n for (const doc of derivedDocs) {\r\n let content: string;\r\n if (doc.type === \"central\") {\r\n content = this.generateCentral(taskBoard, mother, projectName, doc.extra);\r\n } else if (doc.type === \"collaborator\" && doc.filter?.owner) {\r\n content = this.generateCollaborator(taskBoard, doc.filter.owner, projectName);\n } else if (doc.type === \"status-board\") {\r\n content = this.generateStatusBoard(taskBoard, projectName);\r\n } else {\r\n continue;\r\n }\r\n\r\n const fullPath = join(this.root, doc.path);\r\n const writeResult = this.state.writeText(fullPath, content);\r\n if (!writeResult.ok) return writeResult;\r\n }\r\n\r\n return ok(undefined);\r\n }\r\n\r\n generateCentral(\r\n taskBoard: TaskBoard,\r\n mother: MotherVersion,\r\n projectName: string,\r\n extra?: Record<string, string>\r\n ): string {\r\n const openTasks = taskBoard.tasks.filter((t) => t.status !== \"done\");\r\n const readyTasks = openTasks.filter((t) => t.status === \"ready\");\r\n const pendingTasks = openTasks.filter((t) => t.status === \"pending\");\r\n const taskRows = (list: Task[]) =>\r\n list.length === 0\r\n ? \"| Ninguno | - | - | - |\\n\"\r\n : list\r\n .map((t) => `| ${t.id} | ${t.status} | ${t.owner} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`)\r\n .join(\"\\n\");\r\n\r\n const extraFields = extra\r\n ? Object.entries(extra)\r\n .map(([k, v]) => `| ${k} | ${v} |`)\r\n .join(\"\\n\")\r\n : \"\";\r\n\r\n return [\r\n \"---\",\r\n `type: master-dashboard`,\r\n `project: \"${projectName}\"`,\r\n `status: active-production`,\r\n `phase: \"Canonical Oreshnik task board governs current assignments\"`,\r\n `last_updated: \"${this.nowISO()}\"`,\r\n `mother_branch: \"${mother.current || \"unknown\"}\"`,\r\n \"tags:\",\r\n \" - \\\"#central\\\"\",\r\n \" - \\\"#status/live-source\\\"\",\r\n \"---\",\r\n \"\",\r\n `# ${projectName} - Dashboard Canonico`,\r\n \"\",\r\n \"> Fuente operativa: `var/oreshnik/task-board.json`. Los documentos de colaborador y status son derivados y deben ser regenerados si cambian las asignaciones.\",\r\n \"\",\r\n \"## Estado Actual\",\r\n \"\",\r\n \"| Campo | Valor |\",\r\n \"|---|---|\",\r\n `| Task board actualizado | ${taskBoard.updatedAt || \"unknown\"} |`,\r\n `| Rama madre | ${mother.current || \"unknown\"} |`,\r\n extraFields,\r\n \"\",\r\n \"## Orden de Ejecucion\",\r\n \"\",\r\n ...taskBoard.currentExecutionOrder.map((item) => `- ${item}`),\r\n \"\",\r\n \"## Tareas Abiertas\",\r\n \"\",\r\n \"| Sprint | Estado | Owner | Scope | Depende de |\",\r\n \"|---|---|---|---|---|\",\r\n taskRows(openTasks),\r\n \"\",\r\n \"## Ready Ahora\",\r\n \"\",\r\n \"| Sprint | Owner | Scope |\",\r\n \"|---|---|---|\",\r\n readyTasks.length\r\n ? readyTasks.map((t) => `| ${t.id} | ${t.owner} | ${t.title} |`).join(\"\\n\")\r\n : \"| Ninguno | - | - |\",\r\n \"\",\r\n \"## Pendientes Bloqueados por Dependencias\",\r\n \"\",\r\n \"| Sprint | Owner | Scope | Depende de |\",\r\n \"|---|---|---|---|\",\r\n pendingTasks.length\r\n ? pendingTasks.map((t) => `| ${t.id} | ${t.owner} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`).join(\"\\n\")\r\n : \"| Ninguno | - | - | - |\",\r\n \"\",\r\n ].join(\"\\n\");\r\n }\r\n\r\n generateCollaborator(taskBoard: TaskBoard, owner: string, projectName: string): string {\n const assigned = taskBoard.tasks.filter(\r\n (t) => t.status !== \"done\" && (t.owner === owner || String(t.owner).includes(`${owner}+`) || String(t.owner).includes(`+${owner}`))\r\n );\r\n const ready = assigned.filter((t) => t.status === \"ready\");\r\n const pending = assigned.filter((t) => t.status === \"pending\");\r\n\r\n const acceptanceRows = (task: Task) =>\r\n (task.acceptance || []).map((item) => `- ${item}`).join(\"\\n\");\r\n\r\n const taskRows = (list: Task[]) =>\r\n list.length === 0\r\n ? \"| Ninguno | - | - |\"\r\n : list.map((t) => `| ${t.id} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`).join(\"\\n\");\r\n\r\n return [\r\n \"---\",\r\n `type: collaborator-status`,\r\n `project: \"${projectName}\"`,\n `operator: \"${owner}\"`,\r\n `last_updated: \"${this.nowISO()}\"`,\r\n `generated_by: \"Oreshnik canonical-check\"`,\r\n `source: \"var/oreshnik/task-board.json\"`,\r\n \"---\",\r\n \"\",\r\n `# Estado ${owner}`,\r\n \"\",\r\n \"> Documento derivado. La fuente operativa es `var/oreshnik/task-board.json`.\",\r\n \"\",\r\n \"## Ready\",\r\n \"\",\r\n \"| Sprint | Scope | Depende de |\",\r\n \"|---|---|---|\",\r\n taskRows(ready),\r\n \"\",\r\n \"## Pending\",\r\n \"\",\r\n \"| Sprint | Scope | Depende de |\",\r\n \"|---|---|---|\",\r\n taskRows(pending),\r\n \"\",\r\n \"## Detalle de Aceptacion\",\r\n \"\",\r\n assigned.length\r\n ? assigned\r\n .map(\r\n (t) =>\r\n `### ${t.id} - ${t.title}\\n\\nEstado: \\`${t.status}\\`\\n\\n${acceptanceRows(t)}\\n\\nZonas: ${(t.zone || []).map((z) => `\\`${z}\\``).join(\", \") || \"-\"}\\n`\r\n )\r\n .join(\"\\n\")\r\n : \"Sin tareas abiertas asignadas.\",\r\n \"\",\r\n ].join(\"\\n\");\r\n }\r\n\r\n generateStatusBoard(taskBoard: TaskBoard, projectName: string): string {\r\n const openTasks = taskBoard.tasks.filter((t) => t.status !== \"done\");\r\n const doneTasks = taskBoard.tasks.filter((t) => t.status === \"done\");\r\n const ownerRows = (owner: string) => {\r\n const owned = openTasks.filter((t) => t.owner === owner || String(t.owner).includes(`${owner}+`) || String(t.owner).includes(`+${owner}`));\r\n return owned.length\r\n ? owned.map((t) => `| ${t.id} | ${t.status} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`).join(\"\\n\")\r\n : \"| Ninguno | - | - | - |\";\r\n };\r\n\r\n return [\r\n \"---\",\r\n `type: status-board`,\r\n `project: \"${projectName}\"`,\r\n `last_updated: \"${this.nowISO()}\"`,\r\n `generated_by: \"Oreshnik canonical-check\"`,\r\n `source: \"var/oreshnik/task-board.json\"`,\r\n \"---\",\r\n \"\",\r\n \"# STATUS BOARD - Realidad Canonica del Repositorio\",\r\n \"\",\r\n \"> Fuente operativa: `var/oreshnik/task-board.json`. Si este documento contradice el task board, el preflight debe bloquear.\",\r\n \"\",\r\n \"## Orden de Ejecucion Actual\",\r\n \"\",\r\n ...taskBoard.currentExecutionOrder.map((item) => `- ${item}`),\r\n \"\",\r\n \"## Tareas Ready/Pending\",\r\n \"\",\r\n \"| Sprint | Estado | Owner | Scope | Depende de |\",\r\n \"|---|---|---|---|---|\",\r\n openTasks\r\n .map((t) => `| ${t.id} | ${t.status} | ${t.owner} | ${t.title} | ${t.dependsOn?.join(\", \") || \"-\"} |`)\r\n .join(\"\\n\"),\r\n \"\",\r\n \"## Hard Stops Vigentes\",\r\n \"\",\r\n \"- No credenciales en git.\",\r\n \"- No sprint closure sin vault, handoff y validaciones.\",\r\n \"\",\r\n \"## Sprints Cerrados Segun Task Board\",\r\n \"\",\r\n \"| Sprint | Owner | Scope |\",\r\n \"|---|---|---|\",\r\n doneTasks.map((t) => `| ${t.id} | ${t.owner} | ${t.title} |`).join(\"\\n\"),\r\n \"\",\r\n ].join(\"\\n\");\r\n }\r\n\r\n private hasLegacyClosureConflict(\r\n content: string,\r\n taskId: string,\r\n taskById: Map<string, Task>\r\n ): boolean {\r\n const task = taskById.get(taskId);\r\n if (task?.status !== \"done\") return false;\r\n const pattern = new RegExp(\r\n `${taskId}[\\\\s\\\\S]{0,700}(SIN CLOSURE|sin closure|NO EXISTE|CERO commits|sin codigo visible|no code visible)`,\n \"i\"\r\n );\r\n return pattern.test(content);\r\n }\r\n\r\n private hasAssignmentConflict(\r\n content: string,\r\n taskId: string,\r\n taskById: Map<string, Task>\r\n ): boolean {\r\n const task = taskById.get(taskId);\n if (!task || task.status === \"done\") return false;\n\n // Free-text assignment detection is unsafe without a structured marker.\n // Avoid project-specific operator assumptions and false blockers.\n return false;\n }\n\r\n private nowISO(): string {\r\n return new Date().toISOString();\r\n }\r\n}\r\n\r\nexport function createCanonicalService(state: StateManager, root: string): CanonicalService {\r\n return new CanonicalService(state, root);\r\n}\r\n","import { join } from \"node:path\";\r\nimport type { Result, TaskBoard, SyncResult, TaskBoardMergeResult, MotherVersion, Reassignment, OreshnikError } from \"../types/index.js\";\r\nimport { ok, err } from \"../types/index.js\";\r\nimport type { GitService } from \"./git.service.js\";\r\nimport type { StateManager } from \"./state-manager.js\";\r\nimport type { CanonicalService } from \"./canonical.service.js\";\r\n\r\nexport class SyncService {\r\n private readonly root: string;\r\n\r\n constructor(\r\n private readonly git: GitService,\r\n private readonly state: StateManager,\r\n private readonly canonical: CanonicalService,\r\n root: string\r\n ) {\r\n this.root = root;\r\n }\r\n\r\n syncLatestMother(args: {\n motherPrefix: string;\r\n derivedDocPaths: string[];\r\n canonicalAutoConflicts?: string[];\r\n projectName: string;\r\n derivedDocs: Array<{ path: string; type: \"central\" | \"collaborator\" | \"status-board\"; filter?: { owner?: string }; extra?: Record<string, string> }>;\r\n operator: string;\r\n }): SyncResult {\r\n const result: SyncResult = {\r\n success: false,\r\n merged: false,\r\n latestMother: \"\",\r\n conflicts: [],\r\n autoResolved: [],\r\n manualRequired: [],\r\n };\n\n const taskBoardRel = \"var/oreshnik/task-board.json\";\n const derivedDocPaths = args.derivedDocPaths.map((p) => this.toGitPath(p));\n const autoConflicts = new Set([\n ...(args.canonicalAutoConflicts || []).map((p) => this.toGitPath(p)),\n ...derivedDocPaths,\n taskBoardRel,\n ]);\n\r\n const fetchResult = this.git.fetch();\r\n if (!fetchResult.ok) {\r\n result.conflicts.push(`Fetch failed: ${fetchResult.error.message}`);\r\n return result;\r\n }\r\n\r\n const motherResult = this.readMother();\r\n if (!motherResult.ok) return result;\r\n\r\n const currentMother = motherResult.value;\r\n const latest = this.git.discoverLatestMother(args.motherPrefix);\r\n if (!latest.ok || !latest.value) {\r\n result.success = true;\r\n result.latestMother = currentMother.current;\r\n return result;\r\n }\r\n\r\n const latestRef = this.git.refExists(`origin/${latest.value.name}`)\r\n ? `origin/${latest.value.name}`\r\n : latest.value.name;\r\n\r\n result.latestMother = latest.value.name;\r\n\r\n if (latest.value.version <= (currentMother.version || 0)) {\r\n result.success = true;\r\n result.latestMother = currentMother.current;\r\n return result;\r\n }\r\n\r\n const dirty = this.git.statusPorcelain();\n if (!dirty.ok) {\n result.conflicts.push(`Failed to inspect working tree: ${dirty.error.message}`);\n return result;\n }\n const dirtyFiles = dirty.value\n .filter((e) => !this.toGitPath(e.path).startsWith(\"var/oreshnik/\") && !this.toGitPath(e.path).startsWith(\"output/\"))\n .map((e) => this.toGitPath(e.path));\n if (dirtyFiles.length > 0) {\n result.conflicts.push(`Working tree has ${dirtyFiles.length} changed file(s).`);\n return result;\n }\r\n\r\n const merge = this.git.merge(latestRef, {\r\n noFF: true,\r\n message: `chore(oreshnik): sync from ${latest.value.name}`,\r\n });\r\n\r\n if (merge.ok) {\r\n result.success = true;\r\n result.merged = true;\r\n return result;\r\n }\r\n\r\n const conflictFiles = this.git.unmergedFiles();\n if (!conflictFiles.ok) {\n result.conflicts.push(`Failed to inspect merge conflicts: ${conflictFiles.error.message}`);\n return result;\n }\n\n const conflicts = conflictFiles.value.map((p) => this.toGitPath(p));\n const manual = conflicts.filter((f) => !autoConflicts.has(f));\n\r\n if (manual.length > 0) {\r\n result.manualRequired = manual;\r\n return result;\r\n }\r\n\r\n const taskBoardPath = taskBoardRel;\n\n if (conflicts.includes(taskBoardRel)) {\n const mergeResult = this.mergeTaskBoardById(taskBoardPath);\n if (!mergeResult.ok) {\n result.conflicts.push(mergeResult.error.message);\n return result;\n }\n result.autoResolved.push(taskBoardRel);\n }\n\r\n const motherVersion = this.readMother();\r\n const mother = motherVersion.ok ? motherVersion.value : { version: 0, current: \"unknown\", branches: [] };\r\n\r\n const boardData = this.state.readJson<TaskBoard>(taskBoardPath);\r\n const board: TaskBoard = boardData.ok\r\n ? boardData.value\r\n : { project: args.projectName, updatedAt: new Date().toISOString(), currentExecutionOrder: [], tasks: [] };\r\n\r\n const regenResult = this.canonical.regenerateAllDerivedDocs(\r\n board,\r\n args.derivedDocs.map((d) => ({ ...d, source: \"task-board\" as const })),\r\n mother,\r\n args.projectName\r\n );\r\n if (!regenResult.ok) {\r\n result.conflicts.push(`Derived doc regeneration failed: ${regenResult.error.message}`);\r\n return result;\r\n }\r\n\r\n const stageFiles = [taskBoardRel, ...derivedDocPaths];\n const stageResult = this.git.stage(stageFiles);\n if (!stageResult.ok) {\n result.conflicts.push(`Failed to stage auto-resolved files: ${stageResult.error.message}`);\n return result;\n }\n result.autoResolved.push(...derivedDocPaths);\n\n const remaining = this.git.unmergedFiles();\n if (!remaining.ok) {\n result.conflicts.push(`Failed to inspect remaining merge conflicts: ${remaining.error.message}`);\n return result;\n }\n if (remaining.value.length > 0) {\n result.manualRequired = remaining.value.map((p) => this.toGitPath(p));\n return result;\n }\n\n const commitResult = this.git.commit(\"chore(oreshnik): auto-resolve canonical conflicts\");\n if (!commitResult.ok) {\n result.conflicts.push(`Failed to commit auto-resolved conflicts: ${commitResult.error.message}`);\n return result;\n }\n result.success = true;\n result.merged = true;\n\r\n return result;\r\n }\r\n\r\n private mergeTaskBoardById(fileRel: string): Result<TaskBoardMergeResult, OreshnikError> {\n const fullPath = join(this.root, ...fileRel.split(\"/\"));\r\n\r\n const oursRaw = this.git.showRef(\":2\", fileRel);\r\n const theirsRaw = this.git.showRef(\":3\", fileRel);\r\n\r\n if (!oursRaw.ok && !theirsRaw.ok) {\r\n return err({ code: \"STATE_ERROR\", message: `Cannot read conflict stages for ${fileRel}`, exitCode: 1 });\r\n }\r\n\r\n try {\r\n const ours: TaskBoard = oursRaw.ok && oursRaw.value ? JSON.parse(oursRaw.value.replace(/^\\uFEFF/, \"\")) : { project: \"\", updatedAt: \"\", currentExecutionOrder: [], tasks: [] };\r\n const theirs: TaskBoard = theirsRaw.ok && theirsRaw.value ? JSON.parse(theirsRaw.value.replace(/^\\uFEFF/, \"\")) : { project: \"\", updatedAt: \"\", currentExecutionOrder: [], tasks: [] };\r\n\r\n const merged: TaskBoard = {\r\n project: theirs.project || ours.project,\r\n updatedAt: new Date().toISOString(),\r\n currentExecutionOrder: theirs.currentExecutionOrder || ours.currentExecutionOrder,\r\n tasks: structuredClone(theirs.tasks),\r\n reassignments: this.mergeUniqueReassignments(ours.reassignments || [], theirs.reassignments || []),\r\n };\r\n\r\n const mergedIds = new Set(merged.tasks.map((t) => t.id));\r\n const oursOnly: string[] = [];\r\n\r\n for (const task of ours.tasks || []) {\r\n if (!mergedIds.has(task.id)) {\r\n const releaseIdx = merged.tasks.findIndex((t) => t.id.includes(\"RELEASE\"));\r\n if (releaseIdx >= 0) merged.tasks.splice(releaseIdx, 0, task);\r\n else merged.tasks.push(task);\r\n mergedIds.add(task.id);\r\n oursOnly.push(task.id);\r\n }\r\n }\r\n\r\n const theirsOnly = (theirs.tasks || []).filter((t) => !new Set((ours.tasks || []).map((o) => o.id)).has(t.id)).map((t) => t.id);\r\n const writeResult = this.state.writeJson(fullPath, merged);\n if (!writeResult.ok) return writeResult;\n\r\n return ok({ merged, oursOnly, theirsOnly });\r\n } catch (e) {\r\n return err({ code: \"STATE_ERROR\", message: `Failed to merge task board: ${String(e)}`, exitCode: 1 });\r\n }\r\n }\r\n\r\n private mergeUniqueReassignments(a: Reassignment[], b: Reassignment[]): Reassignment[] {\r\n const seen = new Set<string>();\r\n return [...a, ...b].filter((item) => {\r\n const key = JSON.stringify(item);\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n }\r\n\r\n private readMother(): Result<MotherVersion, OreshnikError> {\r\n const path = join(this.root, \"var\", \"oreshnik\", \".mother-version.json\");\r\n return this.state.readJson<MotherVersion>(path);\r\n }\r\n\r\n private runsDir(file: string): string {\n return `var/oreshnik/${file}`;\n }\n\n private toGitPath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n }\n}\n\r\nexport function createSyncService(\r\n git: GitService,\r\n state: StateManager,\r\n canonical: CanonicalService,\r\n root: string\r\n): SyncService {\r\n return new SyncService(git, state, canonical, root);\r\n}\r\n","import type { Result, VaultGuardResult, OreshnikError, GitError } from \"../types/index.js\";\r\nimport type { GitService } from \"./git.service.js\";\r\n\r\nexport class VaultGuard {\r\n constructor(private readonly git: GitService) {}\r\n\r\n check(vaultPath: string, obsidianConfigDir: string, force = false): VaultGuardResult {\r\n const result: VaultGuardResult = {\r\n clean: true,\r\n configDirty: [],\r\n configRestored: false,\r\n contentDirty: [],\r\n unstagedStagedOverlap: [],\r\n untracked: [],\r\n errors: [],\r\n };\r\n\r\n const configDirty = this.gitDirtyFiles(`${obsidianConfigDir}/`, vaultPath);\r\n if (!configDirty.ok) {\r\n result.clean = false;\r\n result.errors.push(configDirty.error.message);\r\n } else if (configDirty.value.length > 0) {\r\n result.configDirty = configDirty.value;\r\n\r\n if (force) {\r\n const restore = this.git.restoreFromHead(`${obsidianConfigDir}/`);\r\n if (restore.ok) {\r\n result.configRestored = true;\r\n } else {\r\n result.clean = false;\r\n }\r\n } else {\r\n result.clean = false;\r\n }\r\n }\r\n\r\n const vaultDirty = this.gitDirtyFiles(`${vaultPath}/`, vaultPath, `:!${obsidianConfigDir}`);\r\n if (!vaultDirty.ok) {\r\n result.clean = false;\r\n result.errors.push(vaultDirty.error.message);\r\n } else if (vaultDirty.value.length > 0) {\r\n result.contentDirty = vaultDirty.value;\r\n }\r\n\r\n const unstaged = this.gitDiffFiles(`${vaultPath}/`);\r\n const staged = this.gitDiffFiles(`${vaultPath}/`, true);\r\n\r\n if (!unstaged.ok) {\r\n result.clean = false;\r\n result.errors.push(unstaged.error.message);\r\n }\r\n if (!staged.ok) {\r\n result.clean = false;\r\n result.errors.push(staged.error.message);\r\n }\r\n if (unstaged.ok && staged.ok && unstaged.value.length > 0 && staged.value.length > 0) {\r\n const both = unstaged.value.filter((f) => staged.value.includes(f));\r\n if (both.length > 0) {\r\n result.unstagedStagedOverlap = both;\r\n }\r\n }\r\n\r\n const untracked = this.gitUntrackedFiles(`${obsidianConfigDir}/`);\r\n if (!untracked.ok) {\r\n result.clean = false;\r\n result.errors.push(untracked.error.message);\r\n } else if (untracked.value.length > 0) {\r\n result.untracked = untracked.value;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n restoreConfig(obsidianConfigDir: string): Result<void, OreshnikError> {\r\n return this.git.restoreFromHead(`${obsidianConfigDir}/`);\r\n }\r\n\r\n private gitDirtyFiles(pattern: string, _vaultPath: string, excludePattern?: string): Result<string[], GitError> {\r\n const args = [\"diff\", \"--name-only\", \"--\", pattern];\r\n if (excludePattern) args.push(excludePattern);\r\n const r = this.git.exec(args);\r\n if (!r.ok) {\r\n return {\r\n ok: false,\r\n error: {\r\n code: \"GIT_ERROR\",\r\n message: `Failed to inspect dirty files for ${pattern}`,\r\n exitCode: 1,\r\n gitCommand: `git ${args.join(\" \")}`,\r\n gitStderr: r.error,\r\n },\r\n };\r\n }\r\n return { ok: true, value: r.output.split(/\\r?\\n/).filter(Boolean) };\r\n }\r\n\r\n private gitDiffFiles(pattern: string, cached = false): Result<string[], GitError> {\r\n const args = [\"diff\", \"--name-only\"];\r\n if (cached) args.push(\"--cached\");\r\n args.push(\"--\", pattern);\r\n const r = this.git.exec(args);\r\n if (!r.ok) {\r\n return {\r\n ok: false,\r\n error: {\r\n code: \"GIT_ERROR\",\r\n message: `Failed to inspect diff files for ${pattern}`,\r\n exitCode: 1,\r\n gitCommand: `git ${args.join(\" \")}`,\r\n gitStderr: r.error,\r\n },\r\n };\r\n }\r\n return { ok: true, value: r.output.split(/\\r?\\n/).filter(Boolean) };\r\n }\r\n\r\n private gitUntrackedFiles(pattern: string): Result<string[], GitError> {\r\n const r = this.git.exec([\"ls-files\", \"--others\", \"--exclude-standard\", \"--\", pattern]);\r\n if (!r.ok) {\r\n return {\r\n ok: false,\r\n error: {\r\n code: \"GIT_ERROR\",\r\n message: `Failed to inspect untracked files for ${pattern}`,\r\n exitCode: 1,\r\n gitCommand: `git ls-files --others --exclude-standard -- ${pattern}`,\r\n gitStderr: r.error,\r\n },\r\n };\r\n }\r\n return { ok: true, value: r.output.split(/\\r?\\n/).filter(Boolean) };\r\n }\r\n}\r\n\r\nexport function createVaultGuard(git: GitService): VaultGuard {\r\n return new VaultGuard(git);\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, PortfolioInspection, PortfolioProject, PortfolioProjectStatus, Result, StateError } from \"../types/index.js\";\nimport { PortfolioConfigSchema } from \"../types/schemas.js\";\n\nexport class PortfolioService {\n constructor(private readonly root: string) {}\n\n load(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config ${configPath}: ${String(e)}`));\n }\n }\n\n inspect(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioInspection, StateError> {\n const config = this.load(configPath);\n if (!config.ok) return config;\n\n const projects = config.value.projects.map((project) => this.inspectProject(project));\n return ok({\n configPath,\n portfolioId: config.value.portfolio.id,\n portfolioName: config.value.portfolio.name,\n projectCount: config.value.projects.length,\n continuityDocPath: config.value.portfolio.continuityDocPath,\n projects,\n });\n }\n\n private inspectProject(project: PortfolioProject): PortfolioProjectStatus {\n const repoPath = this.resolvePath(project.repoPath);\n const repoExists = existsSync(repoPath);\n const taskBoardExists = repoExists && existsSync(join(repoPath, ...project.taskBoardPath.split(\"/\")));\n const zoneMapExists = repoExists && existsSync(join(repoPath, ...project.zoneMapPath.split(\"/\")));\n const warnings: string[] = [];\n\n if (!repoExists) warnings.push(\"repo path not found\");\n if (repoExists && !taskBoardExists) warnings.push(\"task-board missing\");\n if (repoExists && !zoneMapExists) warnings.push(\"zone-map missing\");\n if (project.validationGates.length === 0) warnings.push(\"validation gates missing\");\n if (project.injectionPolicy === \"direct_with_approval\" && !taskBoardExists) warnings.push(\"direct injection blocked until task-board exists\");\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists,\n taskBoardExists,\n zoneMapExists,\n validationGateCount: project.validationGates.length,\n injectionPolicy: project.injectionPolicy,\n warnings,\n };\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createPortfolioService(root: string): PortfolioService {\n return new PortfolioService(root);\n}\n","import { z } from \"zod\";\r\n\r\n// Task Board\n\r\nexport const TaskHistoryEntrySchema = z.object({\r\n at: z.string(),\r\n action: z.string(),\r\n operator: z.string().optional(),\r\n from: z.string().optional(),\r\n to: z.string().optional(),\r\n reason: z.string().optional(),\r\n branch: z.string().optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const TaskSchema = z.object({\r\n id: z.string().min(1).max(120),\r\n title: z.string().min(1).max(500),\r\n owner: z.string().min(1).max(50),\r\n backupOwner: z.string().optional(),\r\n status: z.enum([\"ready\", \"active\", \"pending\", \"blocked\", \"done\", \"rolled_back\"]),\r\n track: z.string().optional(),\r\n zone: z.array(z.string()).optional(),\r\n dependsOn: z.array(z.string()).optional(),\r\n acceptance: z.array(z.string()).optional(),\r\n handoff: z.string().optional(),\r\n history: z.array(TaskHistoryEntrySchema).optional(),\r\n});\r\n\r\nexport const ReassignmentSchema = z.object({\r\n at: z.string(),\r\n task: z.string(),\r\n from: z.string(),\r\n to: z.string(),\r\n reason: z.string(),\r\n});\r\n\r\nexport const TaskBoardSchema = z.object({\r\n project: z.string(),\r\n updatedAt: z.string(),\r\n resiliencePolicy: z.string().optional(),\r\n closurePolicy: z.string().optional(),\r\n baseTestMatrix: z.array(z.string()).optional(),\r\n currentExecutionOrder: z.array(z.string()),\r\n tasks: z.array(TaskSchema),\r\n reassignments: z.array(ReassignmentSchema).optional(),\r\n});\r\n\r\n// Mother Version\n\r\nexport const MotherBranchEntrySchema = z.object({\r\n version: z.number(),\r\n name: z.string(),\r\n sprint: z.string(),\r\n operator: z.string(),\r\n date: z.string(),\r\n at: z.string(),\r\n previous: z.string(),\r\n description: z.string(),\r\n});\r\n\r\nexport const MotherVersionSchema = z.object({\r\n version: z.number(),\r\n current: z.string(),\r\n branches: z.array(MotherBranchEntrySchema),\r\n});\r\n\r\n// Zone Map\n\r\nexport const ZoneEntrySchema = z.object({\r\n owner: z.string(),\r\n lock: z.enum([\"operator_exclusive\", \"operator_double\", \"shared\", \"forbidden\", \"owner_per_sprint\"]),\r\n sprints: z.array(z.string()),\r\n criticality: z.enum([\"low\", \"medium\", \"high\", \"critical\"]).optional(),\r\n});\r\n\r\nexport const ZoneMapSchema = z.object({\r\n zones: z.record(z.string(), ZoneEntrySchema),\r\n});\r\n\r\n// Canonical Documents\n\r\nexport const DerivedDocConfigSchema = z.object({\r\n path: z.string().min(1),\r\n type: z.enum([\"central\", \"collaborator\", \"status-board\"]),\r\n source: z.literal(\"task-board\"),\r\n filter: z.object({ owner: z.string() }).optional(),\r\n extra: z.record(z.string()).optional(),\r\n});\r\n\r\nexport const CanonicalIssueSchema = z.object({\r\n file: z.string(),\r\n severity: z.enum([\"blocker\", \"warn\"]),\r\n reason: z.string(),\r\n});\r\n\r\n// Configuration\n\r\nexport const GateDefinitionSchema = z.object({\r\n name: z.string().min(1).max(100),\r\n command: z.string().min(1).max(500),\r\n args: z.array(z.string()).optional(),\r\n timeoutSeconds: z.number().min(10).max(3600).default(300),\r\n});\r\n\r\nexport const OreshnikConfigSchema = z.object({\r\n version: z.literal(1),\r\n project: z.object({\r\n name: z.string().min(1).max(100),\r\n mainBranch: z.string().min(1).max(100).default(\"main\"),\r\n }),\r\n operators: z.array(z.object({\r\n id: z.string().regex(/^[a-z0-9_-]+$/),\r\n name: z.string().min(1).max(100),\r\n email: z.string().email().optional(),\r\n })).min(1),\r\n branching: z.object({\r\n motherPrefix: z.string().default(\"MADRE\"),\r\n childFormat: z.string().default(\"{operator}/{sprint}-{desc}-{date}\"),\r\n integrationPrefix: z.string().default(\"integration\"),\r\n }).optional().default({}),\r\n validation: z.object({\r\n gates: z.array(GateDefinitionSchema).default([]),\r\n }).optional().default({}),\r\n hardStops: z.object({\r\n forbiddenPatterns: z.array(z.string()).default([]),\r\n doubleLockPatterns: z.array(z.string()).default([]),\r\n }).optional().default({}),\r\n vault: z.object({\r\n enabled: z.boolean().default(true),\r\n path: z.string().default(\"docs/obsidian-vault\"),\r\n centralDoc: z.string().default(\"00_CENTRAL.md\"),\r\n }).optional().default({}),\r\n canonical: z.object({\r\n derivedDocs: z.array(DerivedDocConfigSchema).optional(),\r\n knownLegacyTasks: z.array(z.string()).optional(),\r\n knownAssignmentTasks: z.array(z.string()).optional(),\r\n }).optional(),\r\n sync: z.object({\r\n canonicalAutoConflicts: z.array(z.string()).optional(),\r\n }).optional(),\r\n checkpoints: z.object({\r\n autoOnClose: z.boolean().default(true),\r\n autoPreRollback: z.boolean().default(true),\r\n snapshotDir: z.string().default(\"var/oreshnik/checkpoints\"),\r\n }).optional().default({}),\r\n security: z.object({\r\n requireCleanTree: z.boolean().default(true),\r\n secretScanning: z.boolean().default(true),\r\n blockEnvDiffs: z.boolean().default(true),\r\n }).optional().default({}),\r\n});\r\n\r\n// Distributed Lock\n\r\n// Portfolio\n\nexport const PortfolioProjectSchema = z.object({\n projectId: z.string().min(1).max(50).regex(/^[a-z0-9_-]+$/),\n displayName: z.string().min(1).max(100),\n repoPath: z.string().min(1),\n defaultBranch: z.string().min(1).max(100),\n operators: z.array(z.string().min(1).max(50)).default([]),\n taskBoardPath: z.string().min(1).default(\"var/oreshnik/task-board.json\"),\n zoneMapPath: z.string().min(1).default(\"docs/07_handoffs/zone-map.json\"),\n validationGates: z.array(GateDefinitionSchema).default([]),\n injectionPolicy: z.enum([\"proposal_only\", \"direct_with_approval\"]).default(\"proposal_only\"),\n priority: z.enum([\"low\", \"medium\", \"high\", \"critical\"]).default(\"medium\"),\n});\n\nexport const PortfolioConfigSchema = z.object({\n version: z.literal(1),\n portfolio: z.object({\n id: z.string().min(1).max(50).regex(/^[a-z0-9_-]+$/),\n name: z.string().min(1).max(100),\n sourceNote: z.string().optional(),\n continuityDocPath: z.string().min(1).optional(),\n }),\n projects: z.array(PortfolioProjectSchema).min(1),\n});\n\nexport const DistributedLockSchema = z.object({\n zone: z.string().min(1),\r\n owner: z.string().min(1),\r\n acquiredAt: z.string(),\r\n expiresAt: z.string(),\r\n ttlMinutes: z.number().min(1).max(1440),\r\n sprint: z.string().optional(),\r\n reason: z.string().min(1).max(500),\r\n});\r\n\r\n// Checkpoint\n\r\nexport const CheckpointSchema = z.object({\r\n id: z.string(),\r\n tag: z.string(),\r\n timestamp: z.string(),\r\n operator: z.string(),\r\n sprint: z.string().optional(),\r\n type: z.enum([\"auto\", \"manual\", \"pre-rollback\"]),\r\n git: z.object({\r\n tag: z.string(),\r\n commit: z.string(),\r\n branch: z.string(),\r\n motherBranch: z.string().optional(),\r\n motherVersion: z.number().optional(),\r\n }),\r\n state: z.object({\r\n taskBoard: TaskBoardSchema,\r\n motherVersion: MotherVersionSchema,\r\n workingTreeDirty: z.boolean(),\r\n stashRef: z.string().nullable(),\r\n }),\r\n validation: z.object({\r\n typecheck: z.enum([\"passed\", \"failed\", \"skipped\"]).optional(),\r\n build: z.enum([\"passed\", \"failed\", \"skipped\"]).optional(),\r\n tests: z.string().optional(),\r\n zoneCheck: z.enum([\"clean\", \"violations\"]).optional(),\r\n canonicalCheck: z.enum([\"aligned\", \"drift\"]).optional(),\r\n }).optional(),\r\n});\r\n\r\n// Sprint Event\n\r\nexport const SprintEventSchema = z.object({\r\n sprint: z.string(),\r\n operator: z.string(),\r\n type: z.enum([\"created\", \"started\", \"checkpoint\", \"gate_passed\", \"gate_failed\", \"closed\", \"rolled_back\", \"reassigned\"]),\r\n date: z.string(),\r\n at: z.string(),\r\n branch: z.string().optional(),\r\n previousMother: z.string().optional(),\r\n nextMother: z.string().optional(),\r\n description: z.string().optional(),\r\n changedFiles: z.array(z.string()).optional(),\r\n gateResults: z.record(z.enum([\"passed\", \"failed\"])).optional(),\r\n});\r\n\r\n// Input Sanitizers\n\r\nexport const SprintIdSchema = z.string().min(1).max(50).regex(\r\n /^[a-zA-Z0-9_-]+$/,\r\n \"Sprint ID must contain only alphanumeric characters, hyphens, and underscores\"\r\n);\r\n\r\nexport const OperatorIdSchema = z.string().min(1).max(50).regex(\r\n /^[a-zA-Z0-9_-]+$/,\r\n \"Operator ID must contain only alphanumeric characters, hyphens, and underscores\"\r\n);\r\n\r\nexport const DescriptionSchema = z.string().min(1).max(500);\r\n\r\nexport const TagNameSchema = z.string().min(1).max(100).regex(\r\n /^[a-zA-Z0-9._/-]+$/,\r\n \"Tag name must contain only alphanumeric characters, dots, underscores, hyphens, and slashes\"\r\n);\r\n\r\n// Vault Guard\n\r\nexport const VaultGuardResultSchema = z.object({\r\n clean: z.boolean(),\r\n configDirty: z.array(z.string()),\r\n configRestored: z.boolean(),\r\n contentDirty: z.array(z.string()),\r\n unstagedStagedOverlap: z.array(z.string()),\r\n untracked: z.array(z.string()),\r\n errors: z.array(z.string()),\r\n});\r\n\r\n// Notes Ingestion\r\n\r\nexport const NoteTaskSchema = z.object({\r\n rawLine: z.string(),\r\n lineNumber: z.number(),\r\n checked: z.boolean(),\r\n projectIds: z.array(z.string()),\r\n proposedType: z.enum([\"feature\", \"bug\", \"qa\", \"docs\", \"architecture\", \"migration\", \"ops\"]),\r\n proposedOwner: z.string(),\r\n proposedPriority: z.enum([\"low\", \"medium\", \"high\", \"critical\"]),\r\n proposedSprintPrefix: z.string(),\r\n evidenceType: z.enum([\"code\", \"ui\", \"docs\", \"integration\", \"prod\"]),\r\n evidenceExpectation: z.string(),\r\n});\r\n\r\nexport const NotesIngestionResultSchema = z.object({\r\n sourcePath: z.string(),\r\n portfolioId: z.string(),\r\n parsedAt: z.string(),\r\n dryRun: z.boolean(),\r\n totalLines: z.number(),\r\n taskLines: z.number(),\r\n pendingCount: z.number(),\r\n doneCount: z.number(),\r\n tasksByProject: z.record(z.string(), z.array(NoteTaskSchema)),\r\n unclassifiedTasks: z.array(NoteTaskSchema),\r\n warnings: z.array(z.string()),\r\n});\r\n\r\n// Injection\r\n\r\nexport const ProjectInjectionResultSchema = z.object({\r\n projectId: z.string(),\r\n displayName: z.string(),\r\n injectionPolicy: z.enum([\"proposal_only\", \"direct_with_approval\"]),\r\n repoPath: z.string(),\r\n tasksInjected: z.number(),\r\n tasksSkipped: z.number(),\r\n checkpointTag: z.string().optional(),\r\n handoffPath: z.string().optional(),\r\n proposalPath: z.string().optional(),\r\n blocked: z.boolean(),\r\n blockReason: z.string().optional(),\r\n warnings: z.array(z.string()),\r\n});\r\n\r\nexport const InjectionResultSchema = z.object({\r\n portfolioId: z.string(),\r\n injectedAt: z.string(),\r\n dryRun: z.boolean(),\r\n confirmed: z.boolean(),\r\n projects: z.array(ProjectInjectionResultSchema),\r\n summary: z.object({\r\n totalProjects: z.number(),\r\n projectsBlocked: z.number(),\r\n projectsInjected: z.number(),\r\n proposalsGenerated: z.number(),\r\n totalTasksInjected: z.number(),\r\n totalTasksSkipped: z.number(),\r\n }),\r\n errors: z.array(z.string()),\r\n});\r\n\r\n// Evidence Gates\r\n\r\nexport const EvidenceRecordSchema = z.object({\r\n taskId: z.string(),\r\n evidenceType: z.enum([\"code\", \"ui\", \"docs\", \"integration\", \"prod\"]),\r\n validatedAt: z.string(),\r\n validator: z.string(),\r\n result: z.enum([\"passed\", \"failed\", \"pending\"]),\r\n details: z.string(),\r\n artifacts: z.array(z.string()).optional(),\r\n});\r\n\r\nexport const TaskEvidenceCheckSchema = z.object({\r\n taskId: z.string(),\r\n taskTitle: z.string(),\r\n evidenceType: z.enum([\"code\", \"ui\", \"docs\", \"integration\", \"prod\"]),\r\n hasEvidence: z.boolean(),\r\n requiredEvidence: z.string(),\r\n currentStatus: z.enum([\"ready\", \"active\", \"pending\", \"blocked\", \"done\", \"rolled_back\"]),\r\n missing: z.array(z.string()),\r\n});\r\n\r\nexport const EvidenceGateResultSchema = z.object({\r\n checkedAt: z.string(),\r\n sprint: z.string().optional(),\r\n operator: z.string(),\r\n totalTasks: z.number(),\r\n doneTasks: z.number(),\r\n tasksWithEvidence: z.number(),\r\n tasksWithoutEvidence: z.number(),\r\n tasks: z.array(TaskEvidenceCheckSchema),\r\n passed: z.boolean(),\r\n blockers: z.array(z.string()),\r\n});\r\n\r\n// Distributed Locks\r\n\r\nexport const ZoneLockSchema = z.object({\r\n zone: z.string(),\r\n operator: z.string(),\r\n sprint: z.string(),\r\n acquiredAt: z.string(),\r\n ttl: z.number().min(60).max(86400),\r\n expiresAt: z.string(),\r\n});\r\n\r\nexport const LockResultSchema = z.object({\r\n zone: z.string(),\r\n acquired: z.boolean(),\r\n existingLock: ZoneLockSchema.optional(),\r\n error: z.string().optional(),\r\n});\r\n\r\nexport const LockListSchema = z.object({\r\n fetchedAt: z.string(),\r\n locks: z.array(ZoneLockSchema),\r\n active: z.array(ZoneLockSchema),\r\n expired: z.array(ZoneLockSchema),\r\n});\r\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { NoteTask, NotesIngestionResult, PortfolioConfig, Result, StateError } from \"../types/index.js\";\nimport { NotesIngestionResultSchema, PortfolioConfigSchema } from \"../types/schemas.js\";\n\nconst PROJECT_KEYWORDS: Record<string, string[]> = {\n heptacore: [\"heptacore\", \"heptacor\", \"eptacor\"],\n oreshnik: [\"oreshnik\", \"oresnick\", \"ornik\"],\n turpialsound: [\"turpialsound\", \"turpial sound\", \"turpial zone\"],\n turpialmarket: [\"turpialmarket\", \"turpial market\", \"marketplace\"],\n dropsocial: [\"dropsocial\", \"drop social\"],\n smsmantis: [\"mantis\", \"smsmantis\"],\n};\n\nconst OPERATOR_KEYWORDS: Record<string, string> = {\n jean: \"jean\",\n};\n\nconst TASK_LINE_RE = /^\\s*[-*]\\s+\\[([ xX])\\]\\s+(.+)$/;\n\nexport class NotesIngestionService {\n constructor(private readonly root: string) {}\n\n ingest(options: {\n sourcePath: string;\n configPath?: string;\n dryRun?: boolean;\n }): Result<NotesIngestionResult, StateError> {\n const configResult = this.loadPortfolio(options.configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const fullSourcePath = this.resolvePath(options.sourcePath);\n\n if (!existsSync(fullSourcePath)) {\n return err(this.fail(`Source file not found: ${options.sourcePath}`));\n }\n\n let content: string;\n try {\n content = readFileSync(fullSourcePath, \"utf8\");\n } catch (e) {\n return err(this.fail(`Failed to read source file: ${String(e)}`));\n }\n\n const lines = content.split(\"\\n\");\n const now = new Date().toISOString();\n const validProjectIds = new Set(config.projects.map((p) => p.projectId));\n\n const allTasks: NoteTask[] = [];\n const warnings: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line) continue;\n const match = line.match(TASK_LINE_RE);\n if (!match) continue;\n\n const checked = match[1]!.toLowerCase() === \"x\";\n const rawLine = match[2]!.trim();\n if (!rawLine) continue;\n\n const projectIds = this.classifyProject(rawLine, validProjectIds);\n const proposedOwner = this.classifyOwner(rawLine);\n const proposedType = this.classifyTaskType(rawLine);\n const proposedPriority = this.classifyPriority(rawLine);\n const proposedSprintPrefix = this.resolveSprintPrefix(projectIds);\n const evidence = this.classifyEvidence(rawLine);\n\n const task: NoteTask = {\n rawLine,\n lineNumber: i + 1,\n checked,\n projectIds,\n proposedType,\n proposedOwner,\n proposedPriority,\n proposedSprintPrefix,\n evidenceType: evidence.type,\n evidenceExpectation: evidence.expectation,\n };\n\n allTasks.push(task);\n\n if (projectIds.length === 0) {\n warnings.push(`Line ${i + 1}: could not classify project for task, moved to unclassified`);\n }\n }\n\n const tasksByProject: Record<string, NoteTask[]> = {};\n for (const pid of validProjectIds) {\n tasksByProject[pid] = [];\n }\n\n const unclassifiedTasks: NoteTask[] = [];\n\n for (const task of allTasks) {\n if (task.projectIds.length === 0) {\n unclassifiedTasks.push(task);\n continue;\n }\n for (const pid of task.projectIds) {\n if (validProjectIds.has(pid) && tasksByProject[pid]) {\n tasksByProject[pid].push(task);\n }\n }\n }\n\n const pendingTasks = allTasks.filter((t) => !t.checked);\n const doneTasks = allTasks.filter((t) => t.checked);\n\n const result: NotesIngestionResult = {\n sourcePath: options.sourcePath,\n portfolioId: config.portfolio.id,\n parsedAt: now,\n dryRun: options.dryRun !== false,\n totalLines: lines.length,\n taskLines: allTasks.length,\n pendingCount: pendingTasks.length,\n doneCount: doneTasks.length,\n tasksByProject,\n unclassifiedTasks,\n warnings,\n };\n\n const parsed = NotesIngestionResultSchema.safeParse(result);\n if (!parsed.success) {\n return err(this.fail(`Invalid ingestion result: ${parsed.error.message}`));\n }\n\n return ok(result);\n }\n\n private loadPortfolio(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private classifyProject(text: string, validIds: Set<string>): string[] {\n const lower = text.toLowerCase();\n const candidates: Array<{ id: string; pos: number }> = [];\n for (const [pid, keywords] of Object.entries(PROJECT_KEYWORDS)) {\n if (!validIds.has(pid)) continue;\n for (const kw of keywords) {\n const pos = lower.indexOf(kw);\n if (pos >= 0) {\n candidates.push({ id: pid, pos });\n break;\n }\n }\n }\n if (candidates.length === 0) return [];\n if (candidates.length === 1) return [candidates[0]!.id];\n\n candidates.sort((a, b) => a.pos - b.pos);\n const first = candidates[0]!;\n // If multiple projects are named close together (coordinated with \"y\"/\"and\"), include all\n const nearby = candidates.filter((c) => c.pos - first.pos <= 40);\n if (nearby.length > 1) {\n const span = lower.slice(first.pos, first.pos + 40);\n if (span.includes(\" y \") || span.includes(\" and \")) return nearby.map((c) => c.id);\n }\n // Otherwise return the first project mentioned\n return [first.id];\n }\n\n private classifyOwner(text: string): string {\n const lower = text.toLowerCase();\n for (const [keyword, owner] of Object.entries(OPERATOR_KEYWORDS)) {\n if (lower.includes(keyword)) return owner;\n }\n return \"architect\";\n }\n\n private classifyTaskType(text: string): NoteTask[\"proposedType\"] {\n const lower = text.toLowerCase();\n if (/\\bbug\\b|error|falla|roto|corregir|arreglar|fix\\b/.test(lower)) return \"bug\";\n if (/revisar\\b|qa\\b|test\\b|validar\\b|verificar\\b/.test(lower)) return \"qa\";\n if (/documentar\\b|doc\\b|gu[ií]a\\b|readme|notas\\b/.test(lower)) return \"docs\";\n if (/arquitectura|dise[ñn]o\\b|estructura|decisi[óo]n/.test(lower)) return \"architecture\";\n if (/separar\\b|mover\\b|migrar\\b|aislar\\b|extraer|split/.test(lower)) return \"migration\";\n if (/publicar\\b|deploy\\b|producci[óo]n|server|entorno/.test(lower)) return \"ops\";\n return \"feature\";\n }\n\n private classifyPriority(text: string): NoteTask[\"proposedPriority\"] {\n const lower = text.toLowerCase();\n if (/cr[ií]tico|urgente|bloquea|crash\\b|roto\\b|prioridad alta/.test(lower)) return \"critical\";\n if (/importante|alto impacto|prioridad/.test(lower)) return \"high\";\n if (/bajo|menor|opcional|low priority/.test(lower)) return \"low\";\n return \"medium\";\n }\n\n private resolveSprintPrefix(projectIds: string[]): string {\n const prefixes: Record<string, string> = {\n heptacore: \"S-HC\",\n oreshnik: \"S-ORESHNIK\",\n turpialsound: \"S-TS\",\n turpialmarket: \"S-TM\",\n dropsocial: \"S-DS\",\n smsmantis: \"S-SM\",\n };\n for (const pid of projectIds) {\n if (prefixes[pid]) return prefixes[pid];\n }\n return \"S-GEN\";\n }\n\n private classifyEvidence(text: string): { type: NoteTask[\"evidenceType\"]; expectation: string } {\n const lower = text.toLowerCase();\n if (/implementar|crear\\b|construir|c[óo]digo|funcionalidad|backend|api\\b|endpoint/.test(lower)) {\n return { type: \"code\", expectation: \"diff verificable, tests\" };\n }\n if (/click|bot[óo]n|tarjeta|card\\b|ui\\b|dashboard|modal|interfaz|visual|landing|p[áa]gina/.test(lower)) {\n return { type: \"ui\", expectation: \"QA manual o test automatizado de UI\" };\n }\n if (/documentar|doc\\b|leer\\b|documentaci[óo]n|gu[ií]a|readme/.test(lower)) {\n return { type: \"docs\", expectation: \"documentos actualizados en vault\" };\n }\n if (/integrar|conectar|webhook|deploy\\b|publicar|producci[óo]n/.test(lower)) {\n return { type: \"integration\", expectation: \"dry-run verificable o test e2e\" };\n }\n if (/producci[óo]n\\b|release\\b|publish\\b|lanzar/.test(lower)) {\n return { type: \"prod\", expectation: \"checklist manual, rollback plan y confirmaci[óo]n humana\" };\n }\n return { type: \"code\", expectation: \"diff verificable\" };\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createNotesIngestionService(root: string): NotesIngestionService {\n return new NotesIngestionService(root);\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type {\n InjectionResult,\n NoteTask,\n NotesIngestionResult,\n PortfolioConfig,\n PortfolioProject,\n ProjectInjectionResult,\n Result,\n StateError,\n Task,\n TaskBoard,\n} from \"../types/index.js\";\nimport { InjectionResultSchema, PortfolioConfigSchema } from \"../types/schemas.js\";\nimport { sanitize } from \"../utils/helpers.js\";\nimport { GitService } from \"./git.service.js\";\nimport { StateManager } from \"./state-manager.js\";\n\nexport class InjectionService {\n constructor(private readonly root: string) {}\n\n inject(options: {\n ingestion: NotesIngestionResult;\n configPath?: string;\n dryRun?: boolean;\n confirm?: boolean;\n projectFilter?: string[];\n }): Result<InjectionResult, StateError> {\n const configResult = this.loadPortfolio(options.configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const projectResults: ProjectInjectionResult[] = [];\n const errors: string[] = [];\n\n const projectsToProcess = options.projectFilter\n ? config.projects.filter((p) => options.projectFilter!.includes(p.projectId))\n : config.projects;\n\n for (const project of projectsToProcess) {\n const tasks = options.ingestion.tasksByProject[project.projectId];\n if (!tasks || tasks.length === 0) continue;\n\n const pendingTasks = tasks.filter((t) => !t.checked);\n if (pendingTasks.length === 0) continue;\n\n const result = this.injectIntoProject(project, pendingTasks, options);\n projectResults.push(result);\n\n if (result.blocked && result.blockReason) {\n errors.push(`${project.projectId}: ${result.blockReason}`);\n }\n }\n\n const blocked = projectResults.filter((r) => r.blocked);\n const injected = projectResults.filter((r) => !r.blocked && r.injectionPolicy === \"direct_with_approval\");\n const proposals = projectResults.filter((r) => !r.blocked && r.injectionPolicy === \"proposal_only\");\n\n const summary = {\n totalProjects: projectResults.length,\n projectsBlocked: blocked.length,\n projectsInjected: injected.length,\n proposalsGenerated: proposals.length,\n totalTasksInjected: injected.reduce((sum, r) => sum + r.tasksInjected, 0),\n totalTasksSkipped: projectResults.reduce((sum, r) => sum + r.tasksSkipped, 0),\n };\n\n const result: InjectionResult = {\n portfolioId: config.portfolio.id,\n injectedAt: now,\n dryRun: options.dryRun !== false,\n confirmed: options.confirm === true,\n projects: projectResults,\n summary,\n errors,\n };\n\n const parsed = InjectionResultSchema.safeParse(result);\n if (!parsed.success) {\n return err(this.fail(`Invalid injection result: ${parsed.error.message}`));\n }\n\n return ok(result);\n }\n\n private injectIntoProject(\n project: PortfolioProject,\n tasks: NoteTask[],\n options: { dryRun?: boolean; confirm?: boolean },\n ): ProjectInjectionResult {\n const repoPath = this.resolveProjectPath(project.repoPath);\n const warnings: string[] = [];\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: project.injectionPolicy,\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: \"repo path not found\",\n warnings,\n };\n }\n\n if (project.injectionPolicy === \"proposal_only\") {\n const proposal = this.generateProposal(project, tasks, options.dryRun !== false);\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"proposal_only\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n proposalPath: proposal,\n blocked: false,\n warnings,\n };\n }\n\n if (project.injectionPolicy === \"direct_with_approval\") {\n if (!options.confirm) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: \"confirmation required (use --confirm)\",\n warnings,\n };\n }\n\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n if (!existsSync(zoneMapPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: \"zone-map missing\",\n warnings,\n };\n }\n\n // Read zone-map to distribute tasks among operators\n let zoneOperators: string[] = [];\n try {\n const zoneRaw = JSON.parse(readFileSync(zoneMapPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const owners = new Set<string>();\n for (const [, zone] of Object.entries(zoneRaw.zones || {})) {\n const lock = (zone as { lock?: string; owner?: string }).lock || \"\";\n const owner = (zone as { owner?: string }).owner || \"\";\n if (lock.includes(\"exclusive\") || lock === \"operator_double\") {\n if (owner) owners.add(owner);\n }\n }\n // If no exclusive zones found, use shared operators from project config\n if (owners.size === 0) {\n for (const op of (project as any).operators || []) {\n owners.add(op);\n }\n }\n zoneOperators = [...owners].filter(o => o && o !== \"none\");\n } catch {\n zoneOperators = [];\n }\n\n // Fallback: use project operators or default to architect\n if (zoneOperators.length === 0) {\n zoneOperators = (project as any).operators?.length ? (project as any).operators : [\"architect\"];\n }\n\n // Determine owner distribution: round-robin across zone operators\n const getOwner = (taskIndex: number): string => {\n return zoneOperators[taskIndex % zoneOperators.length] || \"architect\";\n };\n\n const git = new GitService(repoPath);\n const statusResult = git.statusPorcelain();\n if (statusResult.ok && statusResult.value.length > 0) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: `working tree dirty (${statusResult.value.length} files)`,\n warnings,\n };\n }\n\n if (options.dryRun !== false) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: tasks.length,\n tasksSkipped: 0,\n blocked: false,\n warnings: [\"dry-run: no task-board was modified\"],\n };\n }\n\n const checkpointTag = this.createPreInjectionCheckpoint(git, project);\n const checkpointResult = git.createTag(checkpointTag, `pre-injection checkpoint for ${project.projectId}`);\n if (!checkpointResult.ok) {\n warnings.push(`checkpoint creation failed: ${checkpointResult.error.message}`);\n }\n\n const state = new StateManager(repoPath);\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const existingBoard = state.readJson<TaskBoard>(taskBoardPath);\n\n const board: TaskBoard = existingBoard.ok\n ? existingBoard.value\n : {\n project: project.projectId,\n updatedAt: new Date().toISOString(),\n currentExecutionOrder: [],\n tasks: [],\n };\n\n let injected = 0;\n let skipped = 0;\n\n let taskIndex = 0;\n for (const noteTask of tasks) {\n const taskId = this.generateTaskId(noteTask);\n const existingTask = board.tasks.find((t) => t.id === taskId);\n if (existingTask) {\n skipped++;\n continue;\n }\n\n const owner = getOwner(taskIndex);\n taskIndex++;\n\n const task: Task = {\n id: taskId,\n title: noteTask.rawLine.slice(0, 200),\n owner,\n status: \"ready\",\n track: noteTask.proposedSprintPrefix,\n zone: [],\n acceptance: [noteTask.evidenceExpectation],\n handoff: `docs/07_handoffs/handoff-${owner}-${new Date().toISOString().slice(0, 10)}.md`,\n history: [\n {\n at: new Date().toISOString(),\n action: \"injected\",\n operator: owner,\n description: `Injected from notes ingestion. Evidence: ${noteTask.evidenceType}`,\n },\n ],\n };\n\n board.tasks.push(task);\n injected++;\n }\n\n board.updatedAt = new Date().toISOString();\n board.currentExecutionOrder = [...board.currentExecutionOrder, ...tasks.map((t) => this.generateTaskId(t))];\n\n const writeResult = state.writeJson(taskBoardPath, board);\n if (!writeResult.ok) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: `failed to write task-board: ${writeResult.error.message}`,\n warnings,\n };\n }\n\n const handoffPath = this.generateHandoff(project, tasks, repoPath);\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: \"direct_with_approval\",\n repoPath: project.repoPath,\n tasksInjected: injected,\n tasksSkipped: skipped,\n checkpointTag: checkpointResult.ok ? checkpointTag : undefined,\n handoffPath,\n blocked: false,\n warnings,\n };\n }\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n injectionPolicy: project.injectionPolicy,\n repoPath: project.repoPath,\n tasksInjected: 0,\n tasksSkipped: 0,\n blocked: true,\n blockReason: `unknown injection policy: ${project.injectionPolicy}`,\n warnings,\n };\n }\n\n private generateProposal(project: PortfolioProject, tasks: NoteTask[], dryRun: boolean): string {\n const repoPath = this.resolveProjectPath(project.repoPath);\n const proposalDir = join(repoPath, \"var\", \"oreshnik\");\n mkdirSync(proposalDir, { recursive: true });\n const proposalPath = join(proposalDir, \"injection-proposal.json\");\n\n const proposal = {\n projectId: project.projectId,\n generatedAt: new Date().toISOString(),\n dryRun,\n injectionPolicy: \"proposal_only\",\n proposedTasks: tasks.map((t) => ({\n taskId: this.generateTaskId(t),\n title: t.rawLine.slice(0, 200),\n owner: t.proposedOwner,\n priority: t.proposedPriority,\n evidenceType: t.evidenceType,\n evidenceExpectation: t.evidenceExpectation,\n })),\n };\n\n if (!dryRun) {\n writeFileSync(proposalPath, JSON.stringify(proposal, null, 2), \"utf8\");\n }\n\n return `var/oreshnik/injection-proposal.json`;\n }\n\n private generateHandoff(project: PortfolioProject, tasks: NoteTask[], repoPath: string): string {\n const handoffDir = join(repoPath, \"docs\", \"07_handoffs\");\n mkdirSync(handoffDir, { recursive: true });\n\n const owners = new Set(tasks.map((t) => t.proposedOwner));\n\n for (const owner of owners) {\n const ownerTasks = tasks.filter((t) => t.proposedOwner === owner);\n const date = new Date().toISOString().slice(0, 10);\n const handoffPath = join(handoffDir, `handoff-${owner}-${date}.md`);\n\n const lines = [\n `# Handoff — ${owner}`,\n `Date: ${date}`,\n `Project: ${project.displayName} (${project.projectId})`,\n ``,\n `## Tasks Injected`,\n ``,\n ];\n\n for (const task of ownerTasks) {\n lines.push(`- [ ] **${task.proposedSprintPrefix}** ${task.rawLine.slice(0, 150)}`);\n lines.push(` - Type: ${task.proposedType}`);\n lines.push(` - Priority: ${task.proposedPriority}`);\n lines.push(` - Evidence: ${task.evidenceType} — ${task.evidenceExpectation}`);\n lines.push(``);\n }\n\n writeFileSync(handoffPath, lines.join(\"\\n\"), \"utf8\");\n }\n\n return `docs/07_handoffs/`;\n }\n\n private createPreInjectionCheckpoint(git: GitService, project: PortfolioProject): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n return `oreshnik/pre-inject-${project.projectId}-${timestamp}`;\n }\n\n private generateTaskId(noteTask: NoteTask): string {\n const base = sanitize(noteTask.rawLine.slice(0, 48));\n return base || `task-${Date.now()}`;\n }\n\n private loadPortfolio(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolveLocalPath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolveProjectPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private resolveLocalPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createInjectionService(root: string): InjectionService {\n return new InjectionService(root);\n}\n","export function sanitize(value: string, maxLength = 48): string {\n return String(value || \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, maxLength);\n}\n\nexport function today(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\nexport function nowDisplay(timeZone = \"America/Caracas\"): { display: string; iso: string; date: string } {\n const now = new Date();\n const formatter = new Intl.DateTimeFormat(\"es-VE\", {\n timeZone,\n year: \"2-digit\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n return {\n display: formatter.format(now).replace(\",\", \"\"),\n iso: now.toISOString(),\n date: now.toISOString().slice(0, 10),\n };\n}\n\nexport function formatBranchName(\n template: string,\n vars: Record<string, string>\n): string {\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replace(`{${key}}`, sanitize(value));\n }\n return result;\n}\n\nexport function nonIgnoredDirtyFiles(porcelain: Array<{ status: string; path: string }>): string[] {\n return porcelain\n .filter((entry) => !entry.path.startsWith(\"var/oreshnik/\") && !entry.path.startsWith(\"output/\"))\n .map((entry) => entry.path);\n}\n\nexport function isMotherBranch(branch: string): boolean {\n return /^(main|master|MADRE\\/|integration\\/|prod\\/)/i.test(branch);\n}\n\nexport function isChildBranch(branch: string, operator: string): boolean {\n return new RegExp(`^${operator}/`, \"i\").test(branch);\n}\n","import { err, ok } from \"../types/index.js\";\nimport type { EvidenceGateResult, Result, StateError, Task, TaskBoard, TaskEvidenceCheck, EvidenceType, TaskStatus } from \"../types/index.js\";\nimport { EvidenceGateResultSchema } from \"../types/schemas.js\";\n\nconst EVIDENCE_REQUIREMENTS: Record<EvidenceType, { minimum: string; items: string[] }> = {\n code: {\n minimum: \"diff verificable, tests o build\",\n items: [\"changed files diff\", \"typecheck passed\", \"tests passed\"],\n },\n ui: {\n minimum: \"QA manual o test automatizado de UI\",\n items: [\"UI change description\", \"screenshot or test result\", \"operator confirmation\"],\n },\n docs: {\n minimum: \"documentos actualizados en vault\",\n items: [\"updated doc paths\", \"references in vault\", \"canonical alignment check\"],\n },\n integration: {\n minimum: \"dry-run verificable o test e2e\",\n items: [\"integration test output\", \"dry-run summary\", \"endpoint verification\"],\n },\n prod: {\n minimum: \"checklist manual, rollback plan y confirmacion humana\",\n items: [\"deployment checklist\", \"rollback plan\", \"human approval signature\"],\n },\n};\n\nexport class EvidenceGateService {\n check(taskBoard: TaskBoard, operator: string, sprint?: string): Result<EvidenceGateResult, StateError> {\n const now = new Date().toISOString();\n const tasks: TaskEvidenceCheck[] = [];\n const blockers: string[] = [];\n\n let doneTasks = 0;\n let tasksWithEvidence = 0;\n let tasksWithoutEvidence = 0;\n\n for (const task of taskBoard.tasks) {\n if (task.status === \"done\") {\n doneTasks++;\n }\n\n const evidenceType = this.inferEvidenceType(task);\n const required = EVIDENCE_REQUIREMENTS[evidenceType];\n const check = this.evaluateTaskEvidence(task, evidenceType, required);\n\n tasks.push(check);\n\n if (task.status === \"done\" && !check.hasEvidence) {\n tasksWithoutEvidence++;\n blockers.push(`${task.id}: ${check.missing.join(\"; \")}`);\n } else if (task.status === \"done\" && check.hasEvidence) {\n tasksWithEvidence++;\n }\n }\n\n const result: EvidenceGateResult = {\n checkedAt: now,\n sprint,\n operator,\n totalTasks: taskBoard.tasks.length,\n doneTasks,\n tasksWithEvidence,\n tasksWithoutEvidence,\n tasks,\n passed: blockers.length === 0,\n blockers,\n };\n\n const parsed = EvidenceGateResultSchema.safeParse(result);\n if (!parsed.success) {\n return err(this.fail(`Invalid evidence gate result: ${parsed.error.message}`));\n }\n\n return ok(result);\n }\n\n generateChecklist(taskBoard: TaskBoard, operator: string): string {\n const lines: string[] = [\n `# QA Evidence Checklist`,\n `Operator: ${operator}`,\n `Project: ${taskBoard.project}`,\n `Generated: ${new Date().toISOString()}`,\n ``,\n `## Instructions`,\n `Verify each task below. Mark [x] when evidence is confirmed. If a task lacks evidence, it will block sprint closure.`,\n ``,\n ];\n\n for (const task of taskBoard.tasks) {\n if (task.status !== \"done\") continue;\n\n const evidenceType = this.inferEvidenceType(task);\n const required = EVIDENCE_REQUIREMENTS[evidenceType];\n\n lines.push(`### ${task.id}`);\n lines.push(`**Title:** ${task.title}`);\n lines.push(`**Evidence Type:** ${evidenceType}`);\n lines.push(`**Minimum Required:** ${required.minimum}`);\n lines.push(``);\n\n for (const item of required.items) {\n lines.push(`- [ ] ${item}`);\n }\n\n lines.push(`- [ ] Operator confirms task is complete`);\n lines.push(``);\n }\n\n return lines.join(\"\\n\");\n }\n\n private evaluateTaskEvidence(\n task: Task,\n evidenceType: EvidenceType,\n required: { minimum: string; items: string[] },\n ): TaskEvidenceCheck {\n const missing: string[] = [];\n const hardMissing: string[] = [];\n const history = task.history || [];\n const acceptance = task.acceptance || [];\n\n const hasValidation = history.some(\n (h) => h.action === \"validated\" || h.action === \"done\" || h.action === \"qa_passed\",\n );\n if (!hasValidation) {\n hardMissing.push(\"no validation history entry found\");\n }\n\n if (acceptance.length === 0) {\n hardMissing.push(\"no acceptance criteria defined\");\n }\n\n if (task.status === \"done\" && !task.handoff) {\n hardMissing.push(\"no handoff path defined\");\n }\n\n if (task.status === \"done\") {\n const combinedText = [...history.map((h) => h.description || \"\"), ...acceptance].join(\" \").toLowerCase();\n let matchedItems = 0;\n for (const item of required.items) {\n if (combinedText.includes(item.toLowerCase())) {\n matchedItems++;\n }\n }\n\n for (const item of required.items) {\n if (!combinedText.includes(item.toLowerCase())) {\n missing.push(`evidence item not verified: ${item}`);\n }\n }\n\n if (matchedItems === 0) {\n hardMissing.push(\"no evidence items matched the task\");\n }\n }\n\n const allMissing = [...hardMissing, ...missing];\n\n return {\n taskId: task.id,\n taskTitle: task.title,\n evidenceType,\n hasEvidence: task.status !== \"done\" || hardMissing.length === 0,\n requiredEvidence: required.minimum,\n currentStatus: task.status,\n missing: allMissing,\n };\n }\n\n private inferEvidenceType(task: Task): EvidenceType {\n const text = `${task.title} ${task.track || \"\"} ${(task.acceptance || []).join(\" \")}`.toLowerCase();\n\n if (/ui\\b|dashboard|modal|interfaz|visual|landing|p[áa]gina|card|bot[óo]n|click|css|style/.test(text)) return \"ui\";\n if (/documentar|doc\\b|gu[ií]a|readme|vault|notas/.test(text)) return \"docs\";\n if (/integrar|conectar|webhook|deploy\\b|publicar|api\\b|endpoint/.test(text)) return \"integration\";\n if (/producci[óo]n\\b|release\\b|publish\\b|lanzar|prod\\b/.test(text)) return \"prod\";\n\n return \"code\";\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createEvidenceGateService(): EvidenceGateService {\n return new EvidenceGateService();\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, PortfolioProject, Result, StateError } from \"../types/index.js\";\nimport { PortfolioConfigSchema } from \"../types/schemas.js\";\n\nexport interface BootstrapProjectResult {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n taskBoardCreated: boolean;\n zoneMapCreated: boolean;\n gatesDocCreated: boolean;\n errors: string[];\n}\n\nexport interface BootstrapResult {\n portfolioId: string;\n bootstrappedAt: string;\n projects: BootstrapProjectResult[];\n}\n\nexport class BootstrapService {\n constructor(private readonly root: string) {}\n\n bootstrap(configPath = \".oreshnik.portfolio.json\", projectFilter?: string[]): Result<BootstrapResult, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const projects: BootstrapProjectResult[] = [];\n\n const targets = projectFilter\n ? config.projects.filter((p) => projectFilter.includes(p.projectId))\n : config.projects;\n\n for (const project of targets) {\n projects.push(this.bootstrapProject(project));\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n bootstrappedAt: now,\n projects,\n });\n }\n\n private bootstrapProject(project: PortfolioProject): BootstrapProjectResult {\n const repoPath = this.resolveProjectPath(project.repoPath);\n const errors: string[] = [];\n let taskBoardCreated = false;\n let zoneMapCreated = false;\n let gatesDocCreated = false;\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: false,\n taskBoardCreated: false,\n zoneMapCreated: false,\n gatesDocCreated: false,\n errors: [\"repo path not found\"],\n };\n }\n\n const varDir = join(repoPath, \"var\", \"oreshnik\");\n const handoffsDir = join(repoPath, \"docs\", \"07_handoffs\");\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n\n try {\n mkdirSync(varDir, { recursive: true });\n mkdirSync(handoffsDir, { recursive: true });\n } catch (e) {\n errors.push(`failed to create directories: ${String(e)}`);\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: true,\n taskBoardCreated: false,\n zoneMapCreated: false,\n gatesDocCreated: false,\n errors,\n };\n }\n\n if (!existsSync(taskBoardPath)) {\n try {\n const taskBoard = {\n project: project.projectId,\n updatedAt: new Date().toISOString(),\n currentExecutionOrder: [],\n tasks: [],\n };\n writeFileSync(taskBoardPath, JSON.stringify(taskBoard, null, 2) + \"\\n\", \"utf8\");\n taskBoardCreated = true;\n } catch (e) {\n errors.push(`failed to create task-board: ${String(e)}`);\n }\n }\n\n if (!existsSync(zoneMapPath)) {\n try {\n const zoneMap = {\n zones: {\n \"docs/**\": { owner: \"shared\", lock: \"shared\", sprints: [\"*\"] },\n \"var/oreshnik/**\": { owner: \"shared\", lock: \"shared\", sprints: [\"*\"] },\n \"src/**\": { owner: \"architect\", lock: \"operator_exclusive\", sprints: [\"*\"] },\n \".env\": { owner: \"none\", lock: \"forbidden\", sprints: [\"*\"], criticality: \"critical\" },\n \".env.*\": { owner: \"none\", lock: \"forbidden\", sprints: [\"*\"], criticality: \"critical\" },\n },\n };\n writeFileSync(zoneMapPath, JSON.stringify(zoneMap, null, 2) + \"\\n\", \"utf8\");\n zoneMapCreated = true;\n } catch (e) {\n errors.push(`failed to create zone-map: ${String(e)}`);\n }\n }\n\n if (project.validationGates.length === 0) {\n try {\n const gatesDocPath = join(repoPath, \"var\", \"oreshnik\", \"gates.json\");\n const defaultGates = {\n project: project.projectId,\n gates: [\n { name: \"typecheck\", command: \"npm\", args: [\"run\", \"typecheck\"], timeoutSeconds: 120 },\n { name: \"build\", command: \"npm\", args: [\"run\", \"build\"], timeoutSeconds: 300 },\n { name: \"test\", command: \"npm\", args: [\"run\", \"test\"], timeoutSeconds: 300 },\n ],\n };\n writeFileSync(gatesDocPath, JSON.stringify(defaultGates, null, 2) + \"\\n\", \"utf8\");\n gatesDocCreated = true;\n } catch (e) {\n errors.push(`failed to create gates doc: ${String(e)}`);\n }\n }\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: true,\n taskBoardCreated,\n zoneMapCreated,\n gatesDocCreated,\n errors,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolveLocalPath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolveProjectPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private resolveLocalPath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createBootstrapService(root: string): BootstrapService {\n return new BootstrapService(root);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, PortfolioProject, Result, StateError, TaskBoard, ZoneLock } from \"../types/index.js\";\nimport { PortfolioConfigSchema, TaskBoardSchema, ZoneLockSchema } from \"../types/schemas.js\";\nimport { LockService } from \"./lock.service.js\";\n\nexport interface OperatorBreakdown {\n operator: string;\n ready: number;\n active: number;\n done: number;\n blocked: number;\n pending: number;\n total: number;\n}\n\nexport interface TaskEntry {\n id: string;\n title: string;\n owner: string;\n status: string;\n dependsOn: string[];\n}\n\nexport interface LockSummary {\n zone: string;\n operator: string;\n sprint: string;\n expiresAt: string;\n remainingMinutes: number;\n}\n\nexport interface ProjectDashboard {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n taskBoardExists: boolean;\n zoneMapExists: boolean;\n injectionPolicy: string;\n priority: string;\n taskCounts: {\n total: number;\n ready: number;\n active: number;\n done: number;\n blocked: number;\n pending: number;\n };\n operatorBreakdown: OperatorBreakdown[];\n tasks: TaskEntry[];\n locks: LockSummary[];\n lastUpdated?: string;\n warnings: string[];\n}\n\nexport interface PortfolioDashboard {\n portfolioId: string;\n portfolioName: string;\n generatedAt: string;\n projectCount: number;\n projectsWithRepo: number;\n projectsReady: number;\n projectsBlocked: number;\n totalTasks: number;\n totalDone: number;\n totalPending: number;\n projects: ProjectDashboard[];\n}\n\nexport class DashboardService {\n private lockService: LockService;\n\n constructor(private readonly root: string) {\n this.lockService = new LockService(root);\n }\n\n generate(configPath = \".oreshnik.portfolio.json\"): Result<PortfolioDashboard, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const projects: ProjectDashboard[] = [];\n let totalTasks = 0;\n let totalDone = 0;\n let totalPending = 0;\n let projectsWithRepo = 0;\n let projectsReady = 0;\n let projectsBlocked = 0;\n\n for (const project of config.projects) {\n const dash = this.inspectProject(project);\n projects.push(dash);\n\n if (dash.repoExists) {\n projectsWithRepo++;\n if (dash.warnings.length === 0) projectsReady++;\n else projectsBlocked++;\n } else {\n projectsBlocked++;\n }\n\n totalTasks += dash.taskCounts.total;\n totalDone += dash.taskCounts.done;\n totalPending += dash.taskCounts.total - dash.taskCounts.done;\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n portfolioName: config.portfolio.name,\n generatedAt: now,\n projectCount: config.projects.length,\n projectsWithRepo,\n projectsReady,\n projectsBlocked,\n totalTasks,\n totalDone,\n totalPending,\n projects,\n });\n }\n\n toMarkdown(dashboard: PortfolioDashboard): string {\n const lines: string[] = [\n `# ${dashboard.portfolioName}`,\n `Generated: ${dashboard.generatedAt}`,\n ``,\n `## Summary`,\n ``,\n `| Metric | Value |`,\n `|---|---|`,\n `| Projects | ${dashboard.projectCount} |`,\n `| With repo | ${dashboard.projectsWithRepo} |`,\n `| Ready | ${dashboard.projectsReady} |`,\n `| Blocked | ${dashboard.projectsBlocked} |`,\n `| Total tasks | ${dashboard.totalTasks} |`,\n `| Done | ${dashboard.totalDone} |`,\n `| Pending | ${dashboard.totalPending} |`,\n ``,\n `## Projects`,\n ``,\n ];\n\n for (const project of dashboard.projects) {\n const status = project.repoExists\n ? (project.warnings.length === 0 ? \"ready\" : \"needs-attention\")\n : \"missing\";\n const icon = project.repoExists ? (project.warnings.length === 0 ? \"v\" : \"~\") : \"x\";\n\n lines.push(`### ${icon} ${project.displayName} (\\`${project.projectId}\\`) — ${status}`);\n lines.push(``);\n lines.push(`| Field | Value |`);\n lines.push(`|---|---|`);\n lines.push(`| Repo | ${project.repoExists ? project.repoPath : \"not found\"} |`);\n lines.push(`| Task-board | ${project.taskBoardExists ? \"found\" : \"missing\"} |`);\n lines.push(`| Zone-map | ${project.zoneMapExists ? \"found\" : \"missing\"} |`);\n lines.push(`| Injection | ${project.injectionPolicy} |`);\n lines.push(`| Priority | ${project.priority} |`);\n lines.push(``);\n\n if (project.repoExists) {\n lines.push(`### Task Status`);\n lines.push(``);\n lines.push(`| Status | Count |`);\n lines.push(`|---|---|`);\n lines.push(`| Total | ${project.taskCounts.total} |`);\n lines.push(`| Ready | ${project.taskCounts.ready} |`);\n lines.push(`| Active | ${project.taskCounts.active} |`);\n lines.push(`| Done | ${project.taskCounts.done} |`);\n lines.push(`| Blocked | ${project.taskCounts.blocked} |`);\n lines.push(`| Pending | ${project.taskCounts.pending} |`);\n lines.push(``);\n\n if (project.operatorBreakdown.length > 0) {\n lines.push(`### Operator Breakdown`);\n lines.push(``);\n lines.push(`| Operator | Total | Ready | Active | Done | Blocked | Pending |`);\n lines.push(`|---|---|---|---|---|---|---|`);\n for (const ob of project.operatorBreakdown) {\n lines.push(`| ${ob.operator} | ${ob.total} | ${ob.ready} | ${ob.active} | ${ob.done} | ${ob.blocked} | ${ob.pending} |`);\n }\n lines.push(``);\n }\n\n if (project.locks.length > 0) {\n lines.push(`### Active Locks`);\n lines.push(``);\n lines.push(`| Zone | Operator | Sprint | Expires | Remaining |`);\n lines.push(`|---|---|---|---|---|`);\n for (const l of project.locks) {\n lines.push(`| ${l.zone} | ${l.operator} | ${l.sprint} | ${l.expiresAt} | ${l.remainingMinutes}m |`);\n }\n lines.push(``);\n }\n\n if (project.lastUpdated) {\n lines.push(`Last updated: ${project.lastUpdated}`);\n lines.push(``);\n }\n }\n\n for (const warning of project.warnings) {\n lines.push(`- **Warning:** ${warning}`);\n }\n\n lines.push(``);\n }\n\n return lines.join(\"\\n\");\n }\n\n private inspectProject(project: PortfolioProject): ProjectDashboard {\n const repoPath = this.resolvePath(project.repoPath);\n const repoExists = existsSync(repoPath);\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n const taskBoardExists = repoExists && existsSync(taskBoardPath);\n const zoneMapExists = repoExists && existsSync(zoneMapPath);\n const warnings: string[] = [];\n\n const taskCounts = {\n total: 0,\n ready: 0,\n active: 0,\n done: 0,\n blocked: 0,\n pending: 0,\n };\n\n const operatorMap = new Map<string, OperatorBreakdown>();\n const tasks: TaskEntry[] = [];\n let lastUpdated: string | undefined;\n\n if (taskBoardExists) {\n try {\n const raw = JSON.parse(readFileSync(taskBoardPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = TaskBoardSchema.safeParse(raw);\n if (parsed.success) {\n const board: TaskBoard = parsed.data;\n taskCounts.total = board.tasks.length;\n lastUpdated = board.updatedAt;\n for (const task of board.tasks) {\n if (task.status === \"ready\") taskCounts.ready++;\n else if (task.status === \"active\") taskCounts.active++;\n else if (task.status === \"done\") taskCounts.done++;\n else if (task.status === \"blocked\") taskCounts.blocked++;\n else taskCounts.pending++;\n\n const owner = task.owner || \"unassigned\";\n let ob = operatorMap.get(owner);\n if (!ob) {\n ob = { operator: owner, ready: 0, active: 0, done: 0, blocked: 0, pending: 0, total: 0 };\n operatorMap.set(owner, ob);\n }\n ob.total++;\n if (task.status === \"ready\") ob.ready++;\n else if (task.status === \"active\") ob.active++;\n else if (task.status === \"done\") ob.done++;\n else if (task.status === \"blocked\") ob.blocked++;\n else ob.pending++;\n\n tasks.push({\n id: task.id,\n title: task.title.slice(0, 100),\n owner: task.owner || \"unassigned\",\n status: task.status,\n dependsOn: task.dependsOn || [],\n });\n }\n } else {\n warnings.push(\"task-board parse error\");\n }\n } catch {\n warnings.push(\"task-board read error\");\n }\n }\n\n const operatorBreakdown = Array.from(operatorMap.values())\n .sort((a, b) => b.total - a.total);\n\n const locks: LockSummary[] = [];\n try {\n const lockResult = this.lockService.check();\n if (lockResult.ok) {\n for (const l of lockResult.value.active) {\n const expiresAt = new Date(l.expiresAt);\n const remainingMinutes = Math.max(0, Math.ceil((expiresAt.getTime() - Date.now()) / 60000));\n if (l.zone.includes(project.projectId) || l.zone.startsWith(\"**\") || l.zone.startsWith(\"repo\")) {\n locks.push({\n zone: l.zone,\n operator: l.operator,\n sprint: l.sprint,\n expiresAt: l.expiresAt,\n remainingMinutes,\n });\n }\n }\n }\n } catch { /* lock check optional — skip if network unavailable */ }\n\n if (!repoExists) warnings.push(\"repo missing\");\n if (repoExists && !taskBoardExists) warnings.push(\"task-board missing\");\n if (repoExists && !zoneMapExists) warnings.push(\"zone-map missing\");\n if (project.validationGates.length === 0) warnings.push(\"validation gates missing\");\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists,\n taskBoardExists,\n zoneMapExists,\n injectionPolicy: project.injectionPolicy,\n priority: project.priority,\n taskCounts,\n operatorBreakdown,\n tasks,\n locks,\n lastUpdated,\n warnings,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createDashboardService(root: string): DashboardService {\n return new DashboardService(root);\n}\n","import { err, ok } from \"../types/index.js\";\nimport type { LockList, LockResult, Result, StateError, ZoneLock } from \"../types/index.js\";\nimport { LockListSchema, ZoneLockSchema } from \"../types/schemas.js\";\nimport { GitService } from \"./git.service.js\";\n\nconst LOCK_TAG_PREFIX = \"oreshnik-lock/\";\n\nexport class LockService {\n private git: GitService;\n\n constructor(repoPath: string) {\n this.git = new GitService(repoPath);\n }\n\n acquire(zone: string, operator: string, sprint: string, ttl = 3600): Result<LockResult, StateError> {\n const sanitized = this.sanitizeRef(zone);\n\n const existingResult = this.check(zone);\n if (existingResult.ok && existingResult.value.active.length > 0) {\n const existing = existingResult.value.active[0];\n if (!existing) {\n return err(this.fail(\"Unexpected: active lock array element is undefined\"));\n }\n return ok({\n zone,\n acquired: false,\n existingLock: existing,\n error: `Zone locked by ${existing.operator} until ${existing.expiresAt}`,\n });\n }\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttl * 1000);\n\n const lock: ZoneLock = {\n zone,\n operator,\n sprint,\n acquiredAt: now.toISOString(),\n ttl,\n expiresAt: expiresAt.toISOString(),\n };\n\n const parsed = ZoneLockSchema.safeParse(lock);\n if (!parsed.success) {\n return err(this.fail(`Invalid lock: ${parsed.error.message}`));\n }\n\n const tagName = `${LOCK_TAG_PREFIX}${sanitized}`;\n const annotation = JSON.stringify(parsed.data);\n\n // Create annotated tag locally with lock data as message\n const tagResult = this.git.createTag(tagName, annotation);\n if (!tagResult.ok) {\n return err(this.fail(`Failed to create lock tag: ${tagResult.error.message}`));\n }\n\n // Push tag to origin\n const pushResult = this.git.exec([\"push\", \"origin\", tagName]);\n if (!pushResult.ok) {\n const msg = pushResult.error || pushResult.output || \"unknown error\";\n if (typeof msg === \"string\" && (msg.includes(\"rejected\") || msg.includes(\"failed\"))) {\n this.git.deleteTag(tagName);\n return ok({\n zone,\n acquired: false,\n error: \"Failed to push lock: another operator may have acquired it\",\n });\n }\n this.git.deleteTag(tagName);\n return err(this.fail(`Failed to push lock: ${msg}`));\n }\n\n return ok({ zone, acquired: true });\n }\n\n release(zone: string): Result<LockResult, StateError> {\n const sanitized = this.sanitizeRef(zone);\n const tagName = `${LOCK_TAG_PREFIX}${sanitized}`;\n\n const deleteResult = this.git.exec([\"push\", \"origin\", `:refs/tags/${tagName}`]);\n if (!deleteResult.ok) {\n const msg = deleteResult.error || deleteResult.output || \"unknown error\";\n return err(this.fail(`Failed to release lock: ${msg}`));\n }\n\n this.git.deleteTag(tagName);\n return ok({ zone, acquired: false });\n }\n\n check(zone?: string): Result<LockList, StateError> {\n const now = new Date();\n const locks: ZoneLock[] = [];\n const active: ZoneLock[] = [];\n const expired: ZoneLock[] = [];\n\n // Fetch all lock tags from origin\n const fetchResult = this.git.exec([\"ls-remote\", \"origin\", `refs/tags/${LOCK_TAG_PREFIX}*`]);\n if (!fetchResult.ok) {\n return err(this.fail(`Failed to fetch locks: ${fetchResult.error || fetchResult.output}`));\n }\n\n const lines = (fetchResult.output || \"\").split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const parts = line.split(\"\\t\");\n if (parts.length < 2) continue;\n const refName = parts[1];\n if (!refName) continue;\n const tagName = refName.replace(\"refs/tags/\", \"\");\n\n // Try to read tag annotation (lock data)\n const contentResult = this.git.exec([\"tag\", \"-l\", \"--format=%(contents)\", tagName]);\n if (!contentResult.ok || !contentResult.output) continue;\n\n try {\n const raw = JSON.parse(contentResult.output.trim());\n const parsed = ZoneLockSchema.safeParse(raw);\n if (!parsed.success) continue;\n\n const lock = parsed.data;\n locks.push(lock);\n\n const expiresAt = new Date(lock.expiresAt);\n if (expiresAt > now) {\n active.push(lock);\n } else {\n expired.push(lock);\n }\n } catch {\n continue;\n }\n }\n\n if (zone) {\n const zoneActive = active.filter((l) => l.zone === zone);\n const zoneExpired = expired.filter((l) => l.zone === zone);\n\n return ok({\n fetchedAt: now.toISOString(),\n locks: [...zoneActive, ...zoneExpired],\n active: zoneActive,\n expired: zoneExpired,\n });\n }\n\n const result: LockList = {\n fetchedAt: now.toISOString(),\n locks,\n active,\n expired,\n };\n\n const parsedResult = LockListSchema.safeParse(result);\n if (!parsedResult.success) {\n return err(this.fail(`Invalid lock list: ${parsedResult.error.message}`));\n }\n\n return ok(result);\n }\n\n private sanitizeRef(path: string): string {\n return path\n .replace(/\\\\/g, \"/\")\n .replace(/\\/\\//g, \"/\")\n .replace(/^\\//, \"\")\n .replace(/\\/$/, \"\")\n .replace(/\\//g, \"_\")\n .replace(/\\*\\*/g, \"--\")\n .replace(/[^a-zA-Z0-9_.-]/g, \"_\");\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createLockService(repoPath: string): LockService {\n return new LockService(repoPath);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, Result, StateError, ZoneCheckResult, ZoneMap, ZoneViolation, ZoneWarning } from \"../types/index.js\";\nimport { PortfolioConfigSchema, ZoneMapSchema } from \"../types/schemas.js\";\nimport { createZoneEngine } from \"./zone-engine.js\";\nimport { GitService } from \"./git.service.js\";\n\nexport interface ProjectZoneCheck {\n projectId: string;\n displayName: string;\n repoPath: string;\n zoneMapExists: boolean;\n zoneMapValid: boolean;\n branch: string;\n filesChecked: number;\n violations: ZoneViolation[];\n warnings: ZoneWarning[];\n passed: boolean;\n errors: string[];\n}\n\nexport interface PortfolioZoneCheck {\n portfolioId: string;\n checkedAt: string;\n operator: string;\n sprint?: string;\n projects: ProjectZoneCheck[];\n summary: {\n totalProjects: number;\n projectsWithZoneMap: number;\n projectsWithViolations: number;\n projectsPassed: number;\n totalViolations: number;\n totalWarnings: number;\n };\n}\n\nexport class ZoneCheckService {\n constructor(private readonly root: string) {}\n\n checkAll(\n configPath: string,\n operator: string,\n sprint?: string,\n projectFilter?: string[],\n ): Result<PortfolioZoneCheck, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const targets = projectFilter\n ? config.projects.filter((p) => projectFilter.includes(p.projectId))\n : config.projects;\n\n const projects: ProjectZoneCheck[] = [];\n let projectsWithZoneMap = 0;\n let projectsWithViolations = 0;\n let projectsPassed = 0;\n let totalViolations = 0;\n let totalWarnings = 0;\n\n for (const project of targets) {\n const check = this.checkProject(project, operator, sprint);\n projects.push(check);\n\n if (check.zoneMapExists && check.zoneMapValid) {\n projectsWithZoneMap++;\n if (check.passed) projectsPassed++;\n if (check.violations.length > 0) projectsWithViolations++;\n totalViolations += check.violations.length;\n totalWarnings += check.warnings.length;\n }\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n checkedAt: now,\n operator,\n sprint,\n projects,\n summary: {\n totalProjects: projects.length,\n projectsWithZoneMap,\n projectsWithViolations,\n projectsPassed,\n totalViolations,\n totalWarnings,\n },\n });\n }\n\n private checkProject(\n project: PortfolioConfig[\"projects\"][number],\n operator: string,\n sprint?: string,\n ): ProjectZoneCheck {\n const repoPath = this.resolvePath(project.repoPath);\n const errors: string[] = [];\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: false,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [\"repo not found\"],\n };\n }\n\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n const zoneMapExists = existsSync(zoneMapPath);\n\n if (!zoneMapExists) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: false,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [\"zone-map not found\"],\n };\n }\n\n let zoneMap: ZoneMap;\n try {\n const raw = JSON.parse(readFileSync(zoneMapPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = ZoneMapSchema.safeParse(raw);\n if (!parsed.success) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: true,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [`invalid zone-map: ${parsed.error.message}`],\n };\n }\n zoneMap = parsed.data;\n } catch (e) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: true,\n zoneMapValid: false,\n branch: \"unknown\",\n filesChecked: 0,\n violations: [],\n warnings: [],\n passed: false,\n errors: [`failed to read zone-map: ${String(e)}`],\n };\n }\n\n const git = new GitService(repoPath);\n const branchResult = git.currentBranch();\n const branch = branchResult.ok ? branchResult.value : \"unknown\";\n\n const statusResult = git.statusPorcelain();\n if (!statusResult.ok) {\n errors.push(`git status failed: ${statusResult.error.message}`);\n }\n\n const modifiedFiles = statusResult.ok\n ? statusResult.value.map((e) => e.path)\n : [];\n\n const zoneEngine = createZoneEngine();\n const checkResult = zoneEngine.check(\n modifiedFiles,\n operator,\n sprint || \"*\",\n zoneMap,\n );\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n zoneMapExists: true,\n zoneMapValid: true,\n branch,\n filesChecked: checkResult.filesChecked,\n violations: checkResult.violations,\n warnings: checkResult.warnings,\n passed: checkResult.violations.length === 0,\n errors,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createZoneCheckService(root: string): ZoneCheckService {\n return new ZoneCheckService(root);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { err, ok } from \"../types/index.js\";\nimport type { PortfolioConfig, Result, StateError } from \"../types/index.js\";\nimport { PortfolioConfigSchema } from \"../types/schemas.js\";\nimport { GitService } from \"./git.service.js\";\nimport { createZoneEngine } from \"./zone-engine.js\";\n\nexport interface ProjectAudit {\n projectId: string;\n displayName: string;\n repoPath: string;\n repoExists: boolean;\n branch: string;\n lastCommit?: { hash: string; message: string; date: string; author: string };\n checkpointTags: string[];\n taskBoardExists: boolean;\n taskCount: number;\n zoneMapExists: boolean;\n zoneMapValid: boolean;\n modifiedFiles: number;\n errors: string[];\n}\n\nexport interface PortfolioAudit {\n portfolioId: string;\n auditedAt: string;\n projects: ProjectAudit[];\n summary: {\n totalProjects: number;\n projectsWithRepo: number;\n projectsDirty: number;\n projectsClean: number;\n totalTasks: number;\n totalCheckpoints: number;\n };\n}\n\nexport class AuditService {\n constructor(private readonly root: string) {}\n\n audit(configPath = \".oreshnik.portfolio.json\", projectFilter?: string[]): Result<PortfolioAudit, StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const now = new Date().toISOString();\n const targets = projectFilter\n ? config.projects.filter((p) => projectFilter.includes(p.projectId))\n : config.projects;\n\n const projects: ProjectAudit[] = [];\n let projectsWithRepo = 0;\n let projectsDirty = 0;\n let projectsClean = 0;\n let totalTasks = 0;\n let totalCheckpoints = 0;\n\n for (const project of targets) {\n const audit = this.auditProject(project);\n projects.push(audit);\n\n if (audit.repoExists) {\n projectsWithRepo++;\n if (audit.modifiedFiles > 0) projectsDirty++;\n else projectsClean++;\n totalTasks += audit.taskCount;\n totalCheckpoints += audit.checkpointTags.length;\n }\n }\n\n return ok({\n portfolioId: config.portfolio.id,\n auditedAt: now,\n projects,\n summary: {\n totalProjects: projects.length,\n projectsWithRepo,\n projectsDirty,\n projectsClean,\n totalTasks,\n totalCheckpoints,\n },\n });\n }\n\n secretScan(configPath = \".oreshnik.portfolio.json\"): Result<string[], StateError> {\n const configResult = this.loadPortfolio(configPath);\n if (!configResult.ok) return configResult;\n\n const config = configResult.value;\n const findings: string[] = [];\n const sensitivePatterns = [\n { pattern: /\\.env$/i, reason: \"env file detected (should be in .gitignore)\" },\n { pattern: /credentials\\.json$/i, reason: \"credentials file detected\" },\n { pattern: /secret/i, reason: \"file with 'secret' in name\" },\n { pattern: /\\.pem$/i, reason: \"private key file detected\" },\n ];\n\n for (const project of config.projects) {\n const repoPath = this.resolvePath(project.repoPath);\n if (!existsSync(repoPath)) continue;\n\n try {\n const git = new GitService(repoPath);\n const statusResult = git.statusPorcelain();\n if (!statusResult.ok) continue;\n\n for (const entry of statusResult.value) {\n for (const { pattern, reason } of sensitivePatterns) {\n if (pattern.test(entry.path)) {\n findings.push(`${project.projectId}: ${entry.path} — ${reason}`);\n }\n }\n }\n } catch {\n // ignore errors for individual projects\n }\n }\n\n return ok(findings);\n }\n\n private auditProject(project: PortfolioConfig[\"projects\"][number]): ProjectAudit {\n const repoPath = this.resolvePath(project.repoPath);\n const errors: string[] = [];\n\n if (!existsSync(repoPath)) {\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: false,\n branch: \"unknown\",\n checkpointTags: [],\n taskBoardExists: false,\n taskCount: 0,\n zoneMapExists: false,\n zoneMapValid: false,\n modifiedFiles: 0,\n errors: [\"repo not found\"],\n };\n }\n\n const git = new GitService(repoPath);\n\n const branchResult = git.currentBranch();\n const branch = branchResult.ok ? branchResult.value : \"unknown\";\n\n let lastCommit: ProjectAudit[\"lastCommit\"];\n try {\n const logResult = git.exec([\"log\", \"-1\", \"--format=%H|%s|%ai|%an\"]);\n if (logResult.ok && logResult.output) {\n const parts = logResult.output.split(\"|\");\n const hash = parts[0];\n if (hash) lastCommit = {\n hash: hash.slice(0, 8),\n message: parts[1] || \"\",\n date: parts[2] || \"\",\n author: parts[3] || \"\",\n };\n }\n } catch {\n // ignore\n }\n\n const tagsResult = git.exec([\n \"tag\", \"-l\", \"oreshnik/*\", \"--sort=-creatordate\",\n ]);\n const checkpointTags = tagsResult.ok\n ? tagsResult.output.split(\"\\n\").filter(Boolean)\n : [];\n\n const taskBoardPath = join(repoPath, ...project.taskBoardPath.split(\"/\"));\n const taskBoardExists = existsSync(taskBoardPath);\n let taskCount = 0;\n if (taskBoardExists) {\n try {\n const raw = JSON.parse(readFileSync(taskBoardPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n taskCount = raw.tasks?.length || 0;\n } catch {\n // ignore\n }\n }\n\n const zoneMapPath = join(repoPath, ...project.zoneMapPath.split(\"/\"));\n const zoneMapExists = existsSync(zoneMapPath);\n let zoneMapValid = false;\n if (zoneMapExists) {\n try {\n const raw = JSON.parse(readFileSync(zoneMapPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n zoneMapValid = raw.zones && Object.keys(raw.zones).length > 0;\n } catch {\n // ignore\n }\n }\n\n const statusResult = git.statusPorcelain();\n const modifiedFiles = statusResult.ok ? statusResult.value.length : 0;\n\n return {\n projectId: project.projectId,\n displayName: project.displayName,\n repoPath: project.repoPath,\n repoExists: true,\n branch,\n lastCommit,\n checkpointTags,\n taskBoardExists,\n taskCount,\n zoneMapExists,\n zoneMapValid,\n modifiedFiles,\n errors,\n };\n }\n\n private loadPortfolio(configPath: string): Result<PortfolioConfig, StateError> {\n const fullPath = this.resolvePath(configPath);\n if (!existsSync(fullPath)) {\n return err(this.fail(`Portfolio config not found: ${configPath}`));\n }\n try {\n const raw = JSON.parse(readFileSync(fullPath, \"utf8\").replace(/^\\uFEFF/, \"\"));\n const parsed = PortfolioConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err(this.fail(`Invalid portfolio config: ${parsed.error.message}`));\n }\n return ok(parsed.data);\n } catch (e) {\n return err(this.fail(`Failed to read portfolio config: ${String(e)}`));\n }\n }\n\n private resolvePath(path: string): string {\n return isAbsolute(path) ? path : resolve(this.root, path);\n }\n\n private fail(message: string): StateError {\n return { code: \"STATE_ERROR\", message, exitCode: 1 };\n }\n}\n\nexport function createAuditService(root: string): AuditService {\n return new AuditService(root);\n}\n","import chalk from \"chalk\";\r\n\r\nexport type LogLevel = \"OK\" | \"FAIL\" | \"WARN\" | \"INFO\";\r\n\r\nexport function log(level: LogLevel, message: string): void {\r\n const color = level === \"OK\" ? chalk.green :\r\n level === \"FAIL\" ? chalk.red :\r\n level === \"WARN\" ? chalk.yellow :\r\n chalk.cyan;\r\n console.log(` [ ${color(level.padEnd(4))} ] ${message}`);\r\n}\r\n\r\nexport function header(title: string, subtitle?: string): void {\r\n console.log(\"\");\r\n console.log(chalk.bold(\"=\".repeat(50)));\r\n console.log(chalk.bold(` ${title}`));\r\n if (subtitle) console.log(chalk.bold(` ${subtitle}`));\r\n console.log(chalk.bold(\"=\".repeat(50)));\r\n console.log(\"\");\r\n}\r\n\r\nexport function statusBox(lines: Array<[string, string]>): void {\r\n const maxKey = Math.max(...lines.map(([k]) => k.length));\r\n console.log(\"\");\r\n console.log(chalk.bold(\"+\" + \"=\".repeat(maxKey + 42) + \"+\"));\r\n const title = \"ORESHNIK STATUS\";\r\n const padLeft = Math.floor((maxKey + 42 - title.length) / 2);\r\n console.log(chalk.bold(\"|\" + \" \".repeat(padLeft) + title + \" \".repeat(maxKey + 42 - padLeft - title.length) + \"|\"));\r\n console.log(chalk.bold(\"+\" + \"=\".repeat(maxKey + 42) + \"+\"));\r\n for (const [key, value] of lines) {\r\n console.log(chalk.bold(\"| \") + chalk.cyan(key.padEnd(maxKey)) + chalk.bold(\" \") + value.padEnd(40) + chalk.bold(\"|\"));\r\n }\r\n console.log(chalk.bold(\"+\" + \"=\".repeat(maxKey + 42) + \"+\"));\r\n console.log(\"\");\r\n}\r\n\r\nexport function resultSummary(blockers: number, warnings: number, operator: string, sprint: string, branch: string, mother: string): void {\r\n console.log(\"\");\r\n console.log(chalk.bold(\"PRE-FLIGHT RESULT\"));\r\n console.log(` Blockers: ${blockers}`);\r\n console.log(` Warnings: ${warnings}`);\r\n console.log(` Operator: ${operator}`);\r\n console.log(` Sprint: ${sprint || \"not specified\"}`);\r\n console.log(` Branch: ${branch}`);\r\n console.log(` Mother: ${mother}`);\r\n console.log(\"\");\r\n\r\n if (blockers > 0) {\r\n console.log(chalk.red.bold(\"[ORESHNIK] BLOCKED\"));\r\n } else {\r\n console.log((warnings > 0 ? chalk.yellow : chalk.green).bold(\"[ORESHNIK] OK\"));\r\n }\r\n}","import { spawnSync } from \"node:child_process\";\nimport type { Result, GitError } from \"../types/index.js\";\nimport { err } from \"../types/index.js\";\n\nexport function execCommand(\n command: string,\n args: string[],\n options?: { cwd?: string; timeout?: number }\n): Result<{ output: string; exitCode: number }, GitError> {\n const result = spawnSync(command, args, {\n cwd: options?.cwd,\n encoding: \"utf8\",\n timeout: options?.timeout ?? 30000,\n stdio: \"pipe\",\n shell: true,\n });\n\n if (result.status !== 0) {\n return err({\n code: \"GIT_ERROR\",\n message: `Command failed: ${command} ${args.join(\" \")}`,\n exitCode: result.status ?? 1,\n gitCommand: `${command} ${args.join(\" \")}`,\n gitStderr: (result.stderr || \"\").trim(),\n });\n }\n\n return { ok: true, value: { output: (result.stdout || \"\").trim(), exitCode: result.status } };\n}\n\nexport function execCommandInherit(\n command: string,\n args: string[],\n options?: { cwd?: string; timeout?: number }\n): Result<{ exitCode: number }, GitError> {\n const result = spawnSync(command, args, {\n cwd: options?.cwd,\n encoding: \"utf8\",\n timeout: options?.timeout ?? 30000,\n stdio: \"inherit\",\n shell: true,\n });\n\n if (result.status !== 0) {\n return err({\n code: \"GIT_ERROR\",\n message: `Command failed: ${command} ${args.join(\" \")} (exit ${result.status})`,\n exitCode: result.status ?? 1,\n });\n }\n\n return { ok: true, value: { exitCode: result.status ?? 0 } };\n}\n"],"mappings":"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","names":["spawnSync","spawnSync","join","join","z","join","join","existsSync","readFileSync","join","existsSync","readFileSync","join","existsSync","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","isAbsolute","join","resolve","result","existsSync","join","readFileSync","taskIndex","mkdirSync","writeFileSync","isAbsolute","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","isAbsolute","join","resolve","existsSync","join","mkdirSync","writeFileSync","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","join","resolve","existsSync","join","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","join","resolve","existsSync","join","readFileSync","isAbsolute","resolve","existsSync","readFileSync","isAbsolute","join","resolve","existsSync","join","readFileSync","isAbsolute","resolve","spawnSync","spawnSync"]}
|