diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1129ee143..9183459c4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,10 +27,10 @@ bun test Before submitting changes, run the full check suite: ```bash -bun run typecheck # TypeScript strict mode check +bun run typecheck # Workspace typecheck (includes the daemon backlog tracked in #969) bun run lint # Biome static analysis bun run format # Biome auto-format -bun test # All tests +bun test # All maintained repository tests (excludes vendored references/) ``` Common local loops: @@ -149,9 +149,15 @@ Conventions **Package manager:** Bun everywhere. Do not use npm or pnpm. **Linting and formatting:** Biome. Run `bun run lint` and -`bun run format` before committing. CI will enforce this. - -**TypeScript:** Strict mode is enforced by convention. Specifically: +`bun run format` before committing. The mandatory CI enforcement is delivered +by the follow-up quality-gates PR. + +**TypeScript:** `strict` and `noUncheckedIndexedAccess` are the shared baseline +for configs that extend the root `tsconfig.json`. The daemon has a known +typecheck backlog tracked in [#969](https://github.com/Signet-AI/signetai/issues/969) +and remains a visible, non-blocking check until that backlog is cleared. All +other TypeScript changes must preserve the applicable strict configuration. +Specifically: no `any` (use `unknown` with narrowing), no `as` casts (fix the types), no non-null assertions (`!`), explicit return types on all exported functions, `readonly` where mutation is not intended, `as const` unions diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index d287eeb57..d55a61272 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -36,10 +36,10 @@ bun test Before submitting changes, run the full check suite: ```bash -bun run typecheck # TypeScript strict mode check +bun run typecheck # Workspace typecheck (includes the daemon backlog tracked in #969) bun run lint # Biome static analysis bun run format # Biome auto-format -bun test # All tests +bun test # All maintained repository tests (excludes vendored references/) ``` Common local loops: @@ -158,9 +158,15 @@ Conventions **Package manager:** Bun everywhere. Do not use npm or pnpm. **Linting and formatting:** Biome. Run `bun run lint` and -`bun run format` before committing. CI will enforce this. - -**TypeScript:** Strict mode is enforced by convention. Specifically: +`bun run format` before committing. The mandatory CI enforcement is delivered +by the follow-up quality-gates PR. + +**TypeScript:** `strict` and `noUncheckedIndexedAccess` are the shared baseline +for configs that extend the root `tsconfig.json`. The daemon has a known +typecheck backlog tracked in [#969](https://github.com/Signet-AI/signetai/issues/969) +and remains a visible, non-blocking check until that backlog is cleared. All +other TypeScript changes must preserve the applicable strict configuration. +Specifically: no `any` (use `unknown` with narrowing), no `as` casts (fix the types), no non-null assertions (`!`), explicit return types on all exported functions, `readonly` where mutation is not intended, `as const` unions diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index b92ea3afb..94325f46c 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -10,136 +10,131 @@ section: "Project" Roadmap === -This is the public roadmap for Signet, updated manually as priorities -shift. It captures what we're actively building, what's committed next, -and what we're still shaping. For implementation sequencing, dependency -contracts, and status truth, see [Spec Index](specs/INDEX.md). +Updated 2026-07-23. This gets updated as priorities shift. -Status markers: `[done]` shipped, `[wip]` in progress, `[next]` planned, -`[stub]` intentionally tracked but not fully planned, `[idea]` exploring. +What the markers mean: `[done]` shipped, `[wip]` working on it now, `[next]` next in line, `[backlog]` want to do it but not yet scheduled. +--- + +What we're building now + +--- + +The core memory system works. The pipeline drains. Recall is fast. What's missing is the part where normal people can install it and not feel lost. + +**[wip] Dashboard redesign (#948)** + +The old dashboard was never given a proper design pass. It grew piece by piece without a plan. We're replacing it completely. + +The new one is React 19 with shadcn/ui and Geist fonts. One design, light and dark mode, system-default. The design is already locked -- there's an HTML mockup at `surfaces/dashboard/redesign-home-mockup.html`. The React build has to match it pixel for pixel. First milestone proves the build works inside Electron. After that, every page gets rebuilt: home, memory browsing, settings, harness config, sources, journal. + +**[wip] Desktop app (#1001)** + +Right now Signet is a command-line tool. That works for developers. It doesn't work for everyone else. + +The desktop app is an Electron shell that wraps the same compiled binary headless installs use. It manages the daemon in the background, shows a tray icon, and updates itself. Ships as .dmg, .exe, and .AppImage from GitHub releases. No app store. + +Headless installs (`npm i -g signetai`, curl-install) still work. The data lives in `~/.agents/` no matter how you install it, so switching from headless to desktop is seamless -- the desktop app detects your existing setup and adopts it. + +**[wip] Config system that doesn't suck** + +The router blocks targets with opaque error messages. The privacy check for local models is broken. Old config fields get left behind after migration. These all came up during real use and need to be fixed before the settings panel in the dashboard can ship. + +**[next] Setup wizard (#967)** + +New users shouldn't have to hand-edit a YAML file to get started. The wizard walks through harness connections, inference targets, and workspace setup. + +**[next] Transcript export (#984)** + +Export session transcripts in a format suitable for training. Powers the dataset work below. + +--- + +Making the pipeline coherent + +--- + +Extraction works, but the architecture between the pipeline and dreaming is tangled. Both should draw from the same queue and produce the same kind of graph changes, so users can pick whichever approach fits their hardware. + +**[wip] Unify pipeline and dreaming (#913)** + +One queue for everything -- summaries, transcripts, imported content. Pipeline distillation and agentic dreaming both read from it and write to the same graph operations. You turn one on, you turn the other off, or you run both. The system doesn't care. + +**[next] Dreaming as a proper agent inside the daemon (#947 B)** + +Pi is a TypeScript library that gives us auth, model selection, and 30+ providers out of the box. Embedding it in the daemon means the dreaming agent gets real graph tools and produces runbook logs. Replaces the current fragile chain of five separate LLM calls with a single agent that can wander the graph, check its assumptions, and write back. + +**[next] Temporal claims (#945)** + +When someone saves "going to Venezuela in March," the system should remember to follow up when March passes. A `review_after` timestamp on the memory makes this possible without scanning everything. + +**[next] Cross-agent notifications (#944)** + +Messages that jump between agent sessions in different harnesses without polling. Each harness declares which hooks it exposes. The module routes through the next available one. -Current Focus (0.124.x) --- -- [wip] Public positioning and documentation correctness - - align README, docs, and website language around portable agent state, - local ownership, source truth, and behavioral context portability -- [wip] Source-native substrate - - preserve source artifacts as ground truth, derive semantic memory with - provenance, and make claims rebuildable from their evidence -- [wip] Source events as agent triggers - - treat sources as live event surfaces, not only passive recall inputs: - events should carry source truth, policy, context, and a result artifact -- [wip] Skills over substrate - - keep deterministic substrate in Signet and move repeated cognition into - loadable, inspectable, portable skills with their own working trails -- [wip] Proving-ground loop - - use one source ecosystem, one recurring job-to-be-done, one visible - metric, and one tight loop where bad memory visibly hurts -- [wip] Reliability and performance as product integrity - - reduce daemon fragility, runtime cost, and resource waste because local - ownership should not push access debt back onto users -- [wip] Authority, permissions, and secrets boundary - - agent-blind secrets, RBAC, token policy, rate limits, capability scoping, - and source-backed authority across protocols and MCP tools - - -Planned Next +Cloud, scale, and the long tail + --- -- [next] Universal source layer - - make it easy for an agent to connect Obsidian, repos, transcripts, - Discord, Fitbit, servers, devices, and other sources through one common - source-artifact contract -- [next] Pipeline V3 as skills over substrate - - run scheduled and event-triggered skill sessions over source artifacts, - transcripts, failures, and prior decisions; emit proposed graph, memory, - identity, skill, source, or authority changes with provenance -- [next] Dreaming as background semantic QA - - judge memory maintenance by downstream behavior: fewer repeated - investigations, fewer repeated mistakes, cleaner source-backed memory, - better entity density, and visible mutation diffs -- [next] Obsidian proving ground - - harden the clipping-to-literature workflow as the first bathtub: raw - source, adversarial intake, provenance, synthesis, backlinks, indexes, - operations logs, skill formation, and user taste in one inspectable loop -- [next] Hermes Agent production hardening - - validate real install flows, gateway session routing, and cross-platform - memory continuity; borrow the stronger skill layer where it fits Signet -- [next] Capability-scoped tool permissions - - distinguish read-only, destructive, credentialed, and approval-gated - actions across harnesses and MCP tools -- [next] Signet Cloud baseline inference and sync - - keep the open-source product complete while exploring managed sync, - background inference, and stronger embedding models as hosted help -- [next] Rust daemon parity + primary runtime cutover - - parity first, cutover second, with divergence logging, rollback paths, - and performance wins validated before the TypeScript daemon gives way - - -Strategic Stub Backlog (tracked, planning incomplete) +The cloud is not a replacement for the local product. It's optional infrastructure the daemon connects to if you want it. The app is free and local. You pay for sync and hosted services on top. Same model as Obsidian. + +**[backlog] Cloud inference API (#647, #1001)** + +Background pipeline tasks run on cloud GPUs instead of your local machine. Small free monthly allowance. Paid tier (~$4-8/mo) for more. Separate private repo. + +**[backlog] Cross-device sync** + +Memory, config, and sources sync between your machines. The daemon opens an outbound connection to the relay. No firewall issues. + +**[backlog] Full hosted daemon** + +The daemon runs in the cloud so your background pipeline keeps going even when your laptop is closed. Not for v1. + +**[backlog] Training dataset and reasoning model** + +Fine-tune a small reasoning model from 20k collected conversations. PII sanitized. Mythos-style reasoning traces for extraction and synthesis. Open source the dataset. + --- -- [stub] Behavioral context portability / OAS working draft - - define export/import expectations for identity, memory, provenance, - skills, source metadata, and secrets metadata without tying the standard - to one harness -- [stub] Distributed harness and multi-remote orchestration -- [stub] Remember/Recall skill parity refresh with current schema -- [stub] Per-user neural query surface - - train a disposable small model on a user's artifact history as a future - query layer, while keeping source artifacts underneath as ground truth -- [stub] Deep memory search as an optional escalation path - - multi-agent or LLM-assisted search only when primary retrieval cannot - answer with enough confidence -- [stub] MCP CLI bridge + usage analytics in dashboard - - reference direction: MC Porter-style command visibility -- [stub] Git-based marketplace monorepo for skills + MCP servers - - GitHub-authenticated PR publishing/reviews, JSON review artifacts -- [stub] Adaptive skill lifecycle - - usage tracking, maintenance suggestions, and procedural memory links -- [stub] Cryptographic identity roadmap - - agent passports, artifact signing, and verifiable identity without - requiring a specific chain or vendor identity provider -- [stub] Plugin API + app ecosystem integrations - - dashboard and CLI surfaces for third-party integrations -- [stub] Unified realtime constellation / embedding / entity viewer - - replace slow current 3D path and make provenance inspectable by default -- [stub] Dashboard IA refactor - - settings as standalone page, breadcrumb-first navigation model -- [stub] Post-install behavior migration audit - - ensure daemon/CLI own critical install flows consistently - - -Recently Shipped +Operations + --- -- [done] Readable changelog generation and release-note correctness - - release entries now use the bumped version and include a highlights - layer plus exact release ledger -- [done] Workspace source checkout sync - - managed source checkout, clean-branch update behavior, and watcher - ignore coverage -- [done] Connector expansion and hardening - - Hermes Agent integration, OpenClaw runtime - hardening, and request normalization -- [done] Recall surface alignment - - CLI, MCP, SDK, and hook recall paths now share more of the same filter - and response contract -- [done] Documentation site quality pass - - section-aware docs search, normal markdown link rewriting, TOC fixes, - and clearer contributor/user workflow docs -- [done] Multi-agent support baseline - - roster/scoping/runtime routing foundation complete; polish phases remain - active in current focus - - -Notes +**[wip] Strict quality gates (#919)** + +Make lint, typecheck, and test gates mandatory across TypeScript and Rust. Clear the backlog so the gate can go hard-required. + +**[wip] Release pipeline** + +Nightly releases produce all three distribution artifacts (npm package, compiled binary, desktop installer). Non-blocking CI. Daemon-rs parity is follow-up, not a merge gate. + +**[next] Status clarity (#908)** + +Status currently mixes up configured, resolved, effective, and running states. Needs to be cleaner. + +**[next] Raspberry Pi target (#921)** + +Test and optimize for Pi 3B+. Target idle RSS under 100MB. + --- -- The old predictor-centered roadmap is retired as a public framing. Learned - ranking can remain experimental, but Signet's product claim is portable - agent state with inspectable extraction, provenance, and context selection. -- This roadmap is directional. [Spec Index](specs/INDEX.md) remains - the execution contract and dependency source of truth. +Recently shipped + +--- + +- **[done]** Inference cutover to pi-ai + ACPX (#947 / #949). All hand-rolled providers deleted. -5853 lines of code. +- **[done]** Distribution model spec (#1001). Three install shapes, cloud architecture, locked. +- **[done]** Dashboard redesign HTML mockup. The design spec for the React rewrite. +- **[done]** Multi-agent support baseline. +- **[done]** Connector expansion (Hermes Agent, OpenClaw). +- **[done]** Readable changelog and release notes. +- **[done]** Recall alignment across CLI, MCP, SDK, and hooks. +- **[done]** Documentation site improvements. + +--- + +What changed from the old roadmap + +The old roadmap talked about "skills over substrate," "source events as agent triggers," and a "proving-ground loop." Those aren't wrong directions, but they're not what we're shipping right now. What we're shipping is a dashboard that doesn't confuse people, a desktop app that installs like a real application, and a pipeline that doesn't need hand-holding. Once those are solid, the bigger ideas have a foundation to land on. diff --git a/integrations/pi/extension/src/index.ts b/integrations/pi/extension/src/index.ts index a01b89960..717822b39 100644 --- a/integrations/pi/extension/src/index.ts +++ b/integrations/pi/extension/src/index.ts @@ -417,7 +417,7 @@ export function parseRememberArgs(raw: string): RememberArgs { const tagMatch = content.match(/^\[([^\]]+)\]:\s*/); if (tagMatch) { - tags.push(...tagMatch[1].split(",").map((t) => t.trim())); + tags.push(...tagMatch[1]?.split(",").map((t) => t.trim()) ?? []); content = content.slice(tagMatch[0].length); } diff --git a/libs/connector-base/src/index.ts b/libs/connector-base/src/index.ts index 0dde9c231..d3e82cc5f 100644 --- a/libs/connector-base/src/index.ts +++ b/libs/connector-base/src/index.ts @@ -237,13 +237,15 @@ export abstract class BaseConnector { */ export function isSignetGeneratedFile(raw: string): boolean { const lines = raw.split("\n").slice(0, 6); - return lines.some( - (line, i) => + return lines.some((line, i) => { + const nextLine = lines[i + 1]; + return ( // Daemon-generated: "# AUTO-GENERATED from by Signet" /^#\s+AUTO-GENERATED\s+from\s+.*\s+by\s+Signet/i.test(line) || // Connector-generated: "# Auto-generated from " followed by "# Source: " on the next line - (/^#\s+Auto-generated\s+from\s+/.test(line) && i + 1 < lines.length && /^#\s+Source:\s+/.test(lines[i + 1])), - ); + (/^#\s+Auto-generated\s+from\s+/.test(line) && /^#\s+Source:\s+/.test(nextLine ?? "")) + ); + }); } // ============================================================================ diff --git a/libs/connector-base/src/lenient-json.ts b/libs/connector-base/src/lenient-json.ts index 6328fd3b1..16bde166c 100644 --- a/libs/connector-base/src/lenient-json.ts +++ b/libs/connector-base/src/lenient-json.ts @@ -15,6 +15,7 @@ export function parseLenientJsonObject(raw: string, options: { readonly label: s parsed = parseJson5(source); } catch { const first = errors[0]; + if (!first) throw new Error(`Invalid ${options.label}`); throw new Error(`Invalid ${options.label} at offset ${first.offset} (${printParseErrorCode(first.error)})`); } } diff --git a/package.json b/package.json index 1829fefab..31fcb2a5f 100644 --- a/package.json +++ b/package.json @@ -1,95 +1,96 @@ { - "name": "signet", - "version": "0.155.1", - "private": true, - "packageManager": "bun@1.3.11", - "description": "Local-first identity, memory, and secrets for AI agents", - "repository": { - "type": "git", - "url": "https://github.com/Signet-AI/signetai.git" - }, - "author": "Signet AI", - "license": "Apache-2.0", - "workspaces": [ - "memorybench", - "platform/*", - "surfaces/*", - "integrations/*/*", - "libs/*", - "dist/*", - "web/marketing", - "web/workers/*" - ], - "scripts": { - "build": "bun run build:core && bun run build:connector-base && bun run build:opencode-plugin && bun run build:native && bun run build:oh-my-pi-extension && bun run build:connector-oh-my-pi && bun run build:pi-extension && bun run build:connector-pi && bun run build:deps && bun run build:signetai", - "build:native": "bun scripts/build-native.ts", - "build:core": "cd platform/core && bun run build", - "build:connector-base": "cd libs/connector-base && bun run build", - "build:connector-oh-my-pi": "cd integrations/oh-my-pi/connector && bun run build", - "build:opencode-plugin": "cd integrations/opencode/plugin && bun run build", - "build:oh-my-pi-extension": "cd integrations/oh-my-pi/extension && bun run build", - "build:pi-extension": "cd integrations/pi/extension && bun run build", - "build:connector-pi": "cd integrations/pi/connector && bun run build", - "build:deps": "bun run --filter '@signet/sdk' build && bun run --filter '@signet/connector-claude-code' --filter '@signet/connector-codex' --filter '@signet/connector-forge' --filter '@signet/connector-gemini' --filter '@signet/connector-hermes-agent' --filter '@signet/connector-opencode' --filter '@signet/connector-openclaw' --filter '@signetai/*' --filter '@signet/daemon' build", - "build:signetai": "cd dist/signetai && bun run build", - "build:native-bun": "bun scripts/build-native-bun.ts", - "native:manifest": "bun scripts/generate-native-manifest.ts", - "build:publish": "bun run build:dashboard", - "build:dashboard": "cd surfaces/dashboard && bun install && bun run build", - "build:desktop": "cd surfaces/desktop && bun run build:desktop", - "build:tray": "cd surfaces/tray && bun run build", - "start": "cd platform/daemon && bun run start", - "dev": "bun run --filter '*' dev", - "test": "bun run --filter '*' test", - "lint": "biome check .", - "format": "biome format --write .", - "typecheck": "bun run --filter '*' typecheck", - "version:sync": "bun scripts/version-sync.ts", - "dev:web": "cd web/marketing && bun run dev", - "deploy:web": "cd web/marketing && bun run deploy", - "changelog": "bun scripts/changelog.ts", - "test:prompt:structural": "SIGNET_OLLAMA_TEST_MODEL=nemotron-3-nano:4b bun test platform/daemon/src/pipeline/structural-dependency.test.ts", - "test:prompt:synthesis": "SIGNET_OLLAMA_TEST_MODEL=nemotron-3-nano:4b bun test platform/daemon/src/pipeline/dependency-synthesis.test.ts", - "probe:signet-mcp": "bun scripts/probe-signet-mcp.ts", - "build:turbo": "turbo run build", - "test:turbo": "turbo run test", - "typecheck:turbo": "turbo run typecheck", - "check:rust-parity": "bun scripts/check-rust-daemon-parity.ts", - "bench": "bun scripts/bench-memory.ts", - "bench:ingest": "bun scripts/bench-memory.ts ingest", - "bench:evaluate": "bun scripts/bench-memory.ts --resume run --from-phase search" - }, - "devDependencies": { - "@biomejs/biome": "^1.9.0", - "@signet/sdk": "workspace:*", - "@types/node": "^24.5.2", - "bun-types": "^1.3.9", - "esbuild": "^0.25.0", - "node-gyp": "^12.4.0", - "turbo": "^2.9.14", - "typescript": "^5.7.0" - }, - "keywords": [ - "ai", - "ai-agents", - "agent-memory", - "agent-identity", - "agent-infrastructure", - "llm", - "mcp", - "ai-memory", - "memory-provider", - "local-first", - "self-hosted", - "claude-code", - "openclaw", - "hermes-agent", - "opencode", - "forge", - "knowledge-graph", - "typescript", - "bun", - "sqlite", - "signet" - ] + "name": "signet", + "version": "0.155.1", + "private": true, + "packageManager": "bun@1.3.11", + "description": "Local-first identity, memory, and secrets for AI agents", + "repository": { + "type": "git", + "url": "https://github.com/Signet-AI/signetai.git" + }, + "author": "Signet AI", + "license": "Apache-2.0", + "workspaces": [ + "memorybench", + "platform/*", + "surfaces/*", + "integrations/*/*", + "libs/*", + "dist/*", + "web/marketing", + "web/workers/*" + ], + "scripts": { + "build": "bun run build:core && bun run build:connector-base && bun run build:opencode-plugin && bun run build:native && bun run build:oh-my-pi-extension && bun run build:connector-oh-my-pi && bun run build:pi-extension && bun run build:connector-pi && bun run build:deps && bun run build:signetai", + "build:native": "bun scripts/build-native.ts", + "build:core": "cd platform/core && bun run build", + "build:connector-base": "cd libs/connector-base && bun run build", + "build:connector-oh-my-pi": "cd integrations/oh-my-pi/connector && bun run build", + "build:opencode-plugin": "cd integrations/opencode/plugin && bun run build", + "build:oh-my-pi-extension": "cd integrations/oh-my-pi/extension && bun run build", + "build:pi-extension": "cd integrations/pi/extension && bun run build", + "build:connector-pi": "cd integrations/pi/connector && bun run build", + "build:deps": "bun run --filter '@signet/sdk' build && bun run --filter '@signet/connector-claude-code' --filter '@signet/connector-codex' --filter '@signet/connector-forge' --filter '@signet/connector-gemini' --filter '@signet/connector-hermes-agent' --filter '@signet/connector-opencode' --filter '@signet/connector-openclaw' --filter '@signetai/*' --filter '@signet/daemon' build", + "build:signetai": "cd dist/signetai && bun run build", + "build:native-bun": "bun scripts/build-native-bun.ts", + "native:manifest": "bun scripts/generate-native-manifest.ts", + "build:publish": "bun run build:dashboard", + "build:dashboard": "cd surfaces/dashboard && bun install && bun run build", + "build:desktop": "cd surfaces/desktop && bun run build:desktop", + "build:tray": "cd surfaces/tray && bun run build", + "start": "cd platform/daemon && bun run start", + "dev": "bun run --filter '*' dev", + "test": "bun run test:workspace", + "test:workspace": "bun test scripts tests platform/core platform/daemon platform/native surfaces/cli surfaces/dashboard surfaces/desktop surfaces/tray integrations libs memorybench web/workers", + "lint": "biome check .", + "format": "biome format --write .", + "typecheck": "bun run --filter '*' typecheck", + "version:sync": "bun scripts/version-sync.ts", + "dev:web": "cd web/marketing && bun run dev", + "deploy:web": "cd web/marketing && bun run deploy", + "changelog": "bun scripts/changelog.ts", + "test:prompt:structural": "SIGNET_OLLAMA_TEST_MODEL=nemotron-3-nano:4b bun test platform/daemon/src/pipeline/structural-dependency.test.ts", + "test:prompt:synthesis": "SIGNET_OLLAMA_TEST_MODEL=nemotron-3-nano:4b bun test platform/daemon/src/pipeline/dependency-synthesis.test.ts", + "probe:signet-mcp": "bun scripts/probe-signet-mcp.ts", + "build:turbo": "turbo run build", + "test:turbo": "turbo run test", + "typecheck:turbo": "turbo run typecheck", + "check:rust-parity": "bun scripts/check-rust-daemon-parity.ts", + "bench": "bun scripts/bench-memory.ts", + "bench:ingest": "bun scripts/bench-memory.ts ingest", + "bench:evaluate": "bun scripts/bench-memory.ts --resume run --from-phase search" + }, + "devDependencies": { + "@biomejs/biome": "^1.9.0", + "@signet/sdk": "workspace:*", + "@types/node": "^24.5.2", + "bun-types": "^1.3.9", + "esbuild": "^0.25.0", + "node-gyp": "^12.4.0", + "turbo": "^2.9.14", + "typescript": "^5.7.0" + }, + "keywords": [ + "ai", + "ai-agents", + "agent-memory", + "agent-identity", + "agent-infrastructure", + "llm", + "mcp", + "ai-memory", + "memory-provider", + "local-first", + "self-hosted", + "claude-code", + "openclaw", + "hermes-agent", + "opencode", + "forge", + "knowledge-graph", + "typescript", + "bun", + "sqlite", + "signet" + ] } diff --git a/scripts/test-contract.test.ts b/scripts/test-contract.test.ts new file mode 100644 index 000000000..c4c22c39e --- /dev/null +++ b/scripts/test-contract.test.ts @@ -0,0 +1,31 @@ +import { expect, test } from "bun:test"; +import packageJson from "../package.json"; + +const MAINTAINED_TEST_ROOTS = [ + "scripts", + "tests", + "platform/core", + "platform/daemon", + "platform/native", + "surfaces/cli", + "surfaces/dashboard", + "surfaces/desktop", + "surfaces/tray", + "integrations", + "libs", + "memorybench", + "web/workers", +]; + +test("the root test command covers every maintained test root", () => { + const scripts = packageJson.scripts; + expect(scripts.test).toBe("bun run test:workspace"); + expect(scripts["test:workspace"]).toBeDefined(); + + for (const root of MAINTAINED_TEST_ROOTS) { + expect(scripts["test:workspace"]).toContain(root); + } + + expect(scripts["test:workspace"]).not.toContain("--filter"); + expect(scripts["test:workspace"]).not.toContain("references"); +}); diff --git a/tsconfig.json b/tsconfig.json index e63cc8e22..14166b90a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "module": "ESNext", "moduleResolution": "bundler", "strict": true, + "noUncheckedIndexedAccess": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, diff --git a/web/marketing/public/contentIndex.json b/web/marketing/public/contentIndex.json index 295a8d22b..2070d6d8b 100644 --- a/web/marketing/public/contentIndex.json +++ b/web/marketing/public/contentIndex.json @@ -26,9 +26,7 @@ "links": [ "docs/daemon", "docs/configuration", - "docs/auth", - "docs/memory", - "docs/sdk" + "docs/auth" ], "collection": "docs" }, @@ -52,6 +50,7 @@ "tags": [], "links": [ "docs/daemon", + "docs/remote-connectors", "docs/api", "docs/configuration" ], @@ -81,7 +80,8 @@ "docs/quickstart", "docs/secrets", "docs/skills", - "docs/harnesses" + "docs/harnesses", + "docs/remote-connectors" ], "collection": "docs" }, @@ -106,7 +106,8 @@ "links": [ "docs/documents", "docs/daemon", - "docs/api" + "docs/api", + "docs/remote-connectors" ], "collection": "docs" }, @@ -180,6 +181,7 @@ "url": "/docs/harnesses/", "tags": [], "links": [ + "docs/remote-connectors", "docs/daemon", "docs/hooks", "docs/cli" @@ -295,6 +297,18 @@ "links": [], "collection": "docs" }, + "docs/remote-connectors": { + "title": "Remote Harness Connectors", + "url": "/docs/remote-connectors/", + "tags": [], + "links": [ + "docs/self-hosting", + "docs/auth", + "docs/harnesses", + "docs/cli" + ], + "collection": "docs" + }, "docs/repo_map": { "title": "repo_map", "url": "/docs/repo_map/", @@ -380,6 +394,13 @@ "links": [], "collection": "docs" }, + "docs/upgrading": { + "title": "upgrading", + "url": "/docs/upgrading/", + "tags": [], + "links": [], + "collection": "docs" + }, "docs/what-is-signet": { "title": "What Is Signet", "url": "/docs/what-is-signet/",