Commit Graph

203 Commits

  • fix: sync .opencode/ package version to 1.4.1
    The OpenCode sub-package had stale 1.0.0 versions in package.json,
    index.ts VERSION export, and package-lock.json while the main package
    is at 1.4.1. Updated all three to match.
  • fix: calendar-accurate date validation in parseSessionFilename, add 22 tests
    - Fix parseSessionFilename to reject impossible dates (Feb 31, Apr 31,
      Feb 29 non-leap) using Date constructor month/day roundtrip check
    - Add 6 session-manager tests for calendar date validation edge cases
    - Add 3 session-manager tests for code blocks/special chars in getSessionStats
    - Add 10 package-manager tests for PM-specific command formats (getRunCommand
      and getExecCommand for pnpm, yarn, bun, npm)
    - Add 3 integration tests for session-end transcript parsing (mixed JSONL
      formats, malformed lines, nested user messages)
  • test: add 7 package-manager priority and source detection tests
    - Test valid project-config detection (.claude/package-manager.json)
    - Test priority order: project-config > package.json > lock-file
    - Test package.json > lock-file priority
    - Test default fallback to npm
    - Test setPreferredPackageManager success case
    - Test getCommandPattern for test and build actions
  • fix: box alignment in test runner, update metadata counts, add 18 tests
    - Fix run-all.js box alignment (hardcoded spaces 1 char short, now using dynamic padEnd)
    - Update .opencode/index.ts metadata (12→13 agents, 24→31 commands, 16→37 skills)
    - Add commandExists edge case tests (empty, spaces, path separators, metacharacters)
    - Add findFiles edge case tests (? wildcard, mtime sorting, maxAge filtering)
    - Add ensureDir race condition and return value tests
    - Add runCommand output trimming and failure tests
    - Add pre-compact session annotation and compaction log timestamp tests
    - Add check-console-log invalid JSON handling test
    - Add replaceInFile capture group test
    - Add readStdinJson Promise type check
  • fix: typecheck hook false positives, add 11 session-manager tests
    - Fix post-edit-typecheck.js error filtering: use relative/absolute path
      matching instead of basename, preventing false positives when multiple
      files share the same name (e.g., src/utils.ts vs tests/utils.ts)
    - Add writeSessionContent tests (create, overwrite, invalid path)
    - Add appendSessionContent test (append to existing file)
    - Add deleteSession tests (delete existing, non-existent)
    - Add sessionExists tests (file, non-existent, directory)
    - Add getSessionStats empty content edge case
    - Add post-edit-typecheck stdout passthrough test
    - Total: 391 → 402 tests, all passing
  • fix: include .md files in instinct-cli glob (completes #216)
    The observer agent creates instinct files as .md with YAML frontmatter,
    but load_all_instincts() only globbed *.yaml and *.yml. Add *.md to the
    glob so instinct-cli status discovers all instinct files.
  • fix: add missing ReplaceInFileOptions to utils.d.ts type declaration
    The replaceInFile function in utils.js accepts an optional `options`
    parameter with `{ all?: boolean }` for replacing all occurrences, but
    the .d.ts type declaration was missing this parameter entirely.
  • fix: grepFile global regex lastIndex bug, add 12 tests
    Fix grepFile() silently skipping matches when called with /g flag regex.
    The global flag makes .test() stateful, causing alternating match/miss
    on consecutive matching lines. Strip g flag since per-line testing
    doesn't need global state.
    
    Add first-ever tests for evaluate-session.js (5 tests: short session,
    long session, missing transcript, malformed stdin, env var fallback)
    and suggest-compact.js (5 tests: counter increment, threshold trigger,
    periodic suggestions, below-threshold silence, invalid threshold).
  • chore: add dist, __pycache__, and tasks to .gitignore
    Prevents accidental commits of build output, Python bytecode
    cache, and Claude Code team task files.
  • test: add tsconfig depth limit and cleanupAliases exception tests
    - post-edit-typecheck: verify 25-level-deep directory completes without
      hanging (tests the max depth=20 walk-up guard)
    - cleanupAliases: document behavior when sessionExists callback throws
      (propagates to caller, which is acceptable)
  • fix: instinct-cli glob and evolve --generate (fixes #216, #217)
    - Load both .yaml and .yml files in load_all_instincts() (#216)
      The *.yaml-only glob missed .yml files, causing 'No instincts found'
    - Implement evolve --generate to create skill/command/agent files (#217)
      Previously printed a stub message. Now generates SKILL.md, command .md,
      and agent .md files from the clustering analysis into ~/.claude/homunculus/evolved/
  • test: add coverage for Claude Code JSONL format and assistant tool blocks
    Tests the new transcript parsing from PR #215:
    - entry.message.content format (string and array content)
    - tool_use blocks nested in assistant message content arrays
    - Verifies file paths and tool names extracted from both formats
  • fix: add missing validation in renameAlias, add 6 tests
    renameAlias was missing length (>128), reserved name, and empty string
    validation that setAlias enforced. This inconsistency allowed renaming
    aliases to reserved names like 'list' or 'delete'.
    
    Also adds tests for:
    - renameAlias empty string, reserved name, and length limit
    - validate-skills whitespace-only SKILL.md rejection
    - validate-rules whitespace-only file and recursive subdirectory scan
  • docs(zh-CN): sync Chinese docs with latest upstream changes (#202)
    * docs(zh-CN): sync Chinese docs with latest upstream changes
    
    * docs: improve Chinese translation consistency in go-test.md
    
    * docs(zh-CN): update image paths to use shared assets directory
    
    - Update image references from ./assets/ to ../../assets/
    - Remove zh-CN/assets directory to use shared assets
    
    ---------
    
    Co-authored-by: neo <neo.dowithless@gmail.com>
  • docs(opencode): clarify OpenCode-specific usage (#214)
    * docs(opencode): clarify OpenCode-specific usage
    
    Signed-off-by: Siddhi Khandelwal <siddhi.200727@gmail.com>
    
    * docs(opencode): close bash code fence in CLI example
    
    Signed-off-by: Siddhi Khandelwal <siddhi.200727@gmail.com>
    
    ---------
    
    Signed-off-by: Siddhi Khandelwal <siddhi.200727@gmail.com>
  • fix: Windows compatibility for hook scripts (execFileSync + tmux) (#215)
    * fix: Windows compatibility for hook scripts
    
    - post-edit-format.js: add `shell: process.platform === 'win32'` to
      execFileSync options so npx.cmd is resolved via cmd.exe on Windows
    - post-edit-typecheck.js: same fix for tsc invocation via npx
    - hooks.json: skip tmux-dependent hooks on Windows where tmux is
      unavailable (dev-server blocker and long-running command reminder)
    
    On Windows, execFileSync('npx', ...) without shell:true fails with
    ENOENT because Node.js cannot directly execute .cmd files. These
    hooks silently fail on all Windows installations.
    
    The tmux hooks unconditionally block dev server commands (exit 2) or
    warn about tmux on Windows where tmux is not available.
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * fix: parse Claude Code JSONL transcript format correctly
    
    The session-end hook expected user messages at entry.content, but
    Claude Code's actual JSONL format nests them at entry.message.content.
    This caused all session files to be blank templates (0 user messages
    despite 136+ actual entries).
    
    - Check entry.message?.content in addition to entry.content
    - Extract tool_use blocks from assistant message.content arrays
    
    Verified with Claude Code v2.1.41 JSONL transcripts.
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: ddungan <sckim@mococo.co.kr>
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
  • fix: use valid model name in colon-in-values frontmatter test
    The test was using 'claude-sonnet-4-5-20250929' which isn't in VALID_MODELS
    (haiku/sonnet/opus). Use 'sonnet' with a description field containing
    colons to properly test colon handling in frontmatter values.
  • fix: add input validation, date range checks, and security hardening
    - validate-agents.js: reject invalid model names in agent frontmatter
    - package-manager.js: validate script/binary names against shell injection
    - session-manager.js: reject impossible month/day values in filenames
    - utils.js: support options.all for replaceInFile string patterns
    - strategic-compact/SKILL.md: fix hook matcher syntax and script reference
    - install.sh: warn when overwriting existing rule customizations
    - Add 24 new tests covering all validation and edge cases
  • test: add 6 tests for command validation and session content verification
    - validate-commands: creates: line skipping, valid cross-refs, unclosed
      code blocks, valid workflow diagrams
    - session-end: backtick escaping in session files, tools/files in output
  • fix: use execFileSync with input option for Windows-compatible stdin tests
    Windows cmd.exe treats single quotes literally, so `echo '...' | node -e '...'`
    fails. Switched to execFileSync with the `input` option to pipe stdin data
    directly without shell quoting issues.
  • fix: add 7 missing commands to README, remove phantom /security entry
    Added: /python-review, /multi-plan, /multi-execute, /multi-backend,
    /multi-frontend, /multi-workflow, /pm2, /sessions
    Removed: /security (no matching command file; use security-review skill)
    Updated count: 24 → 31 commands
  • test: add regression tests for empty frontmatter field rejection
    Add 2 tests verifying validate-agents correctly rejects agents with
    empty model and empty tools values in YAML frontmatter.
  • fix: correct stale counts and broken paths across docs
    - .cursor/README.md: skills 30→37, commands ~28→31
    - .opencode/MIGRATION.md: fix rules paths (rules/ → rules/common/)
    - README.zh-CN.md: fix agent/skill/command counts
    - docs/ja-JP/README.md: fix agent/skill/command counts
  • fix: box() off-by-one alignment, add 5 tests for readStdinJson and box alignment
    - skill-create-output.js: fix top border being 1 char narrower than
      middle/bottom lines (width - title - 5 → width - title - 4)
    - Add box alignment regression test verifying all lines have equal width
    - Add 4 readStdinJson tests via subprocess (valid JSON, invalid JSON,
      empty stdin, nested objects) — last untested exported utility function
    - All 338 tests passing
  • fix: remove unused imports in test files (ESLint)
    - validators.test.js: remove unused execSync (only execFileSync used)
    - skill-create-output.test.js: remove unused path module
  • fix: add word boundary to dev server hook regex, fix box() crash, add 27 tests
    - hooks.json: add \b word boundary anchors to dev server blocking regex
      to prevent false positives matching "npm run develop", "npm run devtools" etc.
    - skill-create-output.js: guard box() horizontal repeat with Math.max(0, ...)
      to prevent RangeError when title exceeds container width
    - Add 13 tests for setup-package-manager.js CLI argument parsing
    - Add 14 tests for skill-create-output.js SkillCreateOutput class
    - All 333 tests passing
  • fix: set USERPROFILE in tests for Windows os.homedir() compatibility
    On Windows, os.homedir() uses USERPROFILE env var instead of HOME.
    Tests that override HOME to a temp dir must also set USERPROFILE for
    the session-manager, session-aliases, and session-start hook tests
    to find files in the correct directory.
  • fix: capture stderr in typecheck hook, add 13 tests for session-end and utils
    - post-edit-typecheck.js: capture both stdout and stderr from tsc
    - hooks.test.js: 7 extractSessionSummary tests (JSONL parsing, array content,
      malformed lines, empty transcript, long message truncation, env var fallback)
    - utils.test.js: 6 tests (replaceInFile g-flag behavior, string replace,
      capture groups, writeFile overwrite, unicode content)
    
    Total test count: 294 → 307
  • test: add 33 edge case tests for session-manager, session-aliases, and hooks
    - session-manager: CRLF handling, empty sections, multi-heading title, context
      extraction, notes/context detection, MB file size, uppercase ID rejection
    - session-aliases: missing timestamps sort, title search, createdAt preservation,
      whitespace-only path rejection, empty string title behavior
    - hooks: session-start isolated HOME, template vs real session injection,
      learned skills count, check-console-log passthrough
    
    Total test count: 261 → 294
  • test: add cross-reference validation tests for validate-commands
    - Add runValidatorWithDirs() helper for multi-constant overrides
    - Test broken command references (e.g., /nonexistent-cmd)
    - Test broken agent path references (e.g., agents/fake-agent.md)
    - Test fenced code block exclusion (refs inside ``` are skipped)
    - Test broken workflow agent references (e.g., planner -> ghost-agent)
    - Total tests: 261 → 287 (+26)
  • fix: add event type enum to hooks schema and avoid shared RegExp state
    - hooks.schema.json: add enum constraint for hook event types
      (PreToolUse, PostToolUse, PreCompact, SessionStart, SessionEnd,
      Stop, Notification, SubagentStop) — enables IDE autocompletion
      and compile-time validation
    - utils.js countInFile: always create fresh RegExp to avoid shared
      lastIndex state when reusing global regex instances
    - README: update AgentShield stats (751 tests, 73 rules)
  • fix: broken cross-references, version sync, and enhanced command validator
    - Fix /build-and-fix → /build-fix in tdd.md, plan.md (+ cursor, zh-CN)
    - Fix non-existent explorer agent → planner in orchestrate.md (+ cursor, zh-CN, zh-TW)
    - Fix /python-test → /tdd in python-review.md (+ cursor, zh-CN)
    - Sync package.json version from 1.0.0 to 1.4.1 to match plugin.json
    - Enhance validate-commands.js with cross-reference checking:
      command refs, agent path refs, skill dir refs, workflow diagrams
    - Strip fenced code blocks before scanning to avoid false positives
    - Skip hypothetical "Creates:" lines in evolve.md examples
    - Add 46 new tests (suggest-compact, session-manager, utils, hooks)
  • fix: skip code blocks in command cross-reference validation
    The validator was matching example/template content inside fenced code
    blocks as real cross-references, causing false positives for evolve.md
    (example /new-table command and debugger agent).
    
    - Strip ``` blocks before running cross-reference checks
    - Change evolve.md examples to use bold instead of backtick formatting
      for hypothetical outputs
    
    All 261 tests pass.
  • feat: add docker-patterns skill for containerized development
    Docker Compose for local dev, networking, volume strategies, container
    security hardening, debugging commands, and anti-patterns.
    
    Complements the existing deployment-patterns skill which covers CI/CD
    and production Dockerfiles.
    
    Closes #121
  • fix: resolve symlinks in install.sh for npm/bun bin usage
    When installed via `npm install ecc-universal`, the `ecc-install` bin
    entry creates a symlink from the package manager's bin directory to
    install.sh. The old `$(dirname "$0")` resolved to the bin directory
    instead of the actual package directory, causing `cp` to fail with
    "cannot stat '.../rules/common/.'".
    
    Now follows the symlink chain with readlink before resolving SCRIPT_DIR.
    
    Fixes #199
  • fix: 3 bugs fixed, stdin encoding hardened, 37 CI validator tests added
    Bug fixes:
    - utils.js: glob-to-regex conversion now escapes all regex special chars
      (+, ^, $, |, (), {}, [], \) before converting * and ? wildcards
    - validate-hooks.js: escape sequence processing order corrected —
      \\\\ now processed before \\n and \\t to prevent double-processing
    - 6 hooks: added process.stdin.setEncoding('utf8') to prevent
      multi-byte UTF-8 character corruption at chunk boundaries
      (check-console-log, post-edit-format, post-edit-typecheck,
      post-edit-console-warn, session-end, evaluate-session)
    
    New tests (37):
    - CI validator test suite (tests/ci/validators.test.js):
      - validate-agents: 9 tests (real project, frontmatter parsing,
        BOM/CRLF, colons in values, missing fields, non-md skip)
      - validate-hooks: 13 tests (real project, invalid JSON, invalid
        event types, missing fields, async/timeout validation, inline JS
        syntax, array commands, legacy format)
      - validate-skills: 6 tests (real project, missing SKILL.md, empty
        files, non-directory entries)
      - validate-commands: 5 tests (real project, empty files, non-md skip)
      - validate-rules: 4 tests (real project, empty files)
    
    Total test count: 228 (up from 191)
  • refactor: slim down 4 remaining oversized agents (73% reduction)
    - go-build-resolver: 368 -> 94 lines (-74%), references golang-patterns skill
    - refactor-cleaner: 306 -> 85 lines (-72%), removed project-specific rules & templates
    - tdd-guide: 280 -> 80 lines (-71%), references tdd-workflow skill
    - go-reviewer: 267 -> 76 lines (-72%), references golang-patterns skill
    
    Combined with prior round: 10 agents optimized, 3,710 lines saved total.
    All agents now under 225 lines. Largest: code-reviewer (224).
  • fix: 2 bugs fixed, 17 tests added for hook scripts
    Bug fixes:
    - evaluate-session.js: whitespace-tolerant regex for counting user
      messages in JSONL transcripts (/"type":"user"/ → /"type"\s*:\s*"user"/)
    - session-end.js: guard against null elements in content arrays
      (c.text → (c && c.text) to prevent TypeError)
    
    New tests (17):
    - evaluate-session: whitespace JSON regression test
    - session-end: null content array elements regression test
    - post-edit-console-warn: 5 tests (warn, skip non-JS, clean files,
      missing file, stdout passthrough)
    - post-edit-format: 3 tests (empty stdin, non-JS skip, invalid JSON)
    - post-edit-typecheck: 4 tests (empty stdin, non-TS skip, missing file,
      no tsconfig)
    
    Total test count: 191 (up from 164)
  • fix: use tests/run-all.js in npm test to avoid test file drift
    The package.json test script listed individual test files, which fell
    out of sync when session-manager.test.js and session-aliases.test.js
    were added to tests/run-all.js but not to package.json. Now npm test
    delegates to run-all.js so new test files are automatically included.
  • test: add 13 tests for package-manager.js untested functions
    - setProjectPackageManager: creates config, rejects unknown PM
    - setPreferredPackageManager: rejects unknown PM
    - detectFromPackageJson: invalid JSON, unknown PM name
    - getExecCommand: without args
    - getRunCommand: build, dev, and custom scripts
    - DETECTION_PRIORITY: order verification
    - getCommandPattern: install and custom action patterns
    
    Total tests: 164 → 177