project-tiny-context-harness 0.2.66 → 0.2.67

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.
@@ -0,0 +1,241 @@
1
+ ---
2
+ name: superpowers-long-task
3
+ description: Use when directly invoked for Superpowers long-running task target prompt preparation.
4
+ ---
5
+
6
+ # Superpowers Long Task Skill
7
+
8
+ ## Package-Managed Boundary
9
+
10
+ This Skill is generated by `ty-context sync` and owned by the Harness package. Do not edit the generated `superpowers-long-task` Skill directly in a consumer project.
11
+
12
+ This is Tiny Context's adapter for feeding a complete acceptance packet into the external Superpowers workflow. It is not a Superpowers official schema and 不是 Superpowers 官方 schema. It only makes the target-mode prompt explicit enough that the official Superpowers skills can do their intended work without losing Tiny Context acceptance authority.
13
+
14
+ ## Purpose
15
+
16
+ Consumes a complete acceptance packet and emits a paste-ready Superpowers target-mode prompt. The input packet normally comes from `/normal-long-task`.
17
+
18
+ Use this Skill only after the implementation/source plan and full acceptance checklist already exist or are pasted in full. Do not generate, derive, rewrite, strengthen, or repair the full checklist in this Skill. If the checklist is incomplete, stop and send the user back to `/normal-long-task` or ask for the missing fields.
19
+
20
+ ## Direct Invocation
21
+
22
+ Use this Skill through explicit invocation:
23
+
24
+ ```text
25
+ /superpowers-long-task
26
+ ```
27
+
28
+ Do not rely on broad automatic keyword routing. Use `/normal-long-task` first when the implementation/source plan and full acceptance checklist do not already exist.
29
+
30
+ ## Use Cases
31
+
32
+ Use this Skill when a complete plan/checklist packet needs:
33
+
34
+ - Superpowers target-mode prompt.
35
+ - Superpowers goal-mode prompt.
36
+ - Superpowers 目标模式文本.
37
+ - Superpowers-compatible Codex target prompt.
38
+ - Maximum official Superpowers workflow value from an existing acceptance checklist.
39
+
40
+ Do not trigger merely because a plan mentions TDD or subagents. The user must ask for a Superpowers target/goal prompt or equivalent execution adapter.
41
+
42
+ ## Required Input Packet
43
+
44
+ The input must fully expose these fields:
45
+
46
+ - Original requirement source or original plan summary.
47
+ - implementation/source plan path or pasted text.
48
+ - full acceptance checklist path or pasted text.
49
+ - local audit path, normally `tmp/ty-context/plan-acceptance/<plan-slug>-local-audit.md`.
50
+ - relevant Context that must be read before execution.
51
+ - required tests / core paths.
52
+ - Evidence Layer Separation rules.
53
+ - Invalid Evidence Rules.
54
+ - Completion State Machine rules.
55
+ - UI-Facing Gate rules when any AC touches UI.
56
+ - hard blockers or an explicit no-blocker statement.
57
+
58
+ If any of these are missing required fields, stop. Do not generate the Superpowers target-mode prompt. Report the missing fields and say whether they belong in the development plan, full checklist, local audit rule, blocker section or Context reference.
59
+
60
+ ## Source Roles
61
+
62
+ - Original requirement source prevents implementation/source plan or checklist shrinkage.
63
+ - implementation/source plan is execution direction, not proof.
64
+ - full acceptance checklist is the highest-priority completion standard.
65
+ - local audit records progress, evidence, blockers and invalidating evidence only; it is not proof.
66
+ - relevant Context remains the durable repo intent and boundary source.
67
+ - required tests / core paths bind AC gaps to executable verification.
68
+
69
+ Do not let a compact target prompt override the full checklist. The compact prompt is direction, priority and recovery navigation only. The full checklist wins conflicts.
70
+
71
+ ## Evidence Layer Separation
72
+
73
+ Keep these layers separate in the prompt when relevant:
74
+
75
+ - code implemented.
76
+ - runtime configured.
77
+ - runtime exercised.
78
+ - artifact generated.
79
+ - artifact accepted by validator.
80
+ - API/UI reflected or API/UI reflects accepted evidence.
81
+ - browser or user path verified.
82
+ - final gate/check command passed.
83
+
84
+ An AC cannot be complete when its required layer is missing.
85
+
86
+ ## Invalid Evidence Rules
87
+
88
+ The prompt must reject false proof:
89
+
90
+ - viewmodel-only does not prove a real page.
91
+ - unit test does not prove real API behavior or latency.
92
+ - artifact exists does not prove artifact accepted by validator.
93
+ - old result does not prove current state.
94
+ - build passes does not prove product acceptance.
95
+ - stale, partial, smoke-only, dry-run or research evidence cannot prove full completion.
96
+ - unresolved API/UI/data/test contradictions invalidate completion claims.
97
+
98
+ ## Completion State Machine
99
+
100
+ Every AC starts as `unknown / not_run`.
101
+
102
+ Only fresh required evidence can mark an AC complete.
103
+
104
+ Any fresh browser / API / runtime / data / test contradiction must downgrade the affected AC and overall status and must be recorded as invalidating evidence. Do not preserve a previous complete status after contradictory fresh evidence appears.
105
+
106
+ ## UI-Facing Gate
107
+
108
+ For UI-facing acceptance, the executor must open the real page path and confirm the user-visible state matches the AC. component / viewmodel / mock / unit test evidence is auxiliary unless the full checklist explicitly says otherwise.
109
+
110
+ ## Official Superpowers Binding
111
+
112
+ Bind the target prompt to the official Skill names and their documented roles:
113
+
114
+ - If the implementation/source plan is not bite-sized enough, use `superpowers:writing-plans`.
115
+ - Prefer `superpowers:subagent-driven-development` when subagents are available.
116
+ - Use `superpowers:executing-plans` when executing a written plan without the same-session subagent workflow.
117
+ - AC gap -> TDD: every behavior acceptance gap uses `superpowers:test-driven-development` to write a failing test, observe failure, then implement minimally.
118
+ - Before any completion claim, use `superpowers:verification-before-completion` against the full checklist and fresh evidence.
119
+ - review / finish cannot override the full checklist; if the checklist is unsatisfied, continue implementation or report blockers.
120
+
121
+ If Superpowers is missing, install it through the current platform's official Superpowers installation path. If installation is blocked by permissions, network or platform limits, record the blocker in local audit and do not count it as complete.
122
+
123
+ ## Local Audit Requirements
124
+
125
+ The Superpowers target prompt must require the future executor to update local audit after each round with:
126
+
127
+ - overall status.
128
+ - each AC status and current evidence.
129
+ - command/result/time and failure reason.
130
+ - required test command/result/failure.
131
+ - artifact or evidence paths.
132
+ - blockers, missing evidence and acceptance impact.
133
+ - deferred or narrowed scope.
134
+ - stale, partial, smoke, dry-run, research or other invalid evidence.
135
+
136
+ The local audit is not Context, not proof, not a global task manager, and not a replacement for project tests, CI, review, human acceptance, Task Contract or workflow-contract `plan.md`.
137
+
138
+ ## Prompt Generation Rules
139
+
140
+ - The prompt must visibly output `Superpowers 输入包` for Chinese prompts or `Superpowers input packet` for English prompts.
141
+ - The prompt must visibly output `Superpowers 执行绑定` for Chinese prompts or `Superpowers execution binding` for English prompts.
142
+ - The prompt must identify plan path, full checklist path and local audit path at the top.
143
+ - The prompt must state that the full checklist is the complete acceptance standard and wins conflicts.
144
+ - The prompt must preserve hard-blocker semantics: if only locally unsatisfiable hard blockers remain, pause for the user or external owner instead of marking complete.
145
+ - The prompt must include the resource lifecycle line: `可多开agent,agent名额不够了就关掉不用的。` or `You may use multiple agents; if agent slots run low, close idle or unnecessary agents.`
146
+ - The prompt must fit 3850 characters including line breaks.
147
+ - Do not include explanatory preface inside the generated prompt.
148
+
149
+ Recommended compact Chinese prompt shape:
150
+
151
+ ```text
152
+ 实施计划: tmp/ty-context/plan-acceptance/<plan-slug>.md(source/implementation plan,非验收证明)
153
+ 完整验收清单: tmp/ty-context/plan-acceptance/<plan-slug>-acceptance-checklist.md(该文件是完整验收标准,验收以这个为准。完成前必须逐项检查,不满足则继续实现。)
154
+ 执行审计: tmp/ty-context/plan-acceptance/<plan-slug>-local-audit.md(临时 progress state,非 Context/proof)
155
+ 可多开agent,agent名额不够了就关掉不用的。
156
+ 本摘要只负责 direction/priority/recovery navigation;允许与完整 checklist 重叠,冲突时以完整 checklist 为准。This is not a Superpowers official schema / 不是 Superpowers 官方 schema。
157
+ Superpowers 输入包:
158
+ - 原始需求源/原始方案摘要:防止计划/checklist 缩水
159
+ - 实施计划:执行方向;不够 bite-sized 时用 superpowers:writing-plans
160
+ - 完整验收清单:最高优先级完成标准;completion gate 以它为准
161
+ - local audit:只记 progress/evidence/blocker/invalidating evidence,非 proof
162
+ - relevant Context:执行前读取;冲突按完整 checklist 和 Context 规则处理
163
+ - required tests / core paths:把每个 AC gap 绑定到测试、API/UI/runtime/browser 验证
164
+
165
+ 如果 Superpowers 未安装,先按当前平台 official Superpowers installation path 安装;若 installation is blocked by 权限/网络/平台限制,写入 audit,不得算完成。
166
+ Superpowers 执行绑定:
167
+ - 先读完整验收清单,验收以它为准
168
+ - 计划不够可执行时,用 superpowers:writing-plans 转成 bite-sized implementation plan
169
+ - 有 subagent 支持时优先用 superpowers:subagent-driven-development;否则用 superpowers:executing-plans
170
+ - AC gap -> TDD:每个行为验收缺口先用 superpowers:test-driven-development write a failing test 并 observe failure,再写最小实现
171
+ - 完成声明前用 superpowers:verification-before-completion 按完整 checklist 和 fresh evidence 做 gate
172
+ - review / finish cannot override the full checklist;不满足则继续实现或报告 blocker
173
+ - 每轮后更新 audit:AC status、证据、命令/结果/时间、required test command/result/failure、evidence path、blocker、deferred/narrowed scope、无效证据
174
+
175
+ 状态机:AC 初始 unknown / not_run;只有 fresh required evidence 才能 complete;任何 fresh browser / API / runtime / data / test contradiction 必须 downgrade the affected AC and overall status,并记录 invalidating evidence。
176
+ UI-Facing Gate:UI 验收必须打开 real page path 且用户可见状态匹配;component / viewmodel / mock / unit test 只算辅助证据,除非完整 checklist 明确说明。
177
+ 禁止完成于:只改代码/计划、只跑部分测试、旧或部分证据、runtime 未配置/未演练、artifact 未被 validator accepted、API/UI 未 reflected、强卡点未解除、API/UI/data/test 矛盾。
178
+ ```
179
+
180
+ Recommended compact English prompt shape:
181
+
182
+ ```text
183
+ Plan: tmp/ty-context/plan-acceptance/<plan-slug>.md (implementation/source plan, not acceptance proof)
184
+ Full checklist: tmp/ty-context/plan-acceptance/<plan-slug>-acceptance-checklist.md (complete acceptance standard; judge against it; check every item before completion)
185
+ Local audit: tmp/ty-context/plan-acceptance/<plan-slug>-local-audit.md (temporary progress state, not Context or proof)
186
+ You may use multiple agents; if agent slots run low, close idle or unnecessary agents.
187
+ This summary is direction/priority/recovery only; overlap is allowed and the full checklist wins conflicts. This is not a Superpowers official schema / 不是 Superpowers 官方 schema.
188
+ Superpowers input packet:
189
+ - Source/original requirement: prevents plan/checklist shrinkage.
190
+ - Plan: execution direction; if not bite-sized, use superpowers:writing-plans.
191
+ - Full checklist: acceptance authority and completion gate.
192
+ - Local audit: progress/evidence/blockers/invalidating evidence only; not proof.
193
+ - Relevant Context: read before execution; resolve conflicts through checklist + Context.
194
+ - Required tests/core paths: map AC gaps to test/API/UI/runtime/browser evidence.
195
+
196
+ If Superpowers is missing, install it through the current platform's official Superpowers installation path; if installation is blocked by permissions/network/platform, record in audit and do not count as complete.
197
+ Superpowers execution binding:
198
+ - Read the full checklist first; acceptance is judged against it.
199
+ - Use superpowers:writing-plans if the plan is not executable enough.
200
+ - Prefer superpowers:subagent-driven-development with subagents; otherwise use superpowers:executing-plans.
201
+ - AC gap -> TDD: every behavior acceptance gap first uses superpowers:test-driven-development to write a failing test, observe failure, then implement minimally.
202
+ - Before any completion claim, use superpowers:verification-before-completion against fresh evidence.
203
+ - review / finish cannot override the full checklist; if unsatisfied, continue or report blockers.
204
+ - After each round update audit: AC status, evidence, command/result/time, required test command/result/failure, evidence paths, blockers, deferred/narrowed scope, invalid evidence.
205
+
206
+ State machine: ACs start unknown / not_run; only fresh required evidence can mark complete; any fresh browser / API / runtime / data / test contradiction downgrades the affected AC and overall status and is invalidating evidence.
207
+ UI-Facing Gate: open the real page path and confirm visible state; component / viewmodel / mock / unit test evidence is auxiliary unless checklist says otherwise.
208
+ Never complete on: code-only, plan-only, partial tests, stale/partial evidence, unconfigured/unexercised runtime, artifact not accepted by validator, API/UI not reflected, hard blockers, or API/UI/data/test contradictions.
209
+ ```
210
+
211
+ Before final response, check the prompt length. If it exceeds 3850 characters, tighten wording while preserving paths, input roles, official Superpowers skill names, state machine, UI gate, blockers and invalid evidence.
212
+
213
+ ## Final Response Requirements
214
+
215
+ When successful, return:
216
+
217
+ - The implementation/source plan path.
218
+ - The full checklist path.
219
+ - The local audit path.
220
+ - Whether required input was complete.
221
+ - The paste-ready Superpowers target-mode prompt in a code block.
222
+
223
+ When blocked, return:
224
+
225
+ - Missing required fields.
226
+ - Which source should provide each missing field.
227
+ - A clear statement that no Superpowers target-mode prompt was generated.
228
+
229
+ Do not claim any AC has passed unless the user explicitly asked for current completion audit and current evidence was inspected.
230
+
231
+ ## Forbidden Behaviors
232
+
233
+ Do not generate, derive, rewrite, strengthen, or repair the full checklist.
234
+
235
+ Do not execute the generated prompt.
236
+
237
+ Do not mark any goal complete.
238
+
239
+ Do not hide missing source files, ambiguous scope, weak evidence or blockers.
240
+
241
+ Do not include business-domain logic, concrete provider names, API names, UI names, artifact schemas or one-off project details in this package-managed Skill.
@@ -82,7 +82,7 @@ export function helpText() {
82
82
  export-context --code [--output tmp/ty-context/context-exports/<name>.md] [--check]
83
83
  export-context --all [--check]
84
84
  export-context --code-index [--profile <id>] [--include-code <path-or-glob>] [--check]
85
- export-context --source-pack [--profile <id>] [--bundle-strategy auto|area|topdir|config] [--max-pack-files 5] [--max-bundle-characters <n>] [--redaction-strict] [--prune <count>] [--check]
85
+ export-context --source-pack [--profile <id>] [--bundle-strategy auto|area|topdir|config] [--max-pack-files 5] [--max-bundle-characters <n>] [--redaction-strict] [--check]
86
86
  export-context --code-bundles [--profile <id>] [--include-code <path-or-glob>] [--max-pack-files 5] [--check]
87
87
  export-context --task-context <name> [--profile <id>] [--include-context <path-or-glob>] [--include-code <path-or-glob>] [--max-pack-files 5] [--redaction-strict] [--check]
88
88
 
@@ -90,7 +90,7 @@ Creates temporary Markdown artifacts for copying or external-tool ingestion.
90
90
  --full exports the project Context summary as a full-project-context artifact.
91
91
  --code exports one current implementation snapshot as a code-level-implementation artifact.
92
92
  --all exports both default artifacts in one command.
93
- Source Pack modes write timestamped directories plus latest/ under tmp/ty-context/context-exports/**.
93
+ Source Pack modes write only tmp/ty-context/context-exports/latest/ and remove old timestamped rounds.
94
94
  --source-pack and --task-context are bounded to at most 5 files; --max-pack-files cannot exceed 5.
95
95
  Profiles are export selectors read from <harnessRoot>/config.yaml; verification entries are listed, not executed.
96
96
  Secret redaction is always enabled; --redaction-strict fails if redaction was required.
@@ -1,5 +1,5 @@
1
1
  import path from "node:path";
2
- import { artifactReport, buildManifest, pruneTimestampedExports, readPackageVersion, timestampForFile, writeArtifactSet } from "./source-pack-manifest.js";
2
+ import { artifactReport, buildManifest, pruneTimestampedExports, readPackageVersion, writeArtifactSet } from "./source-pack-manifest.js";
3
3
  import { mergePatterns, parseContextAreas, readSourcePackProfile, validatePatternList } from "./source-pack-config.js";
4
4
  import { collectCodeRecords, collectContextArtifacts, countRedactionWarnings, repoRelative } from "./source-pack-records.js";
5
5
  import { renderBundleArtifact, renderCodeIndexArtifact, renderFullProjectContextArtifact, renderTaskContextArtifact } from "./source-pack-render.js";
@@ -10,8 +10,7 @@ export async function runSourcePackExport(projectRoot, options) {
10
10
  const maxPackFiles = options.maxPackFiles ?? DEFAULT_MAX_PACK_FILES;
11
11
  validateMaxPackFiles(options.mode, maxPackFiles);
12
12
  const now = options.now ?? new Date();
13
- const timestamp = timestampForFile(now);
14
- const timestampDir = path.join(projectRoot, ...DEFAULT_EXPORT_DIR.split("/"), timestamp);
13
+ const outputDir = path.join(projectRoot, ...DEFAULT_EXPORT_DIR.split("/"), "latest");
15
14
  const generatedAt = now.toISOString();
16
15
  const warnings = [];
17
16
  const areas = await parseContextAreas(projectRoot);
@@ -30,7 +29,7 @@ export async function runSourcePackExport(projectRoot, options) {
30
29
  const taskName = options.taskName ?? "";
31
30
  const command = options.command ?? commandFor(options);
32
31
  const toolVersion = await readPackageVersion();
33
- const recommendedUploadSets = uploadSets(options.mode, timestamp, taskName);
32
+ const recommendedUploadSets = uploadSets(options.mode, taskName);
34
33
  const artifacts = [];
35
34
  if (options.mode === "code-index" || options.mode === "source-pack" || options.mode === "code-bundles" || options.mode === "task-context") {
36
35
  assignBundles(records, maxBundleCharacters, bundleStrategy);
@@ -47,13 +46,13 @@ export async function runSourcePackExport(projectRoot, options) {
47
46
  }
48
47
  const omitted = omittedSummary(records);
49
48
  const nonManifestArtifacts = artifacts.slice();
50
- const manifestPath = `${DEFAULT_EXPORT_DIR}/${timestamp}/source-pack-manifest.json`;
49
+ const manifestPath = `${DEFAULT_EXPORT_DIR}/latest/source-pack-manifest.json`;
51
50
  const manifest = await buildManifest({
52
51
  projectRoot,
53
52
  generatedAt,
54
53
  command,
55
54
  maxPackFiles,
56
- artifacts: nonManifestArtifacts.map((artifact) => ({ ...artifact, relativePath: `${DEFAULT_EXPORT_DIR}/${timestamp}/${artifact.name}` })),
55
+ artifacts: nonManifestArtifacts.map((artifact) => ({ ...artifact, relativePath: `${DEFAULT_EXPORT_DIR}/latest/${artifact.name}` })),
57
56
  warnings,
58
57
  omitted,
59
58
  recommendedUploadSets
@@ -69,7 +68,7 @@ export async function runSourcePackExport(projectRoot, options) {
69
68
  });
70
69
  for (const artifact of artifacts) {
71
70
  if (!artifact.relativePath) {
72
- artifact.relativePath = `${DEFAULT_EXPORT_DIR}/${timestamp}/${artifact.name}`;
71
+ artifact.relativePath = `${DEFAULT_EXPORT_DIR}/latest/${artifact.name}`;
73
72
  }
74
73
  }
75
74
  if (artifacts.length > maxPackFiles) {
@@ -80,15 +79,13 @@ export async function runSourcePackExport(projectRoot, options) {
80
79
  throw new Error(`export-context --redaction-strict found ${redactionCount} redaction warning(s)`);
81
80
  }
82
81
  if (!options.check) {
83
- await writeArtifactSet(projectRoot, timestampDir, artifacts);
84
- if (options.prune !== undefined) {
85
- await pruneTimestampedExports(projectRoot, options.prune);
86
- }
82
+ await writeArtifactSet(projectRoot, outputDir, artifacts);
83
+ await pruneTimestampedExports(projectRoot, 0);
87
84
  }
88
85
  return {
89
86
  mode: options.mode,
90
- outputDirectory: timestampDir,
91
- outputRelativePath: repoRelative(projectRoot, timestampDir),
87
+ outputDirectory: outputDir,
88
+ outputRelativePath: repoRelative(projectRoot, outputDir),
92
89
  artifacts: artifacts.map(artifactReport),
93
90
  sourceFiles: records.map((record) => record.relative),
94
91
  sourceCodeCount: records.length,
@@ -184,8 +181,8 @@ function markdownArtifact(kind, name, content, sourceCount, sourceLineCount, war
184
181
  function meta(generatedAt, artifactName, command, toolVersion) {
185
182
  return { generatedAt, outputPath: `tmp/ty-context/context-exports/latest/${artifactName}`, command, toolVersion };
186
183
  }
187
- function uploadSets(mode, timestamp, taskName) {
188
- const base = `${DEFAULT_EXPORT_DIR}/${timestamp}`;
184
+ function uploadSets(mode, taskName) {
185
+ const base = `${DEFAULT_EXPORT_DIR}/latest`;
189
186
  const sets = {
190
187
  daily_planning: [`${base}/full-project-context.md`, `${base}/code-index.md`],
191
188
  cross_module_review: [`${base}/full-project-context.md`, `${base}/code-index.md`, `${base}/code-bundle-core.md`, `${base}/code-bundle-extended.md`],
@@ -19,7 +19,7 @@ export declare function buildManifest(params: {
19
19
  recommendedUploadSets: Record<string, string[]>;
20
20
  }): Promise<string>;
21
21
  export declare function artifactReport(artifact: PendingArtifact): SourcePackArtifactReport;
22
- export declare function writeArtifactSet(projectRoot: string, timestampDir: string, artifacts: PendingArtifact[]): Promise<void>;
22
+ export declare function writeArtifactSet(projectRoot: string, outputDir: string, artifacts: PendingArtifact[]): Promise<void>;
23
23
  export declare function pruneTimestampedExports(projectRoot: string, keepCount: number): Promise<void>;
24
24
  export declare function timestampForFile(now: Date): string;
25
25
  export declare function readPackageVersion(): Promise<string>;
@@ -35,11 +35,13 @@ export function artifactReport(artifact) {
35
35
  warning_count: artifact.warningCount
36
36
  };
37
37
  }
38
- export async function writeArtifactSet(projectRoot, timestampDir, artifacts) {
39
- const latestDir = path.join(projectRoot, "tmp", "ty-context", "context-exports", "latest");
40
- await writeArtifacts(projectRoot, timestampDir, artifacts);
41
- await fs.rm(latestDir, { recursive: true, force: true });
42
- await writeArtifacts(projectRoot, latestDir, artifacts);
38
+ export async function writeArtifactSet(projectRoot, outputDir, artifacts) {
39
+ const outputRelative = repoRelative(projectRoot, outputDir);
40
+ if (!outputRelative.startsWith("tmp/ty-context/context-exports/")) {
41
+ throw new Error("Source Pack output directory must stay under tmp/ty-context/context-exports/**");
42
+ }
43
+ await fs.rm(outputDir, { recursive: true, force: true });
44
+ await writeArtifacts(projectRoot, outputDir, artifacts);
43
45
  }
44
46
  export async function pruneTimestampedExports(projectRoot, keepCount) {
45
47
  if (!Number.isInteger(keepCount) || keepCount < 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-tiny-context-harness",
3
- "version": "0.2.66",
3
+ "version": "0.2.67",
4
4
  "description": "Minimal project memory and validation harness for AI coding agents.",
5
5
  "license": "MIT",
6
6
  "author": "Seven128",