project-tiny-context-harness 0.8.8 → 0.8.11

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.
Files changed (42) hide show
  1. package/README.md +149 -123
  2. package/assets/README.md +279 -251
  3. package/assets/README.zh-CN.md +172 -144
  4. package/assets/skills/design-resource-authoring/SKILL.md +12 -12
  5. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +57 -48
  6. package/dist/commands/design-resource.js +62 -2
  7. package/dist/lib/design-resource-fact-manifest-validation.d.ts +3 -1
  8. package/dist/lib/design-resource-fact-manifest-validation.js +23 -18
  9. package/dist/lib/design-resource-fact-universe-catalog.js +18 -8
  10. package/dist/lib/design-resource-fact-universe-helpers.js +9 -5
  11. package/dist/lib/design-resource-handoff-bundle-draft.d.ts +11 -0
  12. package/dist/lib/design-resource-handoff-bundle-draft.js +38 -0
  13. package/dist/lib/design-resource-handoff-bundle.d.ts +31 -0
  14. package/dist/lib/design-resource-handoff-bundle.js +147 -0
  15. package/dist/lib/design-resource-handoff-file-validation.d.ts +1 -1
  16. package/dist/lib/design-resource-handoff-file-validation.js +1 -9
  17. package/dist/lib/design-resource-handoff-input-types.d.ts +11 -0
  18. package/dist/lib/design-resource-handoff-input-types.js +1 -0
  19. package/dist/lib/design-resource-handoff-manifest-projection.d.ts +4 -0
  20. package/dist/lib/design-resource-handoff-manifest-projection.js +37 -0
  21. package/dist/lib/design-resource-handoff-parser.d.ts +7 -2
  22. package/dist/lib/design-resource-handoff-parser.js +32 -12
  23. package/dist/lib/design-resource-handoff-set-integrity.d.ts +8 -0
  24. package/dist/lib/design-resource-handoff-set-integrity.js +93 -0
  25. package/dist/lib/design-resource-handoff-shape.d.ts +2 -0
  26. package/dist/lib/design-resource-handoff-shape.js +62 -0
  27. package/dist/lib/design-resource-handoff-snapshot.d.ts +6 -0
  28. package/dist/lib/design-resource-handoff-snapshot.js +21 -0
  29. package/dist/lib/design-resource-handoff-types.d.ts +13 -1
  30. package/dist/lib/design-resource-handoff-validation.d.ts +2 -0
  31. package/dist/lib/design-resource-handoff-validation.js +45 -22
  32. package/dist/lib/long-task-design-resource-handoff.d.ts +15 -0
  33. package/dist/lib/long-task-design-resource-handoff.js +63 -173
  34. package/dist/lib/long-task-design-resource-method-binding.d.ts +8 -0
  35. package/dist/lib/long-task-design-resource-method-binding.js +135 -0
  36. package/dist/lib/long-task-source-item-parser.d.ts +8 -0
  37. package/dist/lib/long-task-source-item-parser.js +29 -107
  38. package/dist/lib/long-task-source-owned-sections.d.ts +29 -0
  39. package/dist/lib/long-task-source-owned-sections.js +90 -0
  40. package/dist/lib/source-line-scanner.d.ts +3 -0
  41. package/dist/lib/source-line-scanner.js +42 -0
  42. package/package.json +84 -84
@@ -1,21 +1,28 @@
1
- import { parseDesignResourceHandoffShape } from "./design-resource-handoff-shape.js";
1
+ import { parseDesignResourceHandoffInputShape } from "./design-resource-handoff-shape.js";
2
2
  import { parseSemanticFactManifestShape } from "./semantic-fact-manifest-shape.js";
