@tlog/shared
v0.3.0
Published
Shared TypeScript utilities for tlog
Downloads
52
Readme
@tlog/shared
@tlog/shared は CLI / MCP / VS Code extension で共通利用するドメインモデルとコアロジックを提供する。
Task Coverage
TASK-001Domain types / enums:src/domain.ts,src/schemas.tsTASK-002Schema validator:src/validation.tsTASK-003YAML parser/serializer:src/yaml-io.tsTASK-004ID index / reference resolution:src/id-index.tsTASK-005File naming / slug policy:src/naming.tsTASK-006Default builders:src/builders.tsTASK-007Search / filter engine:src/filter.tsTASK-008Statistics / burndown engine:src/statistics.tsTASK-009Template apply / extract:src/template.tsTASK-010Error model / result contract:src/result.ts
API Contracts
Domain (TASK-001)
type Suite- input/output fields:
id,title,tags,description,scoped,owners,duration,related,remarks
- input/output fields:
type TestCase- input/output fields:
id,title,tags,description,scoped,status,operations,related,remarks,completedDay,tests,issues
- input/output fields:
type TestItem- input/output fields:
name,expected,actual,trails,status
- input/output fields:
type Issue- input/output fields:
incident,owners,causes,solutions,status,detectedDay,completedDay,related,remarks
- input/output fields:
- status enums
- testcase status:
"todo" | "doing" | "done" | null - test result status:
"pass" | "fail" | "skip" | "block" | null - issue status:
"open" | "doing" | "resolved" | "pending"
- testcase status:
- date
type TlogDateString- guard:
isTlogDateString(value: string): value is TlogDateString - converter:
asTlogDateString(value: string): TlogDateString
Validation (TASK-002)
validateSuite(input: unknown): ValidationResult<Suite>validateCase(input: unknown): ValidationResult<TestCase>ValidationResult<T>ok: booleandata?: T(ok === trueのとき)errors: ValidationDiagnostic[]warnings: ValidationDiagnostic[]
ValidationDiagnosticpath: stringmessage: string
YAML I/O (TASK-003)
parseYaml<T>(source: string): T- invalid YAML の場合
TlogYamlParseErrorを throw TlogYamlParseErrorfields:line,column,message
- invalid YAML の場合
stringifyYaml(value: unknown): stringreadYamlFile<T>(path: string): Promise<T>writeYamlFileAtomic(path: string, value: unknown): Promise<void>- temp file 書き込み後に rename する atomic write
ID Resolution (TASK-004)
buildIdIndex(rootDir: string): Promise<IdIndex>resolveById(index: IdIndex, id: string): TlogIndexedEntity | undefinedresolveRelated(index: IdIndex, source: { related: string[] }): RelatedResolutionIdIndexbyId: Map<string, TlogIndexedEntity>entities: TlogIndexedEntity[]duplicates: { id: string; paths: string[] }[]
Naming (TASK-005)
slugifyTitle(title: string): stringensureUniqueSlug(baseSlug: string, usedSlugs: Set<string>): stringbuildSuiteFileName(id: string, title: string): stringbuildCaseFileName(id: string, title: string): stringnormalizeTlogPath(input: string): string
Builders (TASK-006)
buildDefaultSuite(input: BuildDefaultSuiteInput): SuitebuildDefaultCase(input: BuildDefaultCaseInput): TestCase- builder は内部で
validateSuite/validateCaseを実行し、invalid な場合 throw する
Filter Engine (TASK-007)
evaluateFilters(entity: Suite | TestCase, filters: SearchFilters): FilterMetafilterEntities<T extends Suite | TestCase>(entities: T[], filters: SearchFilters): { items: T[]; meta: FilterMeta }SearchFilterstags?: string[]owners?: string[]testcaseStatus?: TestCaseStatus[]testStatus?: TestResultStatus[]date?: DateFilter
Statistics (TASK-008)
summarizeStatus(cases: TestCase[]): StatusSummarytodo,doing,done,total
calculateBurndown(cases: TestCase[], start: string, end: string): BurndownResultsummary: StatusSummarybuckets: BurndownBucket[]anomalies: string[](invalid_date_range,no_target_casesなど)
Template (TASK-009)
applyTemplate(suiteInput, caseInput, template?): { suite: Suite; testCase: TestCase }extractTemplateFromDirectory(rootDir: string): Promise<TlogTemplate>validateTemplate(template: TlogTemplate): { valid: boolean; errors: string[] }
Result Contract (TASK-010)
type Result<T, E = TlogError>- success:
{ ok: true; data: T; warnings: TlogWarning[] } - failure:
{ ok: false; error: E; warnings: TlogWarning[] }
- success:
ok<T>(data: T, warnings?: TlogWarning[]): Result<T>err<E>(error: E, warnings?: TlogWarning[]): Result<never, E>serializeResult(result): string(--json/ MCP response / VS Code diagnostics への橋渡し用)
Usage Example
import {
buildDefaultCase,
buildDefaultSuite,
validateCase,
writeYamlFileAtomic
} from "@tlog/shared";
const suite = buildDefaultSuite({ id: "suite-login", title: "Login Suite" });
const testCase = buildDefaultCase({ id: "case-login-001", title: "Login happy path" });
const caseValidation = validateCase(testCase);
if (!caseValidation.ok) {
throw new Error(caseValidation.errors.map((e) => e.message).join(", "));
}
await writeYamlFileAtomic("tests/index.yaml", suite);
await writeYamlFileAtomic("tests/case-login-001.yaml", testCase);