diff --git a/apps/memos-local-plugin/core/pipeline/memory-core.ts b/apps/memos-local-plugin/core/pipeline/memory-core.ts index 9ea444146..d5055d072 100644 --- a/apps/memos-local-plugin/core/pipeline/memory-core.ts +++ b/apps/memos-local-plugin/core/pipeline/memory-core.ts @@ -1804,6 +1804,7 @@ export function createMemoryCore( status: dto.status, sourceEpisodeIds: [], inducedBy: "import", + decisionGuidance: (dto as any).decisionGuidance ?? { preference: [], antiPattern: [] }, vec: null, createdAt: dto.createdAt ?? Date.now(), updatedAt: dto.updatedAt ?? Date.now(), diff --git a/apps/memos-local-plugin/core/skill/crystallize.ts b/apps/memos-local-plugin/core/skill/crystallize.ts index d5eb36843..fb2b6fe10 100644 --- a/apps/memos-local-plugin/core/skill/crystallize.ts +++ b/apps/memos-local-plugin/core/skill/crystallize.ts @@ -97,7 +97,11 @@ export async function crystallizeDraft( ], { op: "skill.crystallize", - schemaHint: "skill-crystallize.v2", + schemaHint: + 'skill-crystallize.v2\n{"name":"snake_case","display_title":"string","summary":"string","parameters":[{"name":"string","type":"string|number|boolean|enum","required":true,"description":"string"}],"preconditions":["string"],"steps":[{"title":"string","body":"string"}],"examples":[{"input":"string","expected":"string"}],"decision_guidance":{"preference":["string"],"anti_pattern":["string"]},"tags":["string"]}', + malformedRetries: 2, + temperature: 0, + maxTokens: 4096, }, ); const draft = normaliseDraft(rsp.value, input); diff --git a/apps/memos-local-plugin/package.json b/apps/memos-local-plugin/package.json index 9e9244cf1..a0bc9093f 100644 --- a/apps/memos-local-plugin/package.json +++ b/apps/memos-local-plugin/package.json @@ -35,7 +35,7 @@ "docs" ], "scripts": { - "build": "tsc -p tsconfig.json", + "build": "tsc -p tsconfig.build.json", "build:web": "vite build --config vite.config.ts", "build:site": "cd site && vite build", "build:all": "npm run build && npm run build:web && npm run build:site", diff --git a/apps/memos-local-plugin/tests/unit/skill/verifier.test.ts b/apps/memos-local-plugin/tests/unit/skill/verifier.test.ts index d74ac9d09..ba87e2f63 100644 --- a/apps/memos-local-plugin/tests/unit/skill/verifier.test.ts +++ b/apps/memos-local-plugin/tests/unit/skill/verifier.test.ts @@ -140,6 +140,35 @@ describe("skill/verifier", () => { expect(r.unmappedTokens).toContain("kubectl"); }); + it("does not count plain prose words as coverage tokens", () => { + const draft = makeDraft({ + summary: "Create modular storage backends with consistent interface", + steps: [ + { + title: "Implement storage backend", + body: "Create a modular implementation that mirrors JSONStore with load and save methods.", + }, + ], + }); + const evidence = [ + trace( + "tr_1", + "Add a YAML storage backend", + "Wrote YAMLStore mirroring JSONStore with load and save methods.", + ), + trace( + "tr_2", + "Verify storage files", + "Checked task_cli/storage/yaml_store.py and __init__.py exports.", + ), + ]; + const r = verifyDraft({ draft, evidence }, { log }); + expect(r.ok).toBe(true); + expect(r.unmappedTokens).not.toContain("modular"); + expect(r.unmappedTokens).not.toContain("interface"); + expect(r.unmappedTokens).not.toContain("implementation"); + }); + it("fails when there is no evidence at all", () => { const r = verifyDraft({ draft: makeDraft(), evidence: [] }, { log }); expect(r.ok).toBe(false); diff --git a/apps/memos-local-plugin/tsconfig.build.json b/apps/memos-local-plugin/tsconfig.build.json new file mode 100644 index 000000000..ed5c444f6 --- /dev/null +++ b/apps/memos-local-plugin/tsconfig.build.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "core/**/*.ts", + "agent-contract/**/*.ts", + "server/**/*.ts", + "bridge/**/*.ts", + "adapters/openclaw/**/*.ts", + "scripts/**/*.ts", + "site/scripts/**/*.ts", + "bridge.cts" + ], + "exclude": ["node_modules", "dist", "web", "site/src", "adapters/hermes", "tests"] +}