3
- import { normalizeSourceItemText, parseSourceBackgroundMarker, parseSourceItemStartMarker, SOURCE_BACKGROUND_END, SOURCE_BACKGROUND_START, SOURCE_ITEM_END, SOURCE_ITEM_START, validateSourceBackgroundLine, } from "./long-task-source-markers.js";
4
- import { parseStrictYaml, sha256Hex } from "./strict-codec.js";
3
+ import { assertNoOpenOwnedSection, assertOwnedSourceSectionsClosed, consumeBackgroundBoundary, consumeOwnedText, consumeSourceItemBoundary, } from "./long-task-source-owned-sections.js";
4
+ import { formalBlockBody, forEachSourceLine } from "./source-line-scanner.js";
5
+ import { parseStrictYaml } from "./strict-codec.js";
5
6
  const DESIGN_RESOURCE_START = /^\s*```yaml[ \t]+design-resource-handoff-v1[ \t]*$/u;
6
7
  const SEMANTIC_FACT_START = /^\s*```yaml[ \t]+semantic-fact-manifest-v1[ \t]*$/u;
7
8
  const FORMAL_BLOCK_END = /^\s*```[ \t]*$/u;
8
9
  export function parseSourceItems(sourcePath, content) {
9
- const state = sourceParseState(sourcePath);
10
- const lines = content.replace(/\r\n?/gu, "\n").split("\n");
11
- for (const [index, line] of lines.entries())
12
- consumeSourceLine(state, line, index + 1);
10
+ return parseSourceDocument(sourcePath, content).items;
11
+ }
12
+ export function parseSourceDocument(sourcePath, content) {
13
+ const state = sourceParseState(sourcePath, content);
14
+ forEachSourceLine(content, (line, startOffset, _endOffset, nextOffset, lineNumber) => consumeSourceLine(state, line, lineNumber, startOffset, nextOffset));
13
15
  assertSourceSectionsClosed(state);
14
- return state.items;
16
+ return {
17
+ items: state.items,
18
+ designResourceHandoff: state.designResourceHandoff,
19
+ semanticFactManifest: state.semanticFactManifest,
20
+ };
15
21
  }
16
- function sourceParseState(sourcePath) {
22
+ function sourceParseState(sourcePath, content) {
17
23
  return {
18
24
  sourcePath,
25
+ content,
19
26
  items: [],
20
27
  seen: new Set(),
21
28
  seenBackground: new Set(),
@@ -24,12 +31,14 @@ function sourceParseState(sourcePath) {
24
31
  formalBlock: null,
25
32
  designResourceBlocks: 0,
26
33
  semanticFactBlocks: 0,
34
+ designResourceHandoff: null,
35
+ semanticFactManifest: null,
27
36
  };
28
37
  }
29
- function consumeSourceLine(state, line, lineNumber) {
30
- if (consumeOpenFormalBlock(state, line))
38
+ function consumeSourceLine(state, line, lineNumber, startOffset, nextOffset) {
39
+ if (consumeOpenFormalBlock(state, line, startOffset))
31
40
  return;
32
- if (startFormalBlock(state, line, lineNumber))
41
+ if (startFormalBlock(state, line, lineNumber, nextOffset))
33
42
  return;
34
43
  if (consumeSourceItemBoundary(state, line, lineNumber))
35
44
  return;
@@ -37,19 +46,17 @@ function consumeSourceLine(state, line, lineNumber) {
37
46
  return;
38
47
  consumeOwnedText(state, line, lineNumber);
39
48
  }
40
- function consumeOpenFormalBlock(state, line) {
49
+ function consumeOpenFormalBlock(state, line, startOffset) {
41
50
  if (!state.formalBlock)
42
51
  return false;
43
- if (!FORMAL_BLOCK_END.test(line)) {
44
- state.formalBlock.lines.push(line);
52
+ if (!FORMAL_BLOCK_END.test(line))
45
53
  return true;
46
- }
47
54
  try {
48
- const value = parseStrictYaml(state.formalBlock.lines.join("\n"));
55
+ const value = parseStrictYaml(formalBlockBody(state.content, state.formalBlock.bodyStartOffset, startOffset, state.formalBlock.owner === "design-resource-handoff-v1"));
49
56
  if (state.formalBlock.owner === "design-resource-handoff-v1")
50
- parseDesignResourceHandoffShape(value);
57
+ state.designResourceHandoff = parseDesignResourceHandoffInputShape(value);
51
58
  else
52
- parseSemanticFactManifestShape(value);
59
+ state.semanticFactManifest = parseSemanticFactManifestShape(value);
53
60
  }
54
61
  catch (error) {
55
62
  const message = error instanceof Error ? error.message : String(error);
@@ -58,7 +65,7 @@ function consumeOpenFormalBlock(state, line) {
58
65
  state.formalBlock = null;
59
66
  return true;
60
67
  }
61
- function startFormalBlock(state, line, lineNumber) {
68
+ function startFormalBlock(state, line, lineNumber, nextOffset) {
62
69
  const owner = DESIGN_RESOURCE_START.test(line)
63
70
  ? "design-resource-handoff-v1"
64
71
  : SEMANTIC_FACT_START.test(line)
@@ -79,98 +86,13 @@ function startFormalBlock(state, line, lineNumber) {
79
86
  }
80
87
  state.formalBlock = {
81
88
  owner,
82
- lines: [],
89
+ bodyStartOffset: nextOffset,
83
90
  line: lineNumber,
84
91
  };
85
92
  return true;
86
93
  }
87
- function consumeSourceItemBoundary(state, line, lineNumber) {
88
- const start = SOURCE_ITEM_START.exec(line);
89
- if (start) {
90
- assertNoOpenOwnedSection(state, lineNumber);
91
- state.open = {
92
- ...parseSourceItemStartMarker(state.sourcePath, lineNumber, start[1]),
93
- lines: [],
94
- line: lineNumber,
95
- };
96
- return true;
97
- }
98
- if (!SOURCE_ITEM_END.test(line))
99
- return false;
100
- if (!state.open)
101
- throw new Error(`source_item_end_without_start:${state.sourcePath}:${lineNumber}`);
102
- closeSourceItem(state);
103
- return true;
104
- }
105
- function closeSourceItem(state) {
106
- const open = state.open;
107
- const normalizedText = normalizeSourceItemText(open.lines.join("\n"));
108
- if (!normalizedText)
109
- throw new Error(`source_item_empty:${state.sourcePath}:${open.key}`);
110
- if (state.seen.has(open.key))
111
- throw new Error(`source_item_key_duplicate:${open.key}`);
112
- state.seen.add(open.key);
113
- state.items.push({
114
- key: open.key,
115
- kind: open.kind,
116
- ...(open.aspect ? { aspect: open.aspect } : {}),
117
- source_path: state.sourcePath,
118
- normalized_text: normalizedText,
119
- text_sha256: sha256Hex(normalizedText),
120
- ...(open.risk_semantics ? { risk_semantics: open.risk_semantics } : {}),
121
- });
122
- state.open = null;
123
- }
124
- function consumeBackgroundBoundary(state, line, lineNumber) {
125
- const start = SOURCE_BACKGROUND_START.exec(line);
126
- if (start) {
127
- assertNoOpenOwnedSection(state, lineNumber);
128
- const declaration = parseSourceBackgroundMarker(state.sourcePath, lineNumber, start[1]);
129
- if (state.seenBackground.has(declaration.key))
130
- throw new Error(`source_background_key_duplicate:${declaration.key}`);
131
- state.seenBackground.add(declaration.key);
132
- state.background = {
133
- ...declaration,
134
- substantiveLines: 0,
135
- line: lineNumber,
136
- };
137
- return true;
138
- }
139
- if (!SOURCE_BACKGROUND_END.test(line))
140
- return false;
141
- if (!state.background)
142
- throw new Error(`source_background_end_without_start:${state.sourcePath}:${lineNumber}`);
143
- if (!state.background.substantiveLines)
144
- throw new Error(`source_background_empty:${state.sourcePath}:${state.background.key}`);
145
- state.background = null;
146
- return true;
147
- }
148
- function assertNoOpenOwnedSection(state, lineNumber) {
149
- if (!state.open && !state.background)
150
- return;
151
- throw new Error(`source_section_nested_or_overlapping:${state.sourcePath}:${state.open?.key ?? state.background?.key}:${lineNumber}`);
152
- }
153
- function consumeOwnedText(state, line, lineNumber) {
154
- if (line.includes("ty-source-item:start") ||
155
- line.includes("ty-source-item:end") ||
156
- line.includes("ty-source-background:start") ||
157
- line.includes("ty-source-background:end"))
158
- throw new Error(`source_item_marker_invalid:${state.sourcePath}:${lineNumber}`);
159
- if (state.open)
160
- state.open.lines.push(line);
161
- else if (state.background) {
162
- validateSourceBackgroundLine(state.sourcePath, state.background.key, state.background.reason, lineNumber, line);
163
- if (line.trim())
164
- state.background.substantiveLines += 1;
165
- }
166
- else if (line.trim())
167
- throw new Error(`source_text_unclassified:${state.sourcePath}:${lineNumber}`);
168
- }
169
94
  function assertSourceSectionsClosed(state) {
170
- if (state.open)
171
- throw new Error(`source_item_unclosed:${state.sourcePath}:${state.open.key}:${state.open.line}`);
172
- if (state.background)
173
- throw new Error(`source_background_unclosed:${state.sourcePath}:${state.background.key}:${state.background.line}`);
95
+ assertOwnedSourceSectionsClosed(state);
174
96
  if (state.formalBlock)
175
97
  throw new Error(`source_formal_block_unclosed:${state.sourcePath}:${state.formalBlock.owner}:${state.formalBlock.line}`);
176
98
  }
@@ -0,0 +1,29 @@
1
+ import type { CompiledSourceItemV2, SourceItemKind } from "./long-task-delivery-types.js";
2
+ interface OpenSourceItem {
3
+ key: string;
4
+ kind: SourceItemKind;
5
+ aspect?: CompiledSourceItemV2["aspect"];
6
+ risk_semantics?: CompiledSourceItemV2["risk_semantics"];
7
+ lines: string[];
8
+ line: number;
9
+ }
10
+ interface OpenSourceBackground {
11
+ key: string;
12
+ reason: string;
13
+ substantiveLines: number;
14
+ line: number;
15
+ }
16
+ export interface OwnedSourceParseState {
17
+ sourcePath: string;
18
+ items: CompiledSourceItemV2[];
19
+ seen: Set<string>;
20
+ seenBackground: Set<string>;
21
+ open: OpenSourceItem | null;
22
+ background: OpenSourceBackground | null;
23
+ }
24
+ export declare function consumeSourceItemBoundary(state: OwnedSourceParseState, line: string, lineNumber: number): boolean;
25
+ export declare function consumeBackgroundBoundary(state: OwnedSourceParseState, line: string, lineNumber: number): boolean;
26
+ export declare function assertNoOpenOwnedSection(state: OwnedSourceParseState, lineNumber: number): void;
27
+ export declare function consumeOwnedText(state: OwnedSourceParseState, line: string, lineNumber: number): void;
28
+ export declare function assertOwnedSourceSectionsClosed(state: OwnedSourceParseState): void;
29
+ export {};
@@ -0,0 +1,90 @@
1
+ import { normalizeSourceItemText, parseSourceBackgroundMarker, parseSourceItemStartMarker, SOURCE_BACKGROUND_END, SOURCE_BACKGROUND_START, SOURCE_ITEM_END, SOURCE_ITEM_START, validateSourceBackgroundLine, } from "./long-task-source-markers.js";
2
+ import { sha256Hex } from "./strict-codec.js";
3
+ export function consumeSourceItemBoundary(state, line, lineNumber) {
4
+ const start = SOURCE_ITEM_START.exec(line);
5
+ if (start) {
6
+ assertNoOpenOwnedSection(state, lineNumber);
7
+ state.open = {
8
+ ...parseSourceItemStartMarker(state.sourcePath, lineNumber, start[1]),
9
+ lines: [],
10
+ line: lineNumber,
11
+ };
12
+ return true;
13
+ }
14
+ if (!SOURCE_ITEM_END.test(line))
15
+ return false;
16
+ if (!state.open)
17
+ throw new Error(`source_item_end_without_start:${state.sourcePath}:${lineNumber}`);
18
+ closeSourceItem(state);
19
+ return true;
20
+ }
21
+ function closeSourceItem(state) {
22
+ const open = state.open;
23
+ const normalizedText = normalizeSourceItemText(open.lines.join("\n"));
24
+ if (!normalizedText)
25
+ throw new Error(`source_item_empty:${state.sourcePath}:${open.key}`);
26
+ if (state.seen.has(open.key))
27
+ throw new Error(`source_item_key_duplicate:${open.key}`);
28
+ state.seen.add(open.key);
29
+ state.items.push({
30
+ key: open.key,
31
+ kind: open.kind,
32
+ ...(open.aspect ? { aspect: open.aspect } : {}),
33
+ source_path: state.sourcePath,
34
+ normalized_text: normalizedText,
35
+ text_sha256: sha256Hex(normalizedText),
36
+ ...(open.risk_semantics ? { risk_semantics: open.risk_semantics } : {}),
37
+ });
38
+ state.open = null;
39
+ }
40
+ export function consumeBackgroundBoundary(state, line, lineNumber) {
41
+ const start = SOURCE_BACKGROUND_START.exec(line);
42
+ if (start) {
43
+ assertNoOpenOwnedSection(state, lineNumber);
44
+ const declaration = parseSourceBackgroundMarker(state.sourcePath, lineNumber, start[1]);
45
+ if (state.seenBackground.has(declaration.key))
46
+ throw new Error(`source_background_key_duplicate:${declaration.key}`);
47
+ state.seenBackground.add(declaration.key);
48
+ state.background = {
49
+ ...declaration,
50
+ substantiveLines: 0,
51
+ line: lineNumber,
52
+ };
53
+ return true;
54
+ }
55
+ if (!SOURCE_BACKGROUND_END.test(line))
56
+ return false;
57
+ if (!state.background)
58
+ throw new Error(`source_background_end_without_start:${state.sourcePath}:${lineNumber}`);
59
+ if (!state.background.substantiveLines)
60
+ throw new Error(`source_background_empty:${state.sourcePath}:${state.background.key}`);
61
+ state.background = null;
62
+ return true;
63
+ }
64
+ export function assertNoOpenOwnedSection(state, lineNumber) {
65
+ if (!state.open && !state.background)
66
+ return;
67
+ throw new Error(`source_section_nested_or_overlapping:${state.sourcePath}:${state.open?.key ?? state.background?.key}:${lineNumber}`);
68
+ }
69
+ export function consumeOwnedText(state, line, lineNumber) {
70
+ if (line.includes("ty-source-item:start") ||
71
+ line.includes("ty-source-item:end") ||
72
+ line.includes("ty-source-background:start") ||
73
+ line.includes("ty-source-background:end"))
74
+ throw new Error(`source_item_marker_invalid:${state.sourcePath}:${lineNumber}`);
75
+ if (state.open)
76
+ state.open.lines.push(line);
77
+ else if (state.background) {
78
+ validateSourceBackgroundLine(state.sourcePath, state.background.key, state.background.reason, lineNumber, line);
79
+ if (line.trim())
80
+ state.background.substantiveLines += 1;
81
+ }
82
+ else if (line.trim())
83
+ throw new Error(`source_text_unclassified:${state.sourcePath}:${lineNumber}`);
84
+ }
85
+ export function assertOwnedSourceSectionsClosed(state) {
86
+ if (state.open)
87
+ throw new Error(`source_item_unclosed:${state.sourcePath}:${state.open.key}:${state.open.line}`);
88
+ if (state.background)
89
+ throw new Error(`source_background_unclosed:${state.sourcePath}:${state.background.key}:${state.background.line}`);
90
+ }
@@ -0,0 +1,3 @@
1
+ export type SourceLineVisitor = (line: string, startOffset: number, endOffset: number, nextOffset: number, lineNumber: number) => void;
2
+ export declare function forEachSourceLine(content: string, visit: SourceLineVisitor): void;
3
+ export declare function formalBlockBody(content: string, bodyStartOffset: number, closingLineStartOffset: number, preserveClosingSeparator?: boolean): string;
@@ -0,0 +1,42 @@
1
+ export function forEachSourceLine(content, visit) {
2
+ let startOffset = 0;
3
+ let lineNumber = 1;
4
+ while (startOffset <= content.length) {
5
+ let endOffset = startOffset;
6
+ while (endOffset < content.length) {
7
+ const code = content.charCodeAt(endOffset);
8
+ if (code === 10 || code === 13)
9
+ break;
10
+ endOffset += 1;
11
+ }
12
+ let nextOffset = endOffset;
13
+ if (nextOffset < content.length) {
14
+ if (content.charCodeAt(nextOffset) === 13 &&
15
+ content.charCodeAt(nextOffset + 1) === 10)
16
+ nextOffset += 2;
17
+ else
18
+ nextOffset += 1;
19
+ }
20
+ visit(content.slice(startOffset, endOffset), startOffset, endOffset, nextOffset, lineNumber);
21
+ if (endOffset === content.length)
22
+ break;
23
+ startOffset = nextOffset;
24
+ lineNumber += 1;
25
+ }
26
+ }
27
+ export function formalBlockBody(content, bodyStartOffset, closingLineStartOffset, preserveClosingSeparator = false) {
28
+ let bodyEndOffset = closingLineStartOffset;
29
+ if (!preserveClosingSeparator &&
30
+ bodyEndOffset > bodyStartOffset &&
31
+ content.charCodeAt(bodyEndOffset - 1) === 10) {
32
+ bodyEndOffset -= 1;
33
+ if (bodyEndOffset > bodyStartOffset &&
34
+ content.charCodeAt(bodyEndOffset - 1) === 13)
35
+ bodyEndOffset -= 1;
36
+ }
37
+ else if (!preserveClosingSeparator &&
38
+ bodyEndOffset > bodyStartOffset &&
39
+ content.charCodeAt(bodyEndOffset - 1) === 13)
40
+ bodyEndOffset -= 1;
41
+ return content.slice(bodyStartOffset, bodyEndOffset).replace(/\r\n?/gu, "\n");
42
+ }
package/package.json CHANGED
@@ -1,84 +1,84 @@
1
- {
2
- "name": "project-tiny-context-harness",
3
- "version": "0.8.8",
4
- "description": "Minimal project memory and validation harness for AI coding agents.",
5
- "license": "MIT",
6
- "author": "Seven128",
7
- "homepage": "https://github.com/Seven128/project-tiny-context-harness#readme",
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/Seven128/project-tiny-context-harness.git",
11
- "directory": "packages/ty-context"
12
- },
13
- "bugs": {
14
- "url": "https://github.com/Seven128/project-tiny-context-harness/issues"
15
- },
16
- "keywords": [
17
- "ai-agents",
18
- "coding-agent",
19
- "codex",
20
- "claude-code",
21
- "cursor",
22
- "gemini-cli",
23
- "opencode",
24
- "agent-context",
25
- "context-engineering",
26
- "context-management",
27
- "agents-md",
28
- "project-memory",
29
- "agent-memory",
30
- "ai-coding",
31
- "multi-agent",
32
- "llm",
33
- "developer-tools",
34
- "developer-productivity",
35
- "cli",
36
- "ty-context",
37
- "workflow"
38
- ],
39
- "type": "module",
40
- "bin": {
41
- "ty-context": "dist/cli.js"
42
- },
43
- "files": [
44
- "README.md",
45
- "dist",
46
- "assets",
47
- "migrations",
48
- "source-mappings.yaml"
49
- ],
50
- "scripts": {
51
- "build": "node ../../tools/package_build_fingerprint.mjs build",
52
- "typecheck": "tsc -p tsconfig.json --noEmit",
53
- "test:default:built": "node ../../tests/ty-context/run-package-suite.mjs default",
54
- "test:default": "npm run build && npm run test:default:built",
55
- "test:built": "npm run test:default:built && npm run test:long-task-workflow:built",
56
- "test:trust:built": "npm run test:default:built && npm run test:long-task-trust:built",
57
- "test:trust": "npm run build && npm run test:trust:built",
58
- "pretest": "npm run build",
59
- "test": "npm run test:built",
60
- "test:workflow-default:built": "node --test --test-concurrency=1 ../../tests/ty-context/workflow-contract-routing.test.mjs",
61
- "test:delivery-contract:built": "node --test --test-concurrency=1 ../../tests/ty-context/long-task-compact-authoring.test.mjs ../../tests/ty-context/long-task-authoring-claims.test.mjs ../../tests/ty-context/long-task-authoring-preflight.test.mjs ../../tests/ty-context/long-task-authority-authoring-fields.test.mjs ../../tests/ty-context/long-task-playwright-ac-evidence.test.mjs ../../tests/ty-context/long-task-delivery-parser.test.mjs ../../tests/ty-context/long-task-delivery-compiler.test.mjs ../../tests/ty-context/long-task-delivery-risk.test.mjs ../../tests/ty-context/long-task-claim-coverage.test.mjs ../../tests/ty-context/long-task-closure-invariants.test.mjs ../../tests/ty-context/long-task-source-authority-closure.test.mjs ../../tests/ty-context/long-task-evidence-sensitivity-policy.test.mjs ../../tests/ty-context/long-task-global-evidence-sensitivity.test.mjs ../../tests/ty-context/long-task-source-risk-binding.test.mjs ../../tests/ty-context/long-task-non-completing-source.test.mjs ../../tests/ty-context/long-task-playwright-trust-boundary.test.mjs ../../tests/ty-context/long-task-planned-counterfactual.test.mjs ../../tests/ty-context/long-task-public-contract-example.test.mjs ../../tests/ty-context/long-task-release-tarball-contract.test.mjs ../../tests/ty-context/long-task-semantic-assurance-closure.test.mjs ../../tests/ty-context/long-task-semantic-drift-closure.test.mjs ../../tests/ty-context/long-task-semantic-drift-lifecycle.test.mjs ../../tests/ty-context/long-task-workspace-scope.test.mjs",
62
- "test:delivery-contract": "npm run build && npm run test:delivery-contract:built",
63
- "test:long-task-workflow:built": "node ../../tests/ty-context/run-package-suite.mjs long-task",
64
- "test:long-task-workflow": "npm run build && npm run test:long-task-workflow:built",
65
- "test:long-task-trust:built": "node ../../tests/ty-context/run-package-suite.mjs long-task-trust",
66
- "test:long-task-trust": "npm run build && npm run test:long-task-trust:built",
67
- "test:long-task-performance": "npm run build && node ../../tests/ty-context/long-task-performance.mjs",
68
- "prepack": "npm run build"
69
- },
70
- "engines": {
71
- "node": ">=24"
72
- },
73
- "dependencies": {
74
- "@google/design.md": "^0.3.0",
75
- "impeccable": "^3.2.1",
76
- "re2js": "2.8.6",
77
- "smol-toml": "1.7.0",
78
- "yaml": "^2.9.0"
79
- },
80
- "devDependencies": {
81
- "@types/node": "^26.1.1",
82
- "typescript": "^7.0.2"
83
- }
84
- }
1
+ {
2
+ "name": "project-tiny-context-harness",
3
+ "version": "0.8.11",
4
+ "description": "Minimal project memory and validation harness for AI coding agents.",
5
+ "license": "MIT",
6
+ "author": "Seven128",
7
+ "homepage": "https://github.com/Seven128/project-tiny-context-harness#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Seven128/project-tiny-context-harness.git",
11
+ "directory": "packages/ty-context"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/Seven128/project-tiny-context-harness/issues"
15
+ },
16
+ "keywords": [
17
+ "ai-agents",
18
+ "coding-agent",
19
+ "codex",
20
+ "claude-code",
21
+ "cursor",
22
+ "gemini-cli",
23
+ "opencode",
24
+ "agent-context",
25
+ "context-engineering",
26
+ "context-management",
27
+ "agents-md",
28
+ "project-memory",
29
+ "agent-memory",
30
+ "ai-coding",
31
+ "multi-agent",
32
+ "llm",
33
+ "developer-tools",
34
+ "developer-productivity",
35
+ "cli",
36
+ "ty-context",
37
+ "workflow"
38
+ ],
39
+ "type": "module",
40
+ "bin": {
41
+ "ty-context": "dist/cli.js"
42
+ },
43
+ "files": [
44
+ "README.md",
45
+ "dist",
46
+ "assets",
47
+ "migrations",
48
+ "source-mappings.yaml"
49
+ ],
50
+ "scripts": {
51
+ "build": "node ../../tools/package_build_fingerprint.mjs build",
52
+ "typecheck": "tsc -p tsconfig.json --noEmit",
53
+ "test:default:built": "node ../../tests/ty-context/run-package-suite.mjs default",
54
+ "test:default": "npm run build && npm run test:default:built",
55
+ "test:built": "npm run test:default:built && npm run test:long-task-workflow:built",
56
+ "test:trust:built": "npm run test:default:built && npm run test:long-task-trust:built",
57
+ "test:trust": "npm run build && npm run test:trust:built",
58
+ "pretest": "npm run build",
59
+ "test": "npm run test:built",
60
+ "test:workflow-default:built": "node --test --test-concurrency=1 ../../tests/ty-context/workflow-contract-routing.test.mjs",
61
+ "test:delivery-contract:built": "node --test --test-concurrency=1 ../../tests/ty-context/long-task-compact-authoring.test.mjs ../../tests/ty-context/long-task-authoring-claims.test.mjs ../../tests/ty-context/long-task-authoring-preflight.test.mjs ../../tests/ty-context/long-task-authority-authoring-fields.test.mjs ../../tests/ty-context/long-task-playwright-ac-evidence.test.mjs ../../tests/ty-context/long-task-delivery-parser.test.mjs ../../tests/ty-context/long-task-delivery-compiler.test.mjs ../../tests/ty-context/long-task-delivery-risk.test.mjs ../../tests/ty-context/long-task-claim-coverage.test.mjs ../../tests/ty-context/long-task-closure-invariants.test.mjs ../../tests/ty-context/long-task-source-authority-closure.test.mjs ../../tests/ty-context/long-task-evidence-sensitivity-policy.test.mjs ../../tests/ty-context/long-task-global-evidence-sensitivity.test.mjs ../../tests/ty-context/long-task-source-risk-binding.test.mjs ../../tests/ty-context/long-task-non-completing-source.test.mjs ../../tests/ty-context/long-task-playwright-trust-boundary.test.mjs ../../tests/ty-context/long-task-planned-counterfactual.test.mjs ../../tests/ty-context/long-task-public-contract-example.test.mjs ../../tests/ty-context/long-task-release-tarball-contract.test.mjs ../../tests/ty-context/long-task-semantic-assurance-closure.test.mjs ../../tests/ty-context/long-task-semantic-drift-closure.test.mjs ../../tests/ty-context/long-task-semantic-drift-lifecycle.test.mjs ../../tests/ty-context/long-task-workspace-scope.test.mjs",
62
+ "test:delivery-contract": "npm run build && npm run test:delivery-contract:built",
63
+ "test:long-task-workflow:built": "node ../../tests/ty-context/run-package-suite.mjs long-task",
64
+ "test:long-task-workflow": "npm run build && npm run test:long-task-workflow:built",
65
+ "test:long-task-trust:built": "node ../../tests/ty-context/run-package-suite.mjs long-task-trust",
66
+ "test:long-task-trust": "npm run build && npm run test:long-task-trust:built",
67
+ "test:long-task-performance": "npm run build && node ../../tests/ty-context/long-task-performance.mjs",
68
+ "prepack": "npm run build"
69
+ },
70
+ "engines": {
71
+ "node": ">=24"
72
+ },
73
+ "dependencies": {
74
+ "@google/design.md": "^0.3.0",
75
+ "impeccable": "^3.2.1",
76
+ "re2js": "2.8.6",
77
+ "smol-toml": "1.7.0",
78
+ "yaml": "^2.9.0"
79
+ },
80
+ "devDependencies": {
81
+ "@types/node": "^26.1.1",
82
+ "typescript": "^7.0.2"
83
+ }
84
+ }