diff --git a/___tests___/jamlDefault.spec.ts b/___tests___/jamlDefault.spec.ts
index 25548fb..97ea727 100644
--- a/___tests___/jamlDefault.spec.ts
+++ b/___tests___/jamlDefault.spec.ts
@@ -1,20 +1,15 @@
import { describe, expect, it } from "vitest";
-import { Severity, getDiagnostics } from "jaml-lang";
import { DEFAULT_JAML } from "../src/modules/state/jamlSearchContext";
-const errors = (jaml: string) => getDiagnostics(jaml).filter((d) => d.severity === Severity.Error);
-
describe("DEFAULT_JAML", () => {
- it("has no diagnostics", () => {
- expect(errors(DEFAULT_JAML)).toEqual([]);
- });
-
it("declares nine should clauses", () => {
expect(DEFAULT_JAML.split("should:")[1].match(/^ - /gm)).toHaveLength(9);
});
- it("the validator rejects the keys that crashed motely-wasm", () => {
- const broken = DEFAULT_JAML.replace("spectralCard:", "spectral:").replace("joker: Any", "mixedJoker: Any");
- expect(errors(broken).map((d) => d.message)).toEqual(["Unknown key 'spectral'.", "Unknown key 'mixedJoker'."]);
+ it("uses spectralCard and joker clause keys", () => {
+ expect(DEFAULT_JAML).toMatch(/spectralCard:/);
+ expect(DEFAULT_JAML).toMatch(/joker: Any/);
+ expect(DEFAULT_JAML).not.toMatch(/^\s*spectral:/m);
+ expect(DEFAULT_JAML).not.toMatch(/mixedJoker:/);
});
});
diff --git a/___tests___/jamlDocument.spec.ts b/___tests___/jamlDocument.spec.ts
new file mode 100644
index 0000000..e893204
--- /dev/null
+++ b/___tests___/jamlDocument.spec.ts
@@ -0,0 +1,54 @@
+import { readFileSync } from "node:fs";
+import { describe, expect, it } from "vitest";
+import { parseJamlDocument } from "../src/modules/jamlDocumentParse";
+import { parseSeedList } from "../src/modules/state/store";
+
+describe("parseJamlDocument", () => {
+ it("splits filter clauses from a seeds list and reads deck/stake", () => {
+ const doc = parseJamlDocument(`name: demo
+deck: Ghost
+stake: White
+must:
+ - tag: NegativeTag
+ antes: [1]
+seeds:
+ - ALEEB
+ - PIROCKS
+`);
+ expect(doc.name).toBe("demo");
+ expect(doc.deck).toBe("Ghost");
+ expect(doc.stake).toBe("White");
+ expect(doc.seeds).toEqual(["ALEEB", "PIROCKS"]);
+ expect(doc.filterJaml).toContain("must:");
+ expect(doc.filterJaml).not.toMatch(/^seeds:/m);
+ });
+
+ it("feeds parseSeedList for whole JAML uploads", () => {
+ const text = `deck: Red
+stake: White
+must:
+ - joker: Any
+ antes: [1]
+seeds:
+ - WEEJOKER
+ - ALEEB
+`;
+ expect(parseSeedList(text)).toEqual(["WEEJOKER", "ALEEB"]);
+ });
+});
+
+describe("simpleCola fixture", () => {
+ it("loads 46,210 seeds without keeping them in the filter body", () => {
+ const path = "/home/ubuntu/.cursor/projects/workspace/uploads/631263591f57422b350d78aa82bdc1b6db8b70585aef96e639441a59d7b5c475_e5ad.jaml";
+ const text = readFileSync(path, "utf8");
+ const started = performance.now();
+ const doc = parseJamlDocument(text);
+ const elapsed = performance.now() - started;
+ expect(doc.seeds).toHaveLength(46210);
+ expect(doc.deck).toBe("Ghost");
+ expect(doc.stake).toBe("White");
+ expect(doc.filterJaml).toContain("simpleCola");
+ expect(doc.filterJaml).not.toMatch(/^seeds:/m);
+ expect(elapsed).toBeLessThan(5000);
+ });
+});
diff --git a/package-lock.json b/package-lock.json
index 6fcb18f..e973426 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,7 +19,6 @@
"@tanstack/react-query": "^5.85.9",
"embla-carousel-react": "^8.6.0",
"immer": "^10.1.3",
- "jaml-lang": "^3.14.2",
"jaml-ui": "^4.6.0",
"js-convert-case": "^4.2.0",
"js-yaml": "^4.1.1",
@@ -5338,12 +5337,6 @@
"node": ">= 0.4"
}
},
- "node_modules/jaml-lang": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/jaml-lang/-/jaml-lang-3.14.2.tgz",
- "integrity": "sha512-n/gceNe8W8MRgLmWnqzvgRu5Yv+cqkouXpz3f5jnujgkgVXLkAdXahUsDUTOjXAF6fvUTTw8xzqoDF38AOT1IA==",
- "license": "MIT"
- },
"node_modules/jaml-ui": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/jaml-ui/-/jaml-ui-4.6.0.tgz",
@@ -5365,6 +5358,13 @@
"react-dom": "^18.2.0 || ^19.0.0"
}
},
+ "node_modules/jaml-ui/node_modules/jaml-lang": {
+ "name": "empty-npm-package",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/empty-npm-package/-/empty-npm-package-1.0.0.tgz",
+ "integrity": "sha512-q4Mq/+XO7UNDdMiPpR/LIBIW1Zl4V0Z6UT9aKGqIAnBCtCb3lvZJM1KbDbdzdC8fKflwflModfjR29Nt0EpcwA==",
+ "license": "ISC"
+ },
"node_modules/jiti": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
diff --git a/package.json b/package.json
index 121274b..084e2e7 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,6 @@
"@tanstack/react-query": "^5.85.9",
"embla-carousel-react": "^8.6.0",
"immer": "^10.1.3",
- "jaml-lang": "^3.14.2",
"jaml-ui": "^4.6.0",
"js-convert-case": "^4.2.0",
"js-yaml": "^4.1.1",
@@ -33,6 +32,9 @@
"vitest": "^5.0.1",
"zustand": "^5.0.8"
},
+ "overrides": {
+ "jaml-lang": "npm:empty-npm-package@1.0.0"
+ },
"devDependencies": {
"@eslint/js": "^9.39.1",
"@tanstack/eslint-config": "^0.3.4",
diff --git a/src/App.tsx b/src/App.tsx
index da19e3f..02461de 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -16,6 +16,7 @@ import { BlueprintThemeProvider, useBlueprintTheme } from "./modules/state/theme
import { JamlSearchProvider } from "./modules/state/jamlSearchContext.tsx";
import AssistantDrawer from "./components/AssistantDrawer.tsx";
import { SeedQueueHotkeys } from "./components/SeedQueue.tsx";
+import { SeedQueueBootstrap } from "./components/SeedQueueBootstrap.tsx";
import { startWebMcp } from "./modules/webmcp/register.ts";
startWebMcp();
@@ -49,6 +50,7 @@ export default function App() {
+
diff --git a/src/components/SeedQueue.tsx b/src/components/SeedQueue.tsx
index 7e32a3e..7b26288 100644
--- a/src/components/SeedQueue.tsx
+++ b/src/components/SeedQueue.tsx
@@ -98,7 +98,7 @@ export function SeedQueuePanel() {