From 95fec32c480f63156aa6b4ba5f8b90500f53d396 Mon Sep 17 00:00:00 2001 From: Nicholai Date: Tue, 3 Mar 2026 05:17:56 -0700 Subject: [PATCH] 2026-03-03_signet-setup --- AGENTS.md | 98 ++-------------------------- agent.yaml | 34 +++++----- memory/memories.db | Bin 75452416 -> 75452416 bytes scripts/generate-harness-configs.py | 81 ++++++++++++----------- 4 files changed, 65 insertions(+), 148 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c84943f85..a6ef27a93 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -54,100 +54,14 @@ signet secret list About Your User --- -- Name: Nicholai -- Pronouns: he/him -- Timezone: America/Denver -- Role: dev, AI researcher, artist +Add information about yourself here so your agent knows who you are. + +- Name: +- Preferences: Projects --- -See USER.md for the full project list. +List your active projects here. -## Operational Settings - -- **Proactivity:** proactive - suggest things you notice, don't wait to be asked -- **External actions:** always ask before anything public-facing (emails, messages, deployments, posts) -- **Error handling:** own it briefly, fix it, move on. no groveling. -- **Parallel work:** use judgment based on complexity - -## Memory - -- **Remember:** aggressive - log patterns, preferences, project details, anything useful -- **Forgetting:** ask before removing anything - -## Hard Rules - -- Never delete production database without backup -- Never auto-deploy nicholai's website - he prefers manual control -- Do not delegate UI work to subagents - implement yourself -- Signet agent profile lives at `~/.agents/` (not `~/.signet/`) -- Always ask before external/public-facing actions - - -## Memory Context (auto-synced) - - - -Current Context - -Active maintenance of the `signetai` monorepo and OpenMarketUI ecosystem, with a specific focus on contributing high-value fixes to the OpenClaw project and engaging its community by positioning Signet as a complementary utility rather than a competitor. - -Active Projects - -OpenMarketUI (Core) - Location: `/home/nicholai/signet/signetai` - Status: Main branch active, codebase audit completed. - Details: A multi-component system including the trading pipeline, UI components, and Astro-based static site generator. Currently using TypeScript, Biome for linting (no config file), and Bun/Turbo for build orchestration. - Next Steps: Continue monitoring PRs and ensuring consistent naming conventions throughout the codebase. - -Predictive Memory Scorer (R&D) - Location: Rust implementation, architecture docs in `docs/wip/predictive-memory-scorer.md` - Status: Architecture defined; ACAN reference available in `references/acan/`. - Details: Experimental component utilizing 8 delegated agents for real-time preference processing. - Next Steps: Implementation and integration testing. - -OpenMarketUI Website - Location: `/web/` (Astro) - Status: Active build and deployment pipeline. - Details: Published as an npm package named `openmarketui-web` and deployed via Cloudflare Pages. - -OpenClaw Ecosystem Engagement - Status: Bugfixing and Community Outreach. - Details: Currently fixing specific issues in the OpenClaw codebase and drafting forum content to share Signet features. - Next Steps: Complete the secret provider timeout bugfix; finalize and post the OpenClaw discussion thread emphasizing problem-solving over feature comparison. - -Recent Work - -OpenClaw Bugfix: Mistral Tool Call Sanitization - Action: Fixed a logic error in `src/agents/transcript-policy.ts:120`. - Issue: The condition `sanitizeToolCallIds: !isOpenAi && sanitizeToolCallIds` incorrectly short-circuited sanitization for Mistral models when used via an OpenAI-compatible provider. - Resolution: Added regression tests and committed the fix. PR created for review. - -OpenClaw Outreach Strategy - Action: Drafted content for OpenClaw discussions. - Decision: Shifted the narrative away from comparing Signet to ChatGPT/Claude Code. Instead, focused on Signet being a practical solution to specific pain points identified in OpenClaw discussions (#842 memory issues, #9676 secrets concerns). - -OpenClaw Bugfix: Exec Secret Provider Timeout - Action: Identified hardcoded timeout in `src/secrets/resolve.ts:544`. - Issue: The timeout was fixed at 2000ms, ignoring user-configured `timeoutMs` values. - Status: Identified root cause; fix implementation in progress. - -Technical Notes - - Environment: Operating system is Arch Linux running Hyprland window manager. - Storage: User state and secrets are stored in `~/.agents/`. The memory database uses SQLite located within this directory. - Secrets Management: Mandatory workflow uses `secret_list` MCP to discover secrets and `secret_exec` MCP to execute commands securely. - TypeScript Configuration: Strict mode enforced. No usage of `any` types allowed; must use `unknown` with narrowing. Null checks must be explicit. - Git: Commit messages must follow Conventional Commits format. - UI Workflow: For any frontend/UI work involving images or complex layouts, always use the original image references and do not delegate the task to sub-agents. - Session Handling: The session compacting hook is active but limited in scope. - -Rules & Warnings - - Security First: Never delete production data without creating a backup first. - Secrets: Always utilize the `secret_list` and `secret_exec` MCP tools for any operations involving secrets. - Code Quality: Enforce strict TypeScript rules: `any` is forbidden; use `unknown` with type narrowing; explicit null checks preferred. - UI Guidelines: Never delegate UI-related coding to sub-agents. Ensure original image references are preserved in all renders. - Maintenance: Update `MEMORY.md` in the local database at least once per session to track progress and context. - +- diff --git a/agent.yaml b/agent.yaml index f2135efc8..0ce0a8266 100644 --- a/agent.yaml +++ b/agent.yaml @@ -2,16 +2,15 @@ version: 1 schema: signet/v1 agent: name: Mr Claude - description: the exceptionally helpful, capable, thoughtful, and friendly - assistant to Nicholai - created: 2026-02-23T11:25:00.507Z - updated: 2026-02-23T11:25:00.507Z + description: The exceptionally kind, helpful and thoughtful agent. + created: "2026-03-03T12:17:50.888Z" + updated: "2026-03-03T12:17:50.888Z" harnesses: - claude-code - opencode - openclaw install: - primary_package_manager: npm + primary_package_manager: bun source: fallback memory: database: memory/memories.db @@ -19,25 +18,22 @@ memory: decay_rate: 0.95 pipelineV2: enabled: true - extractionProvider: claude-code - extractionModel: haiku - maintenanceMode: execute - allowUpdateDelete: true - graphEnabled: true - autonomousEnabled: true + extraction: + provider: claude-code + model: haiku + graph: + enabled: true reranker: enabled: true - topN: 20 - timeoutMs: 2000 - rerankerEnabled: true + autonomous: + enabled: true + allowUpdateDelete: true + maintenanceMode: execute search: alpha: 0.7 top_k: 20 min_score: 0.3 - rehearsal_enabled: true - rehearsal_weight: 0.1 - rehearsal_half_life_days: 30 embedding: - provider: ollama - model: nomic-embed-text + provider: native + model: nomic-embed-text-v1.5 dimensions: 768 diff --git a/memory/memories.db b/memory/memories.db index f894e1cdb98341498cbfd9dfc8d4a2b4270e073b..47726d9d6d3acf613891f2bb040df0f638a3f65e 100644 GIT binary patch delta 16211 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 E2UcDTpa1{> delta 16233 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 U?ZBPI@+(ak(=1-8@?UZP2TuenPXGV_ diff --git a/scripts/generate-harness-configs.py b/scripts/generate-harness-configs.py index fa093cba9..0dda9a4df 100755 --- a/scripts/generate-harness-configs.py +++ b/scripts/generate-harness-configs.py @@ -1,94 +1,101 @@ #!/usr/bin/env python3 """ -Generate harness-specific config files from AGENTS.md +Generate harness-specific config files from identity files -Source of truth: ~/.agents/AGENTS.md +Source of truth: ~/.agents/ (AGENTS.md, SOUL.md, IDENTITY.md, USER.md, MEMORY.md) Generates: - ~/.claude/CLAUDE.md (Claude Code) - ~/.config/opencode/AGENTS.md (OpenCode) -Run manually or via systemd timer after AGENTS.md changes. +Run manually or via systemd timer after identity file changes. """ import sys from pathlib import Path from datetime import datetime -AGENTS_MD = Path.home() / ".agents/AGENTS.md" +AGENTS_DIR = Path.home() / ".agents" +AGENTS_MD = AGENTS_DIR / "AGENTS.md" + +# Additional identity files to compose (in order) +IDENTITY_FILES = ["SOUL.md", "IDENTITY.md", "USER.md", "MEMORY.md"] TARGETS = { "claude-code": Path.home() / ".claude/CLAUDE.md", "opencode": Path.home() / ".config/opencode/AGENTS.md", } -HEADER = """# Auto-generated from ~/.agents/AGENTS.md +HEADER = """# Auto-generated from ~/.agents/ identity files # Source: {source} # Generated: {timestamp} # DO NOT EDIT - changes will be overwritten -# Edit ~/.agents/AGENTS.md instead +# Edit the source files in ~/.agents/ instead """ -def generate_config(source_content: str, harness: str) -> str: - """Generate harness-specific config from AGENTS.md content.""" - +def read_identity_extras() -> str: + """Read and compose additional identity files with section headers.""" + parts = [] + for name in IDENTITY_FILES: + path = AGENTS_DIR / name + if not path.exists(): + continue + content = path.read_text().strip() + if not content: + continue + header = name.replace(".md", "") + parts.append(f"\n## {header}\n\n{content}") + return "\n".join(parts) + + +def generate_config(source_content: str, extras: str, harness: str) -> str: + """Generate harness-specific config from identity file content.""" + header = HEADER.format( - source=AGENTS_MD, + source=AGENTS_DIR, timestamp=datetime.now().isoformat() ) - - # For now, configs are identical - but this allows harness-specific - # transformations in the future (e.g., removing sections, adding - # harness-specific instructions) - - if harness == "claude-code": - # Claude Code uses CLAUDE.md - return header + source_content - - elif harness == "opencode": - # OpenCode uses AGENTS.md - return header + source_content - - else: - return header + source_content + + return header + source_content + extras def main(): if not AGENTS_MD.exists(): print(f"ERROR: Source file not found: {AGENTS_MD}") sys.exit(1) - + source_content = AGENTS_MD.read_text() - source_hash = hash(source_content) - - print(f"Source: {AGENTS_MD}") - print(f"Content length: {len(source_content)} chars") + extras = read_identity_extras() + + print(f"Source: {AGENTS_DIR}") + print(f"AGENTS.md: {len(source_content)} chars") + print(f"Identity extras: {len(extras)} chars") print() - + for harness, target_path in TARGETS.items(): # Ensure parent directory exists target_path.parent.mkdir(parents=True, exist_ok=True) - + # Remove symlink if it exists if target_path.is_symlink(): target_path.unlink() print(f" Removed symlink: {target_path}") - + # Generate config - config_content = generate_config(source_content, harness) - + config_content = generate_config(source_content, extras, harness) + # Check if content changed if target_path.exists(): existing_content = target_path.read_text() if existing_content == config_content: print(f" {harness}: unchanged") continue - + # Write new config target_path.write_text(config_content) print(f" {harness}: generated → {target_path}") - + print() print("Done.")