feat(api/public-exports): wire up selective public API surface in src/index.ts

Replace wildcard  barrel with selective named re-exports,
ensuring no internal implementation details (TaskGraphInner, Nullable,
SerializedGraph, standalone mutation/query/validation functions,
computeEffectiveP, splitFrontmatter) leak through the public API.

All 590 tests pass, TypeScript declarations compile cleanly.
This commit is contained in:
2026-04-27 14:22:39 +00:00
parent ff7b19bc2c
commit aea08a5428
4 changed files with 113 additions and 18 deletions

View File

@@ -1,8 +1,109 @@
// @alkdev/taskgraph — Public API surface // @alkdev/taskgraph — Public API surface
// Re-exports from all submodules //
// This is the main entry point for consumers. Everything they need should be
// importable from `@alkdev/taskgraph`. Internal implementation details (types
// and functions that operate on the raw graphology instance) are intentionally
// NOT re-exported here to maintain a clean public API boundary.
export * from './schema/index.js'; // ---------------------------------------------------------------------------
export * from './graph/index.js'; // TaskGraph class (the primary data structure)
export * from './analysis/index.js'; // ---------------------------------------------------------------------------
export * from './frontmatter/index.js';
export * from './error/index.js'; export { TaskGraph } from './graph/construction.js';
// ---------------------------------------------------------------------------
// Analysis functions (standalone, composable)
// ---------------------------------------------------------------------------
// Graph analysis
export { parallelGroups } from './analysis/parallel-groups.js';
export { criticalPath, weightedCriticalPath } from './analysis/critical-path.js';
export { bottlenecks } from './analysis/bottleneck.js';
export type { BottleneckResult } from './analysis/bottleneck.js';
// Cost-benefit analysis
export { riskPath, riskDistribution } from './analysis/risk.js';
export { calculateTaskEv, workflowCost } from './analysis/cost-benefit.js';
export { shouldDecomposeTask } from './analysis/decompose.js';
// Categorical numeric methods
export {
scopeCostEstimate,
scopeTokenEstimate,
riskSuccessProbability,
riskWeight,
impactWeight,
resolveDefaults,
} from './analysis/defaults.js';
// ---------------------------------------------------------------------------
// Frontmatter functions
// ---------------------------------------------------------------------------
export { parseFrontmatter } from './frontmatter/parse.js';
export { serializeFrontmatter } from './frontmatter/serialize.js';
export { parseTaskFile, parseTaskDirectory } from './frontmatter/file-io.js';
// ---------------------------------------------------------------------------
// Schemas and types
// ---------------------------------------------------------------------------
// Enum schemas + types (const+type pairs with same name: export by value, TS includes type)
export {
TaskScopeEnum,
TaskRiskEnum,
TaskImpactEnum,
TaskLevelEnum,
TaskPriorityEnum,
TaskStatusEnum,
} from './schema/enums.js';
export type {
TaskScope,
TaskRisk,
TaskImpact,
TaskLevel,
TaskPriority,
TaskStatus,
} from './schema/enums.js';
// Input schemas + types
export { TaskInput, DependencyEdge } from './schema/task.js';
// Graph schemas + types (exclude SerializedGraph generic factory and TaskGraphNodeAttributesUpdate)
export {
TaskGraphNodeAttributes,
TaskGraphEdgeAttributes,
TaskGraphSerialized,
} from './schema/graph.js';
// Result schemas + types
export {
RiskPathResult,
DecomposeResult,
WorkflowCostOptions,
WorkflowCostResult,
EvConfig,
EvResult,
RiskDistributionResult,
ResolvedTaskAttributes,
} from './schema/results.js';
// ---------------------------------------------------------------------------
// Error classes + validation error types
// ---------------------------------------------------------------------------
export {
TaskgraphError,
TaskNotFoundError,
CircularDependencyError,
InvalidInputError,
DuplicateNodeError,
DuplicateEdgeError,
} from './error/index.js';
export type {
ValidationError,
GraphValidationError,
AnyValidationError,
} from './error/index.js';

View File

@@ -1,4 +1,7 @@
// Schema submodule — re-exports // Schema submodule — public re-exports
//
// Excludes: Nullable (internal TypeBox helper), SerializedGraph (generic factory),
// TaskGraphNodeAttributesUpdate (internal use for update operations)
export * from './enums.js'; export * from './enums.js';
export * from './task.js'; export * from './task.js';

View File

@@ -9,9 +9,6 @@ import {
TaskPriorityEnum, TaskPriorityEnum,
} from "./enums.js"; } from "./enums.js";
// Re-export Nullable for convenience (originally defined in enums.ts)
export { Nullable } from "./enums.js";
// --- Input Schemas --- // --- Input Schemas ---
/** /**

View File

@@ -369,14 +369,8 @@ describe('Type alias correctness — TaskInput and DependencyEdge (compile-time)
}); });
}); });
// Re-export Nullable from task.ts to verify the re-export works // Nullable is no longer re-exported from task.ts — it's an internal helper
import { Nullable as NullableFromTask } from '../src/schema/task.js'; // and excluded from the public API surface per src/index.ts
describe('Nullable re-export from task.ts', () => {
it('is the same function as from enums.ts', () => {
expect(NullableFromTask).toBe(Nullable);
});
});
// Intentionally import type aliases to verify they exist at compile time // Intentionally import type aliases to verify they exist at compile time
type TaskScope = import('../src/schema/enums.js').TaskScope; type TaskScope = import('../src/schema/enums.js').TaskScope;