winter-super-cli 2026.5.32 → 2026.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -5
- package/bin/winter.js +39 -4
- package/package.json +22 -3
- package/resources/local/ecc/.agents/plugins/marketplace.json +21 -0
- package/resources/local/ecc/.agents/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/resources/local/ecc/.agents/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/agent-sort/SKILL.md +214 -0
- package/resources/local/ecc/.agents/skills/agent-sort/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/api-design/SKILL.md +522 -0
- package/resources/local/ecc/.agents/skills/api-design/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/article-writing/SKILL.md +78 -0
- package/resources/local/ecc/.agents/skills/article-writing/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/backend-patterns/SKILL.md +597 -0
- package/resources/local/ecc/.agents/skills/backend-patterns/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/brand-voice/SKILL.md +96 -0
- package/resources/local/ecc/.agents/skills/brand-voice/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/resources/local/ecc/.agents/skills/bun-runtime/SKILL.md +83 -0
- package/resources/local/ecc/.agents/skills/bun-runtime/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/coding-standards/SKILL.md +548 -0
- package/resources/local/ecc/.agents/skills/coding-standards/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/content-engine/SKILL.md +130 -0
- package/resources/local/ecc/.agents/skills/content-engine/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/crosspost/SKILL.md +110 -0
- package/resources/local/ecc/.agents/skills/crosspost/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/deep-research/SKILL.md +154 -0
- package/resources/local/ecc/.agents/skills/deep-research/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/dmux-workflows/SKILL.md +143 -0
- package/resources/local/ecc/.agents/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/documentation-lookup/SKILL.md +89 -0
- package/resources/local/ecc/.agents/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/e2e-testing/SKILL.md +325 -0
- package/resources/local/ecc/.agents/skills/e2e-testing/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/eval-harness/SKILL.md +235 -0
- package/resources/local/ecc/.agents/skills/eval-harness/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/everything-claude-code/SKILL.md +442 -0
- package/resources/local/ecc/.agents/skills/everything-claude-code/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/exa-search/SKILL.md +169 -0
- package/resources/local/ecc/.agents/skills/exa-search/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/fal-ai-media/SKILL.md +276 -0
- package/resources/local/ecc/.agents/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/frontend-patterns/SKILL.md +647 -0
- package/resources/local/ecc/.agents/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/frontend-slides/SKILL.md +183 -0
- package/resources/local/ecc/.agents/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/local/ecc/.agents/skills/frontend-slides/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/investor-materials/SKILL.md +95 -0
- package/resources/local/ecc/.agents/skills/investor-materials/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/investor-outreach/SKILL.md +90 -0
- package/resources/local/ecc/.agents/skills/investor-outreach/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/market-research/SKILL.md +74 -0
- package/resources/local/ecc/.agents/skills/market-research/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/mcp-server-patterns/SKILL.md +66 -0
- package/resources/local/ecc/.agents/skills/mcp-server-patterns/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/mle-workflow/SKILL.md +346 -0
- package/resources/local/ecc/.agents/skills/mle-workflow/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/nextjs-turbopack/SKILL.md +43 -0
- package/resources/local/ecc/.agents/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/product-capability/SKILL.md +140 -0
- package/resources/local/ecc/.agents/skills/product-capability/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/security-review/SKILL.md +494 -0
- package/resources/local/ecc/.agents/skills/security-review/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/strategic-compact/SKILL.md +102 -0
- package/resources/local/ecc/.agents/skills/strategic-compact/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/local/ecc/.agents/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/verification-loop/SKILL.md +125 -0
- package/resources/local/ecc/.agents/skills/verification-loop/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/video-editing/SKILL.md +307 -0
- package/resources/local/ecc/.agents/skills/video-editing/agents/openai.yaml +7 -0
- package/resources/local/ecc/.agents/skills/x-api/SKILL.md +229 -0
- package/resources/local/ecc/.agents/skills/x-api/agents/openai.yaml +7 -0
- package/resources/local/ecc/.claude/commands/add-language-rules.md +39 -0
- package/resources/local/ecc/.claude/commands/database-migration.md +36 -0
- package/resources/local/ecc/.claude/commands/feature-development.md +38 -0
- package/resources/local/ecc/.claude/ecc-tools.json +334 -0
- package/resources/local/ecc/.claude/enterprise/controls.md +15 -0
- package/resources/local/ecc/.claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml +162 -0
- package/resources/local/ecc/.claude/identity.json +14 -0
- package/resources/local/ecc/.claude/package-manager.json +4 -0
- package/resources/local/ecc/.claude/research/everything-claude-code-research-playbook.md +21 -0
- package/resources/local/ecc/.claude/rules/everything-claude-code-guardrails.md +43 -0
- package/resources/local/ecc/.claude/rules/node.md +56 -0
- package/resources/local/ecc/.claude/skills/everything-claude-code/SKILL.md +442 -0
- package/resources/local/ecc/.claude/team/everything-claude-code-team-config.json +15 -0
- package/resources/local/ecc/.claude-plugin/README.md +17 -0
- package/resources/local/ecc/.claude-plugin/marketplace.json +47 -0
- package/resources/local/ecc/.claude-plugin/plugin.json +32 -0
- package/resources/local/ecc/.codebuddy/README.md +98 -0
- package/resources/local/ecc/.codebuddy/install.js +312 -0
- package/resources/local/ecc/.codebuddy/install.sh +231 -0
- package/resources/local/ecc/.codebuddy/uninstall.js +291 -0
- package/resources/local/ecc/.codebuddy/uninstall.sh +184 -0
- package/resources/local/ecc/.codex/AGENTS.md +102 -0
- package/resources/local/ecc/.codex/agents/docs-researcher.toml +9 -0
- package/resources/local/ecc/.codex/agents/explorer.toml +9 -0
- package/resources/local/ecc/.codex/agents/reviewer.toml +9 -0
- package/resources/local/ecc/.codex/config.toml +120 -0
- package/resources/local/ecc/.codex-plugin/README.md +64 -0
- package/resources/local/ecc/.codex-plugin/plugin.json +30 -0
- package/resources/local/ecc/.cursor/hooks/adapter.js +81 -0
- package/resources/local/ecc/.cursor/hooks/after-file-edit.js +19 -0
- package/resources/local/ecc/.cursor/hooks/after-mcp-execution.js +12 -0
- package/resources/local/ecc/.cursor/hooks/after-shell-execution.js +28 -0
- package/resources/local/ecc/.cursor/hooks/after-tab-file-edit.js +12 -0
- package/resources/local/ecc/.cursor/hooks/before-mcp-execution.js +11 -0
- package/resources/local/ecc/.cursor/hooks/before-read-file.js +13 -0
- package/resources/local/ecc/.cursor/hooks/before-shell-execution.js +41 -0
- package/resources/local/ecc/.cursor/hooks/before-submit-prompt.js +23 -0
- package/resources/local/ecc/.cursor/hooks/before-tab-file-read.js +13 -0
- package/resources/local/ecc/.cursor/hooks/pre-compact.js +7 -0
- package/resources/local/ecc/.cursor/hooks/session-end.js +10 -0
- package/resources/local/ecc/.cursor/hooks/session-start.js +10 -0
- package/resources/local/ecc/.cursor/hooks/stop.js +21 -0
- package/resources/local/ecc/.cursor/hooks/subagent-start.js +10 -0
- package/resources/local/ecc/.cursor/hooks/subagent-stop.js +10 -0
- package/resources/local/ecc/.cursor/hooks.json +115 -0
- package/resources/local/ecc/.cursor/rules/common-agents.md +53 -0
- package/resources/local/ecc/.cursor/rules/common-coding-style.md +52 -0
- package/resources/local/ecc/.cursor/rules/common-development-workflow.md +33 -0
- package/resources/local/ecc/.cursor/rules/common-git-workflow.md +28 -0
- package/resources/local/ecc/.cursor/rules/common-hooks.md +34 -0
- package/resources/local/ecc/.cursor/rules/common-patterns.md +35 -0
- package/resources/local/ecc/.cursor/rules/common-performance.md +59 -0
- package/resources/local/ecc/.cursor/rules/common-security.md +33 -0
- package/resources/local/ecc/.cursor/rules/common-testing.md +33 -0
- package/resources/local/ecc/.cursor/rules/golang-coding-style.md +31 -0
- package/resources/local/ecc/.cursor/rules/golang-hooks.md +16 -0
- package/resources/local/ecc/.cursor/rules/golang-patterns.md +44 -0
- package/resources/local/ecc/.cursor/rules/golang-security.md +33 -0
- package/resources/local/ecc/.cursor/rules/golang-testing.md +30 -0
- package/resources/local/ecc/.cursor/rules/kotlin-coding-style.md +39 -0
- package/resources/local/ecc/.cursor/rules/kotlin-hooks.md +16 -0
- package/resources/local/ecc/.cursor/rules/kotlin-patterns.md +50 -0
- package/resources/local/ecc/.cursor/rules/kotlin-security.md +58 -0
- package/resources/local/ecc/.cursor/rules/kotlin-testing.md +38 -0
- package/resources/local/ecc/.cursor/rules/php-coding-style.md +25 -0
- package/resources/local/ecc/.cursor/rules/php-hooks.md +21 -0
- package/resources/local/ecc/.cursor/rules/php-patterns.md +23 -0
- package/resources/local/ecc/.cursor/rules/php-security.md +24 -0
- package/resources/local/ecc/.cursor/rules/php-testing.md +26 -0
- package/resources/local/ecc/.cursor/rules/python-coding-style.md +42 -0
- package/resources/local/ecc/.cursor/rules/python-hooks.md +19 -0
- package/resources/local/ecc/.cursor/rules/python-patterns.md +39 -0
- package/resources/local/ecc/.cursor/rules/python-security.md +30 -0
- package/resources/local/ecc/.cursor/rules/python-testing.md +38 -0
- package/resources/local/ecc/.cursor/rules/swift-coding-style.md +47 -0
- package/resources/local/ecc/.cursor/rules/swift-hooks.md +20 -0
- package/resources/local/ecc/.cursor/rules/swift-patterns.md +66 -0
- package/resources/local/ecc/.cursor/rules/swift-security.md +33 -0
- package/resources/local/ecc/.cursor/rules/swift-testing.md +45 -0
- package/resources/local/ecc/.cursor/rules/typescript-coding-style.md +63 -0
- package/resources/local/ecc/.cursor/rules/typescript-hooks.md +20 -0
- package/resources/local/ecc/.cursor/rules/typescript-patterns.md +50 -0
- package/resources/local/ecc/.cursor/rules/typescript-security.md +26 -0
- package/resources/local/ecc/.cursor/rules/typescript-testing.md +16 -0
- package/resources/local/ecc/.cursor/skills/article-writing/SKILL.md +85 -0
- package/resources/local/ecc/.cursor/skills/bun-runtime/SKILL.md +84 -0
- package/resources/local/ecc/.cursor/skills/content-engine/SKILL.md +88 -0
- package/resources/local/ecc/.cursor/skills/documentation-lookup/SKILL.md +90 -0
- package/resources/local/ecc/.cursor/skills/frontend-slides/SKILL.md +184 -0
- package/resources/local/ecc/.cursor/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/local/ecc/.cursor/skills/investor-materials/SKILL.md +96 -0
- package/resources/local/ecc/.cursor/skills/investor-outreach/SKILL.md +76 -0
- package/resources/local/ecc/.cursor/skills/market-research/SKILL.md +75 -0
- package/resources/local/ecc/.cursor/skills/mcp-server-patterns/SKILL.md +67 -0
- package/resources/local/ecc/.cursor/skills/nextjs-turbopack/SKILL.md +44 -0
- package/resources/local/ecc/.env.example +48 -0
- package/resources/local/ecc/.gemini/GEMINI.md +48 -0
- package/resources/local/ecc/.github/FUNDING.yml +2 -0
- package/resources/local/ecc/.github/ISSUE_TEMPLATE/copilot-task.md +17 -0
- package/resources/local/ecc/.github/PULL_REQUEST_TEMPLATE.md +33 -0
- package/resources/local/ecc/.github/copilot-instructions.md +115 -0
- package/resources/local/ecc/.github/dependabot.yml +21 -0
- package/resources/local/ecc/.github/prompts/build-fix.prompt.md +47 -0
- package/resources/local/ecc/.github/prompts/code-review.prompt.md +56 -0
- package/resources/local/ecc/.github/prompts/plan.prompt.md +52 -0
- package/resources/local/ecc/.github/prompts/refactor.prompt.md +50 -0
- package/resources/local/ecc/.github/prompts/security-review.prompt.md +70 -0
- package/resources/local/ecc/.github/prompts/tdd.prompt.md +47 -0
- package/resources/local/ecc/.github/release.yml +20 -0
- package/resources/local/ecc/.github/workflows/ci.yml +243 -0
- package/resources/local/ecc/.github/workflows/maintenance.yml +56 -0
- package/resources/local/ecc/.github/workflows/monthly-metrics.yml +192 -0
- package/resources/local/ecc/.github/workflows/release.yml +151 -0
- package/resources/local/ecc/.github/workflows/reusable-release.yml +169 -0
- package/resources/local/ecc/.github/workflows/reusable-test.yml +95 -0
- package/resources/local/ecc/.github/workflows/reusable-validate.yml +55 -0
- package/resources/local/ecc/.github/workflows/supply-chain-watch.yml +65 -0
- package/resources/local/ecc/.kiro/README.md +607 -0
- package/resources/local/ecc/.kiro/agents/architect.json +16 -0
- package/resources/local/ecc/.kiro/agents/architect.md +212 -0
- package/resources/local/ecc/.kiro/agents/build-error-resolver.json +17 -0
- package/resources/local/ecc/.kiro/agents/build-error-resolver.md +116 -0
- package/resources/local/ecc/.kiro/agents/chief-of-staff.json +17 -0
- package/resources/local/ecc/.kiro/agents/chief-of-staff.md +153 -0
- package/resources/local/ecc/.kiro/agents/code-reviewer.json +16 -0
- package/resources/local/ecc/.kiro/agents/code-reviewer.md +238 -0
- package/resources/local/ecc/.kiro/agents/database-reviewer.json +16 -0
- package/resources/local/ecc/.kiro/agents/database-reviewer.md +92 -0
- package/resources/local/ecc/.kiro/agents/doc-updater.json +16 -0
- package/resources/local/ecc/.kiro/agents/doc-updater.md +108 -0
- package/resources/local/ecc/.kiro/agents/e2e-runner.json +17 -0
- package/resources/local/ecc/.kiro/agents/e2e-runner.md +109 -0
- package/resources/local/ecc/.kiro/agents/go-build-resolver.json +17 -0
- package/resources/local/ecc/.kiro/agents/go-build-resolver.md +96 -0
- package/resources/local/ecc/.kiro/agents/go-reviewer.json +16 -0
- package/resources/local/ecc/.kiro/agents/go-reviewer.md +77 -0
- package/resources/local/ecc/.kiro/agents/harness-optimizer.json +15 -0
- package/resources/local/ecc/.kiro/agents/harness-optimizer.md +34 -0
- package/resources/local/ecc/.kiro/agents/loop-operator.json +16 -0
- package/resources/local/ecc/.kiro/agents/loop-operator.md +36 -0
- package/resources/local/ecc/.kiro/agents/planner.json +15 -0
- package/resources/local/ecc/.kiro/agents/planner.md +212 -0
- package/resources/local/ecc/.kiro/agents/python-reviewer.json +16 -0
- package/resources/local/ecc/.kiro/agents/python-reviewer.md +99 -0
- package/resources/local/ecc/.kiro/agents/refactor-cleaner.json +17 -0
- package/resources/local/ecc/.kiro/agents/refactor-cleaner.md +87 -0
- package/resources/local/ecc/.kiro/agents/security-reviewer.json +16 -0
- package/resources/local/ecc/.kiro/agents/security-reviewer.md +109 -0
- package/resources/local/ecc/.kiro/agents/tdd-guide.json +17 -0
- package/resources/local/ecc/.kiro/agents/tdd-guide.md +93 -0
- package/resources/local/ecc/.kiro/docs/longform-guide.md +301 -0
- package/resources/local/ecc/.kiro/docs/security-guide.md +496 -0
- package/resources/local/ecc/.kiro/docs/shortform-guide.md +360 -0
- package/resources/local/ecc/.kiro/hooks/README.md +93 -0
- package/resources/local/ecc/.kiro/hooks/auto-format.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/hooks/code-review-on-write.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/hooks/console-log-check.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/hooks/doc-file-warning.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/hooks/extract-patterns.kiro.hook +13 -0
- package/resources/local/ecc/.kiro/hooks/git-push-review.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/hooks/quality-gate.kiro.hook +13 -0
- package/resources/local/ecc/.kiro/hooks/session-summary.kiro.hook +13 -0
- package/resources/local/ecc/.kiro/hooks/tdd-reminder.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/hooks/typecheck-on-edit.kiro.hook +14 -0
- package/resources/local/ecc/.kiro/install.sh +143 -0
- package/resources/local/ecc/.kiro/scripts/format.sh +70 -0
- package/resources/local/ecc/.kiro/scripts/quality-gate.sh +120 -0
- package/resources/local/ecc/.kiro/settings/mcp.json.example +50 -0
- package/resources/local/ecc/.kiro/skills/agentic-engineering/SKILL.md +135 -0
- package/resources/local/ecc/.kiro/skills/api-design/SKILL.md +525 -0
- package/resources/local/ecc/.kiro/skills/backend-patterns/SKILL.md +600 -0
- package/resources/local/ecc/.kiro/skills/coding-standards/SKILL.md +532 -0
- package/resources/local/ecc/.kiro/skills/database-migrations/SKILL.md +348 -0
- package/resources/local/ecc/.kiro/skills/deployment-patterns/SKILL.md +440 -0
- package/resources/local/ecc/.kiro/skills/docker-patterns/SKILL.md +376 -0
- package/resources/local/ecc/.kiro/skills/e2e-testing/SKILL.md +328 -0
- package/resources/local/ecc/.kiro/skills/frontend-patterns/SKILL.md +644 -0
- package/resources/local/ecc/.kiro/skills/golang-patterns/SKILL.md +227 -0
- package/resources/local/ecc/.kiro/skills/golang-testing/SKILL.md +332 -0
- package/resources/local/ecc/.kiro/skills/postgres-patterns/SKILL.md +161 -0
- package/resources/local/ecc/.kiro/skills/python-patterns/SKILL.md +428 -0
- package/resources/local/ecc/.kiro/skills/python-testing/SKILL.md +497 -0
- package/resources/local/ecc/.kiro/skills/search-first/SKILL.md +179 -0
- package/resources/local/ecc/.kiro/skills/security-review/SKILL.md +497 -0
- package/resources/local/ecc/.kiro/skills/tdd-workflow/SKILL.md +414 -0
- package/resources/local/ecc/.kiro/skills/verification-loop/SKILL.md +128 -0
- package/resources/local/ecc/.kiro/steering/coding-style.md +53 -0
- package/resources/local/ecc/.kiro/steering/dev-mode.md +44 -0
- package/resources/local/ecc/.kiro/steering/development-workflow.md +34 -0
- package/resources/local/ecc/.kiro/steering/git-workflow.md +29 -0
- package/resources/local/ecc/.kiro/steering/golang-patterns.md +45 -0
- package/resources/local/ecc/.kiro/steering/lessons-learned.md +84 -0
- package/resources/local/ecc/.kiro/steering/patterns.md +36 -0
- package/resources/local/ecc/.kiro/steering/performance.md +54 -0
- package/resources/local/ecc/.kiro/steering/python-patterns.md +40 -0
- package/resources/local/ecc/.kiro/steering/research-mode.md +62 -0
- package/resources/local/ecc/.kiro/steering/review-mode.md +56 -0
- package/resources/local/ecc/.kiro/steering/security.md +34 -0
- package/resources/local/ecc/.kiro/steering/swift-patterns.md +67 -0
- package/resources/local/ecc/.kiro/steering/testing.md +34 -0
- package/resources/local/ecc/.kiro/steering/typescript-patterns.md +51 -0
- package/resources/local/ecc/.kiro/steering/typescript-security.md +98 -0
- package/resources/local/ecc/.markdownlint.json +19 -0
- package/resources/local/ecc/.mcp.json +28 -0
- package/resources/local/ecc/.opencode/MIGRATION.md +368 -0
- package/resources/local/ecc/.opencode/README.md +204 -0
- package/resources/local/ecc/.opencode/commands/build-fix.md +56 -0
- package/resources/local/ecc/.opencode/commands/checkpoint.md +67 -0
- package/resources/local/ecc/.opencode/commands/code-review.md +68 -0
- package/resources/local/ecc/.opencode/commands/e2e.md +105 -0
- package/resources/local/ecc/.opencode/commands/eval.md +88 -0
- package/resources/local/ecc/.opencode/commands/evolve.md +36 -0
- package/resources/local/ecc/.opencode/commands/go-build.md +87 -0
- package/resources/local/ecc/.opencode/commands/go-review.md +71 -0
- package/resources/local/ecc/.opencode/commands/go-test.md +131 -0
- package/resources/local/ecc/.opencode/commands/harness-audit.md +77 -0
- package/resources/local/ecc/.opencode/commands/instinct-export.md +93 -0
- package/resources/local/ecc/.opencode/commands/instinct-import.md +88 -0
- package/resources/local/ecc/.opencode/commands/instinct-status.md +29 -0
- package/resources/local/ecc/.opencode/commands/learn.md +61 -0
- package/resources/local/ecc/.opencode/commands/loop-start.md +32 -0
- package/resources/local/ecc/.opencode/commands/loop-status.md +24 -0
- package/resources/local/ecc/.opencode/commands/model-route.md +26 -0
- package/resources/local/ecc/.opencode/commands/orchestrate.md +88 -0
- package/resources/local/ecc/.opencode/commands/plan.md +49 -0
- package/resources/local/ecc/.opencode/commands/projects.md +23 -0
- package/resources/local/ecc/.opencode/commands/promote.md +23 -0
- package/resources/local/ecc/.opencode/commands/quality-gate.md +29 -0
- package/resources/local/ecc/.opencode/commands/refactor-clean.md +102 -0
- package/resources/local/ecc/.opencode/commands/rust-build.md +78 -0
- package/resources/local/ecc/.opencode/commands/rust-review.md +65 -0
- package/resources/local/ecc/.opencode/commands/rust-test.md +104 -0
- package/resources/local/ecc/.opencode/commands/security-scan.md +92 -0
- package/resources/local/ecc/.opencode/commands/security.md +89 -0
- package/resources/local/ecc/.opencode/commands/setup-pm.md +67 -0
- package/resources/local/ecc/.opencode/commands/skill-create.md +117 -0
- package/resources/local/ecc/.opencode/commands/tdd.md +66 -0
- package/resources/local/ecc/.opencode/commands/test-coverage.md +80 -0
- package/resources/local/ecc/.opencode/commands/update-codemaps.md +81 -0
- package/resources/local/ecc/.opencode/commands/update-docs.md +67 -0
- package/resources/local/ecc/.opencode/commands/verify.md +67 -0
- package/resources/local/ecc/.opencode/index.ts +80 -0
- package/resources/local/ecc/.opencode/instructions/INSTRUCTIONS.md +337 -0
- package/resources/local/ecc/.opencode/opencode.json +467 -0
- package/resources/local/ecc/.opencode/package-lock.json +169 -0
- package/resources/local/ecc/.opencode/package.json +70 -0
- package/resources/local/ecc/.opencode/plugins/ecc-hooks.ts +520 -0
- package/resources/local/ecc/.opencode/plugins/index.ts +12 -0
- package/resources/local/ecc/.opencode/plugins/lib/changed-files-store.ts +98 -0
- package/resources/local/ecc/.opencode/prompts/agents/architect.txt +175 -0
- package/resources/local/ecc/.opencode/prompts/agents/build-error-resolver.txt +233 -0
- package/resources/local/ecc/.opencode/prompts/agents/code-reviewer.txt +103 -0
- package/resources/local/ecc/.opencode/prompts/agents/cpp-build-resolver.txt +81 -0
- package/resources/local/ecc/.opencode/prompts/agents/cpp-reviewer.txt +65 -0
- package/resources/local/ecc/.opencode/prompts/agents/database-reviewer.txt +247 -0
- package/resources/local/ecc/.opencode/prompts/agents/doc-updater.txt +192 -0
- package/resources/local/ecc/.opencode/prompts/agents/docs-lookup.txt +57 -0
- package/resources/local/ecc/.opencode/prompts/agents/e2e-runner.txt +305 -0
- package/resources/local/ecc/.opencode/prompts/agents/go-build-resolver.txt +325 -0
- package/resources/local/ecc/.opencode/prompts/agents/go-reviewer.txt +241 -0
- package/resources/local/ecc/.opencode/prompts/agents/harness-optimizer.txt +27 -0
- package/resources/local/ecc/.opencode/prompts/agents/java-build-resolver.txt +125 -0
- package/resources/local/ecc/.opencode/prompts/agents/java-reviewer.txt +99 -0
- package/resources/local/ecc/.opencode/prompts/agents/kotlin-build-resolver.txt +120 -0
- package/resources/local/ecc/.opencode/prompts/agents/kotlin-reviewer.txt +127 -0
- package/resources/local/ecc/.opencode/prompts/agents/loop-operator.txt +39 -0
- package/resources/local/ecc/.opencode/prompts/agents/planner.txt +112 -0
- package/resources/local/ecc/.opencode/prompts/agents/python-reviewer.txt +85 -0
- package/resources/local/ecc/.opencode/prompts/agents/refactor-cleaner.txt +241 -0
- package/resources/local/ecc/.opencode/prompts/agents/rust-build-resolver.txt +93 -0
- package/resources/local/ecc/.opencode/prompts/agents/rust-reviewer.txt +61 -0
- package/resources/local/ecc/.opencode/prompts/agents/security-reviewer.txt +207 -0
- package/resources/local/ecc/.opencode/prompts/agents/tdd-guide.txt +211 -0
- package/resources/local/ecc/.opencode/tools/changed-files.ts +83 -0
- package/resources/local/ecc/.opencode/tools/check-coverage.ts +172 -0
- package/resources/local/ecc/.opencode/tools/format-code.ts +70 -0
- package/resources/local/ecc/.opencode/tools/git-summary.ts +56 -0
- package/resources/local/ecc/.opencode/tools/index.ts +14 -0
- package/resources/local/ecc/.opencode/tools/lint-check.ts +87 -0
- package/resources/local/ecc/.opencode/tools/run-tests.ts +141 -0
- package/resources/local/ecc/.opencode/tools/security-audit.ts +279 -0
- package/resources/local/ecc/.opencode/tsconfig.json +30 -0
- package/resources/local/ecc/.prettierrc +8 -0
- package/resources/local/ecc/.qwen/QWEN.md +25 -0
- package/resources/local/ecc/.tool-versions +6 -0
- package/resources/local/ecc/.trae/README.md +184 -0
- package/resources/local/ecc/.trae/install.sh +234 -0
- package/resources/local/ecc/.trae/uninstall.sh +194 -0
- package/resources/local/ecc/.vscode/settings.json +17 -0
- package/resources/local/ecc/.yarnrc.yml +1 -0
- package/resources/local/ecc/.zed/settings.json +41 -0
- package/resources/local/ecc/AGENTS.md +170 -0
- package/resources/local/ecc/CHANGELOG.md +203 -0
- package/resources/local/ecc/CLAUDE.md +81 -0
- package/resources/local/ecc/CODE_OF_CONDUCT.md +128 -0
- package/resources/local/ecc/COMMANDS-QUICK-REF.md +159 -0
- package/resources/local/ecc/CONTRIBUTING.md +507 -0
- package/resources/local/ecc/EVALUATION.md +122 -0
- package/resources/local/ecc/LICENSE +21 -0
- package/resources/local/ecc/README.md +1760 -0
- package/resources/local/ecc/REPO-ASSESSMENT.md +196 -0
- package/resources/local/ecc/RULES.md +38 -0
- package/resources/local/ecc/SECURITY.md +101 -0
- package/resources/local/ecc/SOUL.md +17 -0
- package/resources/local/ecc/SPONSORING.md +43 -0
- package/resources/local/ecc/SPONSORS.md +76 -0
- package/resources/local/ecc/TROUBLESHOOTING.md +432 -0
- package/resources/local/ecc/VERSION +1 -0
- package/resources/local/ecc/WORKING-CONTEXT.md +179 -0
- package/resources/local/ecc/agent.yaml +238 -0
- package/resources/local/ecc/agents/a11y-architect.md +149 -0
- package/resources/local/ecc/agents/architect.md +220 -0
- package/resources/local/ecc/agents/build-error-resolver.md +123 -0
- package/resources/local/ecc/agents/chief-of-staff.md +160 -0
- package/resources/local/ecc/agents/code-architect.md +80 -0
- package/resources/local/ecc/agents/code-explorer.md +78 -0
- package/resources/local/ecc/agents/code-reviewer.md +323 -0
- package/resources/local/ecc/agents/code-simplifier.md +56 -0
- package/resources/local/ecc/agents/comment-analyzer.md +54 -0
- package/resources/local/ecc/agents/conversation-analyzer.md +61 -0
- package/resources/local/ecc/agents/cpp-build-resolver.md +99 -0
- package/resources/local/ecc/agents/cpp-reviewer.md +81 -0
- package/resources/local/ecc/agents/csharp-reviewer.md +110 -0
- package/resources/local/ecc/agents/dart-build-resolver.md +210 -0
- package/resources/local/ecc/agents/database-reviewer.md +100 -0
- package/resources/local/ecc/agents/django-build-resolver.md +252 -0
- package/resources/local/ecc/agents/django-reviewer.md +169 -0
- package/resources/local/ecc/agents/doc-updater.md +116 -0
- package/resources/local/ecc/agents/docs-lookup.md +77 -0
- package/resources/local/ecc/agents/e2e-runner.md +116 -0
- package/resources/local/ecc/agents/fastapi-reviewer.md +79 -0
- package/resources/local/ecc/agents/flutter-reviewer.md +252 -0
- package/resources/local/ecc/agents/fsharp-reviewer.md +109 -0
- package/resources/local/ecc/agents/gan-evaluator.md +218 -0
- package/resources/local/ecc/agents/gan-generator.md +140 -0
- package/resources/local/ecc/agents/gan-planner.md +108 -0
- package/resources/local/ecc/agents/go-build-resolver.md +103 -0
- package/resources/local/ecc/agents/go-reviewer.md +85 -0
- package/resources/local/ecc/agents/harmonyos-app-resolver.md +182 -0
- package/resources/local/ecc/agents/harness-optimizer.md +44 -0
- package/resources/local/ecc/agents/healthcare-reviewer.md +92 -0
- package/resources/local/ecc/agents/homelab-architect.md +107 -0
- package/resources/local/ecc/agents/java-build-resolver.md +275 -0
- package/resources/local/ecc/agents/java-reviewer.md +190 -0
- package/resources/local/ecc/agents/kotlin-build-resolver.md +127 -0
- package/resources/local/ecc/agents/kotlin-reviewer.md +168 -0
- package/resources/local/ecc/agents/loop-operator.md +45 -0
- package/resources/local/ecc/agents/mle-reviewer.md +162 -0
- package/resources/local/ecc/agents/network-architect.md +106 -0
- package/resources/local/ecc/agents/network-config-reviewer.md +106 -0
- package/resources/local/ecc/agents/network-troubleshooter.md +128 -0
- package/resources/local/ecc/agents/opensource-forker.md +207 -0
- package/resources/local/ecc/agents/opensource-packager.md +258 -0
- package/resources/local/ecc/agents/opensource-sanitizer.md +197 -0
- package/resources/local/ecc/agents/performance-optimizer.md +455 -0
- package/resources/local/ecc/agents/planner.md +221 -0
- package/resources/local/ecc/agents/pr-test-analyzer.md +54 -0
- package/resources/local/ecc/agents/python-reviewer.md +107 -0
- package/resources/local/ecc/agents/pytorch-build-resolver.md +129 -0
- package/resources/local/ecc/agents/refactor-cleaner.md +94 -0
- package/resources/local/ecc/agents/rust-build-resolver.md +157 -0
- package/resources/local/ecc/agents/rust-reviewer.md +103 -0
- package/resources/local/ecc/agents/security-reviewer.md +117 -0
- package/resources/local/ecc/agents/seo-specialist.md +71 -0
- package/resources/local/ecc/agents/silent-failure-hunter.md +59 -0
- package/resources/local/ecc/agents/swift-build-resolver.md +170 -0
- package/resources/local/ecc/agents/swift-reviewer.md +116 -0
- package/resources/local/ecc/agents/tdd-guide.md +100 -0
- package/resources/local/ecc/agents/type-design-analyzer.md +50 -0
- package/resources/local/ecc/agents/typescript-reviewer.md +121 -0
- package/resources/local/ecc/assets/hero.png +0 -0
- package/resources/local/ecc/assets/images/ecc-logo.png +0 -0
- package/resources/local/ecc/assets/images/guides/longform-guide.png +0 -0
- package/resources/local/ecc/assets/images/guides/shorthand-guide.png +0 -0
- package/resources/local/ecc/assets/images/longform/01-header.png +0 -0
- package/resources/local/ecc/assets/images/longform/02-shortform-reference.png +0 -0
- package/resources/local/ecc/assets/images/longform/03-session-storage.png +0 -0
- package/resources/local/ecc/assets/images/longform/03b-session-storage-alt.png +0 -0
- package/resources/local/ecc/assets/images/longform/04-model-selection.png +0 -0
- package/resources/local/ecc/assets/images/longform/05-pricing-table.png +0 -0
- package/resources/local/ecc/assets/images/longform/06-mgrep-benchmark.png +0 -0
- package/resources/local/ecc/assets/images/longform/07-boris-parallel.png +0 -0
- package/resources/local/ecc/assets/images/longform/08-two-terminals.png +0 -0
- package/resources/local/ecc/assets/images/longform/09-25k-stars.png +0 -0
- package/resources/local/ecc/assets/images/security/attack-chain.png +0 -0
- package/resources/local/ecc/assets/images/security/attack-vectors.png +0 -0
- package/resources/local/ecc/assets/images/security/ghostyy-overflow.jpeg +0 -0
- package/resources/local/ecc/assets/images/security/observability.png +0 -0
- package/resources/local/ecc/assets/images/security/sandboxing-brain.png +0 -0
- package/resources/local/ecc/assets/images/security/sandboxing-comparison.png +0 -0
- package/resources/local/ecc/assets/images/security/sandboxing.png +0 -0
- package/resources/local/ecc/assets/images/security/sanitization-utility.png +0 -0
- package/resources/local/ecc/assets/images/security/sanitization.png +0 -0
- package/resources/local/ecc/assets/images/security/security-guide-header.png +0 -0
- package/resources/local/ecc/assets/images/shortform/00-header.png +0 -0
- package/resources/local/ecc/assets/images/shortform/01-hackathon-tweet.png +0 -0
- package/resources/local/ecc/assets/images/shortform/02-chaining-commands.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/03-posttooluse-hook.png +0 -0
- package/resources/local/ecc/assets/images/shortform/04-supabase-mcp.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/05-plugins-interface.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/06-marketplaces-mgrep.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/07-tmux-video.mp4 +0 -0
- package/resources/local/ecc/assets/images/shortform/08-github-pr-review.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/09-zed-editor.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/10-vscode-extension.jpeg +0 -0
- package/resources/local/ecc/assets/images/shortform/11-statusline.jpeg +0 -0
- package/resources/local/ecc/commands/aside.md +164 -0
- package/resources/local/ecc/commands/auto-update.md +28 -0
- package/resources/local/ecc/commands/build-fix.md +66 -0
- package/resources/local/ecc/commands/checkpoint.md +78 -0
- package/resources/local/ecc/commands/code-review.md +289 -0
- package/resources/local/ecc/commands/cost-report.md +107 -0
- package/resources/local/ecc/commands/cpp-build.md +173 -0
- package/resources/local/ecc/commands/cpp-review.md +132 -0
- package/resources/local/ecc/commands/cpp-test.md +251 -0
- package/resources/local/ecc/commands/ecc-guide.md +93 -0
- package/resources/local/ecc/commands/evolve.md +178 -0
- package/resources/local/ecc/commands/fastapi-review.md +39 -0
- package/resources/local/ecc/commands/feature-dev.md +49 -0
- package/resources/local/ecc/commands/flutter-build.md +164 -0
- package/resources/local/ecc/commands/flutter-review.md +116 -0
- package/resources/local/ecc/commands/flutter-test.md +144 -0
- package/resources/local/ecc/commands/gan-build.md +103 -0
- package/resources/local/ecc/commands/gan-design.md +39 -0
- package/resources/local/ecc/commands/go-build.md +183 -0
- package/resources/local/ecc/commands/go-review.md +148 -0
- package/resources/local/ecc/commands/go-test.md +268 -0
- package/resources/local/ecc/commands/gradle-build.md +70 -0
- package/resources/local/ecc/commands/harness-audit.md +77 -0
- package/resources/local/ecc/commands/hookify-configure.md +14 -0
- package/resources/local/ecc/commands/hookify-help.md +46 -0
- package/resources/local/ecc/commands/hookify-list.md +21 -0
- package/resources/local/ecc/commands/hookify.md +50 -0
- package/resources/local/ecc/commands/instinct-export.md +66 -0
- package/resources/local/ecc/commands/instinct-import.md +114 -0
- package/resources/local/ecc/commands/instinct-status.md +59 -0
- package/resources/local/ecc/commands/jira.md +106 -0
- package/resources/local/ecc/commands/kotlin-build.md +174 -0
- package/resources/local/ecc/commands/kotlin-review.md +140 -0
- package/resources/local/ecc/commands/kotlin-test.md +312 -0
- package/resources/local/ecc/commands/learn-eval.md +116 -0
- package/resources/local/ecc/commands/learn.md +74 -0
- package/resources/local/ecc/commands/loop-start.md +36 -0
- package/resources/local/ecc/commands/loop-status.md +77 -0
- package/resources/local/ecc/commands/model-route.md +30 -0
- package/resources/local/ecc/commands/multi-backend.md +162 -0
- package/resources/local/ecc/commands/multi-execute.md +319 -0
- package/resources/local/ecc/commands/multi-frontend.md +162 -0
- package/resources/local/ecc/commands/multi-plan.md +272 -0
- package/resources/local/ecc/commands/multi-workflow.md +195 -0
- package/resources/local/ecc/commands/plan-prd.md +160 -0
- package/resources/local/ecc/commands/plan.md +200 -0
- package/resources/local/ecc/commands/pm2.md +276 -0
- package/resources/local/ecc/commands/pr.md +184 -0
- package/resources/local/ecc/commands/project-init.md +86 -0
- package/resources/local/ecc/commands/projects.md +39 -0
- package/resources/local/ecc/commands/promote.md +41 -0
- package/resources/local/ecc/commands/prp-commit.md +112 -0
- package/resources/local/ecc/commands/prp-implement.md +385 -0
- package/resources/local/ecc/commands/prp-plan.md +502 -0
- package/resources/local/ecc/commands/prp-pr.md +184 -0
- package/resources/local/ecc/commands/prp-prd.md +447 -0
- package/resources/local/ecc/commands/prune.md +31 -0
- package/resources/local/ecc/commands/python-review.md +297 -0
- package/resources/local/ecc/commands/quality-gate.md +33 -0
- package/resources/local/ecc/commands/refactor-clean.md +84 -0
- package/resources/local/ecc/commands/resume-session.md +156 -0
- package/resources/local/ecc/commands/review-pr.md +37 -0
- package/resources/local/ecc/commands/rust-build.md +187 -0
- package/resources/local/ecc/commands/rust-review.md +142 -0
- package/resources/local/ecc/commands/rust-test.md +308 -0
- package/resources/local/ecc/commands/santa-loop.md +175 -0
- package/resources/local/ecc/commands/save-session.md +275 -0
- package/resources/local/ecc/commands/security-scan.md +92 -0
- package/resources/local/ecc/commands/sessions.md +339 -0
- package/resources/local/ecc/commands/setup-pm.md +80 -0
- package/resources/local/ecc/commands/skill-create.md +174 -0
- package/resources/local/ecc/commands/skill-health.md +54 -0
- package/resources/local/ecc/commands/test-coverage.md +73 -0
- package/resources/local/ecc/commands/update-codemaps.md +76 -0
- package/resources/local/ecc/commands/update-docs.md +88 -0
- package/resources/local/ecc/commitlint.config.js +11 -0
- package/resources/local/ecc/config/project-stack-mappings.json +539 -0
- package/resources/local/ecc/contexts/dev.md +20 -0
- package/resources/local/ecc/contexts/research.md +26 -0
- package/resources/local/ecc/contexts/review.md +22 -0
- package/resources/local/ecc/docs/ANTIGRAVITY-GUIDE.md +156 -0
- package/resources/local/ecc/docs/ARCHITECTURE-IMPROVEMENTS.md +146 -0
- package/resources/local/ecc/docs/COMMAND-AGENT-MAP.md +67 -0
- package/resources/local/ecc/docs/COMMAND-REGISTRY.json +898 -0
- package/resources/local/ecc/docs/ECC-2.0-GA-ROADMAP.md +1026 -0
- package/resources/local/ecc/docs/ECC-2.0-REFERENCE-ARCHITECTURE.md +246 -0
- package/resources/local/ecc/docs/ECC-2.0-SESSION-ADAPTER-DISCOVERY.md +322 -0
- package/resources/local/ecc/docs/HERMES-OPENCLAW-MIGRATION.md +239 -0
- package/resources/local/ecc/docs/HERMES-SETUP.md +125 -0
- package/resources/local/ecc/docs/JOYCODE-GUIDE.md +55 -0
- package/resources/local/ecc/docs/MANUAL-ADAPTATION-GUIDE.md +214 -0
- package/resources/local/ecc/docs/MEGA-PLAN-REPO-PROMPTS-2026-03-12.md +286 -0
- package/resources/local/ecc/docs/PHASE1-ISSUE-BUNDLE-2026-03-12.md +272 -0
- package/resources/local/ecc/docs/PLAN-PRD-PATTERN.md +154 -0
- package/resources/local/ecc/docs/PR-399-REVIEW-2026-03-12.md +59 -0
- package/resources/local/ecc/docs/PR-QUEUE-TRIAGE-2026-03-13.md +355 -0
- package/resources/local/ecc/docs/QWEN-GUIDE.md +54 -0
- package/resources/local/ecc/docs/SELECTIVE-INSTALL-ARCHITECTURE.md +933 -0
- package/resources/local/ecc/docs/SELECTIVE-INSTALL-DESIGN.md +489 -0
- package/resources/local/ecc/docs/SESSION-ADAPTER-CONTRACT.md +293 -0
- package/resources/local/ecc/docs/SKILL-DEVELOPMENT-GUIDE.md +919 -0
- package/resources/local/ecc/docs/SKILL-PLACEMENT-POLICY.md +104 -0
- package/resources/local/ecc/docs/TROUBLESHOOTING.md +75 -0
- package/resources/local/ecc/docs/architecture/agentshield-enterprise-research-roadmap.md +373 -0
- package/resources/local/ecc/docs/architecture/cross-harness.md +133 -0
- package/resources/local/ecc/docs/architecture/discussion-response-playbook.md +90 -0
- package/resources/local/ecc/docs/architecture/evaluator-rag-prototype.md +158 -0
- package/resources/local/ecc/docs/architecture/harness-adapter-compliance.md +105 -0
- package/resources/local/ecc/docs/architecture/hud-status-session-control.md +80 -0
- package/resources/local/ecc/docs/architecture/observability-readiness.md +85 -0
- package/resources/local/ecc/docs/architecture/progress-sync-contract.md +67 -0
- package/resources/local/ecc/docs/business/metrics-and-sponsorship.md +74 -0
- package/resources/local/ecc/docs/business/social-launch-copy.md +72 -0
- package/resources/local/ecc/docs/capability-surface-selection.md +140 -0
- package/resources/local/ecc/docs/continuous-learning-v2-spec.md +14 -0
- package/resources/local/ecc/docs/drafts/release-1.10.1-announcement.md +63 -0
- package/resources/local/ecc/docs/examples/product-capability-template.md +84 -0
- package/resources/local/ecc/docs/examples/project-guidelines-template.md +347 -0
- package/resources/local/ecc/docs/fixes/HOOK-FIX-20260421-ADDENDUM.md +109 -0
- package/resources/local/ecc/docs/fixes/HOOK-FIX-20260421.md +144 -0
- package/resources/local/ecc/docs/fixes/INSTALL-HOOK-WRAPPER-FIX-20260422.md +66 -0
- package/resources/local/ecc/docs/fixes/PATCH-SETTINGS-SIMPLE-FIX-20260422.md +78 -0
- package/resources/local/ecc/docs/fixes/apply-hook-fix.sh +60 -0
- package/resources/local/ecc/docs/fixes/install_hook_wrapper.ps1 +167 -0
- package/resources/local/ecc/docs/fixes/patch_settings_cl_v2_simple.ps1 +187 -0
- package/resources/local/ecc/docs/hook-bug-workarounds.md +74 -0
- package/resources/local/ecc/docs/ja-JP/AGENTS.md +170 -0
- package/resources/local/ecc/docs/ja-JP/CHANGELOG.md +203 -0
- package/resources/local/ecc/docs/ja-JP/CLAUDE.md +81 -0
- package/resources/local/ecc/docs/ja-JP/CODE_OF_CONDUCT.md +82 -0
- package/resources/local/ecc/docs/ja-JP/COMMANDS-QUICK-REF.md +159 -0
- package/resources/local/ecc/docs/ja-JP/CONTRIBUTING.md +430 -0
- package/resources/local/ecc/docs/ja-JP/EVALUATION.md +122 -0
- package/resources/local/ecc/docs/ja-JP/GLOSSARY.md +53 -0
- package/resources/local/ecc/docs/ja-JP/README.md +799 -0
- package/resources/local/ecc/docs/ja-JP/RULES.md +38 -0
- package/resources/local/ecc/docs/ja-JP/SECURITY.md +101 -0
- package/resources/local/ecc/docs/ja-JP/SOUL.md +17 -0
- package/resources/local/ecc/docs/ja-JP/SPONSORING.md +43 -0
- package/resources/local/ecc/docs/ja-JP/SPONSORS.md +59 -0
- package/resources/local/ecc/docs/ja-JP/TROUBLESHOOTING.md +433 -0
- package/resources/local/ecc/docs/ja-JP/agents/a11y-architect.md +149 -0
- package/resources/local/ecc/docs/ja-JP/agents/architect.md +211 -0
- package/resources/local/ecc/docs/ja-JP/agents/build-error-resolver.md +534 -0
- package/resources/local/ecc/docs/ja-JP/agents/chief-of-staff.md +160 -0
- package/resources/local/ecc/docs/ja-JP/agents/code-architect.md +80 -0
- package/resources/local/ecc/docs/ja-JP/agents/code-explorer.md +78 -0
- package/resources/local/ecc/docs/ja-JP/agents/code-reviewer.md +104 -0
- package/resources/local/ecc/docs/ja-JP/agents/code-simplifier.md +56 -0
- package/resources/local/ecc/docs/ja-JP/agents/comment-analyzer.md +54 -0
- package/resources/local/ecc/docs/ja-JP/agents/conversation-analyzer.md +61 -0
- package/resources/local/ecc/docs/ja-JP/agents/cpp-build-resolver.md +99 -0
- package/resources/local/ecc/docs/ja-JP/agents/cpp-reviewer.md +81 -0
- package/resources/local/ecc/docs/ja-JP/agents/csharp-reviewer.md +110 -0
- package/resources/local/ecc/docs/ja-JP/agents/dart-build-resolver.md +210 -0
- package/resources/local/ecc/docs/ja-JP/agents/database-reviewer.md +654 -0
- package/resources/local/ecc/docs/ja-JP/agents/django-build-resolver.md +252 -0
- package/resources/local/ecc/docs/ja-JP/agents/django-reviewer.md +169 -0
- package/resources/local/ecc/docs/ja-JP/agents/doc-updater.md +452 -0
- package/resources/local/ecc/docs/ja-JP/agents/docs-lookup.md +77 -0
- package/resources/local/ecc/docs/ja-JP/agents/e2e-runner.md +636 -0
- package/resources/local/ecc/docs/ja-JP/agents/fastapi-reviewer.md +79 -0
- package/resources/local/ecc/docs/ja-JP/agents/flutter-reviewer.md +143 -0
- package/resources/local/ecc/docs/ja-JP/agents/fsharp-reviewer.md +100 -0
- package/resources/local/ecc/docs/ja-JP/agents/gan-evaluator.md +149 -0
- package/resources/local/ecc/docs/ja-JP/agents/gan-generator.md +93 -0
- package/resources/local/ecc/docs/ja-JP/agents/gan-planner.md +108 -0
- package/resources/local/ecc/docs/ja-JP/agents/go-build-resolver.md +368 -0
- package/resources/local/ecc/docs/ja-JP/agents/go-reviewer.md +269 -0
- package/resources/local/ecc/docs/ja-JP/agents/harmonyos-app-resolver.md +85 -0
- package/resources/local/ecc/docs/ja-JP/agents/harness-optimizer.md +44 -0
- package/resources/local/ecc/docs/ja-JP/agents/healthcare-reviewer.md +92 -0
- package/resources/local/ecc/docs/ja-JP/agents/homelab-architect.md +73 -0
- package/resources/local/ecc/docs/ja-JP/agents/java-build-resolver.md +87 -0
- package/resources/local/ecc/docs/ja-JP/agents/java-reviewer.md +73 -0
- package/resources/local/ecc/docs/ja-JP/agents/kotlin-build-resolver.md +70 -0
- package/resources/local/ecc/docs/ja-JP/agents/kotlin-reviewer.md +85 -0
- package/resources/local/ecc/docs/ja-JP/agents/loop-operator.md +45 -0
- package/resources/local/ecc/docs/ja-JP/agents/mle-reviewer.md +162 -0
- package/resources/local/ecc/docs/ja-JP/agents/network-architect.md +90 -0
- package/resources/local/ecc/docs/ja-JP/agents/network-config-reviewer.md +95 -0
- package/resources/local/ecc/docs/ja-JP/agents/network-troubleshooter.md +120 -0
- package/resources/local/ecc/docs/ja-JP/agents/opensource-forker.md +207 -0
- package/resources/local/ecc/docs/ja-JP/agents/opensource-packager.md +258 -0
- package/resources/local/ecc/docs/ja-JP/agents/opensource-sanitizer.md +197 -0
- package/resources/local/ecc/docs/ja-JP/agents/performance-optimizer.md +455 -0
- package/resources/local/ecc/docs/ja-JP/agents/planner.md +119 -0
- package/resources/local/ecc/docs/ja-JP/agents/pr-test-analyzer.md +54 -0
- package/resources/local/ecc/docs/ja-JP/agents/python-reviewer.md +469 -0
- package/resources/local/ecc/docs/ja-JP/agents/pytorch-build-resolver.md +125 -0
- package/resources/local/ecc/docs/ja-JP/agents/refactor-cleaner.md +306 -0
- package/resources/local/ecc/docs/ja-JP/agents/rust-build-resolver.md +157 -0
- package/resources/local/ecc/docs/ja-JP/agents/rust-reviewer.md +103 -0
- package/resources/local/ecc/docs/ja-JP/agents/security-reviewer.md +545 -0
- package/resources/local/ecc/docs/ja-JP/agents/seo-specialist.md +71 -0
- package/resources/local/ecc/docs/ja-JP/agents/silent-failure-hunter.md +59 -0
- package/resources/local/ecc/docs/ja-JP/agents/swift-build-resolver.md +170 -0
- package/resources/local/ecc/docs/ja-JP/agents/swift-reviewer.md +116 -0
- package/resources/local/ecc/docs/ja-JP/agents/tdd-guide.md +280 -0
- package/resources/local/ecc/docs/ja-JP/agents/type-design-analyzer.md +50 -0
- package/resources/local/ecc/docs/ja-JP/agents/typescript-reviewer.md +121 -0
- package/resources/local/ecc/docs/ja-JP/commands/README.md +113 -0
- package/resources/local/ecc/docs/ja-JP/commands/aside.md +166 -0
- package/resources/local/ecc/docs/ja-JP/commands/auto-update.md +28 -0
- package/resources/local/ecc/docs/ja-JP/commands/build-fix.md +29 -0
- package/resources/local/ecc/docs/ja-JP/commands/checkpoint.md +78 -0
- package/resources/local/ecc/docs/ja-JP/commands/claw.md +51 -0
- package/resources/local/ecc/docs/ja-JP/commands/code-review.md +43 -0
- package/resources/local/ecc/docs/ja-JP/commands/context-budget.md +29 -0
- package/resources/local/ecc/docs/ja-JP/commands/cost-report.md +99 -0
- package/resources/local/ecc/docs/ja-JP/commands/cpp-build.md +78 -0
- package/resources/local/ecc/docs/ja-JP/commands/cpp-review.md +82 -0
- package/resources/local/ecc/docs/ja-JP/commands/cpp-test.md +128 -0
- package/resources/local/ecc/docs/ja-JP/commands/devfleet.md +93 -0
- package/resources/local/ecc/docs/ja-JP/commands/docs.md +32 -0
- package/resources/local/ecc/docs/ja-JP/commands/e2e.md +370 -0
- package/resources/local/ecc/docs/ja-JP/commands/ecc-guide.md +93 -0
- package/resources/local/ecc/docs/ja-JP/commands/eval.md +120 -0
- package/resources/local/ecc/docs/ja-JP/commands/evolve.md +193 -0
- package/resources/local/ecc/docs/ja-JP/commands/fastapi-review.md +39 -0
- package/resources/local/ecc/docs/ja-JP/commands/feature-dev.md +49 -0
- package/resources/local/ecc/docs/ja-JP/commands/flutter-build.md +79 -0
- package/resources/local/ecc/docs/ja-JP/commands/flutter-review.md +116 -0
- package/resources/local/ecc/docs/ja-JP/commands/flutter-test.md +144 -0
- package/resources/local/ecc/docs/ja-JP/commands/gan-build.md +103 -0
- package/resources/local/ecc/docs/ja-JP/commands/gan-design.md +39 -0
- package/resources/local/ecc/docs/ja-JP/commands/go-build.md +183 -0
- package/resources/local/ecc/docs/ja-JP/commands/go-review.md +148 -0
- package/resources/local/ecc/docs/ja-JP/commands/go-test.md +268 -0
- package/resources/local/ecc/docs/ja-JP/commands/gradle-build.md +70 -0
- package/resources/local/ecc/docs/ja-JP/commands/harness-audit.md +77 -0
- package/resources/local/ecc/docs/ja-JP/commands/hookify-configure.md +14 -0
- package/resources/local/ecc/docs/ja-JP/commands/hookify-help.md +46 -0
- package/resources/local/ecc/docs/ja-JP/commands/hookify-list.md +21 -0
- package/resources/local/ecc/docs/ja-JP/commands/hookify.md +50 -0
- package/resources/local/ecc/docs/ja-JP/commands/instinct-export.md +91 -0
- package/resources/local/ecc/docs/ja-JP/commands/instinct-import.md +142 -0
- package/resources/local/ecc/docs/ja-JP/commands/instinct-status.md +86 -0
- package/resources/local/ecc/docs/ja-JP/commands/jira.md +106 -0
- package/resources/local/ecc/docs/ja-JP/commands/kotlin-build.md +174 -0
- package/resources/local/ecc/docs/ja-JP/commands/kotlin-review.md +140 -0
- package/resources/local/ecc/docs/ja-JP/commands/kotlin-test.md +312 -0
- package/resources/local/ecc/docs/ja-JP/commands/learn-eval.md +116 -0
- package/resources/local/ecc/docs/ja-JP/commands/learn.md +70 -0
- package/resources/local/ecc/docs/ja-JP/commands/loop-start.md +36 -0
- package/resources/local/ecc/docs/ja-JP/commands/loop-status.md +58 -0
- package/resources/local/ecc/docs/ja-JP/commands/model-route.md +30 -0
- package/resources/local/ecc/docs/ja-JP/commands/multi-backend.md +158 -0
- package/resources/local/ecc/docs/ja-JP/commands/multi-execute.md +315 -0
- package/resources/local/ecc/docs/ja-JP/commands/multi-frontend.md +158 -0
- package/resources/local/ecc/docs/ja-JP/commands/multi-plan.md +268 -0
- package/resources/local/ecc/docs/ja-JP/commands/multi-workflow.md +183 -0
- package/resources/local/ecc/docs/ja-JP/commands/orchestrate.md +172 -0
- package/resources/local/ecc/docs/ja-JP/commands/plan-prd.md +160 -0
- package/resources/local/ecc/docs/ja-JP/commands/plan.md +200 -0
- package/resources/local/ecc/docs/ja-JP/commands/pm2.md +272 -0
- package/resources/local/ecc/docs/ja-JP/commands/pr.md +184 -0
- package/resources/local/ecc/docs/ja-JP/commands/project-init.md +86 -0
- package/resources/local/ecc/docs/ja-JP/commands/projects.md +39 -0
- package/resources/local/ecc/docs/ja-JP/commands/promote.md +41 -0
- package/resources/local/ecc/docs/ja-JP/commands/prompt-optimize.md +37 -0
- package/resources/local/ecc/docs/ja-JP/commands/prp-commit.md +112 -0
- package/resources/local/ecc/docs/ja-JP/commands/prp-implement.md +385 -0
- package/resources/local/ecc/docs/ja-JP/commands/prp-plan.md +502 -0
- package/resources/local/ecc/docs/ja-JP/commands/prp-pr.md +184 -0
- package/resources/local/ecc/docs/ja-JP/commands/prp-prd.md +447 -0
- package/resources/local/ecc/docs/ja-JP/commands/prune.md +31 -0
- package/resources/local/ecc/docs/ja-JP/commands/python-review.md +297 -0
- package/resources/local/ecc/docs/ja-JP/commands/quality-gate.md +33 -0
- package/resources/local/ecc/docs/ja-JP/commands/refactor-clean.md +28 -0
- package/resources/local/ecc/docs/ja-JP/commands/resume-session.md +156 -0
- package/resources/local/ecc/docs/ja-JP/commands/review-pr.md +37 -0
- package/resources/local/ecc/docs/ja-JP/commands/rules-distill.md +11 -0
- package/resources/local/ecc/docs/ja-JP/commands/rust-build.md +187 -0
- package/resources/local/ecc/docs/ja-JP/commands/rust-review.md +142 -0
- package/resources/local/ecc/docs/ja-JP/commands/rust-test.md +308 -0
- package/resources/local/ecc/docs/ja-JP/commands/santa-loop.md +175 -0
- package/resources/local/ecc/docs/ja-JP/commands/save-session.md +276 -0
- package/resources/local/ecc/docs/ja-JP/commands/security-scan.md +92 -0
- package/resources/local/ecc/docs/ja-JP/commands/sessions.md +305 -0
- package/resources/local/ecc/docs/ja-JP/commands/setup-pm.md +80 -0
- package/resources/local/ecc/docs/ja-JP/commands/skill-create.md +174 -0
- package/resources/local/ecc/docs/ja-JP/commands/skill-health.md +54 -0
- package/resources/local/ecc/docs/ja-JP/commands/tdd.md +326 -0
- package/resources/local/ecc/docs/ja-JP/commands/test-coverage.md +27 -0
- package/resources/local/ecc/docs/ja-JP/commands/update-codemaps.md +17 -0
- package/resources/local/ecc/docs/ja-JP/commands/update-docs.md +31 -0
- package/resources/local/ecc/docs/ja-JP/commands/verify.md +59 -0
- package/resources/local/ecc/docs/ja-JP/contexts/dev.md +20 -0
- package/resources/local/ecc/docs/ja-JP/contexts/research.md +26 -0
- package/resources/local/ecc/docs/ja-JP/contexts/review.md +22 -0
- package/resources/local/ecc/docs/ja-JP/examples/CLAUDE.md +109 -0
- package/resources/local/ecc/docs/ja-JP/examples/django-api-CLAUDE.md +308 -0
- package/resources/local/ecc/docs/ja-JP/examples/go-microservice-CLAUDE.md +267 -0
- package/resources/local/ecc/docs/ja-JP/examples/harmonyos-app-CLAUDE.md +88 -0
- package/resources/local/ecc/docs/ja-JP/examples/laravel-api-CLAUDE.md +311 -0
- package/resources/local/ecc/docs/ja-JP/examples/rust-api-CLAUDE.md +285 -0
- package/resources/local/ecc/docs/ja-JP/examples/saas-nextjs-CLAUDE.md +166 -0
- package/resources/local/ecc/docs/ja-JP/examples/user-CLAUDE.md +109 -0
- package/resources/local/ecc/docs/ja-JP/hooks/README.md +249 -0
- package/resources/local/ecc/docs/ja-JP/plugins/README.md +87 -0
- package/resources/local/ecc/docs/ja-JP/rules/README.md +81 -0
- package/resources/local/ecc/docs/ja-JP/rules/angular/coding-style.md +182 -0
- package/resources/local/ecc/docs/ja-JP/rules/angular/hooks.md +25 -0
- package/resources/local/ecc/docs/ja-JP/rules/angular/patterns.md +249 -0
- package/resources/local/ecc/docs/ja-JP/rules/angular/security.md +87 -0
- package/resources/local/ecc/docs/ja-JP/rules/angular/testing.md +164 -0
- package/resources/local/ecc/docs/ja-JP/rules/arkts/coding-style.md +153 -0
- package/resources/local/ecc/docs/ja-JP/rules/arkts/hooks.md +135 -0
- package/resources/local/ecc/docs/ja-JP/rules/arkts/patterns.md +236 -0
- package/resources/local/ecc/docs/ja-JP/rules/arkts/security.md +141 -0
- package/resources/local/ecc/docs/ja-JP/rules/arkts/testing.md +126 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/agents.md +49 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/code-review.md +124 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/coding-style.md +48 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/development-workflow.md +44 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/git-workflow.md +45 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/hooks.md +30 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/patterns.md +31 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/performance.md +55 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/security.md +29 -0
- package/resources/local/ecc/docs/ja-JP/rules/common/testing.md +29 -0
- package/resources/local/ecc/docs/ja-JP/rules/cpp/coding-style.md +44 -0
- package/resources/local/ecc/docs/ja-JP/rules/cpp/hooks.md +39 -0
- package/resources/local/ecc/docs/ja-JP/rules/cpp/patterns.md +51 -0
- package/resources/local/ecc/docs/ja-JP/rules/cpp/security.md +51 -0
- package/resources/local/ecc/docs/ja-JP/rules/cpp/testing.md +44 -0
- package/resources/local/ecc/docs/ja-JP/rules/csharp/coding-style.md +72 -0
- package/resources/local/ecc/docs/ja-JP/rules/csharp/hooks.md +25 -0
- package/resources/local/ecc/docs/ja-JP/rules/csharp/patterns.md +50 -0
- package/resources/local/ecc/docs/ja-JP/rules/csharp/security.md +58 -0
- package/resources/local/ecc/docs/ja-JP/rules/csharp/testing.md +46 -0
- package/resources/local/ecc/docs/ja-JP/rules/dart/coding-style.md +159 -0
- package/resources/local/ecc/docs/ja-JP/rules/dart/hooks.md +66 -0
- package/resources/local/ecc/docs/ja-JP/rules/dart/patterns.md +261 -0
- package/resources/local/ecc/docs/ja-JP/rules/dart/security.md +135 -0
- package/resources/local/ecc/docs/ja-JP/rules/dart/testing.md +215 -0
- package/resources/local/ecc/docs/ja-JP/rules/fsharp/coding-style.md +112 -0
- package/resources/local/ecc/docs/ja-JP/rules/fsharp/hooks.md +26 -0
- package/resources/local/ecc/docs/ja-JP/rules/fsharp/patterns.md +111 -0
- package/resources/local/ecc/docs/ja-JP/rules/fsharp/security.md +76 -0
- package/resources/local/ecc/docs/ja-JP/rules/fsharp/testing.md +62 -0
- package/resources/local/ecc/docs/ja-JP/rules/golang/coding-style.md +32 -0
- package/resources/local/ecc/docs/ja-JP/rules/golang/hooks.md +17 -0
- package/resources/local/ecc/docs/ja-JP/rules/golang/patterns.md +45 -0
- package/resources/local/ecc/docs/ja-JP/rules/golang/security.md +34 -0
- package/resources/local/ecc/docs/ja-JP/rules/golang/testing.md +31 -0
- package/resources/local/ecc/docs/ja-JP/rules/java/coding-style.md +114 -0
- package/resources/local/ecc/docs/ja-JP/rules/java/hooks.md +18 -0
- package/resources/local/ecc/docs/ja-JP/rules/java/patterns.md +147 -0
- package/resources/local/ecc/docs/ja-JP/rules/java/security.md +101 -0
- package/resources/local/ecc/docs/ja-JP/rules/java/testing.md +133 -0
- package/resources/local/ecc/docs/ja-JP/rules/kotlin/coding-style.md +86 -0
- package/resources/local/ecc/docs/ja-JP/rules/kotlin/hooks.md +17 -0
- package/resources/local/ecc/docs/ja-JP/rules/kotlin/patterns.md +146 -0
- package/resources/local/ecc/docs/ja-JP/rules/kotlin/security.md +82 -0
- package/resources/local/ecc/docs/ja-JP/rules/kotlin/testing.md +128 -0
- package/resources/local/ecc/docs/ja-JP/rules/perl/coding-style.md +46 -0
- package/resources/local/ecc/docs/ja-JP/rules/perl/hooks.md +22 -0
- package/resources/local/ecc/docs/ja-JP/rules/perl/patterns.md +76 -0
- package/resources/local/ecc/docs/ja-JP/rules/perl/security.md +69 -0
- package/resources/local/ecc/docs/ja-JP/rules/perl/testing.md +54 -0
- package/resources/local/ecc/docs/ja-JP/rules/php/coding-style.md +40 -0
- package/resources/local/ecc/docs/ja-JP/rules/php/hooks.md +24 -0
- package/resources/local/ecc/docs/ja-JP/rules/php/patterns.md +33 -0
- package/resources/local/ecc/docs/ja-JP/rules/php/security.md +37 -0
- package/resources/local/ecc/docs/ja-JP/rules/php/testing.md +39 -0
- package/resources/local/ecc/docs/ja-JP/rules/python/coding-style.md +42 -0
- package/resources/local/ecc/docs/ja-JP/rules/python/fastapi.md +58 -0
- package/resources/local/ecc/docs/ja-JP/rules/python/hooks.md +19 -0
- package/resources/local/ecc/docs/ja-JP/rules/python/patterns.md +39 -0
- package/resources/local/ecc/docs/ja-JP/rules/python/security.md +30 -0
- package/resources/local/ecc/docs/ja-JP/rules/python/testing.md +38 -0
- package/resources/local/ecc/docs/ja-JP/rules/ruby/coding-style.md +46 -0
- package/resources/local/ecc/docs/ja-JP/rules/ruby/hooks.md +37 -0
- package/resources/local/ecc/docs/ja-JP/rules/ruby/patterns.md +44 -0
- package/resources/local/ecc/docs/ja-JP/rules/ruby/security.md +51 -0
- package/resources/local/ecc/docs/ja-JP/rules/ruby/testing.md +51 -0
- package/resources/local/ecc/docs/ja-JP/rules/rust/coding-style.md +151 -0
- package/resources/local/ecc/docs/ja-JP/rules/rust/hooks.md +16 -0
- package/resources/local/ecc/docs/ja-JP/rules/rust/patterns.md +168 -0
- package/resources/local/ecc/docs/ja-JP/rules/rust/security.md +141 -0
- package/resources/local/ecc/docs/ja-JP/rules/rust/testing.md +154 -0
- package/resources/local/ecc/docs/ja-JP/rules/swift/coding-style.md +47 -0
- package/resources/local/ecc/docs/ja-JP/rules/swift/hooks.md +20 -0
- package/resources/local/ecc/docs/ja-JP/rules/swift/patterns.md +66 -0
- package/resources/local/ecc/docs/ja-JP/rules/swift/security.md +33 -0
- package/resources/local/ecc/docs/ja-JP/rules/swift/testing.md +45 -0
- package/resources/local/ecc/docs/ja-JP/rules/typescript/coding-style.md +199 -0
- package/resources/local/ecc/docs/ja-JP/rules/typescript/hooks.md +22 -0
- package/resources/local/ecc/docs/ja-JP/rules/typescript/patterns.md +52 -0
- package/resources/local/ecc/docs/ja-JP/rules/typescript/security.md +28 -0
- package/resources/local/ecc/docs/ja-JP/rules/typescript/testing.md +18 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/coding-style.md +96 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/design-quality.md +63 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/hooks.md +129 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/patterns.md +79 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/performance.md +64 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/security.md +57 -0
- package/resources/local/ecc/docs/ja-JP/rules/web/testing.md +55 -0
- package/resources/local/ecc/docs/ja-JP/skills/README.md +109 -0
- package/resources/local/ecc/docs/ja-JP/skills/accessibility/SKILL.md +145 -0
- package/resources/local/ecc/docs/ja-JP/skills/agent-architecture-audit/SKILL.md +256 -0
- package/resources/local/ecc/docs/ja-JP/skills/agent-eval/SKILL.md +145 -0
- package/resources/local/ecc/docs/ja-JP/skills/agent-harness-construction/SKILL.md +73 -0
- package/resources/local/ecc/docs/ja-JP/skills/agent-introspection-debugging/SKILL.md +153 -0
- package/resources/local/ecc/docs/ja-JP/skills/agent-payment-x402/SKILL.md +224 -0
- package/resources/local/ecc/docs/ja-JP/skills/agent-sort/SKILL.md +215 -0
- package/resources/local/ecc/docs/ja-JP/skills/agentic-engineering/SKILL.md +63 -0
- package/resources/local/ecc/docs/ja-JP/skills/agentic-os/SKILL.md +387 -0
- package/resources/local/ecc/docs/ja-JP/skills/ai-first-engineering/SKILL.md +51 -0
- package/resources/local/ecc/docs/ja-JP/skills/ai-regression-testing/SKILL.md +385 -0
- package/resources/local/ecc/docs/ja-JP/skills/android-clean-architecture/SKILL.md +339 -0
- package/resources/local/ecc/docs/ja-JP/skills/angular-developer/SKILL.md +154 -0
- package/resources/local/ecc/docs/ja-JP/skills/api-connector-builder/SKILL.md +120 -0
- package/resources/local/ecc/docs/ja-JP/skills/api-design/SKILL.md +457 -0
- package/resources/local/ecc/docs/ja-JP/skills/architecture-decision-records/SKILL.md +179 -0
- package/resources/local/ecc/docs/ja-JP/skills/article-writing/SKILL.md +79 -0
- package/resources/local/ecc/docs/ja-JP/skills/automation-audit-ops/SKILL.md +142 -0
- package/resources/local/ecc/docs/ja-JP/skills/autonomous-agent-harness/SKILL.md +103 -0
- package/resources/local/ecc/docs/ja-JP/skills/autonomous-loops/SKILL.md +77 -0
- package/resources/local/ecc/docs/ja-JP/skills/backend-patterns/SKILL.md +587 -0
- package/resources/local/ecc/docs/ja-JP/skills/benchmark/SKILL.md +93 -0
- package/resources/local/ecc/docs/ja-JP/skills/blueprint/SKILL.md +61 -0
- package/resources/local/ecc/docs/ja-JP/skills/brand-voice/SKILL.md +79 -0
- package/resources/local/ecc/docs/ja-JP/skills/browser-qa/SKILL.md +84 -0
- package/resources/local/ecc/docs/ja-JP/skills/bun-runtime/SKILL.md +70 -0
- package/resources/local/ecc/docs/ja-JP/skills/canary-watch/SKILL.md +96 -0
- package/resources/local/ecc/docs/ja-JP/skills/carrier-relationship-management/SKILL.md +60 -0
- package/resources/local/ecc/docs/ja-JP/skills/cisco-ios-patterns/SKILL.md +92 -0
- package/resources/local/ecc/docs/ja-JP/skills/ck/SKILL.md +99 -0
- package/resources/local/ecc/docs/ja-JP/skills/claude-devfleet/SKILL.md +69 -0
- package/resources/local/ecc/docs/ja-JP/skills/click-path-audit/SKILL.md +85 -0
- package/resources/local/ecc/docs/ja-JP/skills/clickhouse-io/SKILL.md +429 -0
- package/resources/local/ecc/docs/ja-JP/skills/code-tour/SKILL.md +57 -0
- package/resources/local/ecc/docs/ja-JP/skills/codebase-onboarding/SKILL.md +58 -0
- package/resources/local/ecc/docs/ja-JP/skills/coding-standards/SKILL.md +527 -0
- package/resources/local/ecc/docs/ja-JP/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/resources/local/ecc/docs/ja-JP/skills/configure-ecc/SKILL.md +313 -0
- package/resources/local/ecc/docs/ja-JP/skills/connections-optimizer/SKILL.md +189 -0
- package/resources/local/ecc/docs/ja-JP/skills/content-engine/SKILL.md +131 -0
- package/resources/local/ecc/docs/ja-JP/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/resources/local/ecc/docs/ja-JP/skills/context-budget/SKILL.md +135 -0
- package/resources/local/ecc/docs/ja-JP/skills/continuous-agent-loop/SKILL.md +45 -0
- package/resources/local/ecc/docs/ja-JP/skills/continuous-learning/SKILL.md +110 -0
- package/resources/local/ecc/docs/ja-JP/skills/continuous-learning-v2/SKILL.md +268 -0
- package/resources/local/ecc/docs/ja-JP/skills/continuous-learning-v2/agents/observer.md +137 -0
- package/resources/local/ecc/docs/ja-JP/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/resources/local/ecc/docs/ja-JP/skills/cost-tracking/SKILL.md +137 -0
- package/resources/local/ecc/docs/ja-JP/skills/council/SKILL.md +203 -0
- package/resources/local/ecc/docs/ja-JP/skills/cpp-coding-standards/SKILL.md +49 -0
- package/resources/local/ecc/docs/ja-JP/skills/cpp-testing/SKILL.md +322 -0
- package/resources/local/ecc/docs/ja-JP/skills/crosspost/SKILL.md +111 -0
- package/resources/local/ecc/docs/ja-JP/skills/csharp-testing/SKILL.md +321 -0
- package/resources/local/ecc/docs/ja-JP/skills/customer-billing-ops/SKILL.md +140 -0
- package/resources/local/ecc/docs/ja-JP/skills/customs-trade-compliance/SKILL.md +46 -0
- package/resources/local/ecc/docs/ja-JP/skills/dart-flutter-patterns/SKILL.md +53 -0
- package/resources/local/ecc/docs/ja-JP/skills/dashboard-builder/SKILL.md +58 -0
- package/resources/local/ecc/docs/ja-JP/skills/data-scraper-agent/SKILL.md +57 -0
- package/resources/local/ecc/docs/ja-JP/skills/database-migrations/SKILL.md +54 -0
- package/resources/local/ecc/docs/ja-JP/skills/deep-research/SKILL.md +33 -0
- package/resources/local/ecc/docs/ja-JP/skills/defi-amm-security/SKILL.md +46 -0
- package/resources/local/ecc/docs/ja-JP/skills/deployment-patterns/SKILL.md +50 -0
- package/resources/local/ecc/docs/ja-JP/skills/design-system/SKILL.md +53 -0
- package/resources/local/ecc/docs/ja-JP/skills/django-celery/SKILL.md +72 -0
- package/resources/local/ecc/docs/ja-JP/skills/django-patterns/SKILL.md +733 -0
- package/resources/local/ecc/docs/ja-JP/skills/django-security/SKILL.md +592 -0
- package/resources/local/ecc/docs/ja-JP/skills/django-tdd/SKILL.md +728 -0
- package/resources/local/ecc/docs/ja-JP/skills/django-verification/SKILL.md +460 -0
- package/resources/local/ecc/docs/ja-JP/skills/dmux-workflows/SKILL.md +68 -0
- package/resources/local/ecc/docs/ja-JP/skills/docker-patterns/SKILL.md +93 -0
- package/resources/local/ecc/docs/ja-JP/skills/documentation-lookup/SKILL.md +77 -0
- package/resources/local/ecc/docs/ja-JP/skills/dotnet-patterns/SKILL.md +321 -0
- package/resources/local/ecc/docs/ja-JP/skills/e2e-testing/SKILL.md +326 -0
- package/resources/local/ecc/docs/ja-JP/skills/ecc-guide/SKILL.md +189 -0
- package/resources/local/ecc/docs/ja-JP/skills/ecc-tools-cost-audit/SKILL.md +160 -0
- package/resources/local/ecc/docs/ja-JP/skills/email-ops/SKILL.md +121 -0
- package/resources/local/ecc/docs/ja-JP/skills/energy-procurement/SKILL.md +228 -0
- package/resources/local/ecc/docs/ja-JP/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/resources/local/ecc/docs/ja-JP/skills/error-handling/SKILL.md +376 -0
- package/resources/local/ecc/docs/ja-JP/skills/eval-harness/SKILL.md +227 -0
- package/resources/local/ecc/docs/ja-JP/skills/evm-token-decimals/SKILL.md +130 -0
- package/resources/local/ecc/docs/ja-JP/skills/exa-search/SKILL.md +105 -0
- package/resources/local/ecc/docs/ja-JP/skills/fal-ai-media/SKILL.md +286 -0
- package/resources/local/ecc/docs/ja-JP/skills/fastapi-patterns/SKILL.md +327 -0
- package/resources/local/ecc/docs/ja-JP/skills/finance-billing-ops/SKILL.md +127 -0
- package/resources/local/ecc/docs/ja-JP/skills/flox-environments/SKILL.md +496 -0
- package/resources/local/ecc/docs/ja-JP/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/resources/local/ecc/docs/ja-JP/skills/foundation-models-on-device/SKILL.md +243 -0
- package/resources/local/ecc/docs/ja-JP/skills/frontend-design-direction/SKILL.md +92 -0
- package/resources/local/ecc/docs/ja-JP/skills/frontend-patterns/SKILL.md +631 -0
- package/resources/local/ecc/docs/ja-JP/skills/frontend-slides/SKILL.md +184 -0
- package/resources/local/ecc/docs/ja-JP/skills/frontend-slides/STYLE_PRESETS.md +333 -0
- package/resources/local/ecc/docs/ja-JP/skills/fsharp-testing/SKILL.md +280 -0
- package/resources/local/ecc/docs/ja-JP/skills/gan-style-harness/SKILL.md +278 -0
- package/resources/local/ecc/docs/ja-JP/skills/gateguard/SKILL.md +125 -0
- package/resources/local/ecc/docs/ja-JP/skills/git-workflow/SKILL.md +715 -0
- package/resources/local/ecc/docs/ja-JP/skills/github-ops/SKILL.md +144 -0
- package/resources/local/ecc/docs/ja-JP/skills/golang-patterns/SKILL.md +673 -0
- package/resources/local/ecc/docs/ja-JP/skills/golang-testing/SKILL.md +959 -0
- package/resources/local/ecc/docs/ja-JP/skills/google-workspace-ops/SKILL.md +95 -0
- package/resources/local/ecc/docs/ja-JP/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/resources/local/ecc/docs/ja-JP/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/resources/local/ecc/docs/ja-JP/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/resources/local/ecc/docs/ja-JP/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/resources/local/ecc/docs/ja-JP/skills/hermes-imports/SKILL.md +88 -0
- package/resources/local/ecc/docs/ja-JP/skills/hexagonal-architecture/SKILL.md +276 -0
- package/resources/local/ecc/docs/ja-JP/skills/hipaa-compliance/SKILL.md +78 -0
- package/resources/local/ecc/docs/ja-JP/skills/homelab-network-readiness/SKILL.md +169 -0
- package/resources/local/ecc/docs/ja-JP/skills/homelab-network-setup/SKILL.md +129 -0
- package/resources/local/ecc/docs/ja-JP/skills/homelab-pihole-dns/SKILL.md +274 -0
- package/resources/local/ecc/docs/ja-JP/skills/homelab-vlan-segmentation/SKILL.md +311 -0
- package/resources/local/ecc/docs/ja-JP/skills/homelab-wireguard-vpn/SKILL.md +305 -0
- package/resources/local/ecc/docs/ja-JP/skills/hookify-rules/SKILL.md +128 -0
- package/resources/local/ecc/docs/ja-JP/skills/inventory-demand-planning/SKILL.md +247 -0
- package/resources/local/ecc/docs/ja-JP/skills/investor-materials/SKILL.md +96 -0
- package/resources/local/ecc/docs/ja-JP/skills/investor-outreach/SKILL.md +91 -0
- package/resources/local/ecc/docs/ja-JP/skills/ios-icon-gen/SKILL.md +157 -0
- package/resources/local/ecc/docs/ja-JP/skills/iterative-retrieval/SKILL.md +202 -0
- package/resources/local/ecc/docs/ja-JP/skills/java-coding-standards/SKILL.md +138 -0
- package/resources/local/ecc/docs/ja-JP/skills/jira-integration/SKILL.md +293 -0
- package/resources/local/ecc/docs/ja-JP/skills/jpa-patterns/SKILL.md +141 -0
- package/resources/local/ecc/docs/ja-JP/skills/knowledge-ops/SKILL.md +154 -0
- package/resources/local/ecc/docs/ja-JP/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/resources/local/ecc/docs/ja-JP/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/resources/local/ecc/docs/ja-JP/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/resources/local/ecc/docs/ja-JP/skills/kotlin-patterns/SKILL.md +711 -0
- package/resources/local/ecc/docs/ja-JP/skills/kotlin-testing/SKILL.md +824 -0
- package/resources/local/ecc/docs/ja-JP/skills/laravel-patterns/SKILL.md +415 -0
- package/resources/local/ecc/docs/ja-JP/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/resources/local/ecc/docs/ja-JP/skills/laravel-security/SKILL.md +285 -0
- package/resources/local/ecc/docs/ja-JP/skills/laravel-tdd/SKILL.md +283 -0
- package/resources/local/ecc/docs/ja-JP/skills/laravel-verification/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/lead-intelligence/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/liquid-glass-design/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/llm-trading-agent-security/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/logistics-exception-management/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/make-interfaces-feel-better/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/manim-video/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/market-research/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/mcp-server-patterns/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/messages-ops/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/mle-workflow/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/motion-advanced/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/motion-foundations/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/motion-patterns/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/motion-ui/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/mysql-patterns/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/nanoclaw-repl/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/nestjs-patterns/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/netmiko-ssh-automation/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/network-bgp-diagnostics/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/network-config-validation/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/network-interface-health/SKILL.md +143 -0
- package/resources/local/ecc/docs/ja-JP/skills/nextjs-turbopack/SKILL.md +44 -0
- package/resources/local/ecc/docs/ja-JP/skills/nodejs-keccak256/SKILL.md +102 -0
- package/resources/local/ecc/docs/ja-JP/skills/nutrient-document-processing/SKILL.md +164 -0
- package/resources/local/ecc/docs/ja-JP/skills/nuxt4-patterns/SKILL.md +100 -0
- package/resources/local/ecc/docs/ja-JP/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/resources/local/ecc/docs/ja-JP/skills/opensource-pipeline/SKILL.md +255 -0
- package/resources/local/ecc/docs/ja-JP/skills/perl-patterns/SKILL.md +504 -0
- package/resources/local/ecc/docs/ja-JP/skills/perl-security/SKILL.md +503 -0
- package/resources/local/ecc/docs/ja-JP/skills/perl-testing/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/plan-orchestrate/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/plankton-code-quality/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/postgres-patterns/SKILL.md +146 -0
- package/resources/local/ecc/docs/ja-JP/skills/product-capability/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/product-lens/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/production-audit/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/production-scheduling/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/project-flow-ops/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/project-guidelines-example/SKILL.md +345 -0
- package/resources/local/ecc/docs/ja-JP/skills/prompt-optimizer/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/python-patterns/SKILL.md +749 -0
- package/resources/local/ecc/docs/ja-JP/skills/python-testing/SKILL.md +815 -0
- package/resources/local/ecc/docs/ja-JP/skills/pytorch-patterns/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/quality-nonconformance/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/quarkus-patterns/SKILL.md +11 -0
- package/resources/local/ecc/docs/ja-JP/skills/quarkus-security/SKILL.md +466 -0
- package/resources/local/ecc/docs/ja-JP/skills/quarkus-tdd/SKILL.md +811 -0
- package/resources/local/ecc/docs/ja-JP/skills/quarkus-verification/SKILL.md +479 -0
- package/resources/local/ecc/docs/ja-JP/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/resources/local/ecc/docs/ja-JP/skills/redis-patterns/SKILL.md +403 -0
- package/resources/local/ecc/docs/ja-JP/skills/regex-vs-llm-structured-text/SKILL.md +217 -0
- package/resources/local/ecc/docs/ja-JP/skills/remotion-video-creation/SKILL.md +43 -0
- package/resources/local/ecc/docs/ja-JP/skills/repo-scan/SKILL.md +79 -0
- package/resources/local/ecc/docs/ja-JP/skills/research-ops/SKILL.md +112 -0
- package/resources/local/ecc/docs/ja-JP/skills/returns-reverse-logistics/SKILL.md +225 -0
- package/resources/local/ecc/docs/ja-JP/skills/rules-distill/SKILL.md +264 -0
- package/resources/local/ecc/docs/ja-JP/skills/rust-patterns/SKILL.md +499 -0
- package/resources/local/ecc/docs/ja-JP/skills/rust-testing/SKILL.md +502 -0
- package/resources/local/ecc/docs/ja-JP/skills/safety-guard/SKILL.md +75 -0
- package/resources/local/ecc/docs/ja-JP/skills/santa-method/SKILL.md +306 -0
- package/resources/local/ecc/docs/ja-JP/skills/scientific-db-pubmed-database/SKILL.md +168 -0
- package/resources/local/ecc/docs/ja-JP/skills/scientific-db-uspto-database/SKILL.md +158 -0
- package/resources/local/ecc/docs/ja-JP/skills/scientific-pkg-gget/SKILL.md +154 -0
- package/resources/local/ecc/docs/ja-JP/skills/scientific-thinking-literature-review/SKILL.md +184 -0
- package/resources/local/ecc/docs/ja-JP/skills/scientific-thinking-scholar-evaluation/SKILL.md +159 -0
- package/resources/local/ecc/docs/ja-JP/skills/search-first/SKILL.md +181 -0
- package/resources/local/ecc/docs/ja-JP/skills/security-bounty-hunter/SKILL.md +99 -0
- package/resources/local/ecc/docs/ja-JP/skills/security-review/SKILL.md +494 -0
- package/resources/local/ecc/docs/ja-JP/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/resources/local/ecc/docs/ja-JP/skills/security-scan/SKILL.md +164 -0
- package/resources/local/ecc/docs/ja-JP/skills/seo/SKILL.md +154 -0
- package/resources/local/ecc/docs/ja-JP/skills/skill-comply/SKILL.md +60 -0
- package/resources/local/ecc/docs/ja-JP/skills/skill-scout/SKILL.md +131 -0
- package/resources/local/ecc/docs/ja-JP/skills/skill-stocktake/SKILL.md +194 -0
- package/resources/local/ecc/docs/ja-JP/skills/social-graph-ranker/SKILL.md +154 -0
- package/resources/local/ecc/docs/ja-JP/skills/springboot-patterns/SKILL.md +304 -0
- package/resources/local/ecc/docs/ja-JP/skills/springboot-security/SKILL.md +119 -0
- package/resources/local/ecc/docs/ja-JP/skills/springboot-tdd/SKILL.md +157 -0
- package/resources/local/ecc/docs/ja-JP/skills/springboot-verification/SKILL.md +100 -0
- package/resources/local/ecc/docs/ja-JP/skills/strategic-compact/SKILL.md +66 -0
- package/resources/local/ecc/docs/ja-JP/skills/swift-actor-persistence/SKILL.md +157 -0
- package/resources/local/ecc/docs/ja-JP/skills/swift-concurrency-6-2/SKILL.md +217 -0
- package/resources/local/ecc/docs/ja-JP/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/resources/local/ecc/docs/ja-JP/skills/swiftui-patterns/SKILL.md +259 -0
- package/resources/local/ecc/docs/ja-JP/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/local/ecc/docs/ja-JP/skills/team-builder/SKILL.md +165 -0
- package/resources/local/ecc/docs/ja-JP/skills/terminal-ops/SKILL.md +109 -0
- package/resources/local/ecc/docs/ja-JP/skills/tinystruct-patterns/SKILL.md +104 -0
- package/resources/local/ecc/docs/ja-JP/skills/token-budget-advisor/SKILL.md +121 -0
- package/resources/local/ecc/docs/ja-JP/skills/ui-demo/SKILL.md +465 -0
- package/resources/local/ecc/docs/ja-JP/skills/ui-to-vue/SKILL.md +86 -0
- package/resources/local/ecc/docs/ja-JP/skills/unified-notifications-ops/SKILL.md +197 -0
- package/resources/local/ecc/docs/ja-JP/skills/verification-loop/SKILL.md +120 -0
- package/resources/local/ecc/docs/ja-JP/skills/video-editing/SKILL.md +317 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/SKILL.md +386 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/api-reference.md +550 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/capture-reference.md +416 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/capture.md +104 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/editor.md +443 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/generative.md +331 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/rtstream-reference.md +567 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/rtstream.md +59 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/search.md +230 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/streaming.md +406 -0
- package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/use-cases.md +142 -0
- package/resources/local/ecc/docs/ja-JP/skills/visa-doc-translate/README.md +91 -0
- package/resources/local/ecc/docs/ja-JP/skills/visa-doc-translate/SKILL.md +119 -0
- package/resources/local/ecc/docs/ja-JP/skills/vite-patterns/SKILL.md +449 -0
- package/resources/local/ecc/docs/ja-JP/skills/windows-desktop-e2e/SKILL.md +784 -0
- package/resources/local/ecc/docs/ja-JP/skills/workspace-surface-audit/SKILL.md +125 -0
- package/resources/local/ecc/docs/ja-JP/skills/x-api/SKILL.md +210 -0
- package/resources/local/ecc/docs/ja-JP/the-longform-guide.md +354 -0
- package/resources/local/ecc/docs/ja-JP/the-openclaw-guide.md +471 -0
- package/resources/local/ecc/docs/ja-JP/the-security-guide.md +257 -0
- package/resources/local/ecc/docs/ja-JP/the-shortform-guide.md +429 -0
- package/resources/local/ecc/docs/ko-KR/CONTRIBUTING.md +453 -0
- package/resources/local/ecc/docs/ko-KR/README.md +731 -0
- package/resources/local/ecc/docs/ko-KR/TERMINOLOGY.md +104 -0
- package/resources/local/ecc/docs/ko-KR/agents/architect.md +211 -0
- package/resources/local/ecc/docs/ko-KR/agents/build-error-resolver.md +114 -0
- package/resources/local/ecc/docs/ko-KR/agents/code-reviewer.md +237 -0
- package/resources/local/ecc/docs/ko-KR/agents/database-reviewer.md +87 -0
- package/resources/local/ecc/docs/ko-KR/agents/doc-updater.md +107 -0
- package/resources/local/ecc/docs/ko-KR/agents/e2e-runner.md +103 -0
- package/resources/local/ecc/docs/ko-KR/agents/go-build-resolver.md +92 -0
- package/resources/local/ecc/docs/ko-KR/agents/go-reviewer.md +74 -0
- package/resources/local/ecc/docs/ko-KR/agents/planner.md +209 -0
- package/resources/local/ecc/docs/ko-KR/agents/refactor-cleaner.md +85 -0
- package/resources/local/ecc/docs/ko-KR/agents/security-reviewer.md +104 -0
- package/resources/local/ecc/docs/ko-KR/agents/tdd-guide.md +101 -0
- package/resources/local/ecc/docs/ko-KR/commands/build-fix.md +68 -0
- package/resources/local/ecc/docs/ko-KR/commands/checkpoint.md +79 -0
- package/resources/local/ecc/docs/ko-KR/commands/code-review.md +40 -0
- package/resources/local/ecc/docs/ko-KR/commands/e2e.md +334 -0
- package/resources/local/ecc/docs/ko-KR/commands/eval.md +120 -0
- package/resources/local/ecc/docs/ko-KR/commands/go-build.md +183 -0
- package/resources/local/ecc/docs/ko-KR/commands/go-review.md +148 -0
- package/resources/local/ecc/docs/ko-KR/commands/go-test.md +268 -0
- package/resources/local/ecc/docs/ko-KR/commands/learn.md +70 -0
- package/resources/local/ecc/docs/ko-KR/commands/orchestrate.md +172 -0
- package/resources/local/ecc/docs/ko-KR/commands/plan.md +113 -0
- package/resources/local/ecc/docs/ko-KR/commands/refactor-clean.md +80 -0
- package/resources/local/ecc/docs/ko-KR/commands/setup-pm.md +80 -0
- package/resources/local/ecc/docs/ko-KR/commands/tdd.md +326 -0
- package/resources/local/ecc/docs/ko-KR/commands/test-coverage.md +74 -0
- package/resources/local/ecc/docs/ko-KR/commands/update-codemaps.md +79 -0
- package/resources/local/ecc/docs/ko-KR/commands/update-docs.md +89 -0
- package/resources/local/ecc/docs/ko-KR/commands/verify.md +63 -0
- package/resources/local/ecc/docs/ko-KR/examples/CLAUDE.md +109 -0
- package/resources/local/ecc/docs/ko-KR/examples/django-api-CLAUDE.md +308 -0
- package/resources/local/ecc/docs/ko-KR/examples/go-microservice-CLAUDE.md +267 -0
- package/resources/local/ecc/docs/ko-KR/examples/rust-api-CLAUDE.md +291 -0
- package/resources/local/ecc/docs/ko-KR/examples/saas-nextjs-CLAUDE.md +166 -0
- package/resources/local/ecc/docs/ko-KR/examples/statusline.json +19 -0
- package/resources/local/ecc/docs/ko-KR/examples/user-CLAUDE.md +109 -0
- package/resources/local/ecc/docs/ko-KR/rules/agents.md +52 -0
- package/resources/local/ecc/docs/ko-KR/rules/coding-style.md +48 -0
- package/resources/local/ecc/docs/ko-KR/rules/git-workflow.md +24 -0
- package/resources/local/ecc/docs/ko-KR/rules/hooks.md +30 -0
- package/resources/local/ecc/docs/ko-KR/rules/patterns.md +31 -0
- package/resources/local/ecc/docs/ko-KR/rules/performance.md +55 -0
- package/resources/local/ecc/docs/ko-KR/rules/security.md +29 -0
- package/resources/local/ecc/docs/ko-KR/rules/testing.md +29 -0
- package/resources/local/ecc/docs/ko-KR/skills/backend-patterns/SKILL.md +599 -0
- package/resources/local/ecc/docs/ko-KR/skills/clickhouse-io/SKILL.md +447 -0
- package/resources/local/ecc/docs/ko-KR/skills/coding-standards/SKILL.md +530 -0
- package/resources/local/ecc/docs/ko-KR/skills/continuous-learning/SKILL.md +148 -0
- package/resources/local/ecc/docs/ko-KR/skills/continuous-learning-v2/SKILL.md +346 -0
- package/resources/local/ecc/docs/ko-KR/skills/eval-harness/SKILL.md +270 -0
- package/resources/local/ecc/docs/ko-KR/skills/frontend-patterns/SKILL.md +652 -0
- package/resources/local/ecc/docs/ko-KR/skills/golang-patterns/SKILL.md +675 -0
- package/resources/local/ecc/docs/ko-KR/skills/golang-testing/SKILL.md +720 -0
- package/resources/local/ecc/docs/ko-KR/skills/iterative-retrieval/SKILL.md +211 -0
- package/resources/local/ecc/docs/ko-KR/skills/postgres-patterns/SKILL.md +147 -0
- package/resources/local/ecc/docs/ko-KR/skills/security-review/SKILL.md +504 -0
- package/resources/local/ecc/docs/ko-KR/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/resources/local/ecc/docs/ko-KR/skills/strategic-compact/SKILL.md +105 -0
- package/resources/local/ecc/docs/ko-KR/skills/tdd-workflow/SKILL.md +408 -0
- package/resources/local/ecc/docs/ko-KR/skills/verification-loop/SKILL.md +127 -0
- package/resources/local/ecc/docs/legacy-artifact-inventory.md +112 -0
- package/resources/local/ecc/docs/pt-BR/CONTRIBUTING.md +426 -0
- package/resources/local/ecc/docs/pt-BR/README.md +518 -0
- package/resources/local/ecc/docs/pt-BR/TERMINOLOGY.md +102 -0
- package/resources/local/ecc/docs/pt-BR/agents/architect.md +80 -0
- package/resources/local/ecc/docs/pt-BR/agents/build-error-resolver.md +80 -0
- package/resources/local/ecc/docs/pt-BR/agents/code-reviewer.md +86 -0
- package/resources/local/ecc/docs/pt-BR/agents/database-reviewer.md +91 -0
- package/resources/local/ecc/docs/pt-BR/agents/doc-updater.md +99 -0
- package/resources/local/ecc/docs/pt-BR/agents/e2e-runner.md +99 -0
- package/resources/local/ecc/docs/pt-BR/agents/go-build-resolver.md +80 -0
- package/resources/local/ecc/docs/pt-BR/agents/go-reviewer.md +76 -0
- package/resources/local/ecc/docs/pt-BR/agents/planner.md +81 -0
- package/resources/local/ecc/docs/pt-BR/agents/refactor-cleaner.md +85 -0
- package/resources/local/ecc/docs/pt-BR/agents/security-reviewer.md +108 -0
- package/resources/local/ecc/docs/pt-BR/agents/tdd-guide.md +80 -0
- package/resources/local/ecc/docs/pt-BR/commands/build-fix.md +62 -0
- package/resources/local/ecc/docs/pt-BR/commands/checkpoint.md +74 -0
- package/resources/local/ecc/docs/pt-BR/commands/code-review.md +40 -0
- package/resources/local/ecc/docs/pt-BR/commands/e2e.md +365 -0
- package/resources/local/ecc/docs/pt-BR/commands/eval.md +120 -0
- package/resources/local/ecc/docs/pt-BR/commands/go-build.md +183 -0
- package/resources/local/ecc/docs/pt-BR/commands/go-review.md +147 -0
- package/resources/local/ecc/docs/pt-BR/commands/go-test.md +268 -0
- package/resources/local/ecc/docs/pt-BR/commands/learn.md +70 -0
- package/resources/local/ecc/docs/pt-BR/commands/orchestrate.md +230 -0
- package/resources/local/ecc/docs/pt-BR/commands/plan.md +113 -0
- package/resources/local/ecc/docs/pt-BR/commands/refactor-clean.md +80 -0
- package/resources/local/ecc/docs/pt-BR/commands/setup-pm.md +80 -0
- package/resources/local/ecc/docs/pt-BR/commands/tdd.md +328 -0
- package/resources/local/ecc/docs/pt-BR/commands/test-coverage.md +69 -0
- package/resources/local/ecc/docs/pt-BR/commands/update-codemaps.md +72 -0
- package/resources/local/ecc/docs/pt-BR/commands/update-docs.md +84 -0
- package/resources/local/ecc/docs/pt-BR/commands/verify.md +59 -0
- package/resources/local/ecc/docs/pt-BR/examples/CLAUDE.md +109 -0
- package/resources/local/ecc/docs/pt-BR/examples/django-api-CLAUDE.md +308 -0
- package/resources/local/ecc/docs/pt-BR/examples/go-microservice-CLAUDE.md +267 -0
- package/resources/local/ecc/docs/pt-BR/examples/rust-api-CLAUDE.md +285 -0
- package/resources/local/ecc/docs/pt-BR/examples/saas-nextjs-CLAUDE.md +166 -0
- package/resources/local/ecc/docs/pt-BR/examples/user-CLAUDE.md +109 -0
- package/resources/local/ecc/docs/pt-BR/rules/agents.md +50 -0
- package/resources/local/ecc/docs/pt-BR/rules/coding-style.md +48 -0
- package/resources/local/ecc/docs/pt-BR/rules/git-workflow.md +24 -0
- package/resources/local/ecc/docs/pt-BR/rules/hooks.md +30 -0
- package/resources/local/ecc/docs/pt-BR/rules/patterns.md +31 -0
- package/resources/local/ecc/docs/pt-BR/rules/performance.md +55 -0
- package/resources/local/ecc/docs/pt-BR/rules/security.md +29 -0
- package/resources/local/ecc/docs/pt-BR/rules/testing.md +29 -0
- package/resources/local/ecc/docs/releases/1.10.0/discussion-announcement.md +55 -0
- package/resources/local/ecc/docs/releases/1.10.0/release-notes.md +70 -0
- package/resources/local/ecc/docs/releases/1.10.0/x-thread.md +45 -0
- package/resources/local/ecc/docs/releases/1.8.0/linkedin-post.md +13 -0
- package/resources/local/ecc/docs/releases/1.8.0/reference-attribution.md +16 -0
- package/resources/local/ecc/docs/releases/1.8.0/release-notes.md +20 -0
- package/resources/local/ecc/docs/releases/1.8.0/x-quote-eval-skills.md +5 -0
- package/resources/local/ecc/docs/releases/1.8.0/x-quote-plankton-deslop.md +5 -0
- package/resources/local/ecc/docs/releases/1.8.0/x-thread.md +11 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/article-outline.md +78 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/demo-prompts.md +42 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/launch-checklist.md +56 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/linkedin-post.md +42 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/naming-and-publication-matrix.md +159 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/operator-readiness-dashboard-2026-05-15.md +55 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/operator-readiness-dashboard-2026-05-17.md +51 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/operator-readiness-dashboard-2026-05-18.md +51 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/owner-queue-cleanup-2026-05-18.md +65 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/preview-pack-manifest.md +110 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-12.md +103 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-13-post-hardening.md +98 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-13.md +60 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-15.md +187 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-16.md +86 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-17.md +113 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-18.md +150 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-readiness.md +138 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/quickstart.md +70 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/release-name-plugin-publication-checklist-2026-05-18.md +116 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/release-notes.md +106 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/release-url-ledger-2026-05-18.md +55 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/telegram-handoff.md +30 -0
- package/resources/local/ecc/docs/releases/2.0.0-rc.1/x-thread.md +83 -0
- package/resources/local/ecc/docs/ru/README.md +1613 -0
- package/resources/local/ecc/docs/security/supply-chain-incident-response.md +188 -0
- package/resources/local/ecc/docs/skill-adaptation-policy.md +73 -0
- package/resources/local/ecc/docs/stale-pr-salvage-ledger.md +173 -0
- package/resources/local/ecc/docs/th/README.md +263 -0
- package/resources/local/ecc/docs/token-optimization.md +156 -0
- package/resources/local/ecc/docs/tr/AGENTS.md +160 -0
- package/resources/local/ecc/docs/tr/CHANGELOG.md +189 -0
- package/resources/local/ecc/docs/tr/CLAUDE.md +69 -0
- package/resources/local/ecc/docs/tr/CODE_OF_CONDUCT.md +104 -0
- package/resources/local/ecc/docs/tr/CONTRIBUTING.md +461 -0
- package/resources/local/ecc/docs/tr/README.md +466 -0
- package/resources/local/ecc/docs/tr/SECURITY.md +53 -0
- package/resources/local/ecc/docs/tr/SPONSORING.md +43 -0
- package/resources/local/ecc/docs/tr/SPONSORS.md +59 -0
- package/resources/local/ecc/docs/tr/TERMINOLOGY.md +184 -0
- package/resources/local/ecc/docs/tr/TROUBLESHOOTING.md +422 -0
- package/resources/local/ecc/docs/tr/agents/architect.md +211 -0
- package/resources/local/ecc/docs/tr/agents/build-error-resolver.md +114 -0
- package/resources/local/ecc/docs/tr/agents/chief-of-staff.md +151 -0
- package/resources/local/ecc/docs/tr/agents/code-reviewer.md +237 -0
- package/resources/local/ecc/docs/tr/agents/cpp-build-resolver.md +90 -0
- package/resources/local/ecc/docs/tr/agents/cpp-reviewer.md +72 -0
- package/resources/local/ecc/docs/tr/agents/database-reviewer.md +91 -0
- package/resources/local/ecc/docs/tr/agents/doc-updater.md +107 -0
- package/resources/local/ecc/docs/tr/agents/docs-lookup.md +68 -0
- package/resources/local/ecc/docs/tr/agents/e2e-runner.md +107 -0
- package/resources/local/ecc/docs/tr/agents/flutter-reviewer.md +243 -0
- package/resources/local/ecc/docs/tr/agents/go-build-resolver.md +94 -0
- package/resources/local/ecc/docs/tr/agents/go-reviewer.md +76 -0
- package/resources/local/ecc/docs/tr/agents/harness-optimizer.md +35 -0
- package/resources/local/ecc/docs/tr/agents/java-build-resolver.md +155 -0
- package/resources/local/ecc/docs/tr/agents/java-reviewer.md +94 -0
- package/resources/local/ecc/docs/tr/agents/kotlin-build-resolver.md +118 -0
- package/resources/local/ecc/docs/tr/agents/kotlin-reviewer.md +159 -0
- package/resources/local/ecc/docs/tr/agents/loop-operator.md +36 -0
- package/resources/local/ecc/docs/tr/agents/planner.md +212 -0
- package/resources/local/ecc/docs/tr/agents/python-reviewer.md +98 -0
- package/resources/local/ecc/docs/tr/agents/pytorch-build-resolver.md +120 -0
- package/resources/local/ecc/docs/tr/agents/refactor-cleaner.md +85 -0
- package/resources/local/ecc/docs/tr/agents/rust-build-resolver.md +148 -0
- package/resources/local/ecc/docs/tr/agents/rust-reviewer.md +94 -0
- package/resources/local/ecc/docs/tr/agents/security-reviewer.md +108 -0
- package/resources/local/ecc/docs/tr/agents/tdd-guide.md +91 -0
- package/resources/local/ecc/docs/tr/agents/typescript-reviewer.md +112 -0
- package/resources/local/ecc/docs/tr/commands/build-fix.md +62 -0
- package/resources/local/ecc/docs/tr/commands/checkpoint.md +74 -0
- package/resources/local/ecc/docs/tr/commands/code-review.md +40 -0
- package/resources/local/ecc/docs/tr/commands/e2e.md +365 -0
- package/resources/local/ecc/docs/tr/commands/eval.md +120 -0
- package/resources/local/ecc/docs/tr/commands/evolve.md +178 -0
- package/resources/local/ecc/docs/tr/commands/go-build.md +183 -0
- package/resources/local/ecc/docs/tr/commands/go-review.md +148 -0
- package/resources/local/ecc/docs/tr/commands/go-test.md +268 -0
- package/resources/local/ecc/docs/tr/commands/instinct-export.md +66 -0
- package/resources/local/ecc/docs/tr/commands/instinct-import.md +114 -0
- package/resources/local/ecc/docs/tr/commands/instinct-status.md +59 -0
- package/resources/local/ecc/docs/tr/commands/learn-eval.md +116 -0
- package/resources/local/ecc/docs/tr/commands/learn.md +70 -0
- package/resources/local/ecc/docs/tr/commands/multi-backend.md +158 -0
- package/resources/local/ecc/docs/tr/commands/multi-execute.md +315 -0
- package/resources/local/ecc/docs/tr/commands/multi-frontend.md +158 -0
- package/resources/local/ecc/docs/tr/commands/multi-plan.md +268 -0
- package/resources/local/ecc/docs/tr/commands/multi-workflow.md +191 -0
- package/resources/local/ecc/docs/tr/commands/orchestrate.md +231 -0
- package/resources/local/ecc/docs/tr/commands/plan.md +115 -0
- package/resources/local/ecc/docs/tr/commands/pm2.md +272 -0
- package/resources/local/ecc/docs/tr/commands/refactor-clean.md +80 -0
- package/resources/local/ecc/docs/tr/commands/sessions.md +293 -0
- package/resources/local/ecc/docs/tr/commands/setup-pm.md +80 -0
- package/resources/local/ecc/docs/tr/commands/skill-create.md +174 -0
- package/resources/local/ecc/docs/tr/commands/tdd.md +328 -0
- package/resources/local/ecc/docs/tr/commands/test-coverage.md +69 -0
- package/resources/local/ecc/docs/tr/commands/update-docs.md +84 -0
- package/resources/local/ecc/docs/tr/commands/verify.md +59 -0
- package/resources/local/ecc/docs/tr/contexts/dev.md +20 -0
- package/resources/local/ecc/docs/tr/contexts/research.md +26 -0
- package/resources/local/ecc/docs/tr/contexts/review.md +22 -0
- package/resources/local/ecc/docs/tr/examples/CLAUDE.md +109 -0
- package/resources/local/ecc/docs/tr/examples/README.md +80 -0
- package/resources/local/ecc/docs/tr/examples/statusline.json +19 -0
- package/resources/local/ecc/docs/tr/examples/user-CLAUDE.md +109 -0
- package/resources/local/ecc/docs/tr/rules/README.md +61 -0
- package/resources/local/ecc/docs/tr/rules/common/agents.md +50 -0
- package/resources/local/ecc/docs/tr/rules/common/coding-style.md +48 -0
- package/resources/local/ecc/docs/tr/rules/common/development-workflow.md +38 -0
- package/resources/local/ecc/docs/tr/rules/common/git-workflow.md +24 -0
- package/resources/local/ecc/docs/tr/rules/common/hooks.md +30 -0
- package/resources/local/ecc/docs/tr/rules/common/patterns.md +31 -0
- package/resources/local/ecc/docs/tr/rules/common/performance.md +55 -0
- package/resources/local/ecc/docs/tr/rules/common/security.md +29 -0
- package/resources/local/ecc/docs/tr/rules/common/testing.md +29 -0
- package/resources/local/ecc/docs/tr/rules/golang/coding-style.md +32 -0
- package/resources/local/ecc/docs/tr/rules/golang/hooks.md +17 -0
- package/resources/local/ecc/docs/tr/rules/golang/patterns.md +45 -0
- package/resources/local/ecc/docs/tr/rules/golang/security.md +34 -0
- package/resources/local/ecc/docs/tr/rules/golang/testing.md +31 -0
- package/resources/local/ecc/docs/tr/rules/python/coding-style.md +42 -0
- package/resources/local/ecc/docs/tr/rules/python/hooks.md +19 -0
- package/resources/local/ecc/docs/tr/rules/python/patterns.md +39 -0
- package/resources/local/ecc/docs/tr/rules/python/security.md +30 -0
- package/resources/local/ecc/docs/tr/rules/python/testing.md +38 -0
- package/resources/local/ecc/docs/tr/rules/typescript/coding-style.md +199 -0
- package/resources/local/ecc/docs/tr/rules/typescript/hooks.md +22 -0
- package/resources/local/ecc/docs/tr/rules/typescript/patterns.md +52 -0
- package/resources/local/ecc/docs/tr/rules/typescript/security.md +28 -0
- package/resources/local/ecc/docs/tr/rules/typescript/testing.md +18 -0
- package/resources/local/ecc/docs/tr/skills/api-design/SKILL.md +523 -0
- package/resources/local/ecc/docs/tr/skills/backend-patterns/SKILL.md +598 -0
- package/resources/local/ecc/docs/tr/skills/coding-standards/SKILL.md +530 -0
- package/resources/local/ecc/docs/tr/skills/continuous-learning/SKILL.md +119 -0
- package/resources/local/ecc/docs/tr/skills/continuous-learning-v2/SKILL.md +347 -0
- package/resources/local/ecc/docs/tr/skills/database-migrations/SKILL.md +319 -0
- package/resources/local/ecc/docs/tr/skills/deployment-patterns/SKILL.md +427 -0
- package/resources/local/ecc/docs/tr/skills/django-patterns/SKILL.md +734 -0
- package/resources/local/ecc/docs/tr/skills/docker-patterns/SKILL.md +364 -0
- package/resources/local/ecc/docs/tr/skills/e2e-testing/SKILL.md +326 -0
- package/resources/local/ecc/docs/tr/skills/eval-harness/SKILL.md +270 -0
- package/resources/local/ecc/docs/tr/skills/frontend-patterns/SKILL.md +642 -0
- package/resources/local/ecc/docs/tr/skills/golang-patterns/SKILL.md +674 -0
- package/resources/local/ecc/docs/tr/skills/golang-testing/SKILL.md +720 -0
- package/resources/local/ecc/docs/tr/skills/jpa-patterns/SKILL.md +151 -0
- package/resources/local/ecc/docs/tr/skills/kotlin-patterns/SKILL.md +535 -0
- package/resources/local/ecc/docs/tr/skills/kotlin-testing/SKILL.md +578 -0
- package/resources/local/ecc/docs/tr/skills/laravel-patterns/SKILL.md +415 -0
- package/resources/local/ecc/docs/tr/skills/laravel-security/SKILL.md +285 -0
- package/resources/local/ecc/docs/tr/skills/laravel-tdd/SKILL.md +283 -0
- package/resources/local/ecc/docs/tr/skills/laravel-verification/SKILL.md +179 -0
- package/resources/local/ecc/docs/tr/skills/nextjs-turbopack/SKILL.md +44 -0
- package/resources/local/ecc/docs/tr/skills/postgres-patterns/SKILL.md +147 -0
- package/resources/local/ecc/docs/tr/skills/python-patterns/SKILL.md +750 -0
- package/resources/local/ecc/docs/tr/skills/python-testing/SKILL.md +816 -0
- package/resources/local/ecc/docs/tr/skills/quarkus-patterns/SKILL.md +778 -0
- package/resources/local/ecc/docs/tr/skills/quarkus-security/SKILL.md +474 -0
- package/resources/local/ecc/docs/tr/skills/quarkus-tdd/SKILL.md +916 -0
- package/resources/local/ecc/docs/tr/skills/quarkus-verification/SKILL.md +479 -0
- package/resources/local/ecc/docs/tr/skills/rust-patterns/SKILL.md +499 -0
- package/resources/local/ecc/docs/tr/skills/rust-testing/SKILL.md +500 -0
- package/resources/local/ecc/docs/tr/skills/security-review/SKILL.md +495 -0
- package/resources/local/ecc/docs/tr/skills/springboot-patterns/SKILL.md +312 -0
- package/resources/local/ecc/docs/tr/skills/springboot-security/SKILL.md +272 -0
- package/resources/local/ecc/docs/tr/skills/springboot-tdd/SKILL.md +158 -0
- package/resources/local/ecc/docs/tr/skills/springboot-verification/SKILL.md +231 -0
- package/resources/local/ecc/docs/tr/skills/tdd-workflow/SKILL.md +410 -0
- package/resources/local/ecc/docs/tr/skills/verification-loop/SKILL.md +126 -0
- package/resources/local/ecc/docs/tr/the-longform-guide.md +354 -0
- package/resources/local/ecc/docs/tr/the-security-guide.md +455 -0
- package/resources/local/ecc/docs/tr/the-shortform-guide.md +431 -0
- package/resources/local/ecc/docs/vi-VN/README.md +179 -0
- package/resources/local/ecc/docs/zh-CN/AGENTS.md +165 -0
- package/resources/local/ecc/docs/zh-CN/CHANGELOG.md +189 -0
- package/resources/local/ecc/docs/zh-CN/CLAUDE.md +70 -0
- package/resources/local/ecc/docs/zh-CN/CODE_OF_CONDUCT.md +83 -0
- package/resources/local/ecc/docs/zh-CN/CONTRIBUTING.md +465 -0
- package/resources/local/ecc/docs/zh-CN/README.md +1415 -0
- package/resources/local/ecc/docs/zh-CN/SECURITY.md +53 -0
- package/resources/local/ecc/docs/zh-CN/SPONSORING.md +43 -0
- package/resources/local/ecc/docs/zh-CN/SPONSORS.md +59 -0
- package/resources/local/ecc/docs/zh-CN/TROUBLESHOOTING.md +446 -0
- package/resources/local/ecc/docs/zh-CN/agents/architect.md +232 -0
- package/resources/local/ecc/docs/zh-CN/agents/build-error-resolver.md +119 -0
- package/resources/local/ecc/docs/zh-CN/agents/chief-of-staff.md +155 -0
- package/resources/local/ecc/docs/zh-CN/agents/code-architect.md +71 -0
- package/resources/local/ecc/docs/zh-CN/agents/code-explorer.md +69 -0
- package/resources/local/ecc/docs/zh-CN/agents/code-reviewer.md +238 -0
- package/resources/local/ecc/docs/zh-CN/agents/code-simplifier.md +47 -0
- package/resources/local/ecc/docs/zh-CN/agents/comment-analyzer.md +45 -0
- package/resources/local/ecc/docs/zh-CN/agents/conversation-analyzer.md +56 -0
- package/resources/local/ecc/docs/zh-CN/agents/cpp-build-resolver.md +91 -0
- package/resources/local/ecc/docs/zh-CN/agents/cpp-reviewer.md +79 -0
- package/resources/local/ecc/docs/zh-CN/agents/csharp-reviewer.md +109 -0
- package/resources/local/ecc/docs/zh-CN/agents/dart-build-resolver.md +202 -0
- package/resources/local/ecc/docs/zh-CN/agents/database-reviewer.md +94 -0
- package/resources/local/ecc/docs/zh-CN/agents/doc-updater.md +110 -0
- package/resources/local/ecc/docs/zh-CN/agents/docs-lookup.md +68 -0
- package/resources/local/ecc/docs/zh-CN/agents/e2e-runner.md +110 -0
- package/resources/local/ecc/docs/zh-CN/agents/flutter-reviewer.md +250 -0
- package/resources/local/ecc/docs/zh-CN/agents/gan-evaluator.md +223 -0
- package/resources/local/ecc/docs/zh-CN/agents/gan-generator.md +139 -0
- package/resources/local/ecc/docs/zh-CN/agents/gan-planner.md +99 -0
- package/resources/local/ecc/docs/zh-CN/agents/go-build-resolver.md +95 -0
- package/resources/local/ecc/docs/zh-CN/agents/go-reviewer.md +83 -0
- package/resources/local/ecc/docs/zh-CN/agents/harness-optimizer.md +35 -0
- package/resources/local/ecc/docs/zh-CN/agents/healthcare-reviewer.md +83 -0
- package/resources/local/ecc/docs/zh-CN/agents/java-build-resolver.md +156 -0
- package/resources/local/ecc/docs/zh-CN/agents/java-reviewer.md +107 -0
- package/resources/local/ecc/docs/zh-CN/agents/kotlin-build-resolver.md +119 -0
- package/resources/local/ecc/docs/zh-CN/agents/kotlin-reviewer.md +161 -0
- package/resources/local/ecc/docs/zh-CN/agents/loop-operator.md +37 -0
- package/resources/local/ecc/docs/zh-CN/agents/opensource-forker.md +203 -0
- package/resources/local/ecc/docs/zh-CN/agents/opensource-packager.md +255 -0
- package/resources/local/ecc/docs/zh-CN/agents/opensource-sanitizer.md +191 -0
- package/resources/local/ecc/docs/zh-CN/agents/performance-optimizer.md +446 -0
- package/resources/local/ecc/docs/zh-CN/agents/planner.md +215 -0
- package/resources/local/ecc/docs/zh-CN/agents/pr-test-analyzer.md +45 -0
- package/resources/local/ecc/docs/zh-CN/agents/python-reviewer.md +106 -0
- package/resources/local/ecc/docs/zh-CN/agents/pytorch-build-resolver.md +122 -0
- package/resources/local/ecc/docs/zh-CN/agents/refactor-cleaner.md +92 -0
- package/resources/local/ecc/docs/zh-CN/agents/rust-build-resolver.md +149 -0
- package/resources/local/ecc/docs/zh-CN/agents/rust-reviewer.md +95 -0
- package/resources/local/ecc/docs/zh-CN/agents/security-reviewer.md +112 -0
- package/resources/local/ecc/docs/zh-CN/agents/seo-specialist.md +63 -0
- package/resources/local/ecc/docs/zh-CN/agents/silent-failure-hunter.md +50 -0
- package/resources/local/ecc/docs/zh-CN/agents/tdd-guide.md +96 -0
- package/resources/local/ecc/docs/zh-CN/agents/type-design-analyzer.md +41 -0
- package/resources/local/ecc/docs/zh-CN/agents/typescript-reviewer.md +122 -0
- package/resources/local/ecc/docs/zh-CN/commands/aside.md +173 -0
- package/resources/local/ecc/docs/zh-CN/commands/auto-update.md +28 -0
- package/resources/local/ecc/docs/zh-CN/commands/build-fix.md +64 -0
- package/resources/local/ecc/docs/zh-CN/commands/checkpoint.md +78 -0
- package/resources/local/ecc/docs/zh-CN/commands/claw.md +51 -0
- package/resources/local/ecc/docs/zh-CN/commands/code-review.md +43 -0
- package/resources/local/ecc/docs/zh-CN/commands/context-budget.md +29 -0
- package/resources/local/ecc/docs/zh-CN/commands/cpp-build.md +173 -0
- package/resources/local/ecc/docs/zh-CN/commands/cpp-review.md +140 -0
- package/resources/local/ecc/docs/zh-CN/commands/cpp-test.md +257 -0
- package/resources/local/ecc/docs/zh-CN/commands/devfleet.md +93 -0
- package/resources/local/ecc/docs/zh-CN/commands/docs.md +32 -0
- package/resources/local/ecc/docs/zh-CN/commands/e2e.md +374 -0
- package/resources/local/ecc/docs/zh-CN/commands/eval.md +122 -0
- package/resources/local/ecc/docs/zh-CN/commands/evolve.md +194 -0
- package/resources/local/ecc/docs/zh-CN/commands/feature-dev.md +49 -0
- package/resources/local/ecc/docs/zh-CN/commands/flutter-build.md +166 -0
- package/resources/local/ecc/docs/zh-CN/commands/flutter-review.md +118 -0
- package/resources/local/ecc/docs/zh-CN/commands/flutter-test.md +145 -0
- package/resources/local/ecc/docs/zh-CN/commands/gan-build.md +109 -0
- package/resources/local/ecc/docs/zh-CN/commands/gan-design.md +45 -0
- package/resources/local/ecc/docs/zh-CN/commands/go-build.md +183 -0
- package/resources/local/ecc/docs/zh-CN/commands/go-review.md +156 -0
- package/resources/local/ecc/docs/zh-CN/commands/go-test.md +274 -0
- package/resources/local/ecc/docs/zh-CN/commands/gradle-build.md +72 -0
- package/resources/local/ecc/docs/zh-CN/commands/harness-audit.md +72 -0
- package/resources/local/ecc/docs/zh-CN/commands/hookify-configure.md +14 -0
- package/resources/local/ecc/docs/zh-CN/commands/hookify-help.md +46 -0
- package/resources/local/ecc/docs/zh-CN/commands/hookify-list.md +21 -0
- package/resources/local/ecc/docs/zh-CN/commands/hookify.md +50 -0
- package/resources/local/ecc/docs/zh-CN/commands/instinct-export.md +67 -0
- package/resources/local/ecc/docs/zh-CN/commands/instinct-import.md +117 -0
- package/resources/local/ecc/docs/zh-CN/commands/instinct-status.md +59 -0
- package/resources/local/ecc/docs/zh-CN/commands/jira.md +108 -0
- package/resources/local/ecc/docs/zh-CN/commands/kotlin-build.md +176 -0
- package/resources/local/ecc/docs/zh-CN/commands/kotlin-review.md +144 -0
- package/resources/local/ecc/docs/zh-CN/commands/kotlin-test.md +315 -0
- package/resources/local/ecc/docs/zh-CN/commands/learn-eval.md +117 -0
- package/resources/local/ecc/docs/zh-CN/commands/learn.md +70 -0
- package/resources/local/ecc/docs/zh-CN/commands/loop-start.md +33 -0
- package/resources/local/ecc/docs/zh-CN/commands/loop-status.md +25 -0
- package/resources/local/ecc/docs/zh-CN/commands/model-route.md +27 -0
- package/resources/local/ecc/docs/zh-CN/commands/multi-backend.md +162 -0
- package/resources/local/ecc/docs/zh-CN/commands/multi-execute.md +321 -0
- package/resources/local/ecc/docs/zh-CN/commands/multi-frontend.md +162 -0
- package/resources/local/ecc/docs/zh-CN/commands/multi-plan.md +278 -0
- package/resources/local/ecc/docs/zh-CN/commands/multi-workflow.md +197 -0
- package/resources/local/ecc/docs/zh-CN/commands/orchestrate.md +242 -0
- package/resources/local/ecc/docs/zh-CN/commands/plan.md +118 -0
- package/resources/local/ecc/docs/zh-CN/commands/pm2.md +283 -0
- package/resources/local/ecc/docs/zh-CN/commands/projects.md +39 -0
- package/resources/local/ecc/docs/zh-CN/commands/promote.md +41 -0
- package/resources/local/ecc/docs/zh-CN/commands/prompt-optimize.md +37 -0
- package/resources/local/ecc/docs/zh-CN/commands/prp-commit.md +115 -0
- package/resources/local/ecc/docs/zh-CN/commands/prp-implement.md +394 -0
- package/resources/local/ecc/docs/zh-CN/commands/prp-plan.md +506 -0
- package/resources/local/ecc/docs/zh-CN/commands/prp-pr.md +188 -0
- package/resources/local/ecc/docs/zh-CN/commands/prp-prd.md +453 -0
- package/resources/local/ecc/docs/zh-CN/commands/prune.md +31 -0
- package/resources/local/ecc/docs/zh-CN/commands/python-review.md +319 -0
- package/resources/local/ecc/docs/zh-CN/commands/quality-gate.md +30 -0
- package/resources/local/ecc/docs/zh-CN/commands/refactor-clean.md +83 -0
- package/resources/local/ecc/docs/zh-CN/commands/resume-session.md +154 -0
- package/resources/local/ecc/docs/zh-CN/commands/review-pr.md +37 -0
- package/resources/local/ecc/docs/zh-CN/commands/rules-distill.md +11 -0
- package/resources/local/ecc/docs/zh-CN/commands/rust-build.md +189 -0
- package/resources/local/ecc/docs/zh-CN/commands/rust-review.md +146 -0
- package/resources/local/ecc/docs/zh-CN/commands/rust-test.md +311 -0
- package/resources/local/ecc/docs/zh-CN/commands/santa-loop.md +180 -0
- package/resources/local/ecc/docs/zh-CN/commands/save-session.md +252 -0
- package/resources/local/ecc/docs/zh-CN/commands/sessions.md +340 -0
- package/resources/local/ecc/docs/zh-CN/commands/setup-pm.md +83 -0
- package/resources/local/ecc/docs/zh-CN/commands/skill-create.md +176 -0
- package/resources/local/ecc/docs/zh-CN/commands/skill-health.md +54 -0
- package/resources/local/ecc/docs/zh-CN/commands/tdd.md +330 -0
- package/resources/local/ecc/docs/zh-CN/commands/test-coverage.md +69 -0
- package/resources/local/ecc/docs/zh-CN/commands/update-codemaps.md +73 -0
- package/resources/local/ecc/docs/zh-CN/commands/update-docs.md +86 -0
- package/resources/local/ecc/docs/zh-CN/commands/verify.md +60 -0
- package/resources/local/ecc/docs/zh-CN/contexts/dev.md +23 -0
- package/resources/local/ecc/docs/zh-CN/contexts/research.md +30 -0
- package/resources/local/ecc/docs/zh-CN/contexts/review.md +25 -0
- package/resources/local/ecc/docs/zh-CN/examples/CLAUDE.md +109 -0
- package/resources/local/ecc/docs/zh-CN/examples/django-api-CLAUDE.md +308 -0
- package/resources/local/ecc/docs/zh-CN/examples/go-microservice-CLAUDE.md +267 -0
- package/resources/local/ecc/docs/zh-CN/examples/laravel-api-CLAUDE.md +311 -0
- package/resources/local/ecc/docs/zh-CN/examples/rust-api-CLAUDE.md +285 -0
- package/resources/local/ecc/docs/zh-CN/examples/saas-nextjs-CLAUDE.md +166 -0
- package/resources/local/ecc/docs/zh-CN/examples/user-CLAUDE.md +118 -0
- package/resources/local/ecc/docs/zh-CN/hooks/README.md +220 -0
- package/resources/local/ecc/docs/zh-CN/plugins/README.md +89 -0
- package/resources/local/ecc/docs/zh-CN/rules/README.md +105 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/agents.md +53 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/coding-style.md +52 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/development-workflow.md +38 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/git-workflow.md +26 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/hooks.md +33 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/patterns.md +34 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/performance.md +63 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/security.md +31 -0
- package/resources/local/ecc/docs/zh-CN/rules/common/testing.md +31 -0
- package/resources/local/ecc/docs/zh-CN/rules/cpp/coding-style.md +45 -0
- package/resources/local/ecc/docs/zh-CN/rules/cpp/hooks.md +40 -0
- package/resources/local/ecc/docs/zh-CN/rules/cpp/patterns.md +52 -0
- package/resources/local/ecc/docs/zh-CN/rules/cpp/security.md +52 -0
- package/resources/local/ecc/docs/zh-CN/rules/cpp/testing.md +45 -0
- package/resources/local/ecc/docs/zh-CN/rules/csharp/coding-style.md +73 -0
- package/resources/local/ecc/docs/zh-CN/rules/csharp/hooks.md +26 -0
- package/resources/local/ecc/docs/zh-CN/rules/csharp/patterns.md +51 -0
- package/resources/local/ecc/docs/zh-CN/rules/csharp/security.md +59 -0
- package/resources/local/ecc/docs/zh-CN/rules/csharp/testing.md +47 -0
- package/resources/local/ecc/docs/zh-CN/rules/golang/coding-style.md +33 -0
- package/resources/local/ecc/docs/zh-CN/rules/golang/hooks.md +18 -0
- package/resources/local/ecc/docs/zh-CN/rules/golang/patterns.md +46 -0
- package/resources/local/ecc/docs/zh-CN/rules/golang/security.md +35 -0
- package/resources/local/ecc/docs/zh-CN/rules/golang/testing.md +32 -0
- package/resources/local/ecc/docs/zh-CN/rules/java/coding-style.md +117 -0
- package/resources/local/ecc/docs/zh-CN/rules/java/hooks.md +19 -0
- package/resources/local/ecc/docs/zh-CN/rules/java/patterns.md +148 -0
- package/resources/local/ecc/docs/zh-CN/rules/java/security.md +102 -0
- package/resources/local/ecc/docs/zh-CN/rules/java/testing.md +135 -0
- package/resources/local/ecc/docs/zh-CN/rules/kotlin/coding-style.md +90 -0
- package/resources/local/ecc/docs/zh-CN/rules/kotlin/hooks.md +18 -0
- package/resources/local/ecc/docs/zh-CN/rules/kotlin/patterns.md +147 -0
- package/resources/local/ecc/docs/zh-CN/rules/kotlin/security.md +83 -0
- package/resources/local/ecc/docs/zh-CN/rules/kotlin/testing.md +129 -0
- package/resources/local/ecc/docs/zh-CN/rules/perl/coding-style.md +47 -0
- package/resources/local/ecc/docs/zh-CN/rules/perl/hooks.md +23 -0
- package/resources/local/ecc/docs/zh-CN/rules/perl/patterns.md +77 -0
- package/resources/local/ecc/docs/zh-CN/rules/perl/security.md +70 -0
- package/resources/local/ecc/docs/zh-CN/rules/perl/testing.md +55 -0
- package/resources/local/ecc/docs/zh-CN/rules/php/coding-style.md +41 -0
- package/resources/local/ecc/docs/zh-CN/rules/php/hooks.md +25 -0
- package/resources/local/ecc/docs/zh-CN/rules/php/patterns.md +34 -0
- package/resources/local/ecc/docs/zh-CN/rules/php/security.md +38 -0
- package/resources/local/ecc/docs/zh-CN/rules/php/testing.md +40 -0
- package/resources/local/ecc/docs/zh-CN/rules/python/coding-style.md +43 -0
- package/resources/local/ecc/docs/zh-CN/rules/python/hooks.md +20 -0
- package/resources/local/ecc/docs/zh-CN/rules/python/patterns.md +40 -0
- package/resources/local/ecc/docs/zh-CN/rules/python/security.md +31 -0
- package/resources/local/ecc/docs/zh-CN/rules/python/testing.md +39 -0
- package/resources/local/ecc/docs/zh-CN/rules/rust/coding-style.md +153 -0
- package/resources/local/ecc/docs/zh-CN/rules/rust/hooks.md +17 -0
- package/resources/local/ecc/docs/zh-CN/rules/rust/patterns.md +169 -0
- package/resources/local/ecc/docs/zh-CN/rules/rust/security.md +142 -0
- package/resources/local/ecc/docs/zh-CN/rules/rust/testing.md +156 -0
- package/resources/local/ecc/docs/zh-CN/rules/swift/coding-style.md +48 -0
- package/resources/local/ecc/docs/zh-CN/rules/swift/hooks.md +21 -0
- package/resources/local/ecc/docs/zh-CN/rules/swift/patterns.md +67 -0
- package/resources/local/ecc/docs/zh-CN/rules/swift/security.md +34 -0
- package/resources/local/ecc/docs/zh-CN/rules/swift/testing.md +46 -0
- package/resources/local/ecc/docs/zh-CN/rules/typescript/coding-style.md +200 -0
- package/resources/local/ecc/docs/zh-CN/rules/typescript/hooks.md +23 -0
- package/resources/local/ecc/docs/zh-CN/rules/typescript/patterns.md +53 -0
- package/resources/local/ecc/docs/zh-CN/rules/typescript/security.md +29 -0
- package/resources/local/ecc/docs/zh-CN/rules/typescript/testing.md +19 -0
- package/resources/local/ecc/docs/zh-CN/skills/accessibility/SKILL.md +145 -0
- package/resources/local/ecc/docs/zh-CN/skills/agent-eval/SKILL.md +149 -0
- package/resources/local/ecc/docs/zh-CN/skills/agent-harness-construction/SKILL.md +77 -0
- package/resources/local/ecc/docs/zh-CN/skills/agent-introspection-debugging/SKILL.md +161 -0
- package/resources/local/ecc/docs/zh-CN/skills/agent-payment-x402/SKILL.md +182 -0
- package/resources/local/ecc/docs/zh-CN/skills/agent-sort/SKILL.md +215 -0
- package/resources/local/ecc/docs/zh-CN/skills/agentic-engineering/SKILL.md +66 -0
- package/resources/local/ecc/docs/zh-CN/skills/ai-first-engineering/SKILL.md +55 -0
- package/resources/local/ecc/docs/zh-CN/skills/ai-regression-testing/SKILL.md +387 -0
- package/resources/local/ecc/docs/zh-CN/skills/android-clean-architecture/SKILL.md +339 -0
- package/resources/local/ecc/docs/zh-CN/skills/api-connector-builder/SKILL.md +120 -0
- package/resources/local/ecc/docs/zh-CN/skills/api-design/SKILL.md +523 -0
- package/resources/local/ecc/docs/zh-CN/skills/architecture-decision-records/SKILL.md +183 -0
- package/resources/local/ecc/docs/zh-CN/skills/article-writing/SKILL.md +92 -0
- package/resources/local/ecc/docs/zh-CN/skills/automation-audit-ops/SKILL.md +142 -0
- package/resources/local/ecc/docs/zh-CN/skills/autonomous-agent-harness/SKILL.md +279 -0
- package/resources/local/ecc/docs/zh-CN/skills/autonomous-loops/SKILL.md +619 -0
- package/resources/local/ecc/docs/zh-CN/skills/backend-patterns/SKILL.md +598 -0
- package/resources/local/ecc/docs/zh-CN/skills/benchmark/SKILL.md +94 -0
- package/resources/local/ecc/docs/zh-CN/skills/blueprint/SKILL.md +96 -0
- package/resources/local/ecc/docs/zh-CN/skills/brand-voice/SKILL.md +97 -0
- package/resources/local/ecc/docs/zh-CN/skills/browser-qa/SKILL.md +81 -0
- package/resources/local/ecc/docs/zh-CN/skills/bun-runtime/SKILL.md +84 -0
- package/resources/local/ecc/docs/zh-CN/skills/canary-watch/SKILL.md +104 -0
- package/resources/local/ecc/docs/zh-CN/skills/carrier-relationship-management/SKILL.md +199 -0
- package/resources/local/ecc/docs/zh-CN/skills/ck/SKILL.md +171 -0
- package/resources/local/ecc/docs/zh-CN/skills/claude-devfleet/SKILL.md +104 -0
- package/resources/local/ecc/docs/zh-CN/skills/click-path-audit/SKILL.md +257 -0
- package/resources/local/ecc/docs/zh-CN/skills/clickhouse-io/SKILL.md +445 -0
- package/resources/local/ecc/docs/zh-CN/skills/code-tour/SKILL.md +244 -0
- package/resources/local/ecc/docs/zh-CN/skills/codebase-onboarding/SKILL.md +243 -0
- package/resources/local/ecc/docs/zh-CN/skills/coding-standards/SKILL.md +537 -0
- package/resources/local/ecc/docs/zh-CN/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/resources/local/ecc/docs/zh-CN/skills/configure-ecc/SKILL.md +400 -0
- package/resources/local/ecc/docs/zh-CN/skills/connections-optimizer/SKILL.md +189 -0
- package/resources/local/ecc/docs/zh-CN/skills/content-engine/SKILL.md +97 -0
- package/resources/local/ecc/docs/zh-CN/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/resources/local/ecc/docs/zh-CN/skills/context-budget/SKILL.md +143 -0
- package/resources/local/ecc/docs/zh-CN/skills/continuous-agent-loop/SKILL.md +46 -0
- package/resources/local/ecc/docs/zh-CN/skills/continuous-learning/SKILL.md +120 -0
- package/resources/local/ecc/docs/zh-CN/skills/continuous-learning-v2/SKILL.md +355 -0
- package/resources/local/ecc/docs/zh-CN/skills/continuous-learning-v2/agents/observer.md +214 -0
- package/resources/local/ecc/docs/zh-CN/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/resources/local/ecc/docs/zh-CN/skills/council/SKILL.md +216 -0
- package/resources/local/ecc/docs/zh-CN/skills/cpp-coding-standards/SKILL.md +723 -0
- package/resources/local/ecc/docs/zh-CN/skills/cpp-testing/SKILL.md +324 -0
- package/resources/local/ecc/docs/zh-CN/skills/crosspost/SKILL.md +207 -0
- package/resources/local/ecc/docs/zh-CN/skills/csharp-testing/SKILL.md +321 -0
- package/resources/local/ecc/docs/zh-CN/skills/customer-billing-ops/SKILL.md +140 -0
- package/resources/local/ecc/docs/zh-CN/skills/customs-trade-compliance/SKILL.md +256 -0
- package/resources/local/ecc/docs/zh-CN/skills/dart-flutter-patterns/SKILL.md +565 -0
- package/resources/local/ecc/docs/zh-CN/skills/dashboard-builder/SKILL.md +108 -0
- package/resources/local/ecc/docs/zh-CN/skills/data-scraper-agent/SKILL.md +772 -0
- package/resources/local/ecc/docs/zh-CN/skills/database-migrations/SKILL.md +335 -0
- package/resources/local/ecc/docs/zh-CN/skills/deep-research/SKILL.md +163 -0
- package/resources/local/ecc/docs/zh-CN/skills/defi-amm-security/SKILL.md +166 -0
- package/resources/local/ecc/docs/zh-CN/skills/deployment-patterns/SKILL.md +432 -0
- package/resources/local/ecc/docs/zh-CN/skills/design-system/SKILL.md +85 -0
- package/resources/local/ecc/docs/zh-CN/skills/django-patterns/SKILL.md +734 -0
- package/resources/local/ecc/docs/zh-CN/skills/django-security/SKILL.md +593 -0
- package/resources/local/ecc/docs/zh-CN/skills/django-tdd/SKILL.md +729 -0
- package/resources/local/ecc/docs/zh-CN/skills/django-verification/SKILL.md +475 -0
- package/resources/local/ecc/docs/zh-CN/skills/dmux-workflows/SKILL.md +193 -0
- package/resources/local/ecc/docs/zh-CN/skills/docker-patterns/SKILL.md +365 -0
- package/resources/local/ecc/docs/zh-CN/skills/documentation-lookup/SKILL.md +90 -0
- package/resources/local/ecc/docs/zh-CN/skills/dotnet-patterns/SKILL.md +321 -0
- package/resources/local/ecc/docs/zh-CN/skills/e2e-testing/SKILL.md +329 -0
- package/resources/local/ecc/docs/zh-CN/skills/ecc-tools-cost-audit/SKILL.md +160 -0
- package/resources/local/ecc/docs/zh-CN/skills/email-ops/SKILL.md +121 -0
- package/resources/local/ecc/docs/zh-CN/skills/energy-procurement/SKILL.md +220 -0
- package/resources/local/ecc/docs/zh-CN/skills/enterprise-agent-ops/SKILL.md +52 -0
- package/resources/local/ecc/docs/zh-CN/skills/eval-harness/SKILL.md +304 -0
- package/resources/local/ecc/docs/zh-CN/skills/evm-token-decimals/SKILL.md +130 -0
- package/resources/local/ecc/docs/zh-CN/skills/exa-search/SKILL.md +109 -0
- package/resources/local/ecc/docs/zh-CN/skills/fal-ai-media/SKILL.md +296 -0
- package/resources/local/ecc/docs/zh-CN/skills/finance-billing-ops/SKILL.md +127 -0
- package/resources/local/ecc/docs/zh-CN/skills/flutter-dart-code-review/SKILL.md +480 -0
- package/resources/local/ecc/docs/zh-CN/skills/foundation-models-on-device/SKILL.md +244 -0
- package/resources/local/ecc/docs/zh-CN/skills/frontend-patterns/SKILL.md +642 -0
- package/resources/local/ecc/docs/zh-CN/skills/frontend-slides/SKILL.md +195 -0
- package/resources/local/ecc/docs/zh-CN/skills/frontend-slides/STYLE_PRESETS.md +333 -0
- package/resources/local/ecc/docs/zh-CN/skills/gan-style-harness/SKILL.md +284 -0
- package/resources/local/ecc/docs/zh-CN/skills/gateguard/SKILL.md +123 -0
- package/resources/local/ecc/docs/zh-CN/skills/git-workflow/SKILL.md +720 -0
- package/resources/local/ecc/docs/zh-CN/skills/github-ops/SKILL.md +145 -0
- package/resources/local/ecc/docs/zh-CN/skills/golang-patterns/SKILL.md +674 -0
- package/resources/local/ecc/docs/zh-CN/skills/golang-testing/SKILL.md +722 -0
- package/resources/local/ecc/docs/zh-CN/skills/google-workspace-ops/SKILL.md +95 -0
- package/resources/local/ecc/docs/zh-CN/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/resources/local/ecc/docs/zh-CN/skills/healthcare-emr-patterns/SKILL.md +161 -0
- package/resources/local/ecc/docs/zh-CN/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/resources/local/ecc/docs/zh-CN/skills/healthcare-phi-compliance/SKILL.md +146 -0
- package/resources/local/ecc/docs/zh-CN/skills/hermes-imports/SKILL.md +88 -0
- package/resources/local/ecc/docs/zh-CN/skills/hexagonal-architecture/SKILL.md +276 -0
- package/resources/local/ecc/docs/zh-CN/skills/hipaa-compliance/SKILL.md +78 -0
- package/resources/local/ecc/docs/zh-CN/skills/hookify-rules/SKILL.md +139 -0
- package/resources/local/ecc/docs/zh-CN/skills/inventory-demand-planning/SKILL.md +233 -0
- package/resources/local/ecc/docs/zh-CN/skills/investor-materials/SKILL.md +104 -0
- package/resources/local/ecc/docs/zh-CN/skills/investor-outreach/SKILL.md +81 -0
- package/resources/local/ecc/docs/zh-CN/skills/iterative-retrieval/SKILL.md +215 -0
- package/resources/local/ecc/docs/zh-CN/skills/java-coding-standards/SKILL.md +147 -0
- package/resources/local/ecc/docs/zh-CN/skills/jira-integration/SKILL.md +302 -0
- package/resources/local/ecc/docs/zh-CN/skills/jpa-patterns/SKILL.md +155 -0
- package/resources/local/ecc/docs/zh-CN/skills/knowledge-ops/SKILL.md +177 -0
- package/resources/local/ecc/docs/zh-CN/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/resources/local/ecc/docs/zh-CN/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/resources/local/ecc/docs/zh-CN/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/resources/local/ecc/docs/zh-CN/skills/kotlin-patterns/SKILL.md +714 -0
- package/resources/local/ecc/docs/zh-CN/skills/kotlin-testing/SKILL.md +826 -0
- package/resources/local/ecc/docs/zh-CN/skills/laravel-patterns/SKILL.md +415 -0
- package/resources/local/ecc/docs/zh-CN/skills/laravel-plugin-discovery/SKILL.md +235 -0
- package/resources/local/ecc/docs/zh-CN/skills/laravel-security/SKILL.md +285 -0
- package/resources/local/ecc/docs/zh-CN/skills/laravel-tdd/SKILL.md +283 -0
- package/resources/local/ecc/docs/zh-CN/skills/laravel-verification/SKILL.md +179 -0
- package/resources/local/ecc/docs/zh-CN/skills/lead-intelligence/SKILL.md +323 -0
- package/resources/local/ecc/docs/zh-CN/skills/liquid-glass-design/SKILL.md +280 -0
- package/resources/local/ecc/docs/zh-CN/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/resources/local/ecc/docs/zh-CN/skills/logistics-exception-management/SKILL.md +218 -0
- package/resources/local/ecc/docs/zh-CN/skills/manim-video/SKILL.md +89 -0
- package/resources/local/ecc/docs/zh-CN/skills/market-research/SKILL.md +85 -0
- package/resources/local/ecc/docs/zh-CN/skills/mcp-server-patterns/SKILL.md +67 -0
- package/resources/local/ecc/docs/zh-CN/skills/messages-ops/SKILL.md +104 -0
- package/resources/local/ecc/docs/zh-CN/skills/nanoclaw-repl/SKILL.md +33 -0
- package/resources/local/ecc/docs/zh-CN/skills/nestjs-patterns/SKILL.md +230 -0
- package/resources/local/ecc/docs/zh-CN/skills/nextjs-turbopack/SKILL.md +44 -0
- package/resources/local/ecc/docs/zh-CN/skills/nodejs-keccak256/SKILL.md +102 -0
- package/resources/local/ecc/docs/zh-CN/skills/nutrient-document-processing/SKILL.md +165 -0
- package/resources/local/ecc/docs/zh-CN/skills/nuxt4-patterns/SKILL.md +100 -0
- package/resources/local/ecc/docs/zh-CN/skills/opensource-pipeline/SKILL.md +258 -0
- package/resources/local/ecc/docs/zh-CN/skills/perl-patterns/SKILL.md +504 -0
- package/resources/local/ecc/docs/zh-CN/skills/perl-security/SKILL.md +503 -0
- package/resources/local/ecc/docs/zh-CN/skills/perl-testing/SKILL.md +475 -0
- package/resources/local/ecc/docs/zh-CN/skills/plankton-code-quality/SKILL.md +243 -0
- package/resources/local/ecc/docs/zh-CN/skills/postgres-patterns/SKILL.md +154 -0
- package/resources/local/ecc/docs/zh-CN/skills/product-capability/SKILL.md +141 -0
- package/resources/local/ecc/docs/zh-CN/skills/product-lens/SKILL.md +93 -0
- package/resources/local/ecc/docs/zh-CN/skills/production-scheduling/SKILL.md +230 -0
- package/resources/local/ecc/docs/zh-CN/skills/project-flow-ops/SKILL.md +111 -0
- package/resources/local/ecc/docs/zh-CN/skills/prompt-optimizer/SKILL.md +380 -0
- package/resources/local/ecc/docs/zh-CN/skills/python-patterns/SKILL.md +750 -0
- package/resources/local/ecc/docs/zh-CN/skills/python-testing/SKILL.md +816 -0
- package/resources/local/ecc/docs/zh-CN/skills/pytorch-patterns/SKILL.md +396 -0
- package/resources/local/ecc/docs/zh-CN/skills/quality-nonconformance/SKILL.md +252 -0
- package/resources/local/ecc/docs/zh-CN/skills/ralphinho-rfc-pipeline/SKILL.md +69 -0
- package/resources/local/ecc/docs/zh-CN/skills/regex-vs-llm-structured-text/SKILL.md +217 -0
- package/resources/local/ecc/docs/zh-CN/skills/remotion-video-creation/SKILL.md +43 -0
- package/resources/local/ecc/docs/zh-CN/skills/repo-scan/SKILL.md +79 -0
- package/resources/local/ecc/docs/zh-CN/skills/research-ops/SKILL.md +112 -0
- package/resources/local/ecc/docs/zh-CN/skills/returns-reverse-logistics/SKILL.md +225 -0
- package/resources/local/ecc/docs/zh-CN/skills/rules-distill/SKILL.md +264 -0
- package/resources/local/ecc/docs/zh-CN/skills/rust-patterns/SKILL.md +499 -0
- package/resources/local/ecc/docs/zh-CN/skills/rust-testing/SKILL.md +502 -0
- package/resources/local/ecc/docs/zh-CN/skills/safety-guard/SKILL.md +75 -0
- package/resources/local/ecc/docs/zh-CN/skills/santa-method/SKILL.md +310 -0
- package/resources/local/ecc/docs/zh-CN/skills/search-first/SKILL.md +175 -0
- package/resources/local/ecc/docs/zh-CN/skills/security-bounty-hunter/SKILL.md +99 -0
- package/resources/local/ecc/docs/zh-CN/skills/security-review/SKILL.md +527 -0
- package/resources/local/ecc/docs/zh-CN/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/resources/local/ecc/docs/zh-CN/skills/security-scan/SKILL.md +172 -0
- package/resources/local/ecc/docs/zh-CN/skills/seo/SKILL.md +155 -0
- package/resources/local/ecc/docs/zh-CN/skills/skill-comply/SKILL.md +60 -0
- package/resources/local/ecc/docs/zh-CN/skills/skill-stocktake/SKILL.md +194 -0
- package/resources/local/ecc/docs/zh-CN/skills/social-graph-ranker/SKILL.md +154 -0
- package/resources/local/ecc/docs/zh-CN/skills/springboot-patterns/SKILL.md +313 -0
- package/resources/local/ecc/docs/zh-CN/skills/springboot-security/SKILL.md +272 -0
- package/resources/local/ecc/docs/zh-CN/skills/springboot-tdd/SKILL.md +160 -0
- package/resources/local/ecc/docs/zh-CN/skills/springboot-verification/SKILL.md +235 -0
- package/resources/local/ecc/docs/zh-CN/skills/strategic-compact/SKILL.md +140 -0
- package/resources/local/ecc/docs/zh-CN/skills/swift-actor-persistence/SKILL.md +143 -0
- package/resources/local/ecc/docs/zh-CN/skills/swift-concurrency-6-2/SKILL.md +217 -0
- package/resources/local/ecc/docs/zh-CN/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/resources/local/ecc/docs/zh-CN/skills/swiftui-patterns/SKILL.md +259 -0
- package/resources/local/ecc/docs/zh-CN/skills/tdd-workflow/SKILL.md +440 -0
- package/resources/local/ecc/docs/zh-CN/skills/team-builder/SKILL.md +165 -0
- package/resources/local/ecc/docs/zh-CN/skills/terminal-ops/SKILL.md +109 -0
- package/resources/local/ecc/docs/zh-CN/skills/token-budget-advisor/SKILL.md +121 -0
- package/resources/local/ecc/docs/zh-CN/skills/ui-demo/SKILL.md +465 -0
- package/resources/local/ecc/docs/zh-CN/skills/unified-notifications-ops/SKILL.md +197 -0
- package/resources/local/ecc/docs/zh-CN/skills/verification-loop/SKILL.md +136 -0
- package/resources/local/ecc/docs/zh-CN/skills/video-editing/SKILL.md +316 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/SKILL.md +386 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/api-reference.md +550 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/capture-reference.md +416 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/capture.md +104 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/editor.md +443 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/generative.md +331 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/rtstream-reference.md +567 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/rtstream.md +59 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/search.md +230 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/streaming.md +406 -0
- package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/use-cases.md +142 -0
- package/resources/local/ecc/docs/zh-CN/skills/visa-doc-translate/README.md +91 -0
- package/resources/local/ecc/docs/zh-CN/skills/visa-doc-translate/SKILL.md +119 -0
- package/resources/local/ecc/docs/zh-CN/skills/workspace-surface-audit/SKILL.md +125 -0
- package/resources/local/ecc/docs/zh-CN/skills/x-api/SKILL.md +210 -0
- package/resources/local/ecc/docs/zh-CN/the-longform-guide.md +358 -0
- package/resources/local/ecc/docs/zh-CN/the-openclaw-guide.md +471 -0
- package/resources/local/ecc/docs/zh-CN/the-security-guide.md +206 -0
- package/resources/local/ecc/docs/zh-CN/the-shortform-guide.md +432 -0
- package/resources/local/ecc/docs/zh-TW/CONTRIBUTING.md +191 -0
- package/resources/local/ecc/docs/zh-TW/README.md +482 -0
- package/resources/local/ecc/docs/zh-TW/TERMINOLOGY.md +104 -0
- package/resources/local/ecc/docs/zh-TW/agents/architect.md +211 -0
- package/resources/local/ecc/docs/zh-TW/agents/build-error-resolver.md +300 -0
- package/resources/local/ecc/docs/zh-TW/agents/code-reviewer.md +104 -0
- package/resources/local/ecc/docs/zh-TW/agents/database-reviewer.md +378 -0
- package/resources/local/ecc/docs/zh-TW/agents/doc-updater.md +310 -0
- package/resources/local/ecc/docs/zh-TW/agents/e2e-runner.md +303 -0
- package/resources/local/ecc/docs/zh-TW/agents/go-build-resolver.md +368 -0
- package/resources/local/ecc/docs/zh-TW/agents/go-reviewer.md +267 -0
- package/resources/local/ecc/docs/zh-TW/agents/planner.md +119 -0
- package/resources/local/ecc/docs/zh-TW/agents/refactor-cleaner.md +273 -0
- package/resources/local/ecc/docs/zh-TW/agents/security-reviewer.md +378 -0
- package/resources/local/ecc/docs/zh-TW/agents/tdd-guide.md +280 -0
- package/resources/local/ecc/docs/zh-TW/commands/build-fix.md +29 -0
- package/resources/local/ecc/docs/zh-TW/commands/checkpoint.md +74 -0
- package/resources/local/ecc/docs/zh-TW/commands/code-review.md +40 -0
- package/resources/local/ecc/docs/zh-TW/commands/e2e.md +115 -0
- package/resources/local/ecc/docs/zh-TW/commands/eval.md +120 -0
- package/resources/local/ecc/docs/zh-TW/commands/go-build.md +81 -0
- package/resources/local/ecc/docs/zh-TW/commands/go-review.md +87 -0
- package/resources/local/ecc/docs/zh-TW/commands/go-test.md +132 -0
- package/resources/local/ecc/docs/zh-TW/commands/learn.md +70 -0
- package/resources/local/ecc/docs/zh-TW/commands/orchestrate.md +140 -0
- package/resources/local/ecc/docs/zh-TW/commands/plan.md +113 -0
- package/resources/local/ecc/docs/zh-TW/commands/refactor-clean.md +28 -0
- package/resources/local/ecc/docs/zh-TW/commands/setup-pm.md +80 -0
- package/resources/local/ecc/docs/zh-TW/commands/tdd.md +100 -0
- package/resources/local/ecc/docs/zh-TW/commands/test-coverage.md +27 -0
- package/resources/local/ecc/docs/zh-TW/commands/update-codemaps.md +17 -0
- package/resources/local/ecc/docs/zh-TW/commands/update-docs.md +31 -0
- package/resources/local/ecc/docs/zh-TW/commands/verify.md +59 -0
- package/resources/local/ecc/docs/zh-TW/rules/agents.md +49 -0
- package/resources/local/ecc/docs/zh-TW/rules/coding-style.md +70 -0
- package/resources/local/ecc/docs/zh-TW/rules/git-workflow.md +45 -0
- package/resources/local/ecc/docs/zh-TW/rules/hooks.md +46 -0
- package/resources/local/ecc/docs/zh-TW/rules/patterns.md +55 -0
- package/resources/local/ecc/docs/zh-TW/rules/performance.md +47 -0
- package/resources/local/ecc/docs/zh-TW/rules/security.md +36 -0
- package/resources/local/ecc/docs/zh-TW/rules/testing.md +30 -0
- package/resources/local/ecc/docs/zh-TW/skills/backend-patterns/SKILL.md +587 -0
- package/resources/local/ecc/docs/zh-TW/skills/clickhouse-io/SKILL.md +429 -0
- package/resources/local/ecc/docs/zh-TW/skills/coding-standards/SKILL.md +520 -0
- package/resources/local/ecc/docs/zh-TW/skills/continuous-learning/SKILL.md +110 -0
- package/resources/local/ecc/docs/zh-TW/skills/continuous-learning-v2/SKILL.md +263 -0
- package/resources/local/ecc/docs/zh-TW/skills/eval-harness/SKILL.md +227 -0
- package/resources/local/ecc/docs/zh-TW/skills/frontend-patterns/SKILL.md +631 -0
- package/resources/local/ecc/docs/zh-TW/skills/golang-patterns/SKILL.md +673 -0
- package/resources/local/ecc/docs/zh-TW/skills/golang-testing/SKILL.md +710 -0
- package/resources/local/ecc/docs/zh-TW/skills/iterative-retrieval/SKILL.md +202 -0
- package/resources/local/ecc/docs/zh-TW/skills/postgres-patterns/SKILL.md +146 -0
- package/resources/local/ecc/docs/zh-TW/skills/project-guidelines-example/SKILL.md +345 -0
- package/resources/local/ecc/docs/zh-TW/skills/security-review/SKILL.md +494 -0
- package/resources/local/ecc/docs/zh-TW/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/resources/local/ecc/docs/zh-TW/skills/strategic-compact/SKILL.md +66 -0
- package/resources/local/ecc/docs/zh-TW/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/local/ecc/docs/zh-TW/skills/verification-loop/SKILL.md +120 -0
- package/resources/local/ecc/ecc2/Cargo.lock +2992 -0
- package/resources/local/ecc/ecc2/Cargo.toml +61 -0
- package/resources/local/ecc/ecc2/README.md +99 -0
- package/resources/local/ecc/ecc2/src/comms/mod.rs +156 -0
- package/resources/local/ecc/ecc2/src/config/mod.rs +1806 -0
- package/resources/local/ecc/ecc2/src/main.rs +12595 -0
- package/resources/local/ecc/ecc2/src/notifications.rs +635 -0
- package/resources/local/ecc/ecc2/src/observability/mod.rs +423 -0
- package/resources/local/ecc/ecc2/src/session/daemon.rs +1322 -0
- package/resources/local/ecc/ecc2/src/session/manager.rs +8190 -0
- package/resources/local/ecc/ecc2/src/session/mod.rs +984 -0
- package/resources/local/ecc/ecc2/src/session/output.rs +172 -0
- package/resources/local/ecc/ecc2/src/session/runtime.rs +379 -0
- package/resources/local/ecc/ecc2/src/session/store.rs +7109 -0
- package/resources/local/ecc/ecc2/src/tui/app.rs +151 -0
- package/resources/local/ecc/ecc2/src/tui/dashboard.rs +15162 -0
- package/resources/local/ecc/ecc2/src/tui/mod.rs +3 -0
- package/resources/local/ecc/ecc2/src/tui/widgets.rs +382 -0
- package/resources/local/ecc/ecc2/src/worktree/mod.rs +2672 -0
- package/resources/local/ecc/ecc_dashboard.py +932 -0
- package/resources/local/ecc/eslint.config.js +34 -0
- package/resources/local/ecc/examples/CLAUDE.md +109 -0
- package/resources/local/ecc/examples/django-api-CLAUDE.md +308 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/candidate-playbook.md +49 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/scenario.json +62 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/trace.json +45 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/verifier-result.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/candidate-playbook.md +41 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/scenario.json +55 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/trace.json +45 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/verifier-result.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/candidate-playbook.md +41 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/candidate-playbook.md +46 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/scenario.json +57 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/trace.json +45 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/verifier-result.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/candidate-playbook.md +60 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/scenario.json +57 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/trace.json +45 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/verifier-result.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/candidate-playbook.md +49 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/scenario.json +57 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/trace.json +45 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/verifier-result.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/scenario.json +56 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/candidate-playbook.md +57 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/report.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/scenario.json +57 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/trace.json +46 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/verifier-result.json +35 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/trace.json +46 -0
- package/resources/local/ecc/examples/evaluator-rag-prototype/verifier-result.json +35 -0
- package/resources/local/ecc/examples/gan-harness/README.md +126 -0
- package/resources/local/ecc/examples/go-microservice-CLAUDE.md +267 -0
- package/resources/local/ecc/examples/harmonyos-app-CLAUDE.md +88 -0
- package/resources/local/ecc/examples/hud-status-contract.json +117 -0
- package/resources/local/ecc/examples/laravel-api-CLAUDE.md +311 -0
- package/resources/local/ecc/examples/rust-api-CLAUDE.md +285 -0
- package/resources/local/ecc/examples/saas-nextjs-CLAUDE.md +166 -0
- package/resources/local/ecc/examples/statusline.json +20 -0
- package/resources/local/ecc/examples/user-CLAUDE.md +109 -0
- package/resources/local/ecc/hooks/README.md +258 -0
- package/resources/local/ecc/hooks/hooks.json +354 -0
- package/resources/local/ecc/hooks/memory-persistence/README.md +44 -0
- package/resources/local/ecc/hooks/memory-persistence/hooks.json +47 -0
- package/resources/local/ecc/install.ps1 +53 -0
- package/resources/local/ecc/install.sh +32 -0
- package/resources/local/ecc/legacy-command-shims/README.md +7 -0
- package/resources/local/ecc/legacy-command-shims/commands/agent-sort.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/claw.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/context-budget.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/devfleet.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/docs.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/e2e.md +268 -0
- package/resources/local/ecc/legacy-command-shims/commands/eval.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/orchestrate.md +135 -0
- package/resources/local/ecc/legacy-command-shims/commands/prompt-optimize.md +23 -0
- package/resources/local/ecc/legacy-command-shims/commands/rules-distill.md +20 -0
- package/resources/local/ecc/legacy-command-shims/commands/tdd.md +231 -0
- package/resources/local/ecc/legacy-command-shims/commands/verify.md +23 -0
- package/resources/local/ecc/manifests/install-components.json +594 -0
- package/resources/local/ecc/manifests/install-modules.json +819 -0
- package/resources/local/ecc/manifests/install-profiles.json +92 -0
- package/resources/local/ecc/mcp-configs/mcp-servers.json +181 -0
- package/resources/local/ecc/nul +2 -0
- package/resources/local/ecc/package-lock.json +2906 -0
- package/resources/local/ecc/package.json +347 -0
- package/resources/local/ecc/plugins/README.md +85 -0
- package/resources/local/ecc/pyproject.toml +78 -0
- package/resources/local/ecc/research/ecc2-codebase-analysis.md +172 -0
- package/resources/local/ecc/rules/README.md +135 -0
- package/resources/local/ecc/rules/angular/coding-style.md +182 -0
- package/resources/local/ecc/rules/angular/hooks.md +25 -0
- package/resources/local/ecc/rules/angular/patterns.md +249 -0
- package/resources/local/ecc/rules/angular/security.md +87 -0
- package/resources/local/ecc/rules/angular/testing.md +164 -0
- package/resources/local/ecc/rules/arkts/coding-style.md +153 -0
- package/resources/local/ecc/rules/arkts/hooks.md +135 -0
- package/resources/local/ecc/rules/arkts/patterns.md +236 -0
- package/resources/local/ecc/rules/arkts/security.md +141 -0
- package/resources/local/ecc/rules/arkts/testing.md +126 -0
- package/resources/local/ecc/rules/common/agents.md +51 -0
- package/resources/local/ecc/rules/common/code-review.md +124 -0
- package/resources/local/ecc/rules/common/coding-style.md +90 -0
- package/resources/local/ecc/rules/common/development-workflow.md +44 -0
- package/resources/local/ecc/rules/common/git-workflow.md +24 -0
- package/resources/local/ecc/rules/common/hooks.md +30 -0
- package/resources/local/ecc/rules/common/patterns.md +31 -0
- package/resources/local/ecc/rules/common/performance.md +55 -0
- package/resources/local/ecc/rules/common/security.md +29 -0
- package/resources/local/ecc/rules/common/testing.md +57 -0
- package/resources/local/ecc/rules/cpp/coding-style.md +44 -0
- package/resources/local/ecc/rules/cpp/hooks.md +39 -0
- package/resources/local/ecc/rules/cpp/patterns.md +51 -0
- package/resources/local/ecc/rules/cpp/security.md +51 -0
- package/resources/local/ecc/rules/cpp/testing.md +44 -0
- package/resources/local/ecc/rules/csharp/coding-style.md +72 -0
- package/resources/local/ecc/rules/csharp/hooks.md +25 -0
- package/resources/local/ecc/rules/csharp/patterns.md +50 -0
- package/resources/local/ecc/rules/csharp/security.md +58 -0
- package/resources/local/ecc/rules/csharp/testing.md +46 -0
- package/resources/local/ecc/rules/dart/coding-style.md +159 -0
- package/resources/local/ecc/rules/dart/hooks.md +66 -0
- package/resources/local/ecc/rules/dart/patterns.md +261 -0
- package/resources/local/ecc/rules/dart/security.md +135 -0
- package/resources/local/ecc/rules/dart/testing.md +215 -0
- package/resources/local/ecc/rules/fsharp/coding-style.md +112 -0
- package/resources/local/ecc/rules/fsharp/hooks.md +26 -0
- package/resources/local/ecc/rules/fsharp/patterns.md +111 -0
- package/resources/local/ecc/rules/fsharp/security.md +76 -0
- package/resources/local/ecc/rules/fsharp/testing.md +62 -0
- package/resources/local/ecc/rules/golang/coding-style.md +32 -0
- package/resources/local/ecc/rules/golang/hooks.md +17 -0
- package/resources/local/ecc/rules/golang/patterns.md +45 -0
- package/resources/local/ecc/rules/golang/security.md +34 -0
- package/resources/local/ecc/rules/golang/testing.md +31 -0
- package/resources/local/ecc/rules/java/coding-style.md +114 -0
- package/resources/local/ecc/rules/java/hooks.md +18 -0
- package/resources/local/ecc/rules/java/patterns.md +147 -0
- package/resources/local/ecc/rules/java/security.md +101 -0
- package/resources/local/ecc/rules/java/testing.md +133 -0
- package/resources/local/ecc/rules/kotlin/coding-style.md +86 -0
- package/resources/local/ecc/rules/kotlin/hooks.md +17 -0
- package/resources/local/ecc/rules/kotlin/patterns.md +146 -0
- package/resources/local/ecc/rules/kotlin/security.md +82 -0
- package/resources/local/ecc/rules/kotlin/testing.md +128 -0
- package/resources/local/ecc/rules/perl/coding-style.md +46 -0
- package/resources/local/ecc/rules/perl/hooks.md +22 -0
- package/resources/local/ecc/rules/perl/patterns.md +76 -0
- package/resources/local/ecc/rules/perl/security.md +69 -0
- package/resources/local/ecc/rules/perl/testing.md +54 -0
- package/resources/local/ecc/rules/php/coding-style.md +40 -0
- package/resources/local/ecc/rules/php/hooks.md +24 -0
- package/resources/local/ecc/rules/php/patterns.md +33 -0
- package/resources/local/ecc/rules/php/security.md +37 -0
- package/resources/local/ecc/rules/php/testing.md +39 -0
- package/resources/local/ecc/rules/python/coding-style.md +42 -0
- package/resources/local/ecc/rules/python/fastapi.md +58 -0
- package/resources/local/ecc/rules/python/hooks.md +19 -0
- package/resources/local/ecc/rules/python/patterns.md +39 -0
- package/resources/local/ecc/rules/python/security.md +30 -0
- package/resources/local/ecc/rules/python/testing.md +38 -0
- package/resources/local/ecc/rules/ruby/coding-style.md +46 -0
- package/resources/local/ecc/rules/ruby/hooks.md +37 -0
- package/resources/local/ecc/rules/ruby/patterns.md +44 -0
- package/resources/local/ecc/rules/ruby/security.md +51 -0
- package/resources/local/ecc/rules/ruby/testing.md +51 -0
- package/resources/local/ecc/rules/rust/coding-style.md +151 -0
- package/resources/local/ecc/rules/rust/hooks.md +16 -0
- package/resources/local/ecc/rules/rust/patterns.md +168 -0
- package/resources/local/ecc/rules/rust/security.md +141 -0
- package/resources/local/ecc/rules/rust/testing.md +154 -0
- package/resources/local/ecc/rules/swift/coding-style.md +47 -0
- package/resources/local/ecc/rules/swift/hooks.md +20 -0
- package/resources/local/ecc/rules/swift/patterns.md +66 -0
- package/resources/local/ecc/rules/swift/security.md +33 -0
- package/resources/local/ecc/rules/swift/testing.md +45 -0
- package/resources/local/ecc/rules/typescript/coding-style.md +199 -0
- package/resources/local/ecc/rules/typescript/hooks.md +22 -0
- package/resources/local/ecc/rules/typescript/patterns.md +52 -0
- package/resources/local/ecc/rules/typescript/security.md +28 -0
- package/resources/local/ecc/rules/typescript/testing.md +18 -0
- package/resources/local/ecc/rules/web/coding-style.md +96 -0
- package/resources/local/ecc/rules/web/design-quality.md +63 -0
- package/resources/local/ecc/rules/web/hooks.md +129 -0
- package/resources/local/ecc/rules/web/patterns.md +79 -0
- package/resources/local/ecc/rules/web/performance.md +64 -0
- package/resources/local/ecc/rules/web/security.md +57 -0
- package/resources/local/ecc/rules/web/testing.md +55 -0
- package/resources/local/ecc/rules/zh/README.md +108 -0
- package/resources/local/ecc/rules/zh/agents.md +50 -0
- package/resources/local/ecc/rules/zh/code-review.md +124 -0
- package/resources/local/ecc/rules/zh/coding-style.md +48 -0
- package/resources/local/ecc/rules/zh/development-workflow.md +44 -0
- package/resources/local/ecc/rules/zh/git-workflow.md +24 -0
- package/resources/local/ecc/rules/zh/hooks.md +30 -0
- package/resources/local/ecc/rules/zh/patterns.md +31 -0
- package/resources/local/ecc/rules/zh/performance.md +55 -0
- package/resources/local/ecc/rules/zh/security.md +29 -0
- package/resources/local/ecc/rules/zh/testing.md +29 -0
- package/resources/local/ecc/schemas/ecc-install-config.schema.json +63 -0
- package/resources/local/ecc/schemas/hooks.schema.json +197 -0
- package/resources/local/ecc/schemas/install-components.schema.json +59 -0
- package/resources/local/ecc/schemas/install-modules.schema.json +111 -0
- package/resources/local/ecc/schemas/install-profiles.schema.json +45 -0
- package/resources/local/ecc/schemas/install-state.schema.json +210 -0
- package/resources/local/ecc/schemas/package-manager.schema.json +23 -0
- package/resources/local/ecc/schemas/plugin.schema.json +70 -0
- package/resources/local/ecc/schemas/provenance.schema.json +31 -0
- package/resources/local/ecc/schemas/state-store.schema.json +382 -0
- package/resources/local/ecc/scripts/auto-update.js +361 -0
- package/resources/local/ecc/scripts/build-opencode.js +26 -0
- package/resources/local/ecc/scripts/catalog.js +186 -0
- package/resources/local/ecc/scripts/ci/catalog.js +828 -0
- package/resources/local/ecc/scripts/ci/check-unicode-safety.js +272 -0
- package/resources/local/ecc/scripts/ci/generate-command-registry.js +318 -0
- package/resources/local/ecc/scripts/ci/scan-supply-chain-iocs.js +847 -0
- package/resources/local/ecc/scripts/ci/supply-chain-advisory-sources.js +469 -0
- package/resources/local/ecc/scripts/ci/validate-agents.js +96 -0
- package/resources/local/ecc/scripts/ci/validate-commands.js +188 -0
- package/resources/local/ecc/scripts/ci/validate-hooks.js +239 -0
- package/resources/local/ecc/scripts/ci/validate-install-manifests.js +218 -0
- package/resources/local/ecc/scripts/ci/validate-no-personal-paths.js +107 -0
- package/resources/local/ecc/scripts/ci/validate-rules.js +81 -0
- package/resources/local/ecc/scripts/ci/validate-skills.js +210 -0
- package/resources/local/ecc/scripts/ci/validate-workflow-security.js +278 -0
- package/resources/local/ecc/scripts/claw.js +473 -0
- package/resources/local/ecc/scripts/codemaps/generate.ts +330 -0
- package/resources/local/ecc/scripts/codex/check-codex-global-state.sh +250 -0
- package/resources/local/ecc/scripts/codex/install-global-git-hooks.sh +65 -0
- package/resources/local/ecc/scripts/codex/merge-codex-config.js +317 -0
- package/resources/local/ecc/scripts/codex/merge-mcp-config.js +335 -0
- package/resources/local/ecc/scripts/codex-git-hooks/pre-commit +77 -0
- package/resources/local/ecc/scripts/codex-git-hooks/pre-push +124 -0
- package/resources/local/ecc/scripts/consult.js +497 -0
- package/resources/local/ecc/scripts/discussion-audit.js +350 -0
- package/resources/local/ecc/scripts/doctor.js +111 -0
- package/resources/local/ecc/scripts/ecc.js +255 -0
- package/resources/local/ecc/scripts/gan-harness.sh +299 -0
- package/resources/local/ecc/scripts/gemini-adapt-agents.js +189 -0
- package/resources/local/ecc/scripts/harness-adapter-compliance.js +149 -0
- package/resources/local/ecc/scripts/harness-audit.js +869 -0
- package/resources/local/ecc/scripts/hooks/auto-tmux-dev.js +107 -0
- package/resources/local/ecc/scripts/hooks/bash-hook-dispatcher.js +177 -0
- package/resources/local/ecc/scripts/hooks/block-no-verify.js +546 -0
- package/resources/local/ecc/scripts/hooks/check-console-log.js +71 -0
- package/resources/local/ecc/scripts/hooks/check-hook-enabled.js +12 -0
- package/resources/local/ecc/scripts/hooks/config-protection.js +169 -0
- package/resources/local/ecc/scripts/hooks/cost-tracker.js +157 -0
- package/resources/local/ecc/scripts/hooks/design-quality-check.js +131 -0
- package/resources/local/ecc/scripts/hooks/desktop-notify.js +245 -0
- package/resources/local/ecc/scripts/hooks/doc-file-warning.js +90 -0
- package/resources/local/ecc/scripts/hooks/ecc-context-monitor.js +258 -0
- package/resources/local/ecc/scripts/hooks/ecc-metrics-bridge.js +263 -0
- package/resources/local/ecc/scripts/hooks/ecc-statusline.js +168 -0
- package/resources/local/ecc/scripts/hooks/evaluate-session.js +100 -0
- package/resources/local/ecc/scripts/hooks/gateguard-fact-force.js +832 -0
- package/resources/local/ecc/scripts/hooks/governance-capture.js +334 -0
- package/resources/local/ecc/scripts/hooks/insaits-security-monitor.py +269 -0
- package/resources/local/ecc/scripts/hooks/insaits-security-wrapper.js +119 -0
- package/resources/local/ecc/scripts/hooks/mcp-health-check.js +720 -0
- package/resources/local/ecc/scripts/hooks/observe-runner.js +196 -0
- package/resources/local/ecc/scripts/hooks/plugin-hook-bootstrap.js +153 -0
- package/resources/local/ecc/scripts/hooks/post-bash-build-complete.js +49 -0
- package/resources/local/ecc/scripts/hooks/post-bash-command-log.js +80 -0
- package/resources/local/ecc/scripts/hooks/post-bash-dispatcher.js +24 -0
- package/resources/local/ecc/scripts/hooks/post-bash-pr-created.js +60 -0
- package/resources/local/ecc/scripts/hooks/post-edit-accumulator.js +78 -0
- package/resources/local/ecc/scripts/hooks/post-edit-console-warn.js +54 -0
- package/resources/local/ecc/scripts/hooks/post-edit-format.js +109 -0
- package/resources/local/ecc/scripts/hooks/post-edit-typecheck.js +96 -0
- package/resources/local/ecc/scripts/hooks/pre-bash-commit-quality.js +447 -0
- package/resources/local/ecc/scripts/hooks/pre-bash-dev-server-block.js +225 -0
- package/resources/local/ecc/scripts/hooks/pre-bash-dispatcher.js +24 -0
- package/resources/local/ecc/scripts/hooks/pre-bash-git-push-reminder.js +52 -0
- package/resources/local/ecc/scripts/hooks/pre-bash-tmux-reminder.js +57 -0
- package/resources/local/ecc/scripts/hooks/pre-compact.js +48 -0
- package/resources/local/ecc/scripts/hooks/pre-write-doc-warn.js +9 -0
- package/resources/local/ecc/scripts/hooks/quality-gate.js +168 -0
- package/resources/local/ecc/scripts/hooks/run-with-flags-shell.sh +36 -0
- package/resources/local/ecc/scripts/hooks/run-with-flags.js +190 -0
- package/resources/local/ecc/scripts/hooks/session-activity-tracker.js +639 -0
- package/resources/local/ecc/scripts/hooks/session-end-marker.js +67 -0
- package/resources/local/ecc/scripts/hooks/session-end.js +328 -0
- package/resources/local/ecc/scripts/hooks/session-start-bootstrap.js +161 -0
- package/resources/local/ecc/scripts/hooks/session-start.js +706 -0
- package/resources/local/ecc/scripts/hooks/stop-format-typecheck.js +209 -0
- package/resources/local/ecc/scripts/hooks/suggest-compact.js +108 -0
- package/resources/local/ecc/scripts/install-apply.js +167 -0
- package/resources/local/ecc/scripts/install-plan.js +276 -0
- package/resources/local/ecc/scripts/lib/agent-compress.js +244 -0
- package/resources/local/ecc/scripts/lib/cost-estimate.js +32 -0
- package/resources/local/ecc/scripts/lib/cursor-agent-names.js +26 -0
- package/resources/local/ecc/scripts/lib/ecc_dashboard_runtime.py +70 -0
- package/resources/local/ecc/scripts/lib/github-discussions.js +159 -0
- package/resources/local/ecc/scripts/lib/harness-adapter-compliance.js +453 -0
- package/resources/local/ecc/scripts/lib/hook-flags.js +74 -0
- package/resources/local/ecc/scripts/lib/inspection.js +212 -0
- package/resources/local/ecc/scripts/lib/install/apply.js +174 -0
- package/resources/local/ecc/scripts/lib/install/config.js +89 -0
- package/resources/local/ecc/scripts/lib/install/request.js +157 -0
- package/resources/local/ecc/scripts/lib/install/runtime.js +56 -0
- package/resources/local/ecc/scripts/lib/install-executor.js +738 -0
- package/resources/local/ecc/scripts/lib/install-lifecycle.js +1226 -0
- package/resources/local/ecc/scripts/lib/install-manifests.js +644 -0
- package/resources/local/ecc/scripts/lib/install-state.js +313 -0
- package/resources/local/ecc/scripts/lib/install-targets/antigravity-project.js +85 -0
- package/resources/local/ecc/scripts/lib/install-targets/claude-home.js +91 -0
- package/resources/local/ecc/scripts/lib/install-targets/codebuddy-project.js +50 -0
- package/resources/local/ecc/scripts/lib/install-targets/codex-home.js +10 -0
- package/resources/local/ecc/scripts/lib/install-targets/cursor-project.js +210 -0
- package/resources/local/ecc/scripts/lib/install-targets/gemini-project.js +10 -0
- package/resources/local/ecc/scripts/lib/install-targets/helpers.js +368 -0
- package/resources/local/ecc/scripts/lib/install-targets/joycode-project.js +50 -0
- package/resources/local/ecc/scripts/lib/install-targets/opencode-home.js +10 -0
- package/resources/local/ecc/scripts/lib/install-targets/qwen-home.js +10 -0
- package/resources/local/ecc/scripts/lib/install-targets/registry.js +76 -0
- package/resources/local/ecc/scripts/lib/install-targets/zed-project.js +50 -0
- package/resources/local/ecc/scripts/lib/mcp-config.js +56 -0
- package/resources/local/ecc/scripts/lib/observer-sessions.js +212 -0
- package/resources/local/ecc/scripts/lib/orchestration-session.js +299 -0
- package/resources/local/ecc/scripts/lib/package-manager.d.ts +119 -0
- package/resources/local/ecc/scripts/lib/package-manager.js +431 -0
- package/resources/local/ecc/scripts/lib/project-detect.js +438 -0
- package/resources/local/ecc/scripts/lib/resolve-ecc-root.js +118 -0
- package/resources/local/ecc/scripts/lib/resolve-formatter.js +185 -0
- package/resources/local/ecc/scripts/lib/session-adapters/canonical-session.js +531 -0
- package/resources/local/ecc/scripts/lib/session-adapters/claude-history.js +160 -0
- package/resources/local/ecc/scripts/lib/session-adapters/dmux-tmux.js +90 -0
- package/resources/local/ecc/scripts/lib/session-adapters/registry.js +127 -0
- package/resources/local/ecc/scripts/lib/session-aliases.d.ts +136 -0
- package/resources/local/ecc/scripts/lib/session-aliases.js +481 -0
- package/resources/local/ecc/scripts/lib/session-bridge.js +81 -0
- package/resources/local/ecc/scripts/lib/session-manager.d.ts +132 -0
- package/resources/local/ecc/scripts/lib/session-manager.js +533 -0
- package/resources/local/ecc/scripts/lib/shell-split.js +86 -0
- package/resources/local/ecc/scripts/lib/shell-substitution.js +494 -0
- package/resources/local/ecc/scripts/lib/skill-evolution/dashboard.js +401 -0
- package/resources/local/ecc/scripts/lib/skill-evolution/health.js +263 -0
- package/resources/local/ecc/scripts/lib/skill-evolution/index.js +20 -0
- package/resources/local/ecc/scripts/lib/skill-evolution/provenance.js +187 -0
- package/resources/local/ecc/scripts/lib/skill-evolution/tracker.js +146 -0
- package/resources/local/ecc/scripts/lib/skill-evolution/versioning.js +237 -0
- package/resources/local/ecc/scripts/lib/skill-improvement/amendify.js +89 -0
- package/resources/local/ecc/scripts/lib/skill-improvement/evaluate.js +59 -0
- package/resources/local/ecc/scripts/lib/skill-improvement/health.js +118 -0
- package/resources/local/ecc/scripts/lib/skill-improvement/observations.js +108 -0
- package/resources/local/ecc/scripts/lib/state-store/index.js +191 -0
- package/resources/local/ecc/scripts/lib/state-store/migrations.js +209 -0
- package/resources/local/ecc/scripts/lib/state-store/queries.js +906 -0
- package/resources/local/ecc/scripts/lib/state-store/schema.js +93 -0
- package/resources/local/ecc/scripts/lib/tmux-worktree-orchestrator.js +598 -0
- package/resources/local/ecc/scripts/lib/utils.d.ts +196 -0
- package/resources/local/ecc/scripts/lib/utils.js +629 -0
- package/resources/local/ecc/scripts/list-installed.js +91 -0
- package/resources/local/ecc/scripts/loop-status.js +820 -0
- package/resources/local/ecc/scripts/observability-readiness.js +462 -0
- package/resources/local/ecc/scripts/operator-readiness-dashboard.js +979 -0
- package/resources/local/ecc/scripts/orchestrate-codex-worker.sh +107 -0
- package/resources/local/ecc/scripts/orchestrate-worktrees.js +108 -0
- package/resources/local/ecc/scripts/orchestration-status.js +62 -0
- package/resources/local/ecc/scripts/platform-audit.js +749 -0
- package/resources/local/ecc/scripts/preview-pack-smoke.js +353 -0
- package/resources/local/ecc/scripts/repair.js +98 -0
- package/resources/local/ecc/scripts/session-inspect.js +150 -0
- package/resources/local/ecc/scripts/sessions-cli.js +178 -0
- package/resources/local/ecc/scripts/setup-package-manager.js +204 -0
- package/resources/local/ecc/scripts/skill-create-output.js +244 -0
- package/resources/local/ecc/scripts/skills-health.js +132 -0
- package/resources/local/ecc/scripts/status.js +394 -0
- package/resources/local/ecc/scripts/sync-ecc-to-codex.sh +534 -0
- package/resources/local/ecc/scripts/uninstall.js +97 -0
- package/resources/local/ecc/scripts/work-items.js +510 -0
- package/resources/local/ecc/skills/accessibility/SKILL.md +146 -0
- package/resources/local/ecc/skills/agent-architecture-audit/SKILL.md +256 -0
- package/resources/local/ecc/skills/agent-eval/SKILL.md +145 -0
- package/resources/local/ecc/skills/agent-harness-construction/SKILL.md +73 -0
- package/resources/local/ecc/skills/agent-introspection-debugging/SKILL.md +153 -0
- package/resources/local/ecc/skills/agent-payment-x402/SKILL.md +224 -0
- package/resources/local/ecc/skills/agent-sort/SKILL.md +215 -0
- package/resources/local/ecc/skills/agentic-engineering/SKILL.md +63 -0
- package/resources/local/ecc/skills/agentic-os/SKILL.md +387 -0
- package/resources/local/ecc/skills/ai-first-engineering/SKILL.md +51 -0
- package/resources/local/ecc/skills/ai-regression-testing/SKILL.md +385 -0
- package/resources/local/ecc/skills/android-clean-architecture/SKILL.md +339 -0
- package/resources/local/ecc/skills/angular-developer/SKILL.md +154 -0
- package/resources/local/ecc/skills/angular-developer/references/angular-animations.md +160 -0
- package/resources/local/ecc/skills/angular-developer/references/angular-aria.md +410 -0
- package/resources/local/ecc/skills/angular-developer/references/cli.md +86 -0
- package/resources/local/ecc/skills/angular-developer/references/component-harnesses.md +59 -0
- package/resources/local/ecc/skills/angular-developer/references/component-styling.md +91 -0
- package/resources/local/ecc/skills/angular-developer/references/components.md +117 -0
- package/resources/local/ecc/skills/angular-developer/references/creating-services.md +97 -0
- package/resources/local/ecc/skills/angular-developer/references/data-resolvers.md +69 -0
- package/resources/local/ecc/skills/angular-developer/references/define-routes.md +67 -0
- package/resources/local/ecc/skills/angular-developer/references/defining-providers.md +72 -0
- package/resources/local/ecc/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/resources/local/ecc/skills/angular-developer/references/e2e-testing.md +56 -0
- package/resources/local/ecc/skills/angular-developer/references/effects.md +83 -0
- package/resources/local/ecc/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/resources/local/ecc/skills/angular-developer/references/host-elements.md +80 -0
- package/resources/local/ecc/skills/angular-developer/references/injection-context.md +63 -0
- package/resources/local/ecc/skills/angular-developer/references/inputs.md +101 -0
- package/resources/local/ecc/skills/angular-developer/references/linked-signal.md +59 -0
- package/resources/local/ecc/skills/angular-developer/references/loading-strategies.md +61 -0
- package/resources/local/ecc/skills/angular-developer/references/mcp.md +108 -0
- package/resources/local/ecc/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/resources/local/ecc/skills/angular-developer/references/outputs.md +86 -0
- package/resources/local/ecc/skills/angular-developer/references/reactive-forms.md +122 -0
- package/resources/local/ecc/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/resources/local/ecc/skills/angular-developer/references/resource.md +77 -0
- package/resources/local/ecc/skills/angular-developer/references/route-animations.md +56 -0
- package/resources/local/ecc/skills/angular-developer/references/route-guards.md +52 -0
- package/resources/local/ecc/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/resources/local/ecc/skills/angular-developer/references/router-testing.md +87 -0
- package/resources/local/ecc/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/resources/local/ecc/skills/angular-developer/references/signal-forms.md +795 -0
- package/resources/local/ecc/skills/angular-developer/references/signals-overview.md +94 -0
- package/resources/local/ecc/skills/angular-developer/references/tailwind-css.md +69 -0
- package/resources/local/ecc/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/resources/local/ecc/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/resources/local/ecc/skills/api-connector-builder/SKILL.md +120 -0
- package/resources/local/ecc/skills/api-design/SKILL.md +523 -0
- package/resources/local/ecc/skills/architecture-decision-records/SKILL.md +179 -0
- package/resources/local/ecc/skills/article-writing/SKILL.md +79 -0
- package/resources/local/ecc/skills/automation-audit-ops/SKILL.md +142 -0
- package/resources/local/ecc/skills/autonomous-agent-harness/SKILL.md +273 -0
- package/resources/local/ecc/skills/autonomous-loops/SKILL.md +610 -0
- package/resources/local/ecc/skills/backend-patterns/SKILL.md +561 -0
- package/resources/local/ecc/skills/benchmark/SKILL.md +93 -0
- package/resources/local/ecc/skills/blender-motion-state-inspection/SKILL.md +164 -0
- package/resources/local/ecc/skills/blueprint/SKILL.md +105 -0
- package/resources/local/ecc/skills/brand-voice/SKILL.md +97 -0
- package/resources/local/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/resources/local/ecc/skills/browser-qa/SKILL.md +87 -0
- package/resources/local/ecc/skills/bun-runtime/SKILL.md +84 -0
- package/resources/local/ecc/skills/canary-watch/SKILL.md +107 -0
- package/resources/local/ecc/skills/carrier-relationship-management/SKILL.md +212 -0
- package/resources/local/ecc/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/resources/local/ecc/skills/ck/SKILL.md +147 -0
- package/resources/local/ecc/skills/ck/commands/forget.mjs +44 -0
- package/resources/local/ecc/skills/ck/commands/info.mjs +24 -0
- package/resources/local/ecc/skills/ck/commands/init.mjs +143 -0
- package/resources/local/ecc/skills/ck/commands/list.mjs +40 -0
- package/resources/local/ecc/skills/ck/commands/migrate.mjs +202 -0
- package/resources/local/ecc/skills/ck/commands/resume.mjs +36 -0
- package/resources/local/ecc/skills/ck/commands/save.mjs +210 -0
- package/resources/local/ecc/skills/ck/commands/shared.mjs +387 -0
- package/resources/local/ecc/skills/ck/hooks/session-start.mjs +224 -0
- package/resources/local/ecc/skills/claude-devfleet/SKILL.md +103 -0
- package/resources/local/ecc/skills/click-path-audit/SKILL.md +244 -0
- package/resources/local/ecc/skills/clickhouse-io/SKILL.md +439 -0
- package/resources/local/ecc/skills/code-tour/SKILL.md +236 -0
- package/resources/local/ecc/skills/codebase-onboarding/SKILL.md +233 -0
- package/resources/local/ecc/skills/coding-standards/SKILL.md +549 -0
- package/resources/local/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/resources/local/ecc/skills/configure-ecc/SKILL.md +384 -0
- package/resources/local/ecc/skills/connections-optimizer/SKILL.md +189 -0
- package/resources/local/ecc/skills/content-engine/SKILL.md +131 -0
- package/resources/local/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/resources/local/ecc/skills/context-budget/SKILL.md +135 -0
- package/resources/local/ecc/skills/continuous-agent-loop/SKILL.md +45 -0
- package/resources/local/ecc/skills/continuous-learning/SKILL.md +131 -0
- package/resources/local/ecc/skills/continuous-learning/config.json +18 -0
- package/resources/local/ecc/skills/continuous-learning/evaluate-session.sh +69 -0
- package/resources/local/ecc/skills/continuous-learning-v2/SKILL.md +360 -0
- package/resources/local/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
- package/resources/local/ecc/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/resources/local/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/resources/local/ecc/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
- package/resources/local/ecc/skills/continuous-learning-v2/config.json +8 -0
- package/resources/local/ecc/skills/continuous-learning-v2/hooks/observe.sh +492 -0
- package/resources/local/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
- package/resources/local/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
- package/resources/local/ecc/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/resources/local/ecc/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
- package/resources/local/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
- package/resources/local/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/resources/local/ecc/skills/cost-tracking/SKILL.md +147 -0
- package/resources/local/ecc/skills/council/SKILL.md +203 -0
- package/resources/local/ecc/skills/cpp-coding-standards/SKILL.md +723 -0
- package/resources/local/ecc/skills/cpp-testing/SKILL.md +324 -0
- package/resources/local/ecc/skills/crosspost/SKILL.md +111 -0
- package/resources/local/ecc/skills/csharp-testing/SKILL.md +321 -0
- package/resources/local/ecc/skills/customer-billing-ops/SKILL.md +140 -0
- package/resources/local/ecc/skills/customs-trade-compliance/SKILL.md +263 -0
- package/resources/local/ecc/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/resources/local/ecc/skills/dashboard-builder/SKILL.md +108 -0
- package/resources/local/ecc/skills/data-scraper-agent/SKILL.md +764 -0
- package/resources/local/ecc/skills/database-migrations/SKILL.md +429 -0
- package/resources/local/ecc/skills/deep-research/SKILL.md +159 -0
- package/resources/local/ecc/skills/defi-amm-security/SKILL.md +166 -0
- package/resources/local/ecc/skills/deployment-patterns/SKILL.md +427 -0
- package/resources/local/ecc/skills/design-system/SKILL.md +82 -0
- package/resources/local/ecc/skills/django-celery/SKILL.md +457 -0
- package/resources/local/ecc/skills/django-patterns/SKILL.md +734 -0
- package/resources/local/ecc/skills/django-security/SKILL.md +593 -0
- package/resources/local/ecc/skills/django-tdd/SKILL.md +729 -0
- package/resources/local/ecc/skills/django-verification/SKILL.md +469 -0
- package/resources/local/ecc/skills/dmux-workflows/SKILL.md +191 -0
- package/resources/local/ecc/skills/docker-patterns/SKILL.md +364 -0
- package/resources/local/ecc/skills/documentation-lookup/SKILL.md +90 -0
- package/resources/local/ecc/skills/dotnet-patterns/SKILL.md +321 -0
- package/resources/local/ecc/skills/e2e-testing/SKILL.md +326 -0
- package/resources/local/ecc/skills/ecc-guide/SKILL.md +189 -0
- package/resources/local/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -0
- package/resources/local/ecc/skills/email-ops/SKILL.md +121 -0
- package/resources/local/ecc/skills/energy-procurement/SKILL.md +228 -0
- package/resources/local/ecc/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/resources/local/ecc/skills/error-handling/SKILL.md +376 -0
- package/resources/local/ecc/skills/eval-harness/SKILL.md +270 -0
- package/resources/local/ecc/skills/evm-token-decimals/SKILL.md +130 -0
- package/resources/local/ecc/skills/exa-search/SKILL.md +107 -0
- package/resources/local/ecc/skills/fal-ai-media/SKILL.md +288 -0
- package/resources/local/ecc/skills/fastapi-patterns/SKILL.md +327 -0
- package/resources/local/ecc/skills/finance-billing-ops/SKILL.md +127 -0
- package/resources/local/ecc/skills/flox-environments/SKILL.md +496 -0
- package/resources/local/ecc/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/resources/local/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
- package/resources/local/ecc/skills/frontend-design-direction/SKILL.md +92 -0
- package/resources/local/ecc/skills/frontend-patterns/SKILL.md +642 -0
- package/resources/local/ecc/skills/frontend-slides/SKILL.md +184 -0
- package/resources/local/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/local/ecc/skills/frontend-slides/animation-patterns.md +122 -0
- package/resources/local/ecc/skills/frontend-slides/html-template.md +419 -0
- package/resources/local/ecc/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/resources/local/ecc/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/resources/local/ecc/skills/frontend-slides/viewport-base.css +153 -0
- package/resources/local/ecc/skills/fsharp-testing/SKILL.md +280 -0
- package/resources/local/ecc/skills/gan-style-harness/SKILL.md +278 -0
- package/resources/local/ecc/skills/gateguard/SKILL.md +125 -0
- package/resources/local/ecc/skills/git-workflow/SKILL.md +715 -0
- package/resources/local/ecc/skills/github-ops/SKILL.md +144 -0
- package/resources/local/ecc/skills/golang-patterns/SKILL.md +674 -0
- package/resources/local/ecc/skills/golang-testing/SKILL.md +720 -0
- package/resources/local/ecc/skills/google-workspace-ops/SKILL.md +95 -0
- package/resources/local/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/resources/local/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/resources/local/ecc/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/resources/local/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/resources/local/ecc/skills/hermes-imports/SKILL.md +88 -0
- package/resources/local/ecc/skills/hexagonal-architecture/SKILL.md +276 -0
- package/resources/local/ecc/skills/hipaa-compliance/SKILL.md +78 -0
- package/resources/local/ecc/skills/homelab-network-readiness/SKILL.md +169 -0
- package/resources/local/ecc/skills/homelab-network-setup/SKILL.md +129 -0
- package/resources/local/ecc/skills/homelab-pihole-dns/SKILL.md +274 -0
- package/resources/local/ecc/skills/homelab-vlan-segmentation/SKILL.md +311 -0
- package/resources/local/ecc/skills/homelab-wireguard-vpn/SKILL.md +305 -0
- package/resources/local/ecc/skills/hookify-rules/SKILL.md +128 -0
- package/resources/local/ecc/skills/inventory-demand-planning/SKILL.md +247 -0
- package/resources/local/ecc/skills/investor-materials/SKILL.md +96 -0
- package/resources/local/ecc/skills/investor-outreach/SKILL.md +91 -0
- package/resources/local/ecc/skills/ios-icon-gen/SKILL.md +157 -0
- package/resources/local/ecc/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/resources/local/ecc/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/resources/local/ecc/skills/iterative-retrieval/SKILL.md +211 -0
- package/resources/local/ecc/skills/java-coding-standards/SKILL.md +383 -0
- package/resources/local/ecc/skills/jira-integration/SKILL.md +293 -0
- package/resources/local/ecc/skills/jpa-patterns/SKILL.md +151 -0
- package/resources/local/ecc/skills/knowledge-ops/SKILL.md +154 -0
- package/resources/local/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/resources/local/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/resources/local/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/resources/local/ecc/skills/kotlin-patterns/SKILL.md +711 -0
- package/resources/local/ecc/skills/kotlin-testing/SKILL.md +824 -0
- package/resources/local/ecc/skills/laravel-patterns/SKILL.md +415 -0
- package/resources/local/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/resources/local/ecc/skills/laravel-security/SKILL.md +285 -0
- package/resources/local/ecc/skills/laravel-tdd/SKILL.md +283 -0
- package/resources/local/ecc/skills/laravel-verification/SKILL.md +179 -0
- package/resources/local/ecc/skills/lead-intelligence/SKILL.md +321 -0
- package/resources/local/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/resources/local/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/resources/local/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/resources/local/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/resources/local/ecc/skills/liquid-glass-design/SKILL.md +279 -0
- package/resources/local/ecc/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/resources/local/ecc/skills/logistics-exception-management/SKILL.md +222 -0
- package/resources/local/ecc/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/resources/local/ecc/skills/manim-video/SKILL.md +89 -0
- package/resources/local/ecc/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/resources/local/ecc/skills/market-research/SKILL.md +75 -0
- package/resources/local/ecc/skills/mcp-server-patterns/SKILL.md +69 -0
- package/resources/local/ecc/skills/messages-ops/SKILL.md +104 -0
- package/resources/local/ecc/skills/mle-workflow/SKILL.md +346 -0
- package/resources/local/ecc/skills/motion-advanced/SKILL.md +596 -0
- package/resources/local/ecc/skills/motion-foundations/SKILL.md +299 -0
- package/resources/local/ecc/skills/motion-patterns/SKILL.md +435 -0
- package/resources/local/ecc/skills/motion-ui/SKILL.md +575 -0
- package/resources/local/ecc/skills/mysql-patterns/SKILL.md +412 -0
- package/resources/local/ecc/skills/nanoclaw-repl/SKILL.md +33 -0
- package/resources/local/ecc/skills/nestjs-patterns/SKILL.md +230 -0
- package/resources/local/ecc/skills/netmiko-ssh-automation/SKILL.md +173 -0
- package/resources/local/ecc/skills/network-bgp-diagnostics/SKILL.md +167 -0
- package/resources/local/ecc/skills/network-config-validation/SKILL.md +210 -0
- package/resources/local/ecc/skills/network-interface-health/SKILL.md +152 -0
- package/resources/local/ecc/skills/nextjs-turbopack/SKILL.md +44 -0
- package/resources/local/ecc/skills/nodejs-keccak256/SKILL.md +102 -0
- package/resources/local/ecc/skills/nutrient-document-processing/SKILL.md +167 -0
- package/resources/local/ecc/skills/nuxt4-patterns/SKILL.md +100 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/gacha.py +224 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/resources/local/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/resources/local/ecc/skills/opensource-pipeline/SKILL.md +255 -0
- package/resources/local/ecc/skills/perl-patterns/SKILL.md +504 -0
- package/resources/local/ecc/skills/perl-security/SKILL.md +503 -0
- package/resources/local/ecc/skills/perl-testing/SKILL.md +475 -0
- package/resources/local/ecc/skills/plan-orchestrate/SKILL.md +262 -0
- package/resources/local/ecc/skills/plankton-code-quality/SKILL.md +236 -0
- package/resources/local/ecc/skills/postgres-patterns/SKILL.md +147 -0
- package/resources/local/ecc/skills/prisma-patterns/SKILL.md +371 -0
- package/resources/local/ecc/skills/product-capability/SKILL.md +141 -0
- package/resources/local/ecc/skills/product-lens/SKILL.md +92 -0
- package/resources/local/ecc/skills/production-audit/SKILL.md +206 -0
- package/resources/local/ecc/skills/production-scheduling/SKILL.md +238 -0
- package/resources/local/ecc/skills/project-flow-ops/SKILL.md +111 -0
- package/resources/local/ecc/skills/prompt-optimizer/SKILL.md +398 -0
- package/resources/local/ecc/skills/python-patterns/SKILL.md +750 -0
- package/resources/local/ecc/skills/python-testing/SKILL.md +816 -0
- package/resources/local/ecc/skills/pytorch-patterns/SKILL.md +396 -0
- package/resources/local/ecc/skills/quality-nonconformance/SKILL.md +260 -0
- package/resources/local/ecc/skills/quarkus-patterns/SKILL.md +722 -0
- package/resources/local/ecc/skills/quarkus-security/SKILL.md +467 -0
- package/resources/local/ecc/skills/quarkus-tdd/SKILL.md +811 -0
- package/resources/local/ecc/skills/quarkus-verification/SKILL.md +479 -0
- package/resources/local/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/resources/local/ecc/skills/recsys-pipeline-architect/SKILL.md +114 -0
- package/resources/local/ecc/skills/redis-patterns/SKILL.md +403 -0
- package/resources/local/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/resources/local/ecc/skills/remotion-video-creation/SKILL.md +43 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/3d.md +86 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/animations.md +29 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/assets.md +78 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/audio.md +172 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/charts.md +58 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/images.md +130 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/timing.md +179 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/resources/local/ecc/skills/remotion-video-creation/rules/videos.md +171 -0
- package/resources/local/ecc/skills/repo-scan/SKILL.md +78 -0
- package/resources/local/ecc/skills/research-ops/SKILL.md +112 -0
- package/resources/local/ecc/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/resources/local/ecc/skills/rules-distill/SKILL.md +264 -0
- package/resources/local/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/resources/local/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/resources/local/ecc/skills/rust-patterns/SKILL.md +499 -0
- package/resources/local/ecc/skills/rust-testing/SKILL.md +500 -0
- package/resources/local/ecc/skills/safety-guard/SKILL.md +75 -0
- package/resources/local/ecc/skills/santa-method/SKILL.md +306 -0
- package/resources/local/ecc/skills/scientific-db-pubmed-database/SKILL.md +175 -0
- package/resources/local/ecc/skills/scientific-db-uspto-database/SKILL.md +177 -0
- package/resources/local/ecc/skills/scientific-pkg-gget/SKILL.md +166 -0
- package/resources/local/ecc/skills/scientific-thinking-literature-review/SKILL.md +192 -0
- package/resources/local/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
- package/resources/local/ecc/skills/search-first/SKILL.md +182 -0
- package/resources/local/ecc/skills/security-bounty-hunter/SKILL.md +99 -0
- package/resources/local/ecc/skills/security-review/SKILL.md +503 -0
- package/resources/local/ecc/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/resources/local/ecc/skills/security-scan/SKILL.md +165 -0
- package/resources/local/ecc/skills/seo/SKILL.md +154 -0
- package/resources/local/ecc/skills/skill-comply/SKILL.md +58 -0
- package/resources/local/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/resources/local/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/resources/local/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/resources/local/ecc/skills/skill-comply/prompts/classifier.md +24 -0
- package/resources/local/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/resources/local/ecc/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/resources/local/ecc/skills/skill-comply/pyproject.toml +15 -0
- package/resources/local/ecc/skills/skill-comply/scripts/__init__.py +0 -0
- package/resources/local/ecc/skills/skill-comply/scripts/classifier.py +85 -0
- package/resources/local/ecc/skills/skill-comply/scripts/grader.py +124 -0
- package/resources/local/ecc/skills/skill-comply/scripts/parser.py +107 -0
- package/resources/local/ecc/skills/skill-comply/scripts/report.py +170 -0
- package/resources/local/ecc/skills/skill-comply/scripts/run.py +127 -0
- package/resources/local/ecc/skills/skill-comply/scripts/runner.py +186 -0
- package/resources/local/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/resources/local/ecc/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/resources/local/ecc/skills/skill-comply/scripts/utils.py +13 -0
- package/resources/local/ecc/skills/skill-comply/tests/test_grader.py +197 -0
- package/resources/local/ecc/skills/skill-comply/tests/test_parser.py +90 -0
- package/resources/local/ecc/skills/skill-comply/tests/test_runner.py +172 -0
- package/resources/local/ecc/skills/skill-scout/SKILL.md +140 -0
- package/resources/local/ecc/skills/skill-stocktake/SKILL.md +194 -0
- package/resources/local/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/resources/local/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/resources/local/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/resources/local/ecc/skills/social-graph-ranker/SKILL.md +154 -0
- package/resources/local/ecc/skills/springboot-patterns/SKILL.md +314 -0
- package/resources/local/ecc/skills/springboot-security/SKILL.md +272 -0
- package/resources/local/ecc/skills/springboot-tdd/SKILL.md +158 -0
- package/resources/local/ecc/skills/springboot-verification/SKILL.md +231 -0
- package/resources/local/ecc/skills/strategic-compact/SKILL.md +131 -0
- package/resources/local/ecc/skills/swift-actor-persistence/SKILL.md +143 -0
- package/resources/local/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/resources/local/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/resources/local/ecc/skills/swiftui-patterns/SKILL.md +259 -0
- package/resources/local/ecc/skills/tdd-workflow/SKILL.md +463 -0
- package/resources/local/ecc/skills/team-builder/SKILL.md +168 -0
- package/resources/local/ecc/skills/terminal-ops/SKILL.md +109 -0
- package/resources/local/ecc/skills/tinystruct-patterns/SKILL.md +203 -0
- package/resources/local/ecc/skills/tinystruct-patterns/references/architecture.md +90 -0
- package/resources/local/ecc/skills/tinystruct-patterns/references/data-handling.md +60 -0
- package/resources/local/ecc/skills/tinystruct-patterns/references/database.md +99 -0
- package/resources/local/ecc/skills/tinystruct-patterns/references/routing.md +64 -0
- package/resources/local/ecc/skills/tinystruct-patterns/references/system-usage.md +97 -0
- package/resources/local/ecc/skills/tinystruct-patterns/references/testing.md +72 -0
- package/resources/local/ecc/skills/token-budget-advisor/SKILL.md +133 -0
- package/resources/local/ecc/skills/ui-demo/SKILL.md +465 -0
- package/resources/local/ecc/skills/ui-to-vue/SKILL.md +134 -0
- package/resources/local/ecc/skills/uncloud/SKILL.md +343 -0
- package/resources/local/ecc/skills/unified-notifications-ops/SKILL.md +187 -0
- package/resources/local/ecc/skills/verification-loop/SKILL.md +126 -0
- package/resources/local/ecc/skills/video-editing/SKILL.md +310 -0
- package/resources/local/ecc/skills/videodb/SKILL.md +374 -0
- package/resources/local/ecc/skills/videodb/reference/api-reference.md +550 -0
- package/resources/local/ecc/skills/videodb/reference/capture-reference.md +407 -0
- package/resources/local/ecc/skills/videodb/reference/capture.md +101 -0
- package/resources/local/ecc/skills/videodb/reference/editor.md +443 -0
- package/resources/local/ecc/skills/videodb/reference/generative.md +331 -0
- package/resources/local/ecc/skills/videodb/reference/rtstream-reference.md +564 -0
- package/resources/local/ecc/skills/videodb/reference/rtstream.md +65 -0
- package/resources/local/ecc/skills/videodb/reference/search.md +230 -0
- package/resources/local/ecc/skills/videodb/reference/streaming.md +406 -0
- package/resources/local/ecc/skills/videodb/reference/use-cases.md +118 -0
- package/resources/local/ecc/skills/videodb/scripts/ws_listener.py +282 -0
- package/resources/local/ecc/skills/visa-doc-translate/README.md +86 -0
- package/resources/local/ecc/skills/visa-doc-translate/SKILL.md +117 -0
- package/resources/local/ecc/skills/vite-patterns/SKILL.md +449 -0
- package/resources/local/ecc/skills/windows-desktop-e2e/SKILL.md +887 -0
- package/resources/local/ecc/skills/workspace-surface-audit/SKILL.md +125 -0
- package/resources/local/ecc/skills/x-api/SKILL.md +234 -0
- package/resources/local/ecc/src/llm/__init__.py +33 -0
- package/resources/local/ecc/src/llm/__main__.py +7 -0
- package/resources/local/ecc/src/llm/cli/__init__.py +0 -0
- package/resources/local/ecc/src/llm/cli/selector.py +154 -0
- package/resources/local/ecc/src/llm/core/__init__.py +1 -0
- package/resources/local/ecc/src/llm/core/interface.py +60 -0
- package/resources/local/ecc/src/llm/core/types.py +166 -0
- package/resources/local/ecc/src/llm/prompt/__init__.py +23 -0
- package/resources/local/ecc/src/llm/prompt/builder.py +125 -0
- package/resources/local/ecc/src/llm/prompt/templates/__init__.py +41 -0
- package/resources/local/ecc/src/llm/providers/__init__.py +17 -0
- package/resources/local/ecc/src/llm/providers/astraflow.py +151 -0
- package/resources/local/ecc/src/llm/providers/claude.py +117 -0
- package/resources/local/ecc/src/llm/providers/constants.py +3 -0
- package/resources/local/ecc/src/llm/providers/ollama.py +112 -0
- package/resources/local/ecc/src/llm/providers/openai.py +125 -0
- package/resources/local/ecc/src/llm/providers/resolver.py +78 -0
- package/resources/local/ecc/src/llm/tools/__init__.py +9 -0
- package/resources/local/ecc/src/llm/tools/executor.py +116 -0
- package/resources/local/ecc/tests/__init__.py +0 -0
- package/resources/local/ecc/tests/ci/agent-instruction-safety.test.js +98 -0
- package/resources/local/ecc/tests/ci/agent-yaml-surface.test.js +131 -0
- package/resources/local/ecc/tests/ci/catalog.test.js +294 -0
- package/resources/local/ecc/tests/ci/code-reviewer-false-positive-guard.test.js +82 -0
- package/resources/local/ecc/tests/ci/codex-skill-surface.test.js +125 -0
- package/resources/local/ecc/tests/ci/command-registry.test.js +176 -0
- package/resources/local/ecc/tests/ci/mle-workflow-coverage.test.js +223 -0
- package/resources/local/ecc/tests/ci/no-personal-paths.test.js +211 -0
- package/resources/local/ecc/tests/ci/scan-supply-chain-iocs.test.js +447 -0
- package/resources/local/ecc/tests/ci/supply-chain-advisory-sources.test.js +290 -0
- package/resources/local/ecc/tests/ci/supply-chain-watch-workflow.test.js +77 -0
- package/resources/local/ecc/tests/ci/validate-workflow-security.test.js +289 -0
- package/resources/local/ecc/tests/ci/validators.test.js +3139 -0
- package/resources/local/ecc/tests/codex-config.test.js +117 -0
- package/resources/local/ecc/tests/commands/command-frontmatter.test.js +61 -0
- package/resources/local/ecc/tests/commands/plan-command.test.js +76 -0
- package/resources/local/ecc/tests/conftest.py +10 -0
- package/resources/local/ecc/tests/docs/canary-watch.test.js +45 -0
- package/resources/local/ecc/tests/docs/configure-ecc-install-paths.test.js +69 -0
- package/resources/local/ecc/tests/docs/continuous-learning-v2-docs.test.js +64 -0
- package/resources/local/ecc/tests/docs/copilot-support.test.js +110 -0
- package/resources/local/ecc/tests/docs/ecc2-release-surface.test.js +374 -0
- package/resources/local/ecc/tests/docs/evaluator-rag-prototype.test.js +417 -0
- package/resources/local/ecc/tests/docs/harness-adapter-compliance.test.js +154 -0
- package/resources/local/ecc/tests/docs/install-identifiers.test.js +104 -0
- package/resources/local/ecc/tests/docs/legacy-artifact-inventory.test.js +155 -0
- package/resources/local/ecc/tests/docs/mcp-management-docs.test.js +77 -0
- package/resources/local/ecc/tests/docs/stale-pr-salvage-ledger.test.js +158 -0
- package/resources/local/ecc/tests/hooks/auto-tmux-dev.test.js +145 -0
- package/resources/local/ecc/tests/hooks/bash-hook-dispatcher.test.js +114 -0
- package/resources/local/ecc/tests/hooks/block-no-verify.test.js +203 -0
- package/resources/local/ecc/tests/hooks/check-hook-enabled.test.js +108 -0
- package/resources/local/ecc/tests/hooks/config-protection.test.js +322 -0
- package/resources/local/ecc/tests/hooks/continuous-learning-observe-runner.test.js +194 -0
- package/resources/local/ecc/tests/hooks/cost-tracker.test.js +222 -0
- package/resources/local/ecc/tests/hooks/design-quality-check.test.js +82 -0
- package/resources/local/ecc/tests/hooks/detect-project-worktree.test.js +260 -0
- package/resources/local/ecc/tests/hooks/doc-file-warning.test.js +215 -0
- package/resources/local/ecc/tests/hooks/ecc-context-monitor.test.js +301 -0
- package/resources/local/ecc/tests/hooks/ecc-metrics-bridge.test.js +430 -0
- package/resources/local/ecc/tests/hooks/ecc-statusline.test.js +213 -0
- package/resources/local/ecc/tests/hooks/evaluate-session.test.js +419 -0
- package/resources/local/ecc/tests/hooks/gateguard-fact-force.test.js +1407 -0
- package/resources/local/ecc/tests/hooks/governance-capture.test.js +360 -0
- package/resources/local/ecc/tests/hooks/hook-flags.test.js +397 -0
- package/resources/local/ecc/tests/hooks/hooks.test.js +6041 -0
- package/resources/local/ecc/tests/hooks/insaits-security-monitor.test.js +219 -0
- package/resources/local/ecc/tests/hooks/insaits-security-wrapper.test.js +199 -0
- package/resources/local/ecc/tests/hooks/mcp-health-check.test.js +1131 -0
- package/resources/local/ecc/tests/hooks/observe-subdirectory-detection.test.js +279 -0
- package/resources/local/ecc/tests/hooks/observer-memory.test.js +475 -0
- package/resources/local/ecc/tests/hooks/plugin-hook-bootstrap.test.js +254 -0
- package/resources/local/ecc/tests/hooks/post-bash-hooks.test.js +207 -0
- package/resources/local/ecc/tests/hooks/pre-bash-commit-quality.test.js +293 -0
- package/resources/local/ecc/tests/hooks/pre-bash-dev-server-block.test.js +225 -0
- package/resources/local/ecc/tests/hooks/pre-bash-reminders.test.js +104 -0
- package/resources/local/ecc/tests/hooks/quality-gate.test.js +159 -0
- package/resources/local/ecc/tests/hooks/session-activity-tracker.test.js +668 -0
- package/resources/local/ecc/tests/hooks/stop-format-typecheck.test.js +248 -0
- package/resources/local/ecc/tests/hooks/suggest-compact.test.js +460 -0
- package/resources/local/ecc/tests/hooks/test_insaits_security_monitor.py +272 -0
- package/resources/local/ecc/tests/integration/hooks.test.js +1018 -0
- package/resources/local/ecc/tests/lib/agent-compress.test.js +271 -0
- package/resources/local/ecc/tests/lib/changed-files-store.test.js +163 -0
- package/resources/local/ecc/tests/lib/command-plugin-root.test.js +48 -0
- package/resources/local/ecc/tests/lib/cost-estimate.test.js +114 -0
- package/resources/local/ecc/tests/lib/inspection.test.js +232 -0
- package/resources/local/ecc/tests/lib/install-config.test.js +144 -0
- package/resources/local/ecc/tests/lib/install-executor.test.js +435 -0
- package/resources/local/ecc/tests/lib/install-lifecycle.test.js +1608 -0
- package/resources/local/ecc/tests/lib/install-manifests.test.js +882 -0
- package/resources/local/ecc/tests/lib/install-request.test.js +249 -0
- package/resources/local/ecc/tests/lib/install-state.test.js +234 -0
- package/resources/local/ecc/tests/lib/install-targets.test.js +872 -0
- package/resources/local/ecc/tests/lib/locale-install.test.js +172 -0
- package/resources/local/ecc/tests/lib/mcp-config.test.js +62 -0
- package/resources/local/ecc/tests/lib/observer-sessions.test.js +134 -0
- package/resources/local/ecc/tests/lib/orchestration-session.test.js +225 -0
- package/resources/local/ecc/tests/lib/package-manager.test.js +1698 -0
- package/resources/local/ecc/tests/lib/project-detect.test.js +447 -0
- package/resources/local/ecc/tests/lib/resolve-ecc-root.test.js +351 -0
- package/resources/local/ecc/tests/lib/resolve-formatter.test.js +277 -0
- package/resources/local/ecc/tests/lib/selective-install.test.js +836 -0
- package/resources/local/ecc/tests/lib/session-adapters.test.js +970 -0
- package/resources/local/ecc/tests/lib/session-aliases.test.js +1830 -0
- package/resources/local/ecc/tests/lib/session-bridge.test.js +174 -0
- package/resources/local/ecc/tests/lib/session-manager.test.js +2650 -0
- package/resources/local/ecc/tests/lib/shell-split.test.js +114 -0
- package/resources/local/ecc/tests/lib/skill-dashboard.test.js +574 -0
- package/resources/local/ecc/tests/lib/skill-evolution.test.js +656 -0
- package/resources/local/ecc/tests/lib/skill-improvement.test.js +186 -0
- package/resources/local/ecc/tests/lib/state-store.test.js +1002 -0
- package/resources/local/ecc/tests/lib/tmux-worktree-orchestrator.test.js +423 -0
- package/resources/local/ecc/tests/lib/utils.test.js +2648 -0
- package/resources/local/ecc/tests/opencode-config.test.js +103 -0
- package/resources/local/ecc/tests/opencode-plugin-hooks.test.js +183 -0
- package/resources/local/ecc/tests/plugin-manifest.test.js +545 -0
- package/resources/local/ecc/tests/run-all.js +118 -0
- package/resources/local/ecc/tests/scripts/auto-update.test.js +395 -0
- package/resources/local/ecc/tests/scripts/build-opencode.test.js +123 -0
- package/resources/local/ecc/tests/scripts/catalog.test.js +104 -0
- package/resources/local/ecc/tests/scripts/check-unicode-safety.test.js +203 -0
- package/resources/local/ecc/tests/scripts/claw.test.js +325 -0
- package/resources/local/ecc/tests/scripts/codex-hooks.test.js +508 -0
- package/resources/local/ecc/tests/scripts/consult.test.js +194 -0
- package/resources/local/ecc/tests/scripts/discussion-audit.test.js +302 -0
- package/resources/local/ecc/tests/scripts/doctor.test.js +190 -0
- package/resources/local/ecc/tests/scripts/ecc-dashboard.test.js +142 -0
- package/resources/local/ecc/tests/scripts/ecc.test.js +258 -0
- package/resources/local/ecc/tests/scripts/gemini-adapt-agents.test.js +136 -0
- package/resources/local/ecc/tests/scripts/harness-audit.test.js +477 -0
- package/resources/local/ecc/tests/scripts/install-apply.test.js +904 -0
- package/resources/local/ecc/tests/scripts/install-plan.test.js +194 -0
- package/resources/local/ecc/tests/scripts/install-ps1.test.js +128 -0
- package/resources/local/ecc/tests/scripts/install-readme-clarity.test.js +170 -0
- package/resources/local/ecc/tests/scripts/install-sh.test.js +102 -0
- package/resources/local/ecc/tests/scripts/list-installed.test.js +139 -0
- package/resources/local/ecc/tests/scripts/loop-status.test.js +749 -0
- package/resources/local/ecc/tests/scripts/manual-hook-install-docs.test.js +71 -0
- package/resources/local/ecc/tests/scripts/npm-publish-surface.test.js +188 -0
- package/resources/local/ecc/tests/scripts/observability-readiness.test.js +331 -0
- package/resources/local/ecc/tests/scripts/openclaw-persona-forge-gacha.test.js +92 -0
- package/resources/local/ecc/tests/scripts/operator-readiness-dashboard.test.js +640 -0
- package/resources/local/ecc/tests/scripts/orchestrate-codex-worker.test.js +63 -0
- package/resources/local/ecc/tests/scripts/orchestration-status.test.js +76 -0
- package/resources/local/ecc/tests/scripts/platform-audit.test.js +432 -0
- package/resources/local/ecc/tests/scripts/post-bash-command-log.test.js +105 -0
- package/resources/local/ecc/tests/scripts/preview-pack-smoke.test.js +260 -0
- package/resources/local/ecc/tests/scripts/release-publish.test.js +79 -0
- package/resources/local/ecc/tests/scripts/release.test.js +150 -0
- package/resources/local/ecc/tests/scripts/repair.test.js +326 -0
- package/resources/local/ecc/tests/scripts/session-inspect.test.js +300 -0
- package/resources/local/ecc/tests/scripts/setup-package-manager.test.js +397 -0
- package/resources/local/ecc/tests/scripts/skill-create-output.test.js +533 -0
- package/resources/local/ecc/tests/scripts/sync-ecc-to-codex.test.js +90 -0
- package/resources/local/ecc/tests/scripts/trae-install.test.js +179 -0
- package/resources/local/ecc/tests/scripts/uninstall.test.js +287 -0
- package/resources/local/ecc/tests/test_astraflow_provider.py +141 -0
- package/resources/local/ecc/tests/test_builder.py +84 -0
- package/resources/local/ecc/tests/test_claude_provider.py +111 -0
- package/resources/local/ecc/tests/test_executor.py +86 -0
- package/resources/local/ecc/tests/test_provider_tools.py +130 -0
- package/resources/local/ecc/tests/test_resolver.py +88 -0
- package/resources/local/ecc/tests/test_templates.py +71 -0
- package/resources/local/ecc/tests/test_types.py +150 -0
- package/resources/local/ecc/the-longform-guide.md +354 -0
- package/resources/local/ecc/the-security-guide.md +455 -0
- package/resources/local/ecc/the-shortform-guide.md +431 -0
- package/resources/local/ecc/yarn.lock +2259 -0
- package/resources/local/manifest.json +12 -0
- package/resources/local/page-agent/.agents/skills/git-cleanup/SKILL.md +64 -0
- package/resources/local/page-agent/.agents/skills/pre-impl-discussion/SKILL.md +104 -0
- package/resources/local/page-agent/.agents/skills/submit-pr-from-current-changes/SKILL.md +102 -0
- package/resources/local/page-agent/.agents/skills/update-changelog/SKILL.md +109 -0
- package/resources/local/page-agent/.github/ISSUE_TEMPLATE/bug_report.yml +59 -0
- package/resources/local/page-agent/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/resources/local/page-agent/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
- package/resources/local/page-agent/.github/PULL_REQUEST_TEMPLATE.md +24 -0
- package/resources/local/page-agent/.github/dependabot.yml +39 -0
- package/resources/local/page-agent/.github/workflows/ci.yml +33 -0
- package/resources/local/page-agent/.github/workflows/deploy-demo.yml +40 -0
- package/resources/local/page-agent/.github/workflows/release.yml +43 -0
- package/resources/local/page-agent/.prettierignore +8 -0
- package/resources/local/page-agent/.vscode/extensions.json +3 -0
- package/resources/local/page-agent/.vscode/settings.json +43 -0
- package/resources/local/page-agent/AGENTS.md +135 -0
- package/resources/local/page-agent/CLAUDE.md +1 -0
- package/resources/local/page-agent/CONTRIBUTING.md +47 -0
- package/resources/local/page-agent/LICENSE +22 -0
- package/resources/local/page-agent/README.md +121 -0
- package/resources/local/page-agent/WINTER.md +101 -0
- package/resources/local/page-agent/docs/CHANGELOG.md +250 -0
- package/resources/local/page-agent/docs/CODE_OF_CONDUCT.md +127 -0
- package/resources/local/page-agent/docs/README-zh.md +110 -0
- package/resources/local/page-agent/docs/SECURITY.md +50 -0
- package/resources/local/page-agent/docs/developer-guide.md +105 -0
- package/resources/local/page-agent/docs/terms-and-privacy.md +85 -0
- package/resources/local/page-agent/eslint.config.js +62 -0
- package/resources/local/page-agent/package-lock.json +11184 -0
- package/resources/local/page-agent/package.json +129 -0
- package/resources/local/page-agent/packages/core/package.json +66 -0
- package/resources/local/page-agent/packages/core/src/PageAgentCore.ts +641 -0
- package/resources/local/page-agent/packages/core/src/env.d.ts +6 -0
- package/resources/local/page-agent/packages/core/src/prompts/system_prompt.md +153 -0
- package/resources/local/page-agent/packages/core/src/tools/index.ts +190 -0
- package/resources/local/page-agent/packages/core/src/types.ts +289 -0
- package/resources/local/page-agent/packages/core/src/utils/autoFixer.ts +216 -0
- package/resources/local/page-agent/packages/core/src/utils/index.ts +111 -0
- package/resources/local/page-agent/packages/core/tsconfig.json +8 -0
- package/resources/local/page-agent/packages/core/vite.config.js +50 -0
- package/resources/local/page-agent/packages/extension/PRIVACY.md +5 -0
- package/resources/local/page-agent/packages/extension/components.json +24 -0
- package/resources/local/page-agent/packages/extension/docs/extension_api.md +224 -0
- package/resources/local/page-agent/packages/extension/package.json +51 -0
- package/resources/local/page-agent/packages/extension/public/_locales/en/messages.json +11 -0
- package/resources/local/page-agent/packages/extension/public/_locales/zh_CN/messages.json +11 -0
- package/resources/local/page-agent/packages/extension/public/assets/page-agent-256.webp +0 -0
- package/resources/local/page-agent/packages/extension/public/assets/page-agent-64.png +0 -0
- package/resources/local/page-agent/packages/extension/src/agent/MultiPageAgent.ts +102 -0
- package/resources/local/page-agent/packages/extension/src/agent/RemotePageController.background.ts +42 -0
- package/resources/local/page-agent/packages/extension/src/agent/RemotePageController.content.ts +135 -0
- package/resources/local/page-agent/packages/extension/src/agent/RemotePageController.ts +194 -0
- package/resources/local/page-agent/packages/extension/src/agent/TabsController.background.ts +169 -0
- package/resources/local/page-agent/packages/extension/src/agent/TabsController.ts +421 -0
- package/resources/local/page-agent/packages/extension/src/agent/constants.ts +30 -0
- package/resources/local/page-agent/packages/extension/src/agent/system_prompt.md +145 -0
- package/resources/local/page-agent/packages/extension/src/agent/tabTools.ts +74 -0
- package/resources/local/page-agent/packages/extension/src/agent/useAgent.ts +161 -0
- package/resources/local/page-agent/packages/extension/src/assets/index.css +158 -0
- package/resources/local/page-agent/packages/extension/src/assets/page-agent-64.png +0 -0
- package/resources/local/page-agent/packages/extension/src/components/ConfigPanel.tsx +402 -0
- package/resources/local/page-agent/packages/extension/src/components/ErrorBoundary.tsx +60 -0
- package/resources/local/page-agent/packages/extension/src/components/HistoryDetail.tsx +79 -0
- package/resources/local/page-agent/packages/extension/src/components/HistoryList.tsx +181 -0
- package/resources/local/page-agent/packages/extension/src/components/cards.tsx +387 -0
- package/resources/local/page-agent/packages/extension/src/components/misc.tsx +153 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/button.tsx +60 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/card.tsx +75 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/field.tsx +232 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/hover-card.tsx +36 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/input-group.tsx +157 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/input.tsx +21 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/item.tsx +172 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/label.tsx +19 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/separator.tsx +26 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/sonner.tsx +38 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/spinner.tsx +16 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/switch.tsx +26 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/textarea.tsx +18 -0
- package/resources/local/page-agent/packages/extension/src/components/ui/typing-animation.tsx +164 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/background.ts +63 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/content.ts +164 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/hub/App.tsx +250 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/hub/hub-ws.ts +243 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/hub/index.html +13 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/hub/main.tsx +25 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/main-world.ts +131 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/sidepanel/App.tsx +235 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/sidepanel/index.html +13 -0
- package/resources/local/page-agent/packages/extension/src/entrypoints/sidepanel/main.tsx +26 -0
- package/resources/local/page-agent/packages/extension/src/lib/db.ts +70 -0
- package/resources/local/page-agent/packages/extension/src/lib/history-export.ts +60 -0
- package/resources/local/page-agent/packages/extension/src/lib/utils.ts +6 -0
- package/resources/local/page-agent/packages/extension/src/types/assets.d.ts +25 -0
- package/resources/local/page-agent/packages/extension/src/types/globals.d.ts +1 -0
- package/resources/local/page-agent/packages/extension/src/types/markdown.d.ts +4 -0
- package/resources/local/page-agent/packages/extension/tsconfig.json +13 -0
- package/resources/local/page-agent/packages/extension/wxt.config.js +69 -0
- package/resources/local/page-agent/packages/llms/package.json +58 -0
- package/resources/local/page-agent/packages/llms/src/OpenAIClient.ts +242 -0
- package/resources/local/page-agent/packages/llms/src/constants.ts +3 -0
- package/resources/local/page-agent/packages/llms/src/errors.ts +58 -0
- package/resources/local/page-agent/packages/llms/src/index.ts +114 -0
- package/resources/local/page-agent/packages/llms/src/types.ts +120 -0
- package/resources/local/page-agent/packages/llms/src/utils.ts +152 -0
- package/resources/local/page-agent/packages/llms/tsconfig.json +8 -0
- package/resources/local/page-agent/packages/llms/vite.config.js +43 -0
- package/resources/local/page-agent/packages/mcp/README.md +93 -0
- package/resources/local/page-agent/packages/mcp/package.json +35 -0
- package/resources/local/page-agent/packages/mcp/src/hub-bridge.js +139 -0
- package/resources/local/page-agent/packages/mcp/src/index.js +100 -0
- package/resources/local/page-agent/packages/mcp/src/launcher.html +245 -0
- package/resources/local/page-agent/packages/page-agent/package.json +69 -0
- package/resources/local/page-agent/packages/page-agent/src/PageAgent.ts +29 -0
- package/resources/local/page-agent/packages/page-agent/src/demo.ts +55 -0
- package/resources/local/page-agent/packages/page-agent/src/env.d.ts +9 -0
- package/resources/local/page-agent/packages/page-agent/tsconfig.json +8 -0
- package/resources/local/page-agent/packages/page-agent/vite.config.js +50 -0
- package/resources/local/page-agent/packages/page-agent/vite.iife.config.js +49 -0
- package/resources/local/page-agent/packages/page-controller/package.json +51 -0
- package/resources/local/page-agent/packages/page-controller/src/PageController.ts +433 -0
- package/resources/local/page-agent/packages/page-controller/src/actions.ts +552 -0
- package/resources/local/page-agent/packages/page-controller/src/dom/dom_tree/index.d.ts +16 -0
- package/resources/local/page-agent/packages/page-controller/src/dom/dom_tree/index.js +1753 -0
- package/resources/local/page-agent/packages/page-controller/src/dom/dom_tree/type.ts +51 -0
- package/resources/local/page-agent/packages/page-controller/src/dom/getPageInfo.ts +42 -0
- package/resources/local/page-agent/packages/page-controller/src/dom/index.ts +569 -0
- package/resources/local/page-agent/packages/page-controller/src/env.d.ts +6 -0
- package/resources/local/page-agent/packages/page-controller/src/mask/SimulatorMask.module.css +13 -0
- package/resources/local/page-agent/packages/page-controller/src/mask/SimulatorMask.ts +217 -0
- package/resources/local/page-agent/packages/page-controller/src/mask/checkDarkMode.ts +115 -0
- package/resources/local/page-agent/packages/page-controller/src/mask/cursor-border.svg +3 -0
- package/resources/local/page-agent/packages/page-controller/src/mask/cursor-fill.svg +5 -0
- package/resources/local/page-agent/packages/page-controller/src/mask/cursor.module.css +70 -0
- package/resources/local/page-agent/packages/page-controller/src/patches/antd.ts +20 -0
- package/resources/local/page-agent/packages/page-controller/src/patches/react.ts +16 -0
- package/resources/local/page-agent/packages/page-controller/src/utils/index.ts +80 -0
- package/resources/local/page-agent/packages/page-controller/tsconfig.json +8 -0
- package/resources/local/page-agent/packages/page-controller/vite.config.js +50 -0
- package/resources/local/page-agent/packages/ui/package.json +48 -0
- package/resources/local/page-agent/packages/ui/src/env.d.ts +6 -0
- package/resources/local/page-agent/packages/ui/src/i18n/index.ts +50 -0
- package/resources/local/page-agent/packages/ui/src/i18n/locales.ts +122 -0
- package/resources/local/page-agent/packages/ui/src/index.ts +2 -0
- package/resources/local/page-agent/packages/ui/src/motion-css/createMotion.ts +64 -0
- package/resources/local/page-agent/packages/ui/src/motion-css/motion.module.css +397 -0
- package/resources/local/page-agent/packages/ui/src/motion-css/readme +5 -0
- package/resources/local/page-agent/packages/ui/src/panel/Panel.module.css +601 -0
- package/resources/local/page-agent/packages/ui/src/panel/Panel.ts +669 -0
- package/resources/local/page-agent/packages/ui/src/panel/cards.ts +52 -0
- package/resources/local/page-agent/packages/ui/src/panel/types.ts +76 -0
- package/resources/local/page-agent/packages/ui/src/utils.ts +18 -0
- package/resources/local/page-agent/packages/ui/tsconfig.json +8 -0
- package/resources/local/page-agent/packages/ui/vite.config.js +46 -0
- package/resources/local/page-agent/packages/website/AGENTS.md +127 -0
- package/resources/local/page-agent/packages/website/components.json +24 -0
- package/resources/local/page-agent/packages/website/index.html +95 -0
- package/resources/local/page-agent/packages/website/package.json +34 -0
- package/resources/local/page-agent/packages/website/public/robots.txt +4 -0
- package/resources/local/page-agent/packages/website/src/components/APIReference.tsx +175 -0
- package/resources/local/page-agent/packages/website/src/components/BetaNotice.tsx +25 -0
- package/resources/local/page-agent/packages/website/src/components/CodeEditor.tsx +129 -0
- package/resources/local/page-agent/packages/website/src/components/Footer.tsx +77 -0
- package/resources/local/page-agent/packages/website/src/components/Header.tsx +188 -0
- package/resources/local/page-agent/packages/website/src/components/Heading.tsx +46 -0
- package/resources/local/page-agent/packages/website/src/components/HighlightSyntax.module.css +128 -0
- package/resources/local/page-agent/packages/website/src/components/HighlightSyntax.tsx +175 -0
- package/resources/local/page-agent/packages/website/src/components/JSConsole.module.css +164 -0
- package/resources/local/page-agent/packages/website/src/components/JSConsole.tsx +371 -0
- package/resources/local/page-agent/packages/website/src/components/LanguageSwitcher.tsx +114 -0
- package/resources/local/page-agent/packages/website/src/components/ThemeSwitcher.tsx +134 -0
- package/resources/local/page-agent/packages/website/src/components/ui/alert.tsx +60 -0
- package/resources/local/page-agent/packages/website/src/components/ui/animated-gradient-text.tsx +37 -0
- package/resources/local/page-agent/packages/website/src/components/ui/animated-shiny-text.tsx +38 -0
- package/resources/local/page-agent/packages/website/src/components/ui/aurora-text.tsx +39 -0
- package/resources/local/page-agent/packages/website/src/components/ui/badge.tsx +37 -0
- package/resources/local/page-agent/packages/website/src/components/ui/bento-grid.tsx +91 -0
- package/resources/local/page-agent/packages/website/src/components/ui/blur-fade.tsx +79 -0
- package/resources/local/page-agent/packages/website/src/components/ui/button.tsx +60 -0
- package/resources/local/page-agent/packages/website/src/components/ui/highlighter.tsx +92 -0
- package/resources/local/page-agent/packages/website/src/components/ui/hyper-text.tsx +140 -0
- package/resources/local/page-agent/packages/website/src/components/ui/kbd.tsx +28 -0
- package/resources/local/page-agent/packages/website/src/components/ui/magic-card.tsx +101 -0
- package/resources/local/page-agent/packages/website/src/components/ui/marquee.tsx +74 -0
- package/resources/local/page-agent/packages/website/src/components/ui/neon-gradient-card.tsx +136 -0
- package/resources/local/page-agent/packages/website/src/components/ui/particles.tsx +297 -0
- package/resources/local/page-agent/packages/website/src/components/ui/separator.tsx +26 -0
- package/resources/local/page-agent/packages/website/src/components/ui/sonner.tsx +38 -0
- package/resources/local/page-agent/packages/website/src/components/ui/sparkles-text.tsx +150 -0
- package/resources/local/page-agent/packages/website/src/components/ui/spinner.tsx +16 -0
- package/resources/local/page-agent/packages/website/src/components/ui/switch.tsx +26 -0
- package/resources/local/page-agent/packages/website/src/components/ui/text-animate.tsx +417 -0
- package/resources/local/page-agent/packages/website/src/components/ui/tooltip.tsx +55 -0
- package/resources/local/page-agent/packages/website/src/components/ui/typing-animation.tsx +164 -0
- package/resources/local/page-agent/packages/website/src/constants.ts +10 -0
- package/resources/local/page-agent/packages/website/src/env.d.ts +10 -0
- package/resources/local/page-agent/packages/website/src/hooks/useGitHubStars.ts +27 -0
- package/resources/local/page-agent/packages/website/src/i18n/context.tsx +34 -0
- package/resources/local/page-agent/packages/website/src/index.css +471 -0
- package/resources/local/page-agent/packages/website/src/lib/useDocumentTitle.ts +9 -0
- package/resources/local/page-agent/packages/website/src/lib/utils.ts +6 -0
- package/resources/local/page-agent/packages/website/src/main.tsx +22 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/Layout.tsx +140 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/advanced/custom-ui/page.tsx +271 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/advanced/page-agent/page.tsx +224 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/advanced/page-agent-core/page.tsx +492 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/advanced/page-controller/page.tsx +294 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/advanced/security-permissions/page.tsx +89 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/chrome-extension/page.tsx +314 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/custom-instructions/page.tsx +136 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/custom-tools/page.tsx +112 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/data-masking/page.tsx +74 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/mcp-server/page.tsx +70 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/models/page.tsx +457 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/features/third-party-agent/page.tsx +99 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/index.tsx +130 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/introduction/limitations/page.tsx +158 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/introduction/overview/page.tsx +233 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/introduction/quick-start/page.tsx +134 -0
- package/resources/local/page-agent/packages/website/src/pages/docs/introduction/troubleshooting/page.tsx +430 -0
- package/resources/local/page-agent/packages/website/src/pages/home/FeaturesSection.tsx +233 -0
- package/resources/local/page-agent/packages/website/src/pages/home/HeroSection.tsx +417 -0
- package/resources/local/page-agent/packages/website/src/pages/home/OneMoreThingSection.tsx +114 -0
- package/resources/local/page-agent/packages/website/src/pages/home/ScenariosSection.tsx +165 -0
- package/resources/local/page-agent/packages/website/src/pages/home/index.tsx +31 -0
- package/resources/local/page-agent/packages/website/src/router.tsx +72 -0
- package/resources/local/page-agent/packages/website/tailwind.config.js +3 -0
- package/resources/local/page-agent/packages/website/tsconfig.json +11 -0
- package/resources/local/page-agent/packages/website/vite.config.js +106 -0
- package/resources/local/page-agent/scripts/build-libs.js +25 -0
- package/resources/local/page-agent/scripts/build.js +45 -0
- package/resources/local/page-agent/scripts/ci.js +55 -0
- package/resources/local/page-agent/scripts/parallel-task.js +115 -0
- package/resources/local/page-agent/scripts/post-publish.js +30 -0
- package/resources/local/page-agent/scripts/pre-publish.js +42 -0
- package/resources/local/page-agent/scripts/sync-version.js +144 -0
- package/resources/local/page-agent/tsconfig.base.json +30 -0
- package/resources/local/page-agent/tsconfig.typecheck.json +25 -0
- package/scripts/audit-pack.js +47 -0
- package/src/agent/agent-definitions.js +154 -0
- package/src/agent/runtime.js +240 -0
- package/src/ai/capability-scorecard.js +241 -0
- package/src/ai/orchestrator.js +478 -0
- package/src/ai/profile-blueprints.js +135 -0
- package/src/ai/prompts/system-prompt.js +14 -4
- package/src/ai/providers.js +73 -0
- package/src/ai/small-model-amplifier.js +37 -0
- package/src/ai/workflow-selector.js +154 -0
- package/src/cli/at-context.js +269 -0
- package/src/cli/commands.js +663 -0
- package/src/cli/composer.js +361 -0
- package/src/cli/config.js +12 -1
- package/src/cli/context-loader.js +20 -3
- package/src/cli/conversation-format.js +11 -210
- package/src/cli/diagnostics.js +101 -0
- package/src/cli/diff-view.js +341 -0
- package/src/cli/ecc.js +274 -0
- package/src/cli/input-controller.js +263 -0
- package/src/cli/project-docs.js +2 -0
- package/src/cli/prompt-builder.js +58 -13
- package/src/cli/repl-commands.js +358 -10
- package/src/cli/repl.js +1120 -389
- package/src/cli/slash-commands.js +22 -1
- package/src/cli/snowflake-logo.js +20 -10
- package/src/cli/terminal-ui.js +92 -40
- package/src/cli/tool-call-adapter.js +327 -0
- package/src/cli/tool-runtime.js +115 -0
- package/src/codebase-index/indexer.js +402 -0
- package/src/codebase-index/search.js +176 -0
- package/src/codebase-index/watcher.js +117 -0
- package/src/context/token-juice.js +166 -0
- package/src/context/wiki-memory.js +212 -0
- package/src/integrations/htmlfx-manager.js +111 -0
- package/src/mcp/inline-complete.js +226 -0
- package/src/tools/executor.js +188 -1
|
@@ -0,0 +1,2650 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for scripts/lib/session-manager.js
|
|
3
|
+
*
|
|
4
|
+
* Run with: node tests/lib/session-manager.test.js
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const assert = require('assert');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const os = require('os');
|
|
11
|
+
|
|
12
|
+
const sessionManager = require('../../scripts/lib/session-manager');
|
|
13
|
+
|
|
14
|
+
// Test helper
|
|
15
|
+
function test(name, fn) {
|
|
16
|
+
try {
|
|
17
|
+
fn();
|
|
18
|
+
console.log(` \u2713 ${name}`);
|
|
19
|
+
return true;
|
|
20
|
+
} catch (err) {
|
|
21
|
+
console.log(` \u2717 ${name}`);
|
|
22
|
+
console.log(` Error: ${err.message}`);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Create a temp directory for session tests
|
|
28
|
+
function createTempSessionDir() {
|
|
29
|
+
const dir = path.join(os.tmpdir(), `ecc-test-sessions-${Date.now()}`);
|
|
30
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
31
|
+
return dir;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function cleanup(dir) {
|
|
35
|
+
try {
|
|
36
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
37
|
+
} catch {
|
|
38
|
+
// best-effort cleanup
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function runTests() {
|
|
43
|
+
console.log('\n=== Testing session-manager.js ===\n');
|
|
44
|
+
|
|
45
|
+
let passed = 0;
|
|
46
|
+
let failed = 0;
|
|
47
|
+
|
|
48
|
+
// parseSessionFilename tests
|
|
49
|
+
console.log('parseSessionFilename:');
|
|
50
|
+
|
|
51
|
+
if (test('parses new format with short ID', () => {
|
|
52
|
+
const result = sessionManager.parseSessionFilename('2026-02-01-a1b2c3d4-session.tmp');
|
|
53
|
+
assert.ok(result);
|
|
54
|
+
assert.strictEqual(result.shortId, 'a1b2c3d4');
|
|
55
|
+
assert.strictEqual(result.date, '2026-02-01');
|
|
56
|
+
assert.strictEqual(result.filename, '2026-02-01-a1b2c3d4-session.tmp');
|
|
57
|
+
})) passed++; else failed++;
|
|
58
|
+
|
|
59
|
+
if (test('parses old format without short ID', () => {
|
|
60
|
+
const result = sessionManager.parseSessionFilename('2026-01-17-session.tmp');
|
|
61
|
+
assert.ok(result);
|
|
62
|
+
assert.strictEqual(result.shortId, 'no-id');
|
|
63
|
+
assert.strictEqual(result.date, '2026-01-17');
|
|
64
|
+
})) passed++; else failed++;
|
|
65
|
+
|
|
66
|
+
if (test('returns null for invalid filename', () => {
|
|
67
|
+
assert.strictEqual(sessionManager.parseSessionFilename('not-a-session.txt'), null);
|
|
68
|
+
assert.strictEqual(sessionManager.parseSessionFilename(''), null);
|
|
69
|
+
assert.strictEqual(sessionManager.parseSessionFilename('random.tmp'), null);
|
|
70
|
+
})) passed++; else failed++;
|
|
71
|
+
|
|
72
|
+
if (test('returns null for malformed date', () => {
|
|
73
|
+
assert.strictEqual(sessionManager.parseSessionFilename('20260-01-17-session.tmp'), null);
|
|
74
|
+
assert.strictEqual(sessionManager.parseSessionFilename('26-01-17-session.tmp'), null);
|
|
75
|
+
})) passed++; else failed++;
|
|
76
|
+
|
|
77
|
+
if (test('parses long short IDs (8+ chars)', () => {
|
|
78
|
+
const result = sessionManager.parseSessionFilename('2026-02-01-abcdef12345678-session.tmp');
|
|
79
|
+
assert.ok(result);
|
|
80
|
+
assert.strictEqual(result.shortId, 'abcdef12345678');
|
|
81
|
+
})) passed++; else failed++;
|
|
82
|
+
|
|
83
|
+
if (test('accepts short IDs under 8 chars', () => {
|
|
84
|
+
const result = sessionManager.parseSessionFilename('2026-02-01-abc-session.tmp');
|
|
85
|
+
assert.ok(result);
|
|
86
|
+
assert.strictEqual(result.shortId, 'abc');
|
|
87
|
+
})) passed++; else failed++;
|
|
88
|
+
|
|
89
|
+
// parseSessionMetadata tests
|
|
90
|
+
console.log('\nparseSessionMetadata:');
|
|
91
|
+
|
|
92
|
+
if (test('parses full session content', () => {
|
|
93
|
+
const content = `# My Session Title
|
|
94
|
+
|
|
95
|
+
**Date:** 2026-02-01
|
|
96
|
+
**Started:** 10:30
|
|
97
|
+
**Last Updated:** 14:45
|
|
98
|
+
**Project:** everything-claude-code
|
|
99
|
+
**Branch:** feature/session-metadata
|
|
100
|
+
**Worktree:** /tmp/ecc-worktree
|
|
101
|
+
|
|
102
|
+
### Completed
|
|
103
|
+
- [x] Set up project
|
|
104
|
+
- [x] Write tests
|
|
105
|
+
|
|
106
|
+
### In Progress
|
|
107
|
+
- [ ] Fix bug
|
|
108
|
+
|
|
109
|
+
### Notes for Next Session
|
|
110
|
+
Remember to check the logs
|
|
111
|
+
|
|
112
|
+
### Context to Load
|
|
113
|
+
\`\`\`
|
|
114
|
+
src/main.ts
|
|
115
|
+
\`\`\``;
|
|
116
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
117
|
+
assert.strictEqual(meta.title, 'My Session Title');
|
|
118
|
+
assert.strictEqual(meta.date, '2026-02-01');
|
|
119
|
+
assert.strictEqual(meta.started, '10:30');
|
|
120
|
+
assert.strictEqual(meta.lastUpdated, '14:45');
|
|
121
|
+
assert.strictEqual(meta.project, 'everything-claude-code');
|
|
122
|
+
assert.strictEqual(meta.branch, 'feature/session-metadata');
|
|
123
|
+
assert.strictEqual(meta.worktree, '/tmp/ecc-worktree');
|
|
124
|
+
assert.strictEqual(meta.completed.length, 2);
|
|
125
|
+
assert.strictEqual(meta.completed[0], 'Set up project');
|
|
126
|
+
assert.strictEqual(meta.inProgress.length, 1);
|
|
127
|
+
assert.strictEqual(meta.inProgress[0], 'Fix bug');
|
|
128
|
+
assert.strictEqual(meta.notes, 'Remember to check the logs');
|
|
129
|
+
assert.strictEqual(meta.context, 'src/main.ts');
|
|
130
|
+
})) passed++; else failed++;
|
|
131
|
+
|
|
132
|
+
if (test('handles null/undefined/empty content', () => {
|
|
133
|
+
const meta1 = sessionManager.parseSessionMetadata(null);
|
|
134
|
+
assert.strictEqual(meta1.title, null);
|
|
135
|
+
assert.deepStrictEqual(meta1.completed, []);
|
|
136
|
+
|
|
137
|
+
const meta2 = sessionManager.parseSessionMetadata(undefined);
|
|
138
|
+
assert.strictEqual(meta2.title, null);
|
|
139
|
+
|
|
140
|
+
const meta3 = sessionManager.parseSessionMetadata('');
|
|
141
|
+
assert.strictEqual(meta3.title, null);
|
|
142
|
+
})) passed++; else failed++;
|
|
143
|
+
|
|
144
|
+
if (test('handles content with no sections', () => {
|
|
145
|
+
const meta = sessionManager.parseSessionMetadata('Just some text');
|
|
146
|
+
assert.strictEqual(meta.title, null);
|
|
147
|
+
assert.deepStrictEqual(meta.completed, []);
|
|
148
|
+
assert.deepStrictEqual(meta.inProgress, []);
|
|
149
|
+
})) passed++; else failed++;
|
|
150
|
+
|
|
151
|
+
// getSessionStats tests
|
|
152
|
+
console.log('\ngetSessionStats:');
|
|
153
|
+
|
|
154
|
+
if (test('calculates stats from content string', () => {
|
|
155
|
+
const content = `# Test Session
|
|
156
|
+
|
|
157
|
+
### Completed
|
|
158
|
+
- [x] Task 1
|
|
159
|
+
- [x] Task 2
|
|
160
|
+
|
|
161
|
+
### In Progress
|
|
162
|
+
- [ ] Task 3
|
|
163
|
+
`;
|
|
164
|
+
const stats = sessionManager.getSessionStats(content);
|
|
165
|
+
assert.strictEqual(stats.totalItems, 3);
|
|
166
|
+
assert.strictEqual(stats.completedItems, 2);
|
|
167
|
+
assert.strictEqual(stats.inProgressItems, 1);
|
|
168
|
+
assert.ok(stats.lineCount > 0);
|
|
169
|
+
})) passed++; else failed++;
|
|
170
|
+
|
|
171
|
+
if (test('handles empty content', () => {
|
|
172
|
+
const stats = sessionManager.getSessionStats('');
|
|
173
|
+
assert.strictEqual(stats.totalItems, 0);
|
|
174
|
+
assert.strictEqual(stats.completedItems, 0);
|
|
175
|
+
assert.strictEqual(stats.lineCount, 0);
|
|
176
|
+
})) passed++; else failed++;
|
|
177
|
+
|
|
178
|
+
if (test('does not treat non-absolute path as file path', () => {
|
|
179
|
+
// This tests the bug fix: content that ends with .tmp but is not a path
|
|
180
|
+
const stats = sessionManager.getSessionStats('Some content ending with test.tmp');
|
|
181
|
+
assert.strictEqual(stats.totalItems, 0);
|
|
182
|
+
assert.strictEqual(stats.lineCount, 1);
|
|
183
|
+
})) passed++; else failed++;
|
|
184
|
+
|
|
185
|
+
// File I/O tests
|
|
186
|
+
console.log('\nSession CRUD:');
|
|
187
|
+
|
|
188
|
+
if (test('writeSessionContent and getSessionContent round-trip', () => {
|
|
189
|
+
const dir = createTempSessionDir();
|
|
190
|
+
try {
|
|
191
|
+
const sessionPath = path.join(dir, '2026-02-01-testid01-session.tmp');
|
|
192
|
+
const content = '# Test Session\n\nHello world';
|
|
193
|
+
|
|
194
|
+
const writeResult = sessionManager.writeSessionContent(sessionPath, content);
|
|
195
|
+
assert.strictEqual(writeResult, true);
|
|
196
|
+
|
|
197
|
+
const readContent = sessionManager.getSessionContent(sessionPath);
|
|
198
|
+
assert.strictEqual(readContent, content);
|
|
199
|
+
} finally {
|
|
200
|
+
cleanup(dir);
|
|
201
|
+
}
|
|
202
|
+
})) passed++; else failed++;
|
|
203
|
+
|
|
204
|
+
if (test('appendSessionContent appends to existing', () => {
|
|
205
|
+
const dir = createTempSessionDir();
|
|
206
|
+
try {
|
|
207
|
+
const sessionPath = path.join(dir, '2026-02-01-testid02-session.tmp');
|
|
208
|
+
sessionManager.writeSessionContent(sessionPath, 'Line 1\n');
|
|
209
|
+
sessionManager.appendSessionContent(sessionPath, 'Line 2\n');
|
|
210
|
+
|
|
211
|
+
const content = sessionManager.getSessionContent(sessionPath);
|
|
212
|
+
assert.ok(content.includes('Line 1'));
|
|
213
|
+
assert.ok(content.includes('Line 2'));
|
|
214
|
+
} finally {
|
|
215
|
+
cleanup(dir);
|
|
216
|
+
}
|
|
217
|
+
})) passed++; else failed++;
|
|
218
|
+
|
|
219
|
+
if (test('writeSessionContent returns false for invalid path', () => {
|
|
220
|
+
const result = sessionManager.writeSessionContent('/nonexistent/deep/path/session.tmp', 'content');
|
|
221
|
+
assert.strictEqual(result, false);
|
|
222
|
+
})) passed++; else failed++;
|
|
223
|
+
|
|
224
|
+
if (test('getSessionContent returns null for non-existent file', () => {
|
|
225
|
+
const result = sessionManager.getSessionContent('/nonexistent/session.tmp');
|
|
226
|
+
assert.strictEqual(result, null);
|
|
227
|
+
})) passed++; else failed++;
|
|
228
|
+
|
|
229
|
+
if (test('deleteSession removes file', () => {
|
|
230
|
+
const dir = createTempSessionDir();
|
|
231
|
+
try {
|
|
232
|
+
const sessionPath = path.join(dir, 'test-session.tmp');
|
|
233
|
+
fs.writeFileSync(sessionPath, 'content');
|
|
234
|
+
assert.strictEqual(fs.existsSync(sessionPath), true);
|
|
235
|
+
|
|
236
|
+
const result = sessionManager.deleteSession(sessionPath);
|
|
237
|
+
assert.strictEqual(result, true);
|
|
238
|
+
assert.strictEqual(fs.existsSync(sessionPath), false);
|
|
239
|
+
} finally {
|
|
240
|
+
cleanup(dir);
|
|
241
|
+
}
|
|
242
|
+
})) passed++; else failed++;
|
|
243
|
+
|
|
244
|
+
if (test('deleteSession returns false for non-existent file', () => {
|
|
245
|
+
const result = sessionManager.deleteSession('/nonexistent/session.tmp');
|
|
246
|
+
assert.strictEqual(result, false);
|
|
247
|
+
})) passed++; else failed++;
|
|
248
|
+
|
|
249
|
+
if (test('sessionExists returns true for existing file', () => {
|
|
250
|
+
const dir = createTempSessionDir();
|
|
251
|
+
try {
|
|
252
|
+
const sessionPath = path.join(dir, 'test.tmp');
|
|
253
|
+
fs.writeFileSync(sessionPath, 'content');
|
|
254
|
+
assert.strictEqual(sessionManager.sessionExists(sessionPath), true);
|
|
255
|
+
} finally {
|
|
256
|
+
cleanup(dir);
|
|
257
|
+
}
|
|
258
|
+
})) passed++; else failed++;
|
|
259
|
+
|
|
260
|
+
if (test('sessionExists returns false for non-existent file', () => {
|
|
261
|
+
assert.strictEqual(sessionManager.sessionExists('/nonexistent/path.tmp'), false);
|
|
262
|
+
})) passed++; else failed++;
|
|
263
|
+
|
|
264
|
+
if (test('sessionExists returns false for directory', () => {
|
|
265
|
+
const dir = createTempSessionDir();
|
|
266
|
+
try {
|
|
267
|
+
assert.strictEqual(sessionManager.sessionExists(dir), false);
|
|
268
|
+
} finally {
|
|
269
|
+
cleanup(dir);
|
|
270
|
+
}
|
|
271
|
+
})) passed++; else failed++;
|
|
272
|
+
|
|
273
|
+
// getSessionSize tests
|
|
274
|
+
console.log('\ngetSessionSize:');
|
|
275
|
+
|
|
276
|
+
if (test('returns human-readable size for existing file', () => {
|
|
277
|
+
const dir = createTempSessionDir();
|
|
278
|
+
try {
|
|
279
|
+
const sessionPath = path.join(dir, 'sized.tmp');
|
|
280
|
+
fs.writeFileSync(sessionPath, 'x'.repeat(2048));
|
|
281
|
+
const size = sessionManager.getSessionSize(sessionPath);
|
|
282
|
+
assert.ok(size.includes('KB'), `Expected KB, got: ${size}`);
|
|
283
|
+
} finally {
|
|
284
|
+
cleanup(dir);
|
|
285
|
+
}
|
|
286
|
+
})) passed++; else failed++;
|
|
287
|
+
|
|
288
|
+
if (test('returns "0 B" for non-existent file', () => {
|
|
289
|
+
const size = sessionManager.getSessionSize('/nonexistent/file.tmp');
|
|
290
|
+
assert.strictEqual(size, '0 B');
|
|
291
|
+
})) passed++; else failed++;
|
|
292
|
+
|
|
293
|
+
if (test('returns bytes for small file', () => {
|
|
294
|
+
const dir = createTempSessionDir();
|
|
295
|
+
try {
|
|
296
|
+
const sessionPath = path.join(dir, 'small.tmp');
|
|
297
|
+
fs.writeFileSync(sessionPath, 'hi');
|
|
298
|
+
const size = sessionManager.getSessionSize(sessionPath);
|
|
299
|
+
assert.ok(size.includes('B'));
|
|
300
|
+
assert.ok(!size.includes('KB'));
|
|
301
|
+
} finally {
|
|
302
|
+
cleanup(dir);
|
|
303
|
+
}
|
|
304
|
+
})) passed++; else failed++;
|
|
305
|
+
|
|
306
|
+
// getSessionTitle tests
|
|
307
|
+
console.log('\ngetSessionTitle:');
|
|
308
|
+
|
|
309
|
+
if (test('extracts title from session file', () => {
|
|
310
|
+
const dir = createTempSessionDir();
|
|
311
|
+
try {
|
|
312
|
+
const sessionPath = path.join(dir, 'titled.tmp');
|
|
313
|
+
fs.writeFileSync(sessionPath, '# My Great Session\n\nSome content');
|
|
314
|
+
const title = sessionManager.getSessionTitle(sessionPath);
|
|
315
|
+
assert.strictEqual(title, 'My Great Session');
|
|
316
|
+
} finally {
|
|
317
|
+
cleanup(dir);
|
|
318
|
+
}
|
|
319
|
+
})) passed++; else failed++;
|
|
320
|
+
|
|
321
|
+
if (test('returns "Untitled Session" for empty content', () => {
|
|
322
|
+
const dir = createTempSessionDir();
|
|
323
|
+
try {
|
|
324
|
+
const sessionPath = path.join(dir, 'empty.tmp');
|
|
325
|
+
fs.writeFileSync(sessionPath, '');
|
|
326
|
+
const title = sessionManager.getSessionTitle(sessionPath);
|
|
327
|
+
assert.strictEqual(title, 'Untitled Session');
|
|
328
|
+
} finally {
|
|
329
|
+
cleanup(dir);
|
|
330
|
+
}
|
|
331
|
+
})) passed++; else failed++;
|
|
332
|
+
|
|
333
|
+
if (test('returns "Untitled Session" for non-existent file', () => {
|
|
334
|
+
const title = sessionManager.getSessionTitle('/nonexistent/file.tmp');
|
|
335
|
+
assert.strictEqual(title, 'Untitled Session');
|
|
336
|
+
})) passed++; else failed++;
|
|
337
|
+
|
|
338
|
+
// getAllSessions tests
|
|
339
|
+
console.log('\ngetAllSessions:');
|
|
340
|
+
|
|
341
|
+
// Override HOME to a temp dir for isolated getAllSessions/getSessionById tests
|
|
342
|
+
// On Windows, os.homedir() uses USERPROFILE, not HOME — set both for cross-platform
|
|
343
|
+
const tmpHome = path.join(os.tmpdir(), `ecc-session-mgr-test-${Date.now()}`);
|
|
344
|
+
const tmpCanonicalSessionsDir = path.join(tmpHome, '.claude', 'session-data');
|
|
345
|
+
const tmpLegacySessionsDir = path.join(tmpHome, '.claude', 'sessions');
|
|
346
|
+
fs.mkdirSync(tmpCanonicalSessionsDir, { recursive: true });
|
|
347
|
+
fs.mkdirSync(tmpLegacySessionsDir, { recursive: true });
|
|
348
|
+
const origHome = process.env.HOME;
|
|
349
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
350
|
+
|
|
351
|
+
// Create test session files with controlled modification times
|
|
352
|
+
const testSessions = [
|
|
353
|
+
{ name: '2026-01-15-abcd1234-session.tmp', content: '# Session 1' },
|
|
354
|
+
{ name: '2026-01-20-efgh5678-session.tmp', content: '# Session 2' },
|
|
355
|
+
{ name: '2026-02-01-ijkl9012-session.tmp', content: '# Session 3' },
|
|
356
|
+
{ name: '2026-02-01-mnop3456-session.tmp', content: '# Session 4' },
|
|
357
|
+
{ name: '2026-02-10-session.tmp', content: '# Old format session' },
|
|
358
|
+
];
|
|
359
|
+
for (let i = 0; i < testSessions.length; i++) {
|
|
360
|
+
const targetDir = testSessions[i].name === '2026-02-10-session.tmp'
|
|
361
|
+
? tmpLegacySessionsDir
|
|
362
|
+
: tmpCanonicalSessionsDir;
|
|
363
|
+
const filePath = path.join(targetDir, testSessions[i].name);
|
|
364
|
+
fs.writeFileSync(filePath, testSessions[i].content);
|
|
365
|
+
// Stagger modification times so sort order is deterministic
|
|
366
|
+
const mtime = new Date(Date.now() - (testSessions.length - i) * 60000);
|
|
367
|
+
fs.utimesSync(filePath, mtime, mtime);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
process.env.HOME = tmpHome;
|
|
371
|
+
process.env.USERPROFILE = tmpHome;
|
|
372
|
+
|
|
373
|
+
if (test('getAllSessions returns all sessions', () => {
|
|
374
|
+
const result = sessionManager.getAllSessions({ limit: 100 });
|
|
375
|
+
assert.strictEqual(result.total, 5);
|
|
376
|
+
assert.strictEqual(result.sessions.length, 5);
|
|
377
|
+
assert.strictEqual(result.hasMore, false);
|
|
378
|
+
})) passed++; else failed++;
|
|
379
|
+
|
|
380
|
+
if (test('getAllSessions paginates correctly', () => {
|
|
381
|
+
const page1 = sessionManager.getAllSessions({ limit: 2, offset: 0 });
|
|
382
|
+
assert.strictEqual(page1.sessions.length, 2);
|
|
383
|
+
assert.strictEqual(page1.hasMore, true);
|
|
384
|
+
assert.strictEqual(page1.total, 5);
|
|
385
|
+
|
|
386
|
+
const page2 = sessionManager.getAllSessions({ limit: 2, offset: 2 });
|
|
387
|
+
assert.strictEqual(page2.sessions.length, 2);
|
|
388
|
+
assert.strictEqual(page2.hasMore, true);
|
|
389
|
+
|
|
390
|
+
const page3 = sessionManager.getAllSessions({ limit: 2, offset: 4 });
|
|
391
|
+
assert.strictEqual(page3.sessions.length, 1);
|
|
392
|
+
assert.strictEqual(page3.hasMore, false);
|
|
393
|
+
})) passed++; else failed++;
|
|
394
|
+
|
|
395
|
+
if (test('getAllSessions filters by date', () => {
|
|
396
|
+
const result = sessionManager.getAllSessions({ date: '2026-02-01', limit: 100 });
|
|
397
|
+
assert.strictEqual(result.total, 2);
|
|
398
|
+
assert.ok(result.sessions.every(s => s.date === '2026-02-01'));
|
|
399
|
+
})) passed++; else failed++;
|
|
400
|
+
|
|
401
|
+
if (test('getAllSessions filters by search (short ID)', () => {
|
|
402
|
+
const result = sessionManager.getAllSessions({ search: 'abcd', limit: 100 });
|
|
403
|
+
assert.strictEqual(result.total, 1);
|
|
404
|
+
assert.strictEqual(result.sessions[0].shortId, 'abcd1234');
|
|
405
|
+
})) passed++; else failed++;
|
|
406
|
+
|
|
407
|
+
if (test('getAllSessions prefers canonical session-data duplicates over newer legacy copies', () => {
|
|
408
|
+
const duplicateName = '2026-01-15-abcd1234-session.tmp';
|
|
409
|
+
const legacyDuplicatePath = path.join(tmpLegacySessionsDir, duplicateName);
|
|
410
|
+
const legacyMtime = new Date(Date.now() + 60000);
|
|
411
|
+
|
|
412
|
+
try {
|
|
413
|
+
fs.writeFileSync(legacyDuplicatePath, '# Legacy duplicate');
|
|
414
|
+
fs.utimesSync(legacyDuplicatePath, legacyMtime, legacyMtime);
|
|
415
|
+
|
|
416
|
+
const result = sessionManager.getAllSessions({ search: 'abcd', limit: 100 });
|
|
417
|
+
assert.strictEqual(result.total, 1, 'Duplicate filenames should be deduped');
|
|
418
|
+
assert.ok(result.sessions[0].sessionPath.includes('session-data'), 'Canonical session-data copy should win');
|
|
419
|
+
} finally {
|
|
420
|
+
fs.rmSync(legacyDuplicatePath, { force: true });
|
|
421
|
+
}
|
|
422
|
+
})) passed++; else failed++;
|
|
423
|
+
|
|
424
|
+
if (test('getAllSessions returns sorted by newest first', () => {
|
|
425
|
+
const result = sessionManager.getAllSessions({ limit: 100 });
|
|
426
|
+
for (let i = 1; i < result.sessions.length; i++) {
|
|
427
|
+
assert.ok(
|
|
428
|
+
result.sessions[i - 1].modifiedTime >= result.sessions[i].modifiedTime,
|
|
429
|
+
'Sessions should be sorted newest first'
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
})) passed++; else failed++;
|
|
433
|
+
|
|
434
|
+
if (test('getAllSessions handles offset beyond total', () => {
|
|
435
|
+
const result = sessionManager.getAllSessions({ offset: 999, limit: 10 });
|
|
436
|
+
assert.strictEqual(result.sessions.length, 0);
|
|
437
|
+
assert.strictEqual(result.total, 5);
|
|
438
|
+
assert.strictEqual(result.hasMore, false);
|
|
439
|
+
})) passed++; else failed++;
|
|
440
|
+
|
|
441
|
+
if (test('getAllSessions returns empty for non-existent date', () => {
|
|
442
|
+
const result = sessionManager.getAllSessions({ date: '2099-12-31', limit: 100 });
|
|
443
|
+
assert.strictEqual(result.total, 0);
|
|
444
|
+
assert.strictEqual(result.sessions.length, 0);
|
|
445
|
+
})) passed++; else failed++;
|
|
446
|
+
|
|
447
|
+
if (test('getAllSessions ignores non-.tmp files', () => {
|
|
448
|
+
fs.writeFileSync(path.join(tmpCanonicalSessionsDir, 'notes.txt'), 'not a session');
|
|
449
|
+
fs.writeFileSync(path.join(tmpCanonicalSessionsDir, 'compaction-log.txt'), 'log');
|
|
450
|
+
const result = sessionManager.getAllSessions({ limit: 100 });
|
|
451
|
+
assert.strictEqual(result.total, 5, 'Should only count .tmp session files');
|
|
452
|
+
})) passed++; else failed++;
|
|
453
|
+
|
|
454
|
+
// getSessionById tests
|
|
455
|
+
console.log('\ngetSessionById:');
|
|
456
|
+
|
|
457
|
+
if (test('getSessionById finds by short ID prefix', () => {
|
|
458
|
+
const result = sessionManager.getSessionById('abcd1234');
|
|
459
|
+
assert.ok(result, 'Should find session by exact short ID');
|
|
460
|
+
assert.strictEqual(result.shortId, 'abcd1234');
|
|
461
|
+
})) passed++; else failed++;
|
|
462
|
+
|
|
463
|
+
if (test('getSessionById finds by short ID prefix match', () => {
|
|
464
|
+
const result = sessionManager.getSessionById('abcd');
|
|
465
|
+
assert.ok(result, 'Should find session by short ID prefix');
|
|
466
|
+
assert.strictEqual(result.shortId, 'abcd1234');
|
|
467
|
+
})) passed++; else failed++;
|
|
468
|
+
|
|
469
|
+
if (test('getSessionById prefers canonical session-data duplicates over newer legacy copies', () => {
|
|
470
|
+
const duplicateName = '2026-01-15-abcd1234-session.tmp';
|
|
471
|
+
const legacyDuplicatePath = path.join(tmpLegacySessionsDir, duplicateName);
|
|
472
|
+
const legacyMtime = new Date(Date.now() + 120000);
|
|
473
|
+
|
|
474
|
+
try {
|
|
475
|
+
fs.writeFileSync(legacyDuplicatePath, '# Legacy duplicate');
|
|
476
|
+
fs.utimesSync(legacyDuplicatePath, legacyMtime, legacyMtime);
|
|
477
|
+
|
|
478
|
+
const result = sessionManager.getSessionById('abcd1234');
|
|
479
|
+
assert.ok(result, 'Should still resolve the duplicate session');
|
|
480
|
+
assert.ok(result.sessionPath.includes('session-data'), 'Canonical session-data copy should win');
|
|
481
|
+
} finally {
|
|
482
|
+
fs.rmSync(legacyDuplicatePath, { force: true });
|
|
483
|
+
}
|
|
484
|
+
})) passed++; else failed++;
|
|
485
|
+
|
|
486
|
+
if (test('getSessionById finds by full filename', () => {
|
|
487
|
+
const result = sessionManager.getSessionById('2026-01-15-abcd1234-session.tmp');
|
|
488
|
+
assert.ok(result, 'Should find session by full filename');
|
|
489
|
+
assert.strictEqual(result.shortId, 'abcd1234');
|
|
490
|
+
})) passed++; else failed++;
|
|
491
|
+
|
|
492
|
+
if (test('getSessionById finds by filename without .tmp', () => {
|
|
493
|
+
const result = sessionManager.getSessionById('2026-01-15-abcd1234-session');
|
|
494
|
+
assert.ok(result, 'Should find session by filename without extension');
|
|
495
|
+
})) passed++; else failed++;
|
|
496
|
+
|
|
497
|
+
if (test('getSessionById returns null for non-existent ID', () => {
|
|
498
|
+
const result = sessionManager.getSessionById('zzzzzzzz');
|
|
499
|
+
assert.strictEqual(result, null);
|
|
500
|
+
})) passed++; else failed++;
|
|
501
|
+
|
|
502
|
+
if (test('getSessionById includes content when requested', () => {
|
|
503
|
+
const result = sessionManager.getSessionById('abcd1234', true);
|
|
504
|
+
assert.ok(result, 'Should find session');
|
|
505
|
+
assert.ok(result.content, 'Should include content');
|
|
506
|
+
assert.ok(result.content.includes('Session 1'), 'Content should match');
|
|
507
|
+
})) passed++; else failed++;
|
|
508
|
+
|
|
509
|
+
if (test('getSessionById finds old format (no short ID)', () => {
|
|
510
|
+
const result = sessionManager.getSessionById('2026-02-10-session');
|
|
511
|
+
assert.ok(result, 'Should find old-format session by filename');
|
|
512
|
+
})) passed++; else failed++;
|
|
513
|
+
|
|
514
|
+
if (test('getSessionById returns null for empty string', () => {
|
|
515
|
+
const result = sessionManager.getSessionById('');
|
|
516
|
+
assert.strictEqual(result, null, 'Empty string should not match any session');
|
|
517
|
+
})) passed++; else failed++;
|
|
518
|
+
|
|
519
|
+
if (test('getSessionById returns null for non-string IDs', () => {
|
|
520
|
+
assert.strictEqual(sessionManager.getSessionById(null), null);
|
|
521
|
+
assert.strictEqual(sessionManager.getSessionById(undefined), null);
|
|
522
|
+
assert.strictEqual(sessionManager.getSessionById(42), null);
|
|
523
|
+
})) passed++; else failed++;
|
|
524
|
+
|
|
525
|
+
if (test('getSessionById metadata and stats populated when includeContent=true', () => {
|
|
526
|
+
const result = sessionManager.getSessionById('abcd1234', true);
|
|
527
|
+
assert.ok(result, 'Should find session');
|
|
528
|
+
assert.ok(result.metadata, 'Should have metadata');
|
|
529
|
+
assert.ok(result.stats, 'Should have stats');
|
|
530
|
+
assert.strictEqual(typeof result.stats.totalItems, 'number', 'stats.totalItems should be number');
|
|
531
|
+
assert.strictEqual(typeof result.stats.lineCount, 'number', 'stats.lineCount should be number');
|
|
532
|
+
})) passed++; else failed++;
|
|
533
|
+
|
|
534
|
+
// parseSessionMetadata edge cases
|
|
535
|
+
console.log('\nparseSessionMetadata (edge cases):');
|
|
536
|
+
|
|
537
|
+
if (test('handles CRLF line endings', () => {
|
|
538
|
+
const content = '# CRLF Session\r\n\r\n**Date:** 2026-03-01\r\n**Started:** 09:00\r\n\r\n### Completed\r\n- [x] Task A\r\n- [x] Task B\r\n';
|
|
539
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
540
|
+
assert.strictEqual(meta.title, 'CRLF Session');
|
|
541
|
+
assert.strictEqual(meta.date, '2026-03-01');
|
|
542
|
+
assert.strictEqual(meta.started, '09:00');
|
|
543
|
+
assert.strictEqual(meta.completed.length, 2);
|
|
544
|
+
})) passed++; else failed++;
|
|
545
|
+
|
|
546
|
+
if (test('takes first h1 heading as title', () => {
|
|
547
|
+
const content = '# First Title\n\nSome text\n\n# Second Title\n';
|
|
548
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
549
|
+
assert.strictEqual(meta.title, 'First Title');
|
|
550
|
+
})) passed++; else failed++;
|
|
551
|
+
|
|
552
|
+
if (test('handles empty sections (Completed with no items)', () => {
|
|
553
|
+
const content = '# Session\n\n### Completed\n\n### In Progress\n\n';
|
|
554
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
555
|
+
assert.deepStrictEqual(meta.completed, []);
|
|
556
|
+
assert.deepStrictEqual(meta.inProgress, []);
|
|
557
|
+
})) passed++; else failed++;
|
|
558
|
+
|
|
559
|
+
if (test('handles content with only title and notes', () => {
|
|
560
|
+
const content = '# Just Notes\n\n### Notes for Next Session\nRemember to test\n';
|
|
561
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
562
|
+
assert.strictEqual(meta.title, 'Just Notes');
|
|
563
|
+
assert.strictEqual(meta.notes, 'Remember to test');
|
|
564
|
+
assert.deepStrictEqual(meta.completed, []);
|
|
565
|
+
assert.deepStrictEqual(meta.inProgress, []);
|
|
566
|
+
})) passed++; else failed++;
|
|
567
|
+
|
|
568
|
+
if (test('extracts context with backtick fenced block', () => {
|
|
569
|
+
const content = '# Session\n\n### Context to Load\n```\nsrc/index.ts\nlib/utils.js\n```\n';
|
|
570
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
571
|
+
assert.strictEqual(meta.context, 'src/index.ts\nlib/utils.js');
|
|
572
|
+
})) passed++; else failed++;
|
|
573
|
+
|
|
574
|
+
if (test('trims whitespace from title', () => {
|
|
575
|
+
const content = '# Spaces Around Title \n';
|
|
576
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
577
|
+
assert.strictEqual(meta.title, 'Spaces Around Title');
|
|
578
|
+
})) passed++; else failed++;
|
|
579
|
+
|
|
580
|
+
// getSessionStats edge cases
|
|
581
|
+
console.log('\ngetSessionStats (edge cases):');
|
|
582
|
+
|
|
583
|
+
if (test('detects notes and context presence', () => {
|
|
584
|
+
const content = '# Stats Test\n\n### Notes for Next Session\nSome notes\n\n### Context to Load\n```\nfile.ts\n```\n';
|
|
585
|
+
const stats = sessionManager.getSessionStats(content);
|
|
586
|
+
assert.strictEqual(stats.hasNotes, true);
|
|
587
|
+
assert.strictEqual(stats.hasContext, true);
|
|
588
|
+
})) passed++; else failed++;
|
|
589
|
+
|
|
590
|
+
if (test('detects absence of notes and context', () => {
|
|
591
|
+
const content = '# Simple Session\n\nJust some content\n';
|
|
592
|
+
const stats = sessionManager.getSessionStats(content);
|
|
593
|
+
assert.strictEqual(stats.hasNotes, false);
|
|
594
|
+
assert.strictEqual(stats.hasContext, false);
|
|
595
|
+
})) passed++; else failed++;
|
|
596
|
+
|
|
597
|
+
if (test('treats Unix absolute path ending with .tmp as file path', () => {
|
|
598
|
+
// Content that starts with / and ends with .tmp should be treated as a path
|
|
599
|
+
// This tests the looksLikePath heuristic
|
|
600
|
+
const fakeContent = '/some/path/session.tmp';
|
|
601
|
+
// Since the file doesn't exist, getSessionContent returns null,
|
|
602
|
+
// parseSessionMetadata(null) returns defaults
|
|
603
|
+
const stats = sessionManager.getSessionStats(fakeContent);
|
|
604
|
+
assert.strictEqual(stats.totalItems, 0);
|
|
605
|
+
assert.strictEqual(stats.lineCount, 0);
|
|
606
|
+
})) passed++; else failed++;
|
|
607
|
+
|
|
608
|
+
// getSessionSize edge case
|
|
609
|
+
console.log('\ngetSessionSize (edge cases):');
|
|
610
|
+
|
|
611
|
+
if (test('returns MB for large file', () => {
|
|
612
|
+
const dir = createTempSessionDir();
|
|
613
|
+
try {
|
|
614
|
+
const sessionPath = path.join(dir, 'large.tmp');
|
|
615
|
+
// Create a file > 1MB
|
|
616
|
+
fs.writeFileSync(sessionPath, 'x'.repeat(1024 * 1024 + 100));
|
|
617
|
+
const size = sessionManager.getSessionSize(sessionPath);
|
|
618
|
+
assert.ok(size.includes('MB'), `Expected MB, got: ${size}`);
|
|
619
|
+
} finally {
|
|
620
|
+
cleanup(dir);
|
|
621
|
+
}
|
|
622
|
+
})) passed++; else failed++;
|
|
623
|
+
|
|
624
|
+
// appendSessionContent edge case
|
|
625
|
+
if (test('appendSessionContent returns false for invalid path', () => {
|
|
626
|
+
const result = sessionManager.appendSessionContent('/nonexistent/deep/path/session.tmp', 'content');
|
|
627
|
+
assert.strictEqual(result, false);
|
|
628
|
+
})) passed++; else failed++;
|
|
629
|
+
|
|
630
|
+
// parseSessionFilename edge cases
|
|
631
|
+
console.log('\nparseSessionFilename (additional edge cases):');
|
|
632
|
+
|
|
633
|
+
if (test('accepts uppercase letters in short ID', () => {
|
|
634
|
+
const result = sessionManager.parseSessionFilename('2026-02-01-ABCD1234-session.tmp');
|
|
635
|
+
assert.ok(result, 'Uppercase letters should be accepted');
|
|
636
|
+
assert.strictEqual(result.shortId, 'ABCD1234');
|
|
637
|
+
})) passed++; else failed++;
|
|
638
|
+
|
|
639
|
+
if (test('accepts underscores in short ID', () => {
|
|
640
|
+
const result = sessionManager.parseSessionFilename('2026-02-01-ChezMoi_2-session.tmp');
|
|
641
|
+
assert.ok(result, 'Underscores should be accepted');
|
|
642
|
+
assert.strictEqual(result.shortId, 'ChezMoi_2');
|
|
643
|
+
})) passed++; else failed++;
|
|
644
|
+
|
|
645
|
+
if (test('accepts hyphenated short IDs (extra segments)', () => {
|
|
646
|
+
const result = sessionManager.parseSessionFilename('2026-02-01-abc12345-extra-session.tmp');
|
|
647
|
+
assert.ok(result, 'Hyphenated short IDs should be accepted');
|
|
648
|
+
assert.strictEqual(result.shortId, 'abc12345-extra');
|
|
649
|
+
})) passed++; else failed++;
|
|
650
|
+
|
|
651
|
+
if (test('rejects impossible month (13)', () => {
|
|
652
|
+
const result = sessionManager.parseSessionFilename('2026-13-01-abcd1234-session.tmp');
|
|
653
|
+
assert.strictEqual(result, null, 'Month 13 should be rejected');
|
|
654
|
+
})) passed++; else failed++;
|
|
655
|
+
|
|
656
|
+
if (test('rejects impossible day (32)', () => {
|
|
657
|
+
const result = sessionManager.parseSessionFilename('2026-01-32-abcd1234-session.tmp');
|
|
658
|
+
assert.strictEqual(result, null, 'Day 32 should be rejected');
|
|
659
|
+
})) passed++; else failed++;
|
|
660
|
+
|
|
661
|
+
if (test('rejects month 00', () => {
|
|
662
|
+
const result = sessionManager.parseSessionFilename('2026-00-15-abcd1234-session.tmp');
|
|
663
|
+
assert.strictEqual(result, null, 'Month 00 should be rejected');
|
|
664
|
+
})) passed++; else failed++;
|
|
665
|
+
|
|
666
|
+
if (test('rejects day 00', () => {
|
|
667
|
+
const result = sessionManager.parseSessionFilename('2026-01-00-abcd1234-session.tmp');
|
|
668
|
+
assert.strictEqual(result, null, 'Day 00 should be rejected');
|
|
669
|
+
})) passed++; else failed++;
|
|
670
|
+
|
|
671
|
+
if (test('accepts valid edge date (month 12, day 31)', () => {
|
|
672
|
+
const result = sessionManager.parseSessionFilename('2026-12-31-abcd1234-session.tmp');
|
|
673
|
+
assert.ok(result, 'Month 12, day 31 should be accepted');
|
|
674
|
+
assert.strictEqual(result.date, '2026-12-31');
|
|
675
|
+
})) passed++; else failed++;
|
|
676
|
+
|
|
677
|
+
if (test('rejects Feb 31 (calendar-inaccurate date)', () => {
|
|
678
|
+
const result = sessionManager.parseSessionFilename('2026-02-31-abcd1234-session.tmp');
|
|
679
|
+
assert.strictEqual(result, null, 'Feb 31 does not exist');
|
|
680
|
+
})) passed++; else failed++;
|
|
681
|
+
|
|
682
|
+
if (test('rejects Apr 31 (calendar-inaccurate date)', () => {
|
|
683
|
+
const result = sessionManager.parseSessionFilename('2026-04-31-abcd1234-session.tmp');
|
|
684
|
+
assert.strictEqual(result, null, 'Apr 31 does not exist');
|
|
685
|
+
})) passed++; else failed++;
|
|
686
|
+
|
|
687
|
+
if (test('rejects Feb 29 in non-leap year', () => {
|
|
688
|
+
const result = sessionManager.parseSessionFilename('2025-02-29-abcd1234-session.tmp');
|
|
689
|
+
assert.strictEqual(result, null, '2025 is not a leap year');
|
|
690
|
+
})) passed++; else failed++;
|
|
691
|
+
|
|
692
|
+
if (test('accepts Feb 29 in leap year', () => {
|
|
693
|
+
const result = sessionManager.parseSessionFilename('2024-02-29-abcd1234-session.tmp');
|
|
694
|
+
assert.ok(result, '2024 is a leap year');
|
|
695
|
+
assert.strictEqual(result.date, '2024-02-29');
|
|
696
|
+
})) passed++; else failed++;
|
|
697
|
+
|
|
698
|
+
if (test('accepts Jun 30 (valid 30-day month)', () => {
|
|
699
|
+
const result = sessionManager.parseSessionFilename('2026-06-30-abcd1234-session.tmp');
|
|
700
|
+
assert.ok(result, 'June has 30 days');
|
|
701
|
+
assert.strictEqual(result.date, '2026-06-30');
|
|
702
|
+
})) passed++; else failed++;
|
|
703
|
+
|
|
704
|
+
if (test('rejects Jun 31 (invalid 30-day month)', () => {
|
|
705
|
+
const result = sessionManager.parseSessionFilename('2026-06-31-abcd1234-session.tmp');
|
|
706
|
+
assert.strictEqual(result, null, 'June has only 30 days');
|
|
707
|
+
})) passed++; else failed++;
|
|
708
|
+
|
|
709
|
+
if (test('datetime field is a Date object', () => {
|
|
710
|
+
const result = sessionManager.parseSessionFilename('2026-06-15-abcdef12-session.tmp');
|
|
711
|
+
assert.ok(result);
|
|
712
|
+
assert.ok(result.datetime instanceof Date, 'datetime should be a Date');
|
|
713
|
+
assert.ok(!isNaN(result.datetime.getTime()), 'datetime should be valid');
|
|
714
|
+
})) passed++; else failed++;
|
|
715
|
+
|
|
716
|
+
// writeSessionContent tests
|
|
717
|
+
console.log('\nwriteSessionContent:');
|
|
718
|
+
|
|
719
|
+
if (test('creates new session file', () => {
|
|
720
|
+
const dir = createTempSessionDir();
|
|
721
|
+
try {
|
|
722
|
+
const sessionPath = path.join(dir, 'write-test.tmp');
|
|
723
|
+
const result = sessionManager.writeSessionContent(sessionPath, '# Test Session\n');
|
|
724
|
+
assert.strictEqual(result, true, 'Should return true on success');
|
|
725
|
+
assert.ok(fs.existsSync(sessionPath), 'File should exist');
|
|
726
|
+
assert.strictEqual(fs.readFileSync(sessionPath, 'utf8'), '# Test Session\n');
|
|
727
|
+
} finally {
|
|
728
|
+
cleanup(dir);
|
|
729
|
+
}
|
|
730
|
+
})) passed++; else failed++;
|
|
731
|
+
|
|
732
|
+
if (test('overwrites existing session file', () => {
|
|
733
|
+
const dir = createTempSessionDir();
|
|
734
|
+
try {
|
|
735
|
+
const sessionPath = path.join(dir, 'overwrite-test.tmp');
|
|
736
|
+
fs.writeFileSync(sessionPath, 'old content');
|
|
737
|
+
const result = sessionManager.writeSessionContent(sessionPath, 'new content');
|
|
738
|
+
assert.strictEqual(result, true);
|
|
739
|
+
assert.strictEqual(fs.readFileSync(sessionPath, 'utf8'), 'new content');
|
|
740
|
+
} finally {
|
|
741
|
+
cleanup(dir);
|
|
742
|
+
}
|
|
743
|
+
})) passed++; else failed++;
|
|
744
|
+
|
|
745
|
+
if (test('writeSessionContent returns false for invalid path', () => {
|
|
746
|
+
const result = sessionManager.writeSessionContent('/nonexistent/deep/path/session.tmp', 'content');
|
|
747
|
+
assert.strictEqual(result, false, 'Should return false for invalid path');
|
|
748
|
+
})) passed++; else failed++;
|
|
749
|
+
|
|
750
|
+
// appendSessionContent tests
|
|
751
|
+
console.log('\nappendSessionContent:');
|
|
752
|
+
|
|
753
|
+
if (test('appends to existing session file', () => {
|
|
754
|
+
const dir = createTempSessionDir();
|
|
755
|
+
try {
|
|
756
|
+
const sessionPath = path.join(dir, 'append-test.tmp');
|
|
757
|
+
fs.writeFileSync(sessionPath, '# Session\n');
|
|
758
|
+
const result = sessionManager.appendSessionContent(sessionPath, '\n## Added Section\n');
|
|
759
|
+
assert.strictEqual(result, true);
|
|
760
|
+
const content = fs.readFileSync(sessionPath, 'utf8');
|
|
761
|
+
assert.ok(content.includes('# Session'));
|
|
762
|
+
assert.ok(content.includes('## Added Section'));
|
|
763
|
+
} finally {
|
|
764
|
+
cleanup(dir);
|
|
765
|
+
}
|
|
766
|
+
})) passed++; else failed++;
|
|
767
|
+
|
|
768
|
+
// deleteSession tests
|
|
769
|
+
console.log('\ndeleteSession:');
|
|
770
|
+
|
|
771
|
+
if (test('deletes existing session file', () => {
|
|
772
|
+
const dir = createTempSessionDir();
|
|
773
|
+
try {
|
|
774
|
+
const sessionPath = path.join(dir, 'delete-me.tmp');
|
|
775
|
+
fs.writeFileSync(sessionPath, '# To Delete');
|
|
776
|
+
assert.ok(fs.existsSync(sessionPath), 'File should exist before delete');
|
|
777
|
+
const result = sessionManager.deleteSession(sessionPath);
|
|
778
|
+
assert.strictEqual(result, true, 'Should return true');
|
|
779
|
+
assert.ok(!fs.existsSync(sessionPath), 'File should not exist after delete');
|
|
780
|
+
} finally {
|
|
781
|
+
cleanup(dir);
|
|
782
|
+
}
|
|
783
|
+
})) passed++; else failed++;
|
|
784
|
+
|
|
785
|
+
if (test('deleteSession returns false for non-existent file', () => {
|
|
786
|
+
const result = sessionManager.deleteSession('/nonexistent/session.tmp');
|
|
787
|
+
assert.strictEqual(result, false, 'Should return false for missing file');
|
|
788
|
+
})) passed++; else failed++;
|
|
789
|
+
|
|
790
|
+
// sessionExists tests
|
|
791
|
+
console.log('\nsessionExists:');
|
|
792
|
+
|
|
793
|
+
if (test('returns true for existing session file', () => {
|
|
794
|
+
const dir = createTempSessionDir();
|
|
795
|
+
try {
|
|
796
|
+
const sessionPath = path.join(dir, 'exists.tmp');
|
|
797
|
+
fs.writeFileSync(sessionPath, '# Exists');
|
|
798
|
+
assert.strictEqual(sessionManager.sessionExists(sessionPath), true);
|
|
799
|
+
} finally {
|
|
800
|
+
cleanup(dir);
|
|
801
|
+
}
|
|
802
|
+
})) passed++; else failed++;
|
|
803
|
+
|
|
804
|
+
if (test('returns false for non-existent file', () => {
|
|
805
|
+
assert.strictEqual(sessionManager.sessionExists('/nonexistent/file.tmp'), false);
|
|
806
|
+
})) passed++; else failed++;
|
|
807
|
+
|
|
808
|
+
if (test('returns false for directory (not a file)', () => {
|
|
809
|
+
const dir = createTempSessionDir();
|
|
810
|
+
try {
|
|
811
|
+
assert.strictEqual(sessionManager.sessionExists(dir), false, 'Directory should not count as session');
|
|
812
|
+
} finally {
|
|
813
|
+
cleanup(dir);
|
|
814
|
+
}
|
|
815
|
+
})) passed++; else failed++;
|
|
816
|
+
|
|
817
|
+
// getAllSessions pagination edge cases (offset/limit clamping)
|
|
818
|
+
console.log('\ngetAllSessions (pagination edge cases):');
|
|
819
|
+
|
|
820
|
+
if (test('getAllSessions clamps negative offset to 0', () => {
|
|
821
|
+
const result = sessionManager.getAllSessions({ offset: -5, limit: 2 });
|
|
822
|
+
// Negative offset should be clamped to 0, returning the first 2 sessions
|
|
823
|
+
assert.strictEqual(result.sessions.length, 2);
|
|
824
|
+
assert.strictEqual(result.offset, 0);
|
|
825
|
+
assert.strictEqual(result.total, 5);
|
|
826
|
+
})) passed++; else failed++;
|
|
827
|
+
|
|
828
|
+
if (test('getAllSessions clamps NaN offset to 0', () => {
|
|
829
|
+
const result = sessionManager.getAllSessions({ offset: NaN, limit: 3 });
|
|
830
|
+
assert.strictEqual(result.sessions.length, 3);
|
|
831
|
+
assert.strictEqual(result.offset, 0);
|
|
832
|
+
})) passed++; else failed++;
|
|
833
|
+
|
|
834
|
+
if (test('getAllSessions clamps NaN limit to default', () => {
|
|
835
|
+
const result = sessionManager.getAllSessions({ offset: 0, limit: NaN });
|
|
836
|
+
// NaN limit should be clamped to default (50), returning all 5 sessions
|
|
837
|
+
assert.ok(result.sessions.length > 0);
|
|
838
|
+
assert.strictEqual(result.total, 5);
|
|
839
|
+
})) passed++; else failed++;
|
|
840
|
+
|
|
841
|
+
if (test('getAllSessions clamps negative limit to 1', () => {
|
|
842
|
+
const result = sessionManager.getAllSessions({ offset: 0, limit: -10 });
|
|
843
|
+
// Negative limit should be clamped to 1
|
|
844
|
+
assert.strictEqual(result.sessions.length, 1);
|
|
845
|
+
assert.strictEqual(result.limit, 1);
|
|
846
|
+
})) passed++; else failed++;
|
|
847
|
+
|
|
848
|
+
if (test('getAllSessions clamps zero limit to 1', () => {
|
|
849
|
+
const result = sessionManager.getAllSessions({ offset: 0, limit: 0 });
|
|
850
|
+
assert.strictEqual(result.sessions.length, 1);
|
|
851
|
+
assert.strictEqual(result.limit, 1);
|
|
852
|
+
})) passed++; else failed++;
|
|
853
|
+
|
|
854
|
+
if (test('getAllSessions handles string offset/limit gracefully', () => {
|
|
855
|
+
const result = sessionManager.getAllSessions({ offset: 'abc', limit: 'xyz' });
|
|
856
|
+
// String non-numeric should be treated as 0/default
|
|
857
|
+
assert.strictEqual(result.offset, 0);
|
|
858
|
+
assert.ok(result.sessions.length > 0);
|
|
859
|
+
})) passed++; else failed++;
|
|
860
|
+
|
|
861
|
+
if (test('getAllSessions handles fractional offset (floors to integer)', () => {
|
|
862
|
+
const result = sessionManager.getAllSessions({ offset: 1.7, limit: 2 });
|
|
863
|
+
// 1.7 should floor to 1, skip first session, return next 2
|
|
864
|
+
assert.strictEqual(result.offset, 1);
|
|
865
|
+
assert.strictEqual(result.sessions.length, 2);
|
|
866
|
+
})) passed++; else failed++;
|
|
867
|
+
|
|
868
|
+
if (test('getAllSessions handles Infinity offset', () => {
|
|
869
|
+
// Infinity should clamp to 0 since Number(Infinity) is Infinity but
|
|
870
|
+
// Math.floor(Infinity) is Infinity — however slice(Infinity) returns []
|
|
871
|
+
// Actually: Number(Infinity) || 0 = Infinity, Math.floor(Infinity) = Infinity
|
|
872
|
+
// Math.max(0, Infinity) = Infinity, so slice(Infinity) = []
|
|
873
|
+
const result = sessionManager.getAllSessions({ offset: Infinity, limit: 2 });
|
|
874
|
+
assert.strictEqual(result.sessions.length, 0);
|
|
875
|
+
assert.strictEqual(result.total, 5);
|
|
876
|
+
})) passed++; else failed++;
|
|
877
|
+
|
|
878
|
+
// getSessionStats with code blocks and special characters
|
|
879
|
+
console.log('\ngetSessionStats (code blocks & special chars):');
|
|
880
|
+
|
|
881
|
+
if (test('counts tasks with inline backticks correctly', () => {
|
|
882
|
+
const content = '# Test\n\n### Completed\n- [x] Fixed `app.js` bug with `fs.readFile()`\n- [x] Ran `npm install` successfully\n\n### In Progress\n- [ ] Review `config.ts` changes\n';
|
|
883
|
+
const stats = sessionManager.getSessionStats(content);
|
|
884
|
+
assert.strictEqual(stats.completedItems, 2, 'Should count 2 completed items');
|
|
885
|
+
assert.strictEqual(stats.inProgressItems, 1, 'Should count 1 in-progress item');
|
|
886
|
+
assert.strictEqual(stats.totalItems, 3);
|
|
887
|
+
})) passed++; else failed++;
|
|
888
|
+
|
|
889
|
+
if (test('handles special chars in notes section', () => {
|
|
890
|
+
const content = '# Test\n\n### Notes for Next Session\nDon\'t forget: <important> & "quotes" & \'apostrophes\'\n';
|
|
891
|
+
const stats = sessionManager.getSessionStats(content);
|
|
892
|
+
assert.strictEqual(stats.hasNotes, true, 'Should detect notes section');
|
|
893
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
894
|
+
assert.ok(meta.notes.includes('<important>'), 'Notes should preserve HTML-like content');
|
|
895
|
+
})) passed++; else failed++;
|
|
896
|
+
|
|
897
|
+
if (test('counts items in multiline code-heavy session', () => {
|
|
898
|
+
const content = '# Code Session\n\n### Completed\n- [x] Refactored `lib/utils.js`\n- [x] Updated `package.json` version\n- [x] Fixed `\\`` escaping bug\n\n### In Progress\n- [ ] Test `getSessionStats()` function\n- [ ] Review PR #42\n';
|
|
899
|
+
const stats = sessionManager.getSessionStats(content);
|
|
900
|
+
assert.strictEqual(stats.completedItems, 3);
|
|
901
|
+
assert.strictEqual(stats.inProgressItems, 2);
|
|
902
|
+
})) passed++; else failed++;
|
|
903
|
+
|
|
904
|
+
// getSessionStats with empty content
|
|
905
|
+
if (test('getSessionStats handles empty string content', () => {
|
|
906
|
+
const stats = sessionManager.getSessionStats('');
|
|
907
|
+
assert.strictEqual(stats.totalItems, 0);
|
|
908
|
+
// Empty string is falsy in JS, so content ? ... : 0 returns 0
|
|
909
|
+
assert.strictEqual(stats.lineCount, 0, 'Empty string is falsy, lineCount = 0');
|
|
910
|
+
assert.strictEqual(stats.hasNotes, false);
|
|
911
|
+
assert.strictEqual(stats.hasContext, false);
|
|
912
|
+
})) passed++; else failed++;
|
|
913
|
+
|
|
914
|
+
// ── Round 26 tests ──
|
|
915
|
+
|
|
916
|
+
console.log('\nparseSessionFilename (30-day month validation):');
|
|
917
|
+
|
|
918
|
+
if (test('rejects Sep 31 (September has 30 days)', () => {
|
|
919
|
+
const result = sessionManager.parseSessionFilename('2026-09-31-abcd1234-session.tmp');
|
|
920
|
+
assert.strictEqual(result, null, 'Sep 31 does not exist');
|
|
921
|
+
})) passed++; else failed++;
|
|
922
|
+
|
|
923
|
+
if (test('rejects Nov 31 (November has 30 days)', () => {
|
|
924
|
+
const result = sessionManager.parseSessionFilename('2026-11-31-abcd1234-session.tmp');
|
|
925
|
+
assert.strictEqual(result, null, 'Nov 31 does not exist');
|
|
926
|
+
})) passed++; else failed++;
|
|
927
|
+
|
|
928
|
+
if (test('accepts Sep 30 (valid 30-day month boundary)', () => {
|
|
929
|
+
const result = sessionManager.parseSessionFilename('2026-09-30-abcd1234-session.tmp');
|
|
930
|
+
assert.ok(result, 'Sep 30 is valid');
|
|
931
|
+
assert.strictEqual(result.date, '2026-09-30');
|
|
932
|
+
})) passed++; else failed++;
|
|
933
|
+
|
|
934
|
+
console.log('\ngetSessionStats (path heuristic edge cases):');
|
|
935
|
+
|
|
936
|
+
if (test('multiline content ending with .tmp is treated as content', () => {
|
|
937
|
+
const content = 'Line 1\nLine 2\nDownload file.tmp';
|
|
938
|
+
const stats = sessionManager.getSessionStats(content);
|
|
939
|
+
// Has newlines so looksLikePath is false → treated as content
|
|
940
|
+
assert.strictEqual(stats.lineCount, 3, 'Should count 3 lines');
|
|
941
|
+
})) passed++; else failed++;
|
|
942
|
+
|
|
943
|
+
if (test('single-line content not starting with / treated as content', () => {
|
|
944
|
+
const content = 'some random text.tmp';
|
|
945
|
+
const stats = sessionManager.getSessionStats(content);
|
|
946
|
+
assert.strictEqual(stats.lineCount, 1, 'Should treat as content, not a path');
|
|
947
|
+
})) passed++; else failed++;
|
|
948
|
+
|
|
949
|
+
console.log('\ngetAllSessions (combined filters):');
|
|
950
|
+
|
|
951
|
+
if (test('combines date filter + search filter + pagination', () => {
|
|
952
|
+
// We have 2026-02-01-ijkl9012 and 2026-02-01-mnop3456 with date 2026-02-01
|
|
953
|
+
const result = sessionManager.getAllSessions({
|
|
954
|
+
date: '2026-02-01',
|
|
955
|
+
search: 'ijkl',
|
|
956
|
+
limit: 10
|
|
957
|
+
});
|
|
958
|
+
assert.strictEqual(result.total, 1, 'Only one session matches both date and search');
|
|
959
|
+
assert.strictEqual(result.sessions[0].shortId, 'ijkl9012');
|
|
960
|
+
})) passed++; else failed++;
|
|
961
|
+
|
|
962
|
+
if (test('date filter + offset beyond matches returns empty', () => {
|
|
963
|
+
const result = sessionManager.getAllSessions({
|
|
964
|
+
date: '2026-02-01',
|
|
965
|
+
offset: 100,
|
|
966
|
+
limit: 10
|
|
967
|
+
});
|
|
968
|
+
assert.strictEqual(result.sessions.length, 0);
|
|
969
|
+
assert.strictEqual(result.total, 2, 'Two sessions match the date');
|
|
970
|
+
assert.strictEqual(result.hasMore, false);
|
|
971
|
+
})) passed++; else failed++;
|
|
972
|
+
|
|
973
|
+
console.log('\ngetSessionById (ambiguous prefix):');
|
|
974
|
+
|
|
975
|
+
if (test('returns first match when multiple sessions share a prefix', () => {
|
|
976
|
+
// Sessions with IDs abcd1234 and efgh5678 exist
|
|
977
|
+
// 'e' should match efgh5678 (only match)
|
|
978
|
+
const result = sessionManager.getSessionById('efgh');
|
|
979
|
+
assert.ok(result, 'Should find session by prefix');
|
|
980
|
+
assert.strictEqual(result.shortId, 'efgh5678');
|
|
981
|
+
})) passed++; else failed++;
|
|
982
|
+
|
|
983
|
+
console.log('\nparseSessionMetadata (edge cases):');
|
|
984
|
+
|
|
985
|
+
if (test('handles unclosed code fence in Context section', () => {
|
|
986
|
+
const content = '# Session\n\n### Context to Load\n```\nsrc/index.ts\n';
|
|
987
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
988
|
+
// Regex requires closing ```, so no context should be extracted
|
|
989
|
+
assert.strictEqual(meta.context, '', 'Unclosed code fence should not extract context');
|
|
990
|
+
})) passed++; else failed++;
|
|
991
|
+
|
|
992
|
+
if (test('handles empty task text in checklist items', () => {
|
|
993
|
+
const content = '# Session\n\n### Completed\n- [x] \n- [x] Real task\n';
|
|
994
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
995
|
+
// \s* in the regex bridges across newlines, collapsing the empty
|
|
996
|
+
// task + next task into a single match. This is an edge case —
|
|
997
|
+
// real sessions don't have empty checklist items.
|
|
998
|
+
assert.strictEqual(meta.completed.length, 1);
|
|
999
|
+
})) passed++; else failed++;
|
|
1000
|
+
|
|
1001
|
+
// ── Round 43: getSessionById default excludes content ──
|
|
1002
|
+
console.log('\nRound 43: getSessionById (default excludes content):');
|
|
1003
|
+
|
|
1004
|
+
if (test('getSessionById without includeContent omits content, metadata, and stats', () => {
|
|
1005
|
+
// Default call (includeContent=false) should NOT load file content
|
|
1006
|
+
const result = sessionManager.getSessionById('abcd1234');
|
|
1007
|
+
assert.ok(result, 'Should find the session');
|
|
1008
|
+
assert.strictEqual(result.shortId, 'abcd1234');
|
|
1009
|
+
// These fields should be absent when includeContent is false
|
|
1010
|
+
assert.strictEqual(result.content, undefined, 'content should be undefined');
|
|
1011
|
+
assert.strictEqual(result.metadata, undefined, 'metadata should be undefined');
|
|
1012
|
+
assert.strictEqual(result.stats, undefined, 'stats should be undefined');
|
|
1013
|
+
// Basic fields should still be present
|
|
1014
|
+
assert.ok(result.sessionPath, 'sessionPath should be present');
|
|
1015
|
+
assert.ok(result.size !== undefined, 'size should be present');
|
|
1016
|
+
assert.ok(result.modifiedTime, 'modifiedTime should be present');
|
|
1017
|
+
})) passed++; else failed++;
|
|
1018
|
+
|
|
1019
|
+
// ── Round 54: search filter scope and getSessionPath utility ──
|
|
1020
|
+
console.log('\nRound 54: search filter scope and path utility:');
|
|
1021
|
+
|
|
1022
|
+
if (test('getAllSessions search filter matches only short ID, not title or content', () => {
|
|
1023
|
+
// "Session" appears in file CONTENT (e.g. "# Session 1") but not in any shortId
|
|
1024
|
+
const result = sessionManager.getAllSessions({ search: 'Session', limit: 100 });
|
|
1025
|
+
assert.strictEqual(result.total, 0, 'Search should not match title/content, only shortId');
|
|
1026
|
+
// Verify that searching by actual shortId substring still works
|
|
1027
|
+
const result2 = sessionManager.getAllSessions({ search: 'abcd', limit: 100 });
|
|
1028
|
+
assert.strictEqual(result2.total, 1, 'Search by shortId should still work');
|
|
1029
|
+
})) passed++; else failed++;
|
|
1030
|
+
|
|
1031
|
+
if (test('getSessionPath returns absolute path for session filename', () => {
|
|
1032
|
+
const filename = '2026-02-01-testpath-session.tmp';
|
|
1033
|
+
const result = sessionManager.getSessionPath(filename);
|
|
1034
|
+
assert.ok(path.isAbsolute(result), 'Should return an absolute path');
|
|
1035
|
+
assert.ok(result.endsWith(filename), `Path should end with filename, got: ${result}`);
|
|
1036
|
+
// Since HOME is overridden, sessions dir should be under tmpHome
|
|
1037
|
+
assert.ok(result.includes('.claude'), 'Path should include .claude directory');
|
|
1038
|
+
assert.ok(result.includes('session-data'), 'Path should use canonical session-data directory');
|
|
1039
|
+
})) passed++; else failed++;
|
|
1040
|
+
|
|
1041
|
+
// ── Round 66: getSessionById noIdMatch path (date-only string for old format) ──
|
|
1042
|
+
console.log('\nRound 66: getSessionById (noIdMatch — date-only match for old format):');
|
|
1043
|
+
|
|
1044
|
+
if (test('getSessionById finds old-format session by date-only string (noIdMatch)', () => {
|
|
1045
|
+
// File is 2026-02-10-session.tmp (old format, shortId = 'no-id')
|
|
1046
|
+
// Calling with '2026-02-10' → filenameMatch fails (filename !== '2026-02-10' and !== '2026-02-10.tmp')
|
|
1047
|
+
// shortIdMatch fails (shortId === 'no-id', not !== 'no-id')
|
|
1048
|
+
// noIdMatch succeeds: shortId === 'no-id' && filename === '2026-02-10-session.tmp'
|
|
1049
|
+
const result = sessionManager.getSessionById('2026-02-10');
|
|
1050
|
+
assert.ok(result, 'Should find old-format session by date-only string');
|
|
1051
|
+
assert.strictEqual(result.shortId, 'no-id', 'Should have no-id shortId');
|
|
1052
|
+
assert.ok(result.filename.includes('2026-02-10-session.tmp'), 'Should match old-format file');
|
|
1053
|
+
assert.ok(result.sessionPath, 'Should have sessionPath');
|
|
1054
|
+
assert.ok(result.date === '2026-02-10', 'Should have correct date');
|
|
1055
|
+
})) passed++; else failed++;
|
|
1056
|
+
|
|
1057
|
+
// Cleanup — restore both HOME and USERPROFILE (Windows)
|
|
1058
|
+
process.env.HOME = origHome;
|
|
1059
|
+
if (origUserProfile !== undefined) {
|
|
1060
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1061
|
+
} else {
|
|
1062
|
+
delete process.env.USERPROFILE;
|
|
1063
|
+
}
|
|
1064
|
+
try {
|
|
1065
|
+
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
1066
|
+
} catch {
|
|
1067
|
+
// best-effort
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
// ── Round 30: datetime local-time fix and parseSessionFilename edge cases ──
|
|
1071
|
+
console.log('\nRound 30: datetime local-time fix:');
|
|
1072
|
+
|
|
1073
|
+
if (test('datetime day matches the filename date (local-time constructor)', () => {
|
|
1074
|
+
const result = sessionManager.parseSessionFilename('2026-06-15-abcdef12-session.tmp');
|
|
1075
|
+
assert.ok(result);
|
|
1076
|
+
// With the fix, getDate()/getMonth() should return local-time values
|
|
1077
|
+
// matching the filename, regardless of timezone
|
|
1078
|
+
assert.strictEqual(result.datetime.getDate(), 15, 'Day should be 15 (local time)');
|
|
1079
|
+
assert.strictEqual(result.datetime.getMonth(), 5, 'Month should be 5 (June, 0-indexed)');
|
|
1080
|
+
assert.strictEqual(result.datetime.getFullYear(), 2026, 'Year should be 2026');
|
|
1081
|
+
})) passed++; else failed++;
|
|
1082
|
+
|
|
1083
|
+
if (test('datetime matches for January 1 (timezone-sensitive date)', () => {
|
|
1084
|
+
// Jan 1 at UTC midnight is Dec 31 in negative offsets — this tests the fix
|
|
1085
|
+
const result = sessionManager.parseSessionFilename('2026-01-01-abc12345-session.tmp');
|
|
1086
|
+
assert.ok(result);
|
|
1087
|
+
assert.strictEqual(result.datetime.getDate(), 1, 'Day should be 1 in local time');
|
|
1088
|
+
assert.strictEqual(result.datetime.getMonth(), 0, 'Month should be 0 (January)');
|
|
1089
|
+
})) passed++; else failed++;
|
|
1090
|
+
|
|
1091
|
+
if (test('datetime matches for December 31 (year boundary)', () => {
|
|
1092
|
+
const result = sessionManager.parseSessionFilename('2025-12-31-abc12345-session.tmp');
|
|
1093
|
+
assert.ok(result);
|
|
1094
|
+
assert.strictEqual(result.datetime.getDate(), 31);
|
|
1095
|
+
assert.strictEqual(result.datetime.getMonth(), 11); // December
|
|
1096
|
+
assert.strictEqual(result.datetime.getFullYear(), 2025);
|
|
1097
|
+
})) passed++; else failed++;
|
|
1098
|
+
|
|
1099
|
+
console.log('\nRound 30: parseSessionFilename edge cases:');
|
|
1100
|
+
|
|
1101
|
+
if (test('parses session ID with many dashes (UUID-like)', () => {
|
|
1102
|
+
const result = sessionManager.parseSessionFilename('2026-02-13-a1b2c3d4-session.tmp');
|
|
1103
|
+
assert.ok(result);
|
|
1104
|
+
assert.strictEqual(result.shortId, 'a1b2c3d4');
|
|
1105
|
+
assert.strictEqual(result.date, '2026-02-13');
|
|
1106
|
+
})) passed++; else failed++;
|
|
1107
|
+
|
|
1108
|
+
if (test('rejects filename with missing session.tmp suffix', () => {
|
|
1109
|
+
const result = sessionManager.parseSessionFilename('2026-02-13-abc12345.tmp');
|
|
1110
|
+
assert.strictEqual(result, null, 'Should reject filename without -session.tmp');
|
|
1111
|
+
})) passed++; else failed++;
|
|
1112
|
+
|
|
1113
|
+
if (test('rejects filename with extra text after suffix', () => {
|
|
1114
|
+
const result = sessionManager.parseSessionFilename('2026-02-13-abc12345-session.tmp.bak');
|
|
1115
|
+
assert.strictEqual(result, null, 'Should reject filenames with extra extension');
|
|
1116
|
+
})) passed++; else failed++;
|
|
1117
|
+
|
|
1118
|
+
if (test('handles old-format filename without session ID', () => {
|
|
1119
|
+
// The regex match[2] is undefined for old format → shortId defaults to 'no-id'
|
|
1120
|
+
const result = sessionManager.parseSessionFilename('2026-02-13-session.tmp');
|
|
1121
|
+
if (result) {
|
|
1122
|
+
assert.strictEqual(result.shortId, 'no-id', 'Should default to no-id');
|
|
1123
|
+
}
|
|
1124
|
+
// Either null (regex doesn't match) or has no-id — both are acceptable
|
|
1125
|
+
assert.ok(true, 'Old format handled without crash');
|
|
1126
|
+
})) passed++; else failed++;
|
|
1127
|
+
|
|
1128
|
+
// ── Round 33: birthtime / createdTime fallback ──
|
|
1129
|
+
console.log('\ncreatedTime fallback (Round 33):');
|
|
1130
|
+
|
|
1131
|
+
// Use HOME override approach (consistent with existing getAllSessions tests)
|
|
1132
|
+
const r33Home = path.join(os.tmpdir(), `ecc-r33-birthtime-${Date.now()}`);
|
|
1133
|
+
const r33SessionsDir = path.join(r33Home, '.claude', 'sessions');
|
|
1134
|
+
fs.mkdirSync(r33SessionsDir, { recursive: true });
|
|
1135
|
+
const r33OrigHome = process.env.HOME;
|
|
1136
|
+
const r33OrigProfile = process.env.USERPROFILE;
|
|
1137
|
+
process.env.HOME = r33Home;
|
|
1138
|
+
process.env.USERPROFILE = r33Home;
|
|
1139
|
+
|
|
1140
|
+
const r33Filename = '2026-02-13-r33birth-session.tmp';
|
|
1141
|
+
const r33FilePath = path.join(r33SessionsDir, r33Filename);
|
|
1142
|
+
fs.writeFileSync(r33FilePath, '{"type":"test"}');
|
|
1143
|
+
|
|
1144
|
+
if (test('getAllSessions returns createdTime from birthtime when available', () => {
|
|
1145
|
+
const result = sessionManager.getAllSessions({ limit: 100 });
|
|
1146
|
+
assert.ok(result.sessions.length > 0, 'Should find the test session');
|
|
1147
|
+
const session = result.sessions[0];
|
|
1148
|
+
assert.ok(session.createdTime instanceof Date, 'createdTime should be a Date');
|
|
1149
|
+
// birthtime should be populated on macOS/Windows — createdTime should match it
|
|
1150
|
+
const stats = fs.statSync(r33FilePath);
|
|
1151
|
+
if (stats.birthtime && stats.birthtime.getTime() > 0) {
|
|
1152
|
+
assert.strictEqual(
|
|
1153
|
+
session.createdTime.getTime(),
|
|
1154
|
+
stats.birthtime.getTime(),
|
|
1155
|
+
'createdTime should match birthtime when available'
|
|
1156
|
+
);
|
|
1157
|
+
}
|
|
1158
|
+
})) passed++; else failed++;
|
|
1159
|
+
|
|
1160
|
+
if (test('getSessionById returns createdTime field', () => {
|
|
1161
|
+
const session = sessionManager.getSessionById('r33birth');
|
|
1162
|
+
assert.ok(session, 'Should find the session');
|
|
1163
|
+
assert.ok(session.createdTime instanceof Date, 'createdTime should be a Date');
|
|
1164
|
+
assert.ok(session.createdTime.getTime() > 0, 'createdTime should be non-zero');
|
|
1165
|
+
})) passed++; else failed++;
|
|
1166
|
+
|
|
1167
|
+
if (test('createdTime falls back to ctime when birthtime is epoch-zero', () => {
|
|
1168
|
+
// This tests the || fallback logic: stats.birthtime || stats.ctime
|
|
1169
|
+
// On some FS, birthtime may be epoch 0 (falsy as a Date number comparison
|
|
1170
|
+
// but truthy as a Date object). The fallback is defensive.
|
|
1171
|
+
const stats = fs.statSync(r33FilePath);
|
|
1172
|
+
// Both birthtime and ctime should be valid Dates on any modern OS
|
|
1173
|
+
assert.ok(stats.ctime instanceof Date, 'ctime should exist');
|
|
1174
|
+
// The fallback expression `birthtime || ctime` should always produce a valid Date
|
|
1175
|
+
const fallbackResult = stats.birthtime || stats.ctime;
|
|
1176
|
+
assert.ok(fallbackResult instanceof Date, 'Fallback should produce a Date');
|
|
1177
|
+
assert.ok(fallbackResult.getTime() > 0, 'Fallback date should be non-zero');
|
|
1178
|
+
})) passed++; else failed++;
|
|
1179
|
+
|
|
1180
|
+
// Cleanup Round 33 HOME override
|
|
1181
|
+
process.env.HOME = r33OrigHome;
|
|
1182
|
+
if (r33OrigProfile !== undefined) {
|
|
1183
|
+
process.env.USERPROFILE = r33OrigProfile;
|
|
1184
|
+
} else {
|
|
1185
|
+
delete process.env.USERPROFILE;
|
|
1186
|
+
}
|
|
1187
|
+
try { fs.rmSync(r33Home, { recursive: true, force: true }); } catch (_e) { /* ignore cleanup errors */ }
|
|
1188
|
+
|
|
1189
|
+
// ── Round 46: path heuristic and checklist edge cases ──
|
|
1190
|
+
console.log('\ngetSessionStats Windows path heuristic (Round 46):');
|
|
1191
|
+
|
|
1192
|
+
if (test('recognises Windows drive-letter path as a file path', () => {
|
|
1193
|
+
// The looksLikePath regex includes /^[A-Za-z]:[/\\]/ for Windows
|
|
1194
|
+
// A non-existent Windows path should still be treated as a path
|
|
1195
|
+
// (getSessionContent returns null → parseSessionMetadata(null) → defaults)
|
|
1196
|
+
const stats1 = sessionManager.getSessionStats('C:/Users/test/session.tmp');
|
|
1197
|
+
assert.strictEqual(stats1.lineCount, 0, 'C:/ path treated as path, not content');
|
|
1198
|
+
const stats2 = sessionManager.getSessionStats('D:\\Sessions\\2026-01-01.tmp');
|
|
1199
|
+
assert.strictEqual(stats2.lineCount, 0, 'D:\\ path treated as path, not content');
|
|
1200
|
+
})) passed++; else failed++;
|
|
1201
|
+
|
|
1202
|
+
if (test('does not treat bare drive letter without slash as path', () => {
|
|
1203
|
+
// "C:session.tmp" has no slash after colon → regex fails → treated as content
|
|
1204
|
+
const stats = sessionManager.getSessionStats('C:session.tmp');
|
|
1205
|
+
assert.strictEqual(stats.lineCount, 1, 'Bare C: without slash treated as content');
|
|
1206
|
+
})) passed++; else failed++;
|
|
1207
|
+
|
|
1208
|
+
console.log('\nparseSessionMetadata checkbox case sensitivity (Round 46):');
|
|
1209
|
+
|
|
1210
|
+
if (test('uppercase [X] does not match completed items regex', () => {
|
|
1211
|
+
const content = '# Test\n\n### Completed\n- [X] Uppercase task\n- [x] Lowercase task\n';
|
|
1212
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1213
|
+
// Regex is /- \[x\]\s*(.+)/g — only matches lowercase [x]
|
|
1214
|
+
assert.strictEqual(meta.completed.length, 1, 'Only lowercase [x] should match');
|
|
1215
|
+
assert.strictEqual(meta.completed[0], 'Lowercase task');
|
|
1216
|
+
})) passed++; else failed++;
|
|
1217
|
+
|
|
1218
|
+
// getAllSessions returns empty result when sessions directory does not exist
|
|
1219
|
+
if (test('getAllSessions returns empty when sessions dir missing', () => {
|
|
1220
|
+
const tmpDir = createTempSessionDir();
|
|
1221
|
+
const origHome = process.env.HOME;
|
|
1222
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1223
|
+
try {
|
|
1224
|
+
// Point HOME to a dir with no .claude/sessions/
|
|
1225
|
+
process.env.HOME = tmpDir;
|
|
1226
|
+
process.env.USERPROFILE = tmpDir;
|
|
1227
|
+
// Re-require to pick up new HOME
|
|
1228
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1229
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1230
|
+
const freshSM = require('../../scripts/lib/session-manager');
|
|
1231
|
+
const result = freshSM.getAllSessions();
|
|
1232
|
+
assert.deepStrictEqual(result.sessions, [], 'Should return empty sessions array');
|
|
1233
|
+
assert.strictEqual(result.total, 0, 'Total should be 0');
|
|
1234
|
+
assert.strictEqual(result.hasMore, false, 'hasMore should be false');
|
|
1235
|
+
} finally {
|
|
1236
|
+
process.env.HOME = origHome;
|
|
1237
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1238
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1239
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1240
|
+
cleanup(tmpDir);
|
|
1241
|
+
}
|
|
1242
|
+
})) passed++; else failed++;
|
|
1243
|
+
|
|
1244
|
+
// ── Round 69: getSessionById returns null when sessions dir missing ──
|
|
1245
|
+
console.log('\nRound 69: getSessionById (missing sessions directory):');
|
|
1246
|
+
|
|
1247
|
+
if (test('getSessionById returns null when sessions directory does not exist', () => {
|
|
1248
|
+
const tmpDir = createTempSessionDir();
|
|
1249
|
+
const origHome = process.env.HOME;
|
|
1250
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1251
|
+
try {
|
|
1252
|
+
// Point HOME to a dir with no .claude/sessions/
|
|
1253
|
+
process.env.HOME = tmpDir;
|
|
1254
|
+
process.env.USERPROFILE = tmpDir;
|
|
1255
|
+
// Re-require to pick up new HOME
|
|
1256
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1257
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1258
|
+
const freshSM = require('../../scripts/lib/session-manager');
|
|
1259
|
+
const result = freshSM.getSessionById('anything');
|
|
1260
|
+
assert.strictEqual(result, null, 'Should return null when sessions dir does not exist');
|
|
1261
|
+
} finally {
|
|
1262
|
+
process.env.HOME = origHome;
|
|
1263
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1264
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1265
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1266
|
+
cleanup(tmpDir);
|
|
1267
|
+
}
|
|
1268
|
+
})) passed++; else failed++;
|
|
1269
|
+
|
|
1270
|
+
// ── Round 78: getSessionStats reads real file when given existing .tmp path ──
|
|
1271
|
+
console.log('\nRound 78: getSessionStats (actual file path → reads from disk):');
|
|
1272
|
+
|
|
1273
|
+
if (test('getSessionStats reads from disk when given path to existing .tmp file', () => {
|
|
1274
|
+
const dir = createTempSessionDir();
|
|
1275
|
+
try {
|
|
1276
|
+
const sessionPath = path.join(dir, '2026-03-01-test1234-session.tmp');
|
|
1277
|
+
const content = '# Real File Stats Test\n\n**Date:** 2026-03-01\n**Started:** 09:00\n\n### Completed\n- [x] First task\n- [x] Second task\n\n### In Progress\n- [ ] Third task\n\n### Notes for Next Session\nDon\'t forget the edge cases\n';
|
|
1278
|
+
fs.writeFileSync(sessionPath, content);
|
|
1279
|
+
|
|
1280
|
+
// Pass the FILE PATH (not content) — this exercises looksLikePath branch
|
|
1281
|
+
const stats = sessionManager.getSessionStats(sessionPath);
|
|
1282
|
+
assert.strictEqual(stats.completedItems, 2, 'Should find 2 completed items from file');
|
|
1283
|
+
assert.strictEqual(stats.inProgressItems, 1, 'Should find 1 in-progress item from file');
|
|
1284
|
+
assert.strictEqual(stats.totalItems, 3, 'Should find 3 total items from file');
|
|
1285
|
+
assert.strictEqual(stats.hasNotes, true, 'Should detect notes section from file');
|
|
1286
|
+
assert.ok(stats.lineCount > 5, `Should have multiple lines from file, got ${stats.lineCount}`);
|
|
1287
|
+
} finally {
|
|
1288
|
+
cleanup(dir);
|
|
1289
|
+
}
|
|
1290
|
+
})) passed++; else failed++;
|
|
1291
|
+
|
|
1292
|
+
// ── Round 78: getAllSessions hasContent field ──
|
|
1293
|
+
console.log('\nRound 78: getAllSessions (hasContent field):');
|
|
1294
|
+
|
|
1295
|
+
if (test('getAllSessions hasContent is true for non-empty and false for empty files', () => {
|
|
1296
|
+
const isoHome = path.join(os.tmpdir(), `ecc-hascontent-${Date.now()}`);
|
|
1297
|
+
const isoSessions = path.join(isoHome, '.claude', 'sessions');
|
|
1298
|
+
fs.mkdirSync(isoSessions, { recursive: true });
|
|
1299
|
+
const savedHome = process.env.HOME;
|
|
1300
|
+
const savedProfile = process.env.USERPROFILE;
|
|
1301
|
+
try {
|
|
1302
|
+
// Create one non-empty session and one empty session
|
|
1303
|
+
fs.writeFileSync(path.join(isoSessions, '2026-04-01-nonempty-session.tmp'), '# Has content');
|
|
1304
|
+
fs.writeFileSync(path.join(isoSessions, '2026-04-02-emptyfile-session.tmp'), '');
|
|
1305
|
+
|
|
1306
|
+
process.env.HOME = isoHome;
|
|
1307
|
+
process.env.USERPROFILE = isoHome;
|
|
1308
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1309
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1310
|
+
const freshSM = require('../../scripts/lib/session-manager');
|
|
1311
|
+
|
|
1312
|
+
const result = freshSM.getAllSessions({ limit: 100 });
|
|
1313
|
+
assert.strictEqual(result.total, 2, 'Should find both sessions');
|
|
1314
|
+
|
|
1315
|
+
const nonEmpty = result.sessions.find(s => s.shortId === 'nonempty');
|
|
1316
|
+
const empty = result.sessions.find(s => s.shortId === 'emptyfile');
|
|
1317
|
+
|
|
1318
|
+
assert.ok(nonEmpty, 'Should find the non-empty session');
|
|
1319
|
+
assert.ok(empty, 'Should find the empty session');
|
|
1320
|
+
assert.strictEqual(nonEmpty.hasContent, true, 'Non-empty file should have hasContent: true');
|
|
1321
|
+
assert.strictEqual(empty.hasContent, false, 'Empty file should have hasContent: false');
|
|
1322
|
+
} finally {
|
|
1323
|
+
process.env.HOME = savedHome;
|
|
1324
|
+
process.env.USERPROFILE = savedProfile;
|
|
1325
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1326
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1327
|
+
fs.rmSync(isoHome, { recursive: true, force: true });
|
|
1328
|
+
}
|
|
1329
|
+
})) passed++; else failed++;
|
|
1330
|
+
|
|
1331
|
+
// ── Round 75: deleteSession catch — unlinkSync throws on read-only dir ──
|
|
1332
|
+
console.log('\nRound 75: deleteSession (unlink failure in read-only dir):');
|
|
1333
|
+
|
|
1334
|
+
if (test('deleteSession returns false when file exists but directory is read-only', () => {
|
|
1335
|
+
if (process.platform === 'win32' || process.getuid?.() === 0) {
|
|
1336
|
+
console.log(' (skipped — chmod ineffective on Windows/root)');
|
|
1337
|
+
return;
|
|
1338
|
+
}
|
|
1339
|
+
const tmpDir = path.join(os.tmpdir(), `sm-del-ro-${Date.now()}`);
|
|
1340
|
+
fs.mkdirSync(tmpDir, { recursive: true });
|
|
1341
|
+
const sessionFile = path.join(tmpDir, 'test-session.tmp');
|
|
1342
|
+
fs.writeFileSync(sessionFile, 'session content');
|
|
1343
|
+
try {
|
|
1344
|
+
// Make directory read-only so unlinkSync throws EACCES
|
|
1345
|
+
fs.chmodSync(tmpDir, 0o555);
|
|
1346
|
+
const result = sessionManager.deleteSession(sessionFile);
|
|
1347
|
+
assert.strictEqual(result, false, 'Should return false when unlinkSync fails');
|
|
1348
|
+
} finally {
|
|
1349
|
+
try { fs.chmodSync(tmpDir, 0o755); } catch { /* best-effort */ }
|
|
1350
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
1351
|
+
}
|
|
1352
|
+
})) passed++; else failed++;
|
|
1353
|
+
|
|
1354
|
+
// ── Round 81: getSessionStats(null) ──
|
|
1355
|
+
console.log('\nRound 81: getSessionStats(null) (null input):');
|
|
1356
|
+
|
|
1357
|
+
if (test('getSessionStats(null) returns zero lineCount and empty metadata', () => {
|
|
1358
|
+
// session-manager.js line 158-177: getSessionStats accepts path or content.
|
|
1359
|
+
// typeof null === 'string' is false → looksLikePath = false → content = null.
|
|
1360
|
+
// Line 177: content ? content.split('\n').length : 0 → lineCount: 0.
|
|
1361
|
+
// parseSessionMetadata(null) returns defaults → totalItems/completedItems/inProgressItems = 0.
|
|
1362
|
+
const stats = sessionManager.getSessionStats(null);
|
|
1363
|
+
assert.strictEqual(stats.lineCount, 0, 'null input should yield lineCount 0');
|
|
1364
|
+
assert.strictEqual(stats.totalItems, 0, 'null input should yield totalItems 0');
|
|
1365
|
+
assert.strictEqual(stats.completedItems, 0, 'null input should yield completedItems 0');
|
|
1366
|
+
assert.strictEqual(stats.inProgressItems, 0, 'null input should yield inProgressItems 0');
|
|
1367
|
+
assert.strictEqual(stats.hasNotes, false, 'null input should yield hasNotes false');
|
|
1368
|
+
assert.strictEqual(stats.hasContext, false, 'null input should yield hasContext false');
|
|
1369
|
+
})) passed++; else failed++;
|
|
1370
|
+
|
|
1371
|
+
// ── Round 83: getAllSessions TOCTOU statSync catch (broken symlink) ──
|
|
1372
|
+
console.log('\nRound 83: getAllSessions (broken symlink — statSync catch):');
|
|
1373
|
+
|
|
1374
|
+
if (test('getAllSessions skips broken symlink .tmp files gracefully', () => {
|
|
1375
|
+
// getAllSessions at line 241-246: statSync throws for broken symlinks,
|
|
1376
|
+
// the catch causes `continue`, skipping that entry entirely.
|
|
1377
|
+
const isoHome = path.join(os.tmpdir(), `ecc-r83-toctou-${Date.now()}`);
|
|
1378
|
+
const sessionsDir = path.join(isoHome, '.claude', 'sessions');
|
|
1379
|
+
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
1380
|
+
|
|
1381
|
+
// Create one real session file
|
|
1382
|
+
const realFile = '2026-02-10-abcd1234-session.tmp';
|
|
1383
|
+
fs.writeFileSync(path.join(sessionsDir, realFile), '# Real session\n');
|
|
1384
|
+
|
|
1385
|
+
// Create a broken symlink that matches the session filename pattern
|
|
1386
|
+
const brokenSymlink = '2026-02-10-deadbeef-session.tmp';
|
|
1387
|
+
fs.symlinkSync('/nonexistent/path/that/does/not/exist', path.join(sessionsDir, brokenSymlink));
|
|
1388
|
+
|
|
1389
|
+
const origHome = process.env.HOME;
|
|
1390
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1391
|
+
process.env.HOME = isoHome;
|
|
1392
|
+
process.env.USERPROFILE = isoHome;
|
|
1393
|
+
try {
|
|
1394
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1395
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1396
|
+
const freshManager = require('../../scripts/lib/session-manager');
|
|
1397
|
+
const result = freshManager.getAllSessions({ limit: 100 });
|
|
1398
|
+
|
|
1399
|
+
// Should have only the real session, not the broken symlink
|
|
1400
|
+
assert.strictEqual(result.total, 1, 'Should find only the real session, not the broken symlink');
|
|
1401
|
+
assert.ok(result.sessions[0].filename === realFile,
|
|
1402
|
+
`Should return the real file, got: ${result.sessions[0].filename}`);
|
|
1403
|
+
} finally {
|
|
1404
|
+
process.env.HOME = origHome;
|
|
1405
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1406
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1407
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1408
|
+
fs.rmSync(isoHome, { recursive: true, force: true });
|
|
1409
|
+
}
|
|
1410
|
+
})) passed++; else failed++;
|
|
1411
|
+
|
|
1412
|
+
// ── Round 84: getSessionById TOCTOU — statSync catch returns null for broken symlink ──
|
|
1413
|
+
console.log('\nRound 84: getSessionById (broken symlink — statSync catch):');
|
|
1414
|
+
|
|
1415
|
+
if (test('getSessionById returns null when matching session is a broken symlink', () => {
|
|
1416
|
+
// getSessionById at line 307-310: statSync throws for broken symlinks,
|
|
1417
|
+
// the catch returns null (file deleted between readdir and stat).
|
|
1418
|
+
const isoHome = path.join(os.tmpdir(), `ecc-r84-getbyid-toctou-${Date.now()}`);
|
|
1419
|
+
const sessionsDir = path.join(isoHome, '.claude', 'sessions');
|
|
1420
|
+
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
1421
|
+
|
|
1422
|
+
// Create a broken symlink that matches a session ID pattern
|
|
1423
|
+
const brokenFile = '2026-02-11-deadbeef-session.tmp';
|
|
1424
|
+
fs.symlinkSync('/nonexistent/target/that/does/not/exist', path.join(sessionsDir, brokenFile));
|
|
1425
|
+
|
|
1426
|
+
const origHome = process.env.HOME;
|
|
1427
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1428
|
+
try {
|
|
1429
|
+
process.env.HOME = isoHome;
|
|
1430
|
+
process.env.USERPROFILE = isoHome;
|
|
1431
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1432
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1433
|
+
const freshSM = require('../../scripts/lib/session-manager');
|
|
1434
|
+
|
|
1435
|
+
// Search by the short ID "deadbeef" — should match the broken symlink
|
|
1436
|
+
const result = freshSM.getSessionById('deadbeef');
|
|
1437
|
+
assert.strictEqual(result, null,
|
|
1438
|
+
'Should return null when matching session file is a broken symlink');
|
|
1439
|
+
} finally {
|
|
1440
|
+
process.env.HOME = origHome;
|
|
1441
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1442
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1443
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1444
|
+
fs.rmSync(isoHome, { recursive: true, force: true });
|
|
1445
|
+
}
|
|
1446
|
+
})) passed++; else failed++;
|
|
1447
|
+
|
|
1448
|
+
// ── Round 88: parseSessionMetadata null date/started/lastUpdated fields ──
|
|
1449
|
+
console.log('\nRound 88: parseSessionMetadata content lacking Date/Started/Updated fields:');
|
|
1450
|
+
if (test('parseSessionMetadata returns null for date, started, lastUpdated when fields absent', () => {
|
|
1451
|
+
const content = '# Title Only\n\n### Notes for Next Session\nSome notes\n';
|
|
1452
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1453
|
+
assert.strictEqual(meta.date, null,
|
|
1454
|
+
'date should be null when **Date:** field is absent');
|
|
1455
|
+
assert.strictEqual(meta.started, null,
|
|
1456
|
+
'started should be null when **Started:** field is absent');
|
|
1457
|
+
assert.strictEqual(meta.lastUpdated, null,
|
|
1458
|
+
'lastUpdated should be null when **Last Updated:** field is absent');
|
|
1459
|
+
// Confirm other fields still parse correctly
|
|
1460
|
+
assert.strictEqual(meta.title, 'Title Only');
|
|
1461
|
+
assert.strictEqual(meta.notes, 'Some notes');
|
|
1462
|
+
})) passed++; else failed++;
|
|
1463
|
+
|
|
1464
|
+
// ── Round 89: getAllSessions skips subdirectories (!entry.isFile()) ──
|
|
1465
|
+
console.log('\nRound 89: getAllSessions (subdirectory skip):');
|
|
1466
|
+
|
|
1467
|
+
if (test('getAllSessions skips subdirectories inside sessions dir', () => {
|
|
1468
|
+
// session-manager.js line 220: if (!entry.isFile() || ...) continue;
|
|
1469
|
+
// Existing tests create non-.tmp FILES to test filtering (e.g., notes.txt).
|
|
1470
|
+
// This test creates a DIRECTORY — entry.isFile() returns false, so it should be skipped.
|
|
1471
|
+
const isoHome = path.join(os.tmpdir(), `ecc-r89-subdir-skip-${Date.now()}`);
|
|
1472
|
+
const sessionsDir = path.join(isoHome, '.claude', 'sessions');
|
|
1473
|
+
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
1474
|
+
|
|
1475
|
+
// Create a real session file
|
|
1476
|
+
const realFile = '2026-02-11-abcd1234-session.tmp';
|
|
1477
|
+
fs.writeFileSync(path.join(sessionsDir, realFile), '# Test session');
|
|
1478
|
+
|
|
1479
|
+
// Create a subdirectory inside sessions dir — should be skipped by !entry.isFile()
|
|
1480
|
+
const subdir = path.join(sessionsDir, 'some-nested-dir');
|
|
1481
|
+
fs.mkdirSync(subdir);
|
|
1482
|
+
|
|
1483
|
+
// Also create a subdirectory whose name ends in .tmp — still not a file
|
|
1484
|
+
const tmpSubdir = path.join(sessionsDir, '2026-02-11-fakeid00-session.tmp');
|
|
1485
|
+
fs.mkdirSync(tmpSubdir);
|
|
1486
|
+
|
|
1487
|
+
const origHome = process.env.HOME;
|
|
1488
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1489
|
+
process.env.HOME = isoHome;
|
|
1490
|
+
process.env.USERPROFILE = isoHome;
|
|
1491
|
+
try {
|
|
1492
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1493
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1494
|
+
const freshManager = require('../../scripts/lib/session-manager');
|
|
1495
|
+
const result = freshManager.getAllSessions({ limit: 100 });
|
|
1496
|
+
|
|
1497
|
+
// Should find only the real file, not either subdirectory
|
|
1498
|
+
assert.strictEqual(result.total, 1,
|
|
1499
|
+
`Should find 1 session (the file), not subdirectories. Got ${result.total}`);
|
|
1500
|
+
assert.strictEqual(result.sessions[0].filename, realFile,
|
|
1501
|
+
`Should return the real file. Got: ${result.sessions[0].filename}`);
|
|
1502
|
+
} finally {
|
|
1503
|
+
process.env.HOME = origHome;
|
|
1504
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1505
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1506
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1507
|
+
fs.rmSync(isoHome, { recursive: true, force: true });
|
|
1508
|
+
}
|
|
1509
|
+
})) passed++; else failed++;
|
|
1510
|
+
|
|
1511
|
+
// ── Round 91: getSessionStats with mixed Windows path separators ──
|
|
1512
|
+
console.log('\nRound 91: getSessionStats (mixed Windows path separators):');
|
|
1513
|
+
|
|
1514
|
+
if (test('getSessionStats treats mixed Windows separators as a file path', () => {
|
|
1515
|
+
// session-manager.js line 166: regex /^[A-Za-z]:[/\\]/ checks only the
|
|
1516
|
+
// character right after the colon. Mixed separators like C:\Users/Mixed\session.tmp
|
|
1517
|
+
// should still match because the first separator (\) satisfies the regex.
|
|
1518
|
+
const stats = sessionManager.getSessionStats('C:\\Users/Mixed\\session.tmp');
|
|
1519
|
+
assert.strictEqual(stats.lineCount, 0,
|
|
1520
|
+
'Mixed separators should be treated as path (file does not exist → lineCount 0)');
|
|
1521
|
+
assert.strictEqual(stats.totalItems, 0, 'Non-existent path should have 0 items');
|
|
1522
|
+
})) passed++; else failed++;
|
|
1523
|
+
|
|
1524
|
+
// ── Round 92: getSessionStats with UNC path treated as content ──
|
|
1525
|
+
console.log('\nRound 92: getSessionStats (Windows UNC path):');
|
|
1526
|
+
|
|
1527
|
+
if (test('getSessionStats treats UNC path as content (not recognized as file path)', () => {
|
|
1528
|
+
// session-manager.js line 163-166: The path heuristic checks for Unix paths
|
|
1529
|
+
// (starts with /) and Windows drive-letter paths (/^[A-Za-z]:[/\\]/). UNC paths
|
|
1530
|
+
// (\\server\share\file.tmp) don't match either pattern, so the function treats
|
|
1531
|
+
// the string as pre-read content rather than a file path to read.
|
|
1532
|
+
const stats = sessionManager.getSessionStats('\\\\server\\share\\session.tmp');
|
|
1533
|
+
assert.strictEqual(stats.lineCount, 1,
|
|
1534
|
+
'UNC path should be treated as single-line content (not a recognized path)');
|
|
1535
|
+
})) passed++; else failed++;
|
|
1536
|
+
|
|
1537
|
+
// ── Round 93: getSessionStats with drive letter but no slash (regex boundary) ──
|
|
1538
|
+
console.log('\nRound 93: getSessionStats (drive letter without slash — regex boundary):');
|
|
1539
|
+
|
|
1540
|
+
if (test('getSessionStats treats drive letter without slash as content (not a path)', () => {
|
|
1541
|
+
// session-manager.js line 166: /^[A-Za-z]:[/\\]/ requires a '/' or '\'
|
|
1542
|
+
// immediately after the colon. 'Z:nosession.tmp' has 'Z:n' which does NOT
|
|
1543
|
+
// match, so looksLikePath is false even though .endsWith('.tmp') is true.
|
|
1544
|
+
const stats = sessionManager.getSessionStats('Z:nosession.tmp');
|
|
1545
|
+
assert.strictEqual(stats.lineCount, 1,
|
|
1546
|
+
'Z:nosession.tmp (no slash) should be treated as single-line content');
|
|
1547
|
+
assert.strictEqual(stats.totalItems, 0,
|
|
1548
|
+
'Content without session items should have 0 totalItems');
|
|
1549
|
+
})) passed++; else failed++;
|
|
1550
|
+
|
|
1551
|
+
// Re-establish test environment for Rounds 95-98 (these tests need sessions to exist)
|
|
1552
|
+
const tmpHome2 = path.join(os.tmpdir(), `ecc-session-mgr-test-2-${Date.now()}`);
|
|
1553
|
+
const tmpSessionsDir2 = path.join(tmpHome2, '.claude', 'sessions');
|
|
1554
|
+
fs.mkdirSync(tmpSessionsDir2, { recursive: true });
|
|
1555
|
+
const origHome2 = process.env.HOME;
|
|
1556
|
+
const origUserProfile2 = process.env.USERPROFILE;
|
|
1557
|
+
|
|
1558
|
+
// Create test session files for these tests
|
|
1559
|
+
const testSessions2 = [
|
|
1560
|
+
{ name: '2026-01-15-aaaa1111-session.tmp', content: '# Test Session 1' },
|
|
1561
|
+
{ name: '2026-02-01-bbbb2222-session.tmp', content: '# Test Session 2' },
|
|
1562
|
+
{ name: '2026-02-10-cccc3333-session.tmp', content: '# Test Session 3' },
|
|
1563
|
+
];
|
|
1564
|
+
for (const session of testSessions2) {
|
|
1565
|
+
const filePath = path.join(tmpSessionsDir2, session.name);
|
|
1566
|
+
fs.writeFileSync(filePath, session.content);
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
process.env.HOME = tmpHome2;
|
|
1570
|
+
process.env.USERPROFILE = tmpHome2;
|
|
1571
|
+
|
|
1572
|
+
// ── Round 95: getAllSessions with both negative offset AND negative limit ──
|
|
1573
|
+
console.log('\nRound 95: getAllSessions (both negative offset and negative limit):');
|
|
1574
|
+
|
|
1575
|
+
if (test('getAllSessions clamps both negative offset (to 0) and negative limit (to 1) simultaneously', () => {
|
|
1576
|
+
const result = sessionManager.getAllSessions({ offset: -5, limit: -10 });
|
|
1577
|
+
// offset clamped: Math.max(0, Math.floor(-5)) → 0
|
|
1578
|
+
// limit clamped: Math.max(1, Math.floor(-10)) → 1
|
|
1579
|
+
// slice(0, 0+1) → first session only
|
|
1580
|
+
assert.strictEqual(result.offset, 0,
|
|
1581
|
+
'Negative offset should be clamped to 0');
|
|
1582
|
+
assert.strictEqual(result.limit, 1,
|
|
1583
|
+
'Negative limit should be clamped to 1');
|
|
1584
|
+
assert.ok(result.sessions.length <= 1,
|
|
1585
|
+
'Should return at most 1 session (slice(0, 1))');
|
|
1586
|
+
})) passed++; else failed++;
|
|
1587
|
+
|
|
1588
|
+
// ── Round 96: parseSessionFilename with Feb 30 (impossible date) ──
|
|
1589
|
+
console.log('\nRound 96: parseSessionFilename (Feb 30 — impossible date):');
|
|
1590
|
+
|
|
1591
|
+
if (test('parseSessionFilename rejects Feb 30 (passes day<=31 but fails Date rollover)', () => {
|
|
1592
|
+
// Feb 30 passes the bounds check (month 1-12, day 1-31) at line 37
|
|
1593
|
+
// but new Date(2026, 1, 30) → March 2 (rollover), so getMonth() !== 1 → returns null
|
|
1594
|
+
const result = sessionManager.parseSessionFilename('2026-02-30-abcd1234-session.tmp');
|
|
1595
|
+
assert.strictEqual(result, null,
|
|
1596
|
+
'Feb 30 should be rejected by Date constructor rollover check (line 41)');
|
|
1597
|
+
})) passed++; else failed++;
|
|
1598
|
+
|
|
1599
|
+
// ── Round 96: getAllSessions with limit: Infinity ──
|
|
1600
|
+
console.log('\nRound 96: getAllSessions (limit: Infinity — pagination bypass):');
|
|
1601
|
+
|
|
1602
|
+
if (test('getAllSessions with limit: Infinity returns all sessions (no pagination)', () => {
|
|
1603
|
+
// Number(Infinity) = Infinity, Number.isNaN(Infinity) = false
|
|
1604
|
+
// Math.max(1, Math.floor(Infinity)) = Math.max(1, Infinity) = Infinity
|
|
1605
|
+
// slice(0, 0 + Infinity) returns all elements
|
|
1606
|
+
const result = sessionManager.getAllSessions({ limit: Infinity });
|
|
1607
|
+
assert.strictEqual(result.limit, Infinity,
|
|
1608
|
+
'Infinity limit should pass through (not clamped or defaulted)');
|
|
1609
|
+
assert.strictEqual(result.sessions.length, result.total,
|
|
1610
|
+
'All sessions should be returned (no pagination truncation)');
|
|
1611
|
+
assert.strictEqual(result.hasMore, false,
|
|
1612
|
+
'hasMore should be false since all sessions are returned');
|
|
1613
|
+
})) passed++; else failed++;
|
|
1614
|
+
|
|
1615
|
+
// ── Round 96: getAllSessions with limit: null ──
|
|
1616
|
+
console.log('\nRound 96: getAllSessions (limit: null — destructuring default bypass):');
|
|
1617
|
+
|
|
1618
|
+
if (test('getAllSessions with limit: null clamps to 1 (null bypasses destructuring default)', () => {
|
|
1619
|
+
// Destructuring default only fires for undefined, NOT null
|
|
1620
|
+
// rawLimit = null (not 50), Number(null) = 0, Math.max(1, 0) = 1
|
|
1621
|
+
const result = sessionManager.getAllSessions({ limit: null });
|
|
1622
|
+
assert.strictEqual(result.limit, 1,
|
|
1623
|
+
'null limit should become 1 (Number(null)=0, clamped via Math.max(1,0))');
|
|
1624
|
+
assert.ok(result.sessions.length <= 1,
|
|
1625
|
+
'Should return at most 1 session (clamped limit)');
|
|
1626
|
+
})) passed++; else failed++;
|
|
1627
|
+
|
|
1628
|
+
// ── Round 97: getAllSessions with whitespace search filters out everything ──
|
|
1629
|
+
console.log('\nRound 97: getAllSessions (whitespace search — truthy but unmatched):');
|
|
1630
|
+
|
|
1631
|
+
if (test('getAllSessions with search: " " returns empty because space is truthy but never matches shortId', () => {
|
|
1632
|
+
// session-manager.js line 233: if (search && !metadata.shortId.includes(search))
|
|
1633
|
+
// ' ' (space) is truthy so the filter is applied, but shortIds are hex strings
|
|
1634
|
+
// that never contain spaces, so ALL sessions are filtered out.
|
|
1635
|
+
// The search filter is inside the loop, so total is also 0.
|
|
1636
|
+
const result = sessionManager.getAllSessions({ search: ' ', limit: 100 });
|
|
1637
|
+
assert.strictEqual(result.sessions.length, 0,
|
|
1638
|
+
'Whitespace search should filter out all sessions (space never appears in hex shortIds)');
|
|
1639
|
+
assert.strictEqual(result.total, 0,
|
|
1640
|
+
'Total should be 0 because search filter is applied inside the loop (line 233)');
|
|
1641
|
+
assert.strictEqual(result.hasMore, false,
|
|
1642
|
+
'hasMore should be false since no sessions matched');
|
|
1643
|
+
// Contrast with null/empty search which returns all sessions:
|
|
1644
|
+
const allResult = sessionManager.getAllSessions({ search: null, limit: 100 });
|
|
1645
|
+
assert.ok(allResult.total > 0,
|
|
1646
|
+
'Null search should return sessions (confirming they exist but space filtered them)');
|
|
1647
|
+
})) passed++; else failed++;
|
|
1648
|
+
|
|
1649
|
+
// ── Round 98: getSessionById with null sessionId returns null ──
|
|
1650
|
+
console.log('\nRound 98: getSessionById (null sessionId — guarded null return):');
|
|
1651
|
+
|
|
1652
|
+
if (test('getSessionById(null) returns null when session files exist', () => {
|
|
1653
|
+
// Keep a populated sessions directory so the early input guard is exercised even when
|
|
1654
|
+
// candidate files are present.
|
|
1655
|
+
assert.strictEqual(sessionManager.getSessionById(null), null);
|
|
1656
|
+
})) passed++; else failed++;
|
|
1657
|
+
|
|
1658
|
+
// Cleanup test environment for Rounds 95-98 that needed sessions
|
|
1659
|
+
// (Round 98: parseSessionFilename below doesn't need sessions)
|
|
1660
|
+
process.env.HOME = origHome2;
|
|
1661
|
+
if (origUserProfile2 !== undefined) {
|
|
1662
|
+
process.env.USERPROFILE = origUserProfile2;
|
|
1663
|
+
} else {
|
|
1664
|
+
delete process.env.USERPROFILE;
|
|
1665
|
+
}
|
|
1666
|
+
try {
|
|
1667
|
+
fs.rmSync(tmpHome2, { recursive: true, force: true });
|
|
1668
|
+
} catch {
|
|
1669
|
+
// best-effort
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
// ── Round 98: parseSessionFilename with null input returns null ──
|
|
1673
|
+
console.log('\nRound 98: parseSessionFilename (null input is safely rejected):');
|
|
1674
|
+
|
|
1675
|
+
if (test('parseSessionFilename(null) returns null instead of throwing', () => {
|
|
1676
|
+
assert.strictEqual(sessionManager.parseSessionFilename(null), null);
|
|
1677
|
+
assert.strictEqual(sessionManager.parseSessionFilename(undefined), null);
|
|
1678
|
+
assert.strictEqual(sessionManager.parseSessionFilename(123), null);
|
|
1679
|
+
})) passed++; else failed++;
|
|
1680
|
+
|
|
1681
|
+
// ── Round 99: writeSessionContent with null path returns false (error caught) ──
|
|
1682
|
+
console.log('\nRound 99: writeSessionContent (null path — error handling):');
|
|
1683
|
+
|
|
1684
|
+
if (test('writeSessionContent(null, content) returns false (TypeError caught by try/catch)', () => {
|
|
1685
|
+
// session-manager.js lines 372-378: writeSessionContent wraps fs.writeFileSync
|
|
1686
|
+
// in a try/catch. When sessionPath is null, fs.writeFileSync throws TypeError:
|
|
1687
|
+
// 'The "path" argument must be of type string or Buffer or URL. Received null'
|
|
1688
|
+
// The catch block catches this and returns false (does not propagate).
|
|
1689
|
+
const result = sessionManager.writeSessionContent(null, 'some content');
|
|
1690
|
+
assert.strictEqual(result, false,
|
|
1691
|
+
'null path should be caught by try/catch and return false');
|
|
1692
|
+
})) passed++; else failed++;
|
|
1693
|
+
|
|
1694
|
+
// ── Round 100: parseSessionMetadata with ### inside item text (premature section termination) ──
|
|
1695
|
+
console.log('\nRound 100: parseSessionMetadata (### in item text — lazy regex truncation):');
|
|
1696
|
+
if (test('parseSessionMetadata truncates item text at embedded ### due to lazy regex lookahead', () => {
|
|
1697
|
+
const content = `# Session
|
|
1698
|
+
|
|
1699
|
+
### Completed
|
|
1700
|
+
- [x] Fix issue ### with parser
|
|
1701
|
+
- [x] Normal task
|
|
1702
|
+
|
|
1703
|
+
### In Progress
|
|
1704
|
+
- [ ] Debug output
|
|
1705
|
+
`;
|
|
1706
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1707
|
+
// The lazy regex ([\s\S]*?)(?=###|\n\n|$) terminates at the first ###
|
|
1708
|
+
// So the Completed section captures only "- [x] Fix issue " (before the inner ###)
|
|
1709
|
+
// The second item "- [x] Normal task" is lost because it's after the inner ###
|
|
1710
|
+
assert.strictEqual(meta.completed.length, 1,
|
|
1711
|
+
'Only 1 item extracted — second item is after the inner ### terminator');
|
|
1712
|
+
assert.strictEqual(meta.completed[0], 'Fix issue',
|
|
1713
|
+
'Item text truncated at embedded ### (lazy regex stops at first ### match)');
|
|
1714
|
+
})) passed++; else failed++;
|
|
1715
|
+
|
|
1716
|
+
// ── Round 101: getSessionStats with non-string input (number) throws TypeError ──
|
|
1717
|
+
console.log('\nRound 101: getSessionStats (non-string input — type confusion crash):');
|
|
1718
|
+
if (test('getSessionStats(123) throws TypeError (number reaches parseSessionMetadata → .match() fails)', () => {
|
|
1719
|
+
// typeof 123 === 'number' → looksLikePath = false → content = 123
|
|
1720
|
+
// parseSessionMetadata(123) → !123 is false → 123.match(...) → TypeError
|
|
1721
|
+
assert.throws(
|
|
1722
|
+
() => sessionManager.getSessionStats(123),
|
|
1723
|
+
{ name: 'TypeError' },
|
|
1724
|
+
'Non-string input (number) should crash in parseSessionMetadata (.match not a function)'
|
|
1725
|
+
);
|
|
1726
|
+
})) passed++; else failed++;
|
|
1727
|
+
|
|
1728
|
+
// ── Round 101: appendSessionContent(null, 'content') returns false (error caught) ──
|
|
1729
|
+
console.log('\nRound 101: appendSessionContent (null path — error handling):');
|
|
1730
|
+
if (test('appendSessionContent(null, content) returns false (TypeError caught by try/catch)', () => {
|
|
1731
|
+
const result = sessionManager.appendSessionContent(null, 'some content');
|
|
1732
|
+
assert.strictEqual(result, false,
|
|
1733
|
+
'null path should cause fs.appendFileSync to throw TypeError, caught by try/catch');
|
|
1734
|
+
})) passed++; else failed++;
|
|
1735
|
+
|
|
1736
|
+
// ── Round 102: getSessionStats with Unix nonexistent .tmp path (looksLikePath heuristic) ──
|
|
1737
|
+
console.log('\nRound 102: getSessionStats (Unix nonexistent .tmp path — looksLikePath → null content):');
|
|
1738
|
+
if (test('getSessionStats returns zeroed stats when Unix path looks like file but does not exist', () => {
|
|
1739
|
+
// session-manager.js lines 163-166: looksLikePath heuristic checks typeof string,
|
|
1740
|
+
// no newlines, endsWith('.tmp'), startsWith('/'). A nonexistent Unix path triggers
|
|
1741
|
+
// the file-read branch → readFile returns null → parseSessionMetadata(null) returns
|
|
1742
|
+
// default empty metadata → lineCount: null ? ... : 0 === 0.
|
|
1743
|
+
const stats = sessionManager.getSessionStats('/nonexistent/deep/path/session.tmp');
|
|
1744
|
+
assert.strictEqual(stats.totalItems, 0,
|
|
1745
|
+
'No items from nonexistent file (parseSessionMetadata(null) returns empty arrays)');
|
|
1746
|
+
assert.strictEqual(stats.lineCount, 0,
|
|
1747
|
+
'lineCount: 0 because content is null (ternary guard at line 177)');
|
|
1748
|
+
assert.strictEqual(stats.hasNotes, false,
|
|
1749
|
+
'No notes section in null content');
|
|
1750
|
+
assert.strictEqual(stats.hasContext, false,
|
|
1751
|
+
'No context section in null content');
|
|
1752
|
+
})) passed++; else failed++;
|
|
1753
|
+
|
|
1754
|
+
// ── Round 102: parseSessionMetadata with [x] checked items in In Progress section ──
|
|
1755
|
+
console.log('\nRound 102: parseSessionMetadata ([x] items in In Progress — regex skips checked):');
|
|
1756
|
+
if (test('parseSessionMetadata skips [x] checked items in In Progress section (regex only matches [ ])', () => {
|
|
1757
|
+
// session-manager.js line 130: progressSection regex uses `- \[ \]\s*(.+)` which
|
|
1758
|
+
// only matches unchecked checkboxes. Checked items `- [x]` in the In Progress
|
|
1759
|
+
// section are silently ignored — they don't match the regex pattern.
|
|
1760
|
+
const content = `# Session
|
|
1761
|
+
|
|
1762
|
+
### In Progress
|
|
1763
|
+
- [x] Already finished but placed here by mistake
|
|
1764
|
+
- [ ] Actually in progress
|
|
1765
|
+
- [x] Another misplaced completed item
|
|
1766
|
+
- [ ] Second active task
|
|
1767
|
+
`;
|
|
1768
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1769
|
+
assert.strictEqual(meta.inProgress.length, 2,
|
|
1770
|
+
'Only unchecked [ ] items should be captured (2 of 4)');
|
|
1771
|
+
assert.strictEqual(meta.inProgress[0], 'Actually in progress',
|
|
1772
|
+
'First unchecked item');
|
|
1773
|
+
assert.strictEqual(meta.inProgress[1], 'Second active task',
|
|
1774
|
+
'Second unchecked item');
|
|
1775
|
+
})) passed++; else failed++;
|
|
1776
|
+
|
|
1777
|
+
// ── Round 104: parseSessionMetadata with whitespace-only notes section ──
|
|
1778
|
+
console.log('\nRound 104: parseSessionMetadata (whitespace-only notes — trim reduces to empty):');
|
|
1779
|
+
if (test('parseSessionMetadata treats whitespace-only notes as absent (trim → empty string → falsy)', () => {
|
|
1780
|
+
// session-manager.js line 139: `metadata.notes = notesSection[1].trim()` — when the
|
|
1781
|
+
// Notes section heading exists but only contains whitespace/newlines, trim() returns "".
|
|
1782
|
+
// Then getSessionStats line 178: `hasNotes: !!metadata.notes` — `!!""` is `false`.
|
|
1783
|
+
// So a notes section with only whitespace is treated as "no notes."
|
|
1784
|
+
const content = `# Session
|
|
1785
|
+
|
|
1786
|
+
### Notes for Next Session
|
|
1787
|
+
\t
|
|
1788
|
+
|
|
1789
|
+
### Context to Load
|
|
1790
|
+
\`\`\`
|
|
1791
|
+
file.ts
|
|
1792
|
+
\`\`\`
|
|
1793
|
+
`;
|
|
1794
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1795
|
+
assert.strictEqual(meta.notes, '',
|
|
1796
|
+
'Whitespace-only notes should trim to empty string');
|
|
1797
|
+
// Verify getSessionStats reports hasNotes as false
|
|
1798
|
+
const stats = sessionManager.getSessionStats(content);
|
|
1799
|
+
assert.strictEqual(stats.hasNotes, false,
|
|
1800
|
+
'hasNotes should be false because !!"" is false (whitespace-only notes treated as absent)');
|
|
1801
|
+
assert.strictEqual(stats.hasContext, true,
|
|
1802
|
+
'hasContext should be true (context section has actual content)');
|
|
1803
|
+
})) passed++; else failed++;
|
|
1804
|
+
|
|
1805
|
+
// ── Round 105: parseSessionMetadata blank-line boundary truncates section items ──
|
|
1806
|
+
console.log('\nRound 105: parseSessionMetadata (blank line inside section — regex stops at \\n\\n):');
|
|
1807
|
+
|
|
1808
|
+
if (test('parseSessionMetadata drops completed items after a blank line within the section', () => {
|
|
1809
|
+
// session-manager.js line 119: regex `(?=###|\n\n|$)` uses lazy [\s\S]*? with
|
|
1810
|
+
// a lookahead that stops at the first \n\n. If completed items are separated
|
|
1811
|
+
// by a blank line, items below the blank line are silently lost.
|
|
1812
|
+
const content = '# Session\n\n### Completed\n- [x] Task A\n\n- [x] Task B\n\n### In Progress\n- [ ] Task C\n';
|
|
1813
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1814
|
+
// The regex captures "- [x] Task A\n" then hits \n\n and stops.
|
|
1815
|
+
// "- [x] Task B" is between the two sections but outside both regex captures.
|
|
1816
|
+
assert.strictEqual(meta.completed.length, 1,
|
|
1817
|
+
'Only Task A captured — blank line terminates the section regex before Task B');
|
|
1818
|
+
assert.strictEqual(meta.completed[0], 'Task A',
|
|
1819
|
+
'First completed item should be Task A');
|
|
1820
|
+
// Task B is lost — it appears after the blank line, outside the captured range
|
|
1821
|
+
assert.strictEqual(meta.inProgress.length, 1,
|
|
1822
|
+
'In Progress should still capture Task C');
|
|
1823
|
+
assert.strictEqual(meta.inProgress[0], 'Task C',
|
|
1824
|
+
'In-progress item should be Task C');
|
|
1825
|
+
})) passed++; else failed++;
|
|
1826
|
+
|
|
1827
|
+
// ── Round 106: getAllSessions with array/object limit — Number() coercion edge cases ──
|
|
1828
|
+
console.log('\nRound 106: getAllSessions (array/object limit coercion — Number([5])→5, Number({})→NaN→50):');
|
|
1829
|
+
if (test('getAllSessions coerces array/object limit via Number() with NaN fallback to 50', () => {
|
|
1830
|
+
const isoHome = path.join(os.tmpdir(), `ecc-r106-limit-coerce-${Date.now()}`);
|
|
1831
|
+
const isoSessionsDir = path.join(isoHome, '.claude', 'sessions');
|
|
1832
|
+
fs.mkdirSync(isoSessionsDir, { recursive: true });
|
|
1833
|
+
// Create 3 test sessions
|
|
1834
|
+
for (let i = 0; i < 3; i++) {
|
|
1835
|
+
const name = `2026-03-0${i + 1}-aaaa${i}${i}${i}${i}-session.tmp`;
|
|
1836
|
+
const filePath = path.join(isoSessionsDir, name);
|
|
1837
|
+
fs.writeFileSync(filePath, `# Session ${i}`);
|
|
1838
|
+
const mtime = new Date(Date.now() - (3 - i) * 60000);
|
|
1839
|
+
fs.utimesSync(filePath, mtime, mtime);
|
|
1840
|
+
}
|
|
1841
|
+
const origHome = process.env.HOME;
|
|
1842
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1843
|
+
process.env.HOME = isoHome;
|
|
1844
|
+
process.env.USERPROFILE = isoHome;
|
|
1845
|
+
try {
|
|
1846
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1847
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1848
|
+
const freshManager = require('../../scripts/lib/session-manager');
|
|
1849
|
+
// Object limit: Number({}) → NaN → fallback to 50
|
|
1850
|
+
const objResult = freshManager.getAllSessions({ limit: {} });
|
|
1851
|
+
assert.strictEqual(objResult.limit, 50,
|
|
1852
|
+
'Object limit should coerce to NaN → fallback to default 50');
|
|
1853
|
+
assert.strictEqual(objResult.total, 3, 'Should still find all 3 sessions');
|
|
1854
|
+
// Single-element array: Number([2]) → 2
|
|
1855
|
+
const arrResult = freshManager.getAllSessions({ limit: [2] });
|
|
1856
|
+
assert.strictEqual(arrResult.limit, 2,
|
|
1857
|
+
'Single-element array [2] coerces to Number 2 via Number([2])');
|
|
1858
|
+
assert.strictEqual(arrResult.sessions.length, 2, 'Should return only 2 sessions');
|
|
1859
|
+
assert.strictEqual(arrResult.hasMore, true, 'hasMore should be true with limit 2 of 3');
|
|
1860
|
+
// Multi-element array: Number([1,2]) → NaN → fallback to 50
|
|
1861
|
+
const multiArrResult = freshManager.getAllSessions({ limit: [1, 2] });
|
|
1862
|
+
assert.strictEqual(multiArrResult.limit, 50,
|
|
1863
|
+
'Multi-element array [1,2] coerces to NaN → fallback to 50');
|
|
1864
|
+
} finally {
|
|
1865
|
+
process.env.HOME = origHome;
|
|
1866
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1867
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1868
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1869
|
+
fs.rmSync(isoHome, { recursive: true, force: true });
|
|
1870
|
+
}
|
|
1871
|
+
})) passed++; else failed++;
|
|
1872
|
+
|
|
1873
|
+
// ── Round 109: getAllSessions skips .tmp files that don't match session filename format ──
|
|
1874
|
+
console.log('\nRound 109: getAllSessions (non-session .tmp files — parseSessionFilename returns null → skip):');
|
|
1875
|
+
if (test('getAllSessions ignores .tmp files with non-matching filenames', () => {
|
|
1876
|
+
const isoHome = path.join(os.tmpdir(), `ecc-r109-nonsession-${Date.now()}`);
|
|
1877
|
+
const isoSessionsDir = path.join(isoHome, '.claude', 'sessions');
|
|
1878
|
+
fs.mkdirSync(isoSessionsDir, { recursive: true });
|
|
1879
|
+
// Create one valid session file
|
|
1880
|
+
const validName = '2026-03-01-abcd1234-session.tmp';
|
|
1881
|
+
fs.writeFileSync(path.join(isoSessionsDir, validName), '# Valid Session');
|
|
1882
|
+
// Create non-session .tmp files that don't match the expected pattern
|
|
1883
|
+
fs.writeFileSync(path.join(isoSessionsDir, 'notes.tmp'), 'personal notes');
|
|
1884
|
+
fs.writeFileSync(path.join(isoSessionsDir, 'scratch.tmp'), 'scratch data');
|
|
1885
|
+
fs.writeFileSync(path.join(isoSessionsDir, 'backup-2026.tmp'), 'backup');
|
|
1886
|
+
const origHome = process.env.HOME;
|
|
1887
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
1888
|
+
process.env.HOME = isoHome;
|
|
1889
|
+
process.env.USERPROFILE = isoHome;
|
|
1890
|
+
try {
|
|
1891
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1892
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1893
|
+
const freshManager = require('../../scripts/lib/session-manager');
|
|
1894
|
+
const result = freshManager.getAllSessions({ limit: 100 });
|
|
1895
|
+
assert.strictEqual(result.total, 1,
|
|
1896
|
+
'Should find only 1 valid session (non-matching .tmp files skipped via !metadata continue)');
|
|
1897
|
+
assert.strictEqual(result.sessions[0].shortId, 'abcd1234',
|
|
1898
|
+
'The one valid session should have correct shortId');
|
|
1899
|
+
} finally {
|
|
1900
|
+
process.env.HOME = origHome;
|
|
1901
|
+
process.env.USERPROFILE = origUserProfile;
|
|
1902
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
1903
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
1904
|
+
fs.rmSync(isoHome, { recursive: true, force: true });
|
|
1905
|
+
}
|
|
1906
|
+
})) passed++; else failed++;
|
|
1907
|
+
|
|
1908
|
+
// ── Round 108: getSessionSize exact boundary at 1024 bytes — B→KB transition ──
|
|
1909
|
+
console.log('\nRound 108: getSessionSize (exact 1024-byte boundary — < means 1024 is KB, 1023 is B):');
|
|
1910
|
+
if (test('getSessionSize returns KB at exactly 1024 bytes and B at 1023', () => {
|
|
1911
|
+
const dir = createTempSessionDir();
|
|
1912
|
+
try {
|
|
1913
|
+
// Exactly 1024 bytes → size < 1024 is FALSE → goes to KB branch
|
|
1914
|
+
const atBoundary = path.join(dir, 'exact-1024.tmp');
|
|
1915
|
+
fs.writeFileSync(atBoundary, 'x'.repeat(1024));
|
|
1916
|
+
const sizeAt = sessionManager.getSessionSize(atBoundary);
|
|
1917
|
+
assert.strictEqual(sizeAt, '1.0 KB',
|
|
1918
|
+
'Exactly 1024 bytes should return "1.0 KB" (not "1024 B")');
|
|
1919
|
+
|
|
1920
|
+
// 1023 bytes → size < 1024 is TRUE → stays in B branch
|
|
1921
|
+
const belowBoundary = path.join(dir, 'below-1024.tmp');
|
|
1922
|
+
fs.writeFileSync(belowBoundary, 'x'.repeat(1023));
|
|
1923
|
+
const sizeBelow = sessionManager.getSessionSize(belowBoundary);
|
|
1924
|
+
assert.strictEqual(sizeBelow, '1023 B',
|
|
1925
|
+
'1023 bytes should return "1023 B" (still in bytes range)');
|
|
1926
|
+
|
|
1927
|
+
// Exactly 1MB boundary → 1048576 bytes
|
|
1928
|
+
const atMB = path.join(dir, 'exact-1mb.tmp');
|
|
1929
|
+
fs.writeFileSync(atMB, 'x'.repeat(1024 * 1024));
|
|
1930
|
+
const sizeMB = sessionManager.getSessionSize(atMB);
|
|
1931
|
+
assert.strictEqual(sizeMB, '1.0 MB',
|
|
1932
|
+
'Exactly 1MB should return "1.0 MB" (not "1024.0 KB")');
|
|
1933
|
+
} finally {
|
|
1934
|
+
cleanup(dir);
|
|
1935
|
+
}
|
|
1936
|
+
})) passed++; else failed++;
|
|
1937
|
+
|
|
1938
|
+
// ── Round 110: parseSessionFilename year 0000 — JS Date maps year 0 to 1900 ──
|
|
1939
|
+
console.log('\nRound 110: parseSessionFilename (year 0000 — Date constructor maps 0→1900):');
|
|
1940
|
+
if (test('parseSessionFilename with year 0000 produces datetime in 1900 due to JS Date legacy mapping', () => {
|
|
1941
|
+
// JavaScript's multi-arg Date constructor treats years 0-99 as 1900-1999
|
|
1942
|
+
// So new Date(0, 0, 1) → January 1, 1900 (not year 0000)
|
|
1943
|
+
const result = sessionManager.parseSessionFilename('0000-01-01-abcd1234-session.tmp');
|
|
1944
|
+
assert.notStrictEqual(result, null, 'Should parse successfully (regex \\d{4} matches 0000)');
|
|
1945
|
+
assert.strictEqual(result.date, '0000-01-01', 'Date string should be "0000-01-01"');
|
|
1946
|
+
assert.strictEqual(result.shortId, 'abcd1234');
|
|
1947
|
+
// The key quirk: datetime is year 1900, not 0000
|
|
1948
|
+
assert.strictEqual(result.datetime.getFullYear(), 1900,
|
|
1949
|
+
'JS Date maps year 0 to 1900 in multi-arg constructor');
|
|
1950
|
+
// Year 99 maps to 1999
|
|
1951
|
+
const result99 = sessionManager.parseSessionFilename('0099-06-15-testid01-session.tmp');
|
|
1952
|
+
assert.notStrictEqual(result99, null, 'Year 0099 should also parse');
|
|
1953
|
+
assert.strictEqual(result99.datetime.getFullYear(), 1999,
|
|
1954
|
+
'JS Date maps year 99 to 1999');
|
|
1955
|
+
// Year 100 does NOT get the 1900 mapping — it stays as year 100
|
|
1956
|
+
const result100 = sessionManager.parseSessionFilename('0100-03-10-validid1-session.tmp');
|
|
1957
|
+
assert.notStrictEqual(result100, null, 'Year 0100 should also parse');
|
|
1958
|
+
assert.strictEqual(result100.datetime.getFullYear(), 100,
|
|
1959
|
+
'Year 100+ is not affected by the 0-99 → 1900-1999 mapping');
|
|
1960
|
+
})) passed++; else failed++;
|
|
1961
|
+
|
|
1962
|
+
// ── Round 110: parseSessionFilename accepts mixed-case IDs ──
|
|
1963
|
+
console.log('\nRound 110: parseSessionFilename (mixed-case IDs are accepted):');
|
|
1964
|
+
if (test('parseSessionFilename accepts filenames with uppercase characters in short ID', () => {
|
|
1965
|
+
const upperResult = sessionManager.parseSessionFilename('2026-01-15-ABCD1234-session.tmp');
|
|
1966
|
+
assert.notStrictEqual(upperResult, null,
|
|
1967
|
+
'All-uppercase ID should be accepted');
|
|
1968
|
+
assert.strictEqual(upperResult.shortId, 'ABCD1234');
|
|
1969
|
+
|
|
1970
|
+
const mixedResult = sessionManager.parseSessionFilename('2026-01-15-AbCd1234-session.tmp');
|
|
1971
|
+
assert.notStrictEqual(mixedResult, null,
|
|
1972
|
+
'Mixed-case ID should be accepted');
|
|
1973
|
+
assert.strictEqual(mixedResult.shortId, 'AbCd1234');
|
|
1974
|
+
|
|
1975
|
+
const lowerResult = sessionManager.parseSessionFilename('2026-01-15-abcd1234-session.tmp');
|
|
1976
|
+
assert.notStrictEqual(lowerResult, null,
|
|
1977
|
+
'All-lowercase ID should still be accepted');
|
|
1978
|
+
assert.strictEqual(lowerResult.shortId, 'abcd1234');
|
|
1979
|
+
})) passed++; else failed++;
|
|
1980
|
+
|
|
1981
|
+
// ── Round 111: parseSessionMetadata context with nested triple backticks — lazy regex truncation ──
|
|
1982
|
+
console.log('\nRound 111: parseSessionMetadata (nested ``` in context — lazy \\S*? stops at first ```):");');
|
|
1983
|
+
if (test('parseSessionMetadata context capture truncated by nested triple backticks', () => {
|
|
1984
|
+
// The regex: /### Context to Load\s*\n```\n([\s\S]*?)```/
|
|
1985
|
+
// The lazy [\s\S]*? matches as few chars as possible, so it stops at the
|
|
1986
|
+
// FIRST ``` it encounters — even if that's inside the code block content.
|
|
1987
|
+
const content = [
|
|
1988
|
+
'# Session',
|
|
1989
|
+
'',
|
|
1990
|
+
'### Context to Load',
|
|
1991
|
+
'```',
|
|
1992
|
+
'const x = 1;',
|
|
1993
|
+
'```nested code block```', // Inner ``` causes premature match end
|
|
1994
|
+
'const y = 2;',
|
|
1995
|
+
'```'
|
|
1996
|
+
].join('\n');
|
|
1997
|
+
const meta = sessionManager.parseSessionMetadata(content);
|
|
1998
|
+
// Lazy regex stops at the inner ```, so context only captures "const x = 1;\n"
|
|
1999
|
+
assert.ok(meta.context.includes('const x = 1'),
|
|
2000
|
+
'Context should contain text before the inner backticks');
|
|
2001
|
+
assert.ok(!meta.context.includes('const y = 2'),
|
|
2002
|
+
'Context should NOT contain text after inner ``` (lazy regex stops early)');
|
|
2003
|
+
// Without nested backticks, full content is captured
|
|
2004
|
+
const cleanContent = [
|
|
2005
|
+
'# Session',
|
|
2006
|
+
'',
|
|
2007
|
+
'### Context to Load',
|
|
2008
|
+
'```',
|
|
2009
|
+
'const x = 1;',
|
|
2010
|
+
'const y = 2;',
|
|
2011
|
+
'```'
|
|
2012
|
+
].join('\n');
|
|
2013
|
+
const cleanMeta = sessionManager.parseSessionMetadata(cleanContent);
|
|
2014
|
+
assert.ok(cleanMeta.context.includes('const x = 1'),
|
|
2015
|
+
'Clean context should have first line');
|
|
2016
|
+
assert.ok(cleanMeta.context.includes('const y = 2'),
|
|
2017
|
+
'Clean context should have second line');
|
|
2018
|
+
})) passed++; else failed++;
|
|
2019
|
+
|
|
2020
|
+
// ── Round 112: getSessionStats with newline-containing absolute path — treated as content ──
|
|
2021
|
+
console.log('\nRound 112: getSessionStats (newline-in-path heuristic):');
|
|
2022
|
+
if (test('getSessionStats treats absolute .tmp path containing newline as content, not a file path', () => {
|
|
2023
|
+
// The looksLikePath heuristic at line 163-166 checks:
|
|
2024
|
+
// !sessionPathOrContent.includes('\n')
|
|
2025
|
+
// A string with embedded newline fails this check and is treated as content
|
|
2026
|
+
const pathWithNewline = '/tmp/sessions/2026-01-15\n-abcd1234-session.tmp';
|
|
2027
|
+
|
|
2028
|
+
// This should NOT throw (it's treated as content, not a path that doesn't exist)
|
|
2029
|
+
const stats = sessionManager.getSessionStats(pathWithNewline);
|
|
2030
|
+
assert.ok(stats, 'Should return stats object (treating input as content)');
|
|
2031
|
+
// The "content" has 2 lines (split by the embedded \n)
|
|
2032
|
+
assert.strictEqual(stats.lineCount, 2,
|
|
2033
|
+
'Should count 2 lines in the "content" (split at \\n)');
|
|
2034
|
+
// No markdown headings = no completed/in-progress items
|
|
2035
|
+
assert.strictEqual(stats.totalItems, 0,
|
|
2036
|
+
'Should find 0 items in non-markdown content');
|
|
2037
|
+
|
|
2038
|
+
// Contrast: a real absolute path without newlines IS treated as a path
|
|
2039
|
+
const realPath = '/tmp/nonexistent-session.tmp';
|
|
2040
|
+
const realStats = sessionManager.getSessionStats(realPath);
|
|
2041
|
+
// getSessionContent returns '' for non-existent files, so lineCount = 1 (empty string split)
|
|
2042
|
+
assert.ok(realStats, 'Should return stats even for nonexistent path');
|
|
2043
|
+
assert.strictEqual(realStats.lineCount, 0,
|
|
2044
|
+
'Non-existent file returns empty content with 0 lines');
|
|
2045
|
+
})) passed++; else failed++;
|
|
2046
|
+
|
|
2047
|
+
// ── Round 112: appendSessionContent with read-only file — returns false ──
|
|
2048
|
+
console.log('\nRound 112: appendSessionContent (read-only file):');
|
|
2049
|
+
if (test('appendSessionContent returns false when file is read-only (EACCES)', () => {
|
|
2050
|
+
if (process.platform === 'win32') {
|
|
2051
|
+
// chmod doesn't work reliably on Windows — skip
|
|
2052
|
+
assert.ok(true, 'Skipped on Windows');
|
|
2053
|
+
return;
|
|
2054
|
+
}
|
|
2055
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'r112-readonly-'));
|
|
2056
|
+
const readOnlyFile = path.join(tmpDir, '2026-01-15-session.tmp');
|
|
2057
|
+
try {
|
|
2058
|
+
fs.writeFileSync(readOnlyFile, '# Session\n\nInitial content\n');
|
|
2059
|
+
// Make file read-only
|
|
2060
|
+
fs.chmodSync(readOnlyFile, 0o444);
|
|
2061
|
+
// Verify it exists and is readable
|
|
2062
|
+
const content = fs.readFileSync(readOnlyFile, 'utf8');
|
|
2063
|
+
assert.ok(content.includes('Initial content'), 'File should be readable');
|
|
2064
|
+
|
|
2065
|
+
// appendSessionContent should catch EACCES and return false
|
|
2066
|
+
const result = sessionManager.appendSessionContent(readOnlyFile, '\nAppended data');
|
|
2067
|
+
assert.strictEqual(result, false,
|
|
2068
|
+
'Should return false when file is read-only (fs.appendFileSync throws EACCES)');
|
|
2069
|
+
|
|
2070
|
+
// Verify original content unchanged
|
|
2071
|
+
const afterContent = fs.readFileSync(readOnlyFile, 'utf8');
|
|
2072
|
+
assert.ok(!afterContent.includes('Appended data'),
|
|
2073
|
+
'Original content should be unchanged');
|
|
2074
|
+
} finally {
|
|
2075
|
+
try { fs.chmodSync(readOnlyFile, 0o644); } catch (_e) { /* ignore permission errors */ }
|
|
2076
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
2077
|
+
}
|
|
2078
|
+
})) passed++; else failed++;
|
|
2079
|
+
|
|
2080
|
+
// ── Round 113: parseSessionFilename century leap year validation (1900, 2100 not leap; 2000 is) ──
|
|
2081
|
+
console.log('\nRound 113: parseSessionFilename (century leap year — 100/400 rules):');
|
|
2082
|
+
if (test('parseSessionFilename rejects Feb 29 in century non-leap years (1900, 2100) but accepts 2000', () => {
|
|
2083
|
+
// Gregorian rule: divisible by 100 → NOT leap, UNLESS also divisible by 400
|
|
2084
|
+
// 1900: divisible by 100 but NOT by 400 → NOT leap → Feb 29 invalid
|
|
2085
|
+
const result1900 = sessionManager.parseSessionFilename('1900-02-29-abcd1234-session.tmp');
|
|
2086
|
+
assert.strictEqual(result1900, null,
|
|
2087
|
+
'1900 is NOT a leap year (div by 100 but not 400) — Feb 29 should be rejected');
|
|
2088
|
+
|
|
2089
|
+
// 2100: same rule — NOT leap
|
|
2090
|
+
const result2100 = sessionManager.parseSessionFilename('2100-02-29-test1234-session.tmp');
|
|
2091
|
+
assert.strictEqual(result2100, null,
|
|
2092
|
+
'2100 is NOT a leap year — Feb 29 should be rejected');
|
|
2093
|
+
|
|
2094
|
+
// 2000: divisible by 400 → IS leap → Feb 29 valid
|
|
2095
|
+
const result2000 = sessionManager.parseSessionFilename('2000-02-29-leap2000-session.tmp');
|
|
2096
|
+
assert.notStrictEqual(result2000, null,
|
|
2097
|
+
'2000 IS a leap year (div by 400) — Feb 29 should be accepted');
|
|
2098
|
+
assert.strictEqual(result2000.date, '2000-02-29');
|
|
2099
|
+
|
|
2100
|
+
// 2400: also divisible by 400 → IS leap
|
|
2101
|
+
const result2400 = sessionManager.parseSessionFilename('2400-02-29-test2400-session.tmp');
|
|
2102
|
+
assert.notStrictEqual(result2400, null,
|
|
2103
|
+
'2400 IS a leap year (div by 400) — Feb 29 should be accepted');
|
|
2104
|
+
|
|
2105
|
+
// Verify Feb 28 always works in non-leap century years
|
|
2106
|
+
const result1900Feb28 = sessionManager.parseSessionFilename('1900-02-28-abcd1234-session.tmp');
|
|
2107
|
+
assert.notStrictEqual(result1900Feb28, null,
|
|
2108
|
+
'Feb 28 should always be valid even in non-leap years');
|
|
2109
|
+
})) passed++; else failed++;
|
|
2110
|
+
|
|
2111
|
+
// ── Round 113: parseSessionMetadata title with markdown formatting — raw markdown preserved ──
|
|
2112
|
+
console.log('\nRound 113: parseSessionMetadata (title with markdown formatting — raw markdown preserved):');
|
|
2113
|
+
if (test('parseSessionMetadata captures raw markdown formatting in title without stripping', () => {
|
|
2114
|
+
// The regex /^#\s+(.+)$/m captures everything after "# ", including markdown
|
|
2115
|
+
const boldContent = '# **Important Session**\n\nSome content';
|
|
2116
|
+
const boldMeta = sessionManager.parseSessionMetadata(boldContent);
|
|
2117
|
+
assert.strictEqual(boldMeta.title, '**Important Session**',
|
|
2118
|
+
'Bold markdown ** should be preserved in title (not stripped)');
|
|
2119
|
+
|
|
2120
|
+
// Inline code in title
|
|
2121
|
+
const codeContent = '# `fix-bug` Session\n\nContent here';
|
|
2122
|
+
const codeMeta = sessionManager.parseSessionMetadata(codeContent);
|
|
2123
|
+
assert.strictEqual(codeMeta.title, '`fix-bug` Session',
|
|
2124
|
+
'Inline code backticks should be preserved in title');
|
|
2125
|
+
|
|
2126
|
+
// Italic in title
|
|
2127
|
+
const italicContent = '# _Urgent_ Review\n\n**Date:** 2026-01-01';
|
|
2128
|
+
const italicMeta = sessionManager.parseSessionMetadata(italicContent);
|
|
2129
|
+
assert.strictEqual(italicMeta.title, '_Urgent_ Review',
|
|
2130
|
+
'Italic underscores should be preserved in title');
|
|
2131
|
+
|
|
2132
|
+
// Mixed markdown in title
|
|
2133
|
+
const mixedContent = '# **Bold** and `code` and _italic_\n\nBody text';
|
|
2134
|
+
const mixedMeta = sessionManager.parseSessionMetadata(mixedContent);
|
|
2135
|
+
assert.strictEqual(mixedMeta.title, '**Bold** and `code` and _italic_',
|
|
2136
|
+
'Mixed markdown should all be preserved as raw text');
|
|
2137
|
+
|
|
2138
|
+
// Title with trailing whitespace (trim should remove it)
|
|
2139
|
+
const trailingContent = '# Title with spaces \n\nBody';
|
|
2140
|
+
const trailingMeta = sessionManager.parseSessionMetadata(trailingContent);
|
|
2141
|
+
assert.strictEqual(trailingMeta.title, 'Title with spaces',
|
|
2142
|
+
'Trailing whitespace should be trimmed');
|
|
2143
|
+
})) passed++; else failed++;
|
|
2144
|
+
|
|
2145
|
+
// ── Round 115: parseSessionMetadata with CRLF line endings — section boundaries differ ──
|
|
2146
|
+
console.log('\nRound 115: parseSessionMetadata (CRLF line endings — \\r\\n vs \\n in section regexes):');
|
|
2147
|
+
if (test('parseSessionMetadata handles CRLF content — title trimmed, sections may over-capture', () => {
|
|
2148
|
+
// Title regex /^#\s+(.+)$/m: . matches \r, trim() removes it
|
|
2149
|
+
const crlfTitle = '# My Session\r\n\r\n**Date:** 2026-01-15';
|
|
2150
|
+
const titleMeta = sessionManager.parseSessionMetadata(crlfTitle);
|
|
2151
|
+
assert.strictEqual(titleMeta.title, 'My Session',
|
|
2152
|
+
'Title should be trimmed (\\r removed by .trim())');
|
|
2153
|
+
assert.strictEqual(titleMeta.date, '2026-01-15',
|
|
2154
|
+
'Date extraction unaffected by CRLF');
|
|
2155
|
+
|
|
2156
|
+
// Completed section with CRLF: regex ### Completed\s*\n works because \s* matches \r
|
|
2157
|
+
// But the boundary (?=###|\n\n|$) — \n\n won't match \r\n\r\n
|
|
2158
|
+
const crlfSections = [
|
|
2159
|
+
'# Session\r\n',
|
|
2160
|
+
'\r\n',
|
|
2161
|
+
'### Completed\r\n',
|
|
2162
|
+
'- [x] Task A\r\n',
|
|
2163
|
+
'- [x] Task B\r\n',
|
|
2164
|
+
'\r\n',
|
|
2165
|
+
'### In Progress\r\n',
|
|
2166
|
+
'- [ ] Task C\r\n'
|
|
2167
|
+
].join('');
|
|
2168
|
+
|
|
2169
|
+
const sectionMeta = sessionManager.parseSessionMetadata(crlfSections);
|
|
2170
|
+
|
|
2171
|
+
// \s* in "### Completed\s*\n" matches the \r before \n, so section header matches
|
|
2172
|
+
assert.ok(sectionMeta.completed.length >= 2,
|
|
2173
|
+
'Should find at least 2 completed items (\\s* consumes \\r before \\n)');
|
|
2174
|
+
assert.ok(sectionMeta.completed.includes('Task A'), 'Should find Task A');
|
|
2175
|
+
assert.ok(sectionMeta.completed.includes('Task B'), 'Should find Task B');
|
|
2176
|
+
|
|
2177
|
+
// In Progress section: \n\n boundary fails on \r\n\r\n, so the lazy [\s\S]*?
|
|
2178
|
+
// stops at ### instead — this still works because ### is present
|
|
2179
|
+
assert.ok(sectionMeta.inProgress.length >= 1,
|
|
2180
|
+
'Should find at least 1 in-progress item');
|
|
2181
|
+
assert.ok(sectionMeta.inProgress.includes('Task C'), 'Should find Task C');
|
|
2182
|
+
|
|
2183
|
+
// Edge case: CRLF content with NO section headers after Completed —
|
|
2184
|
+
// \n\n boundary fails, so [\s\S]*? falls through to $ (end of string)
|
|
2185
|
+
const crlfNoNextSection = [
|
|
2186
|
+
'# Session\r\n',
|
|
2187
|
+
'\r\n',
|
|
2188
|
+
'### Completed\r\n',
|
|
2189
|
+
'- [x] Only task\r\n',
|
|
2190
|
+
'\r\n',
|
|
2191
|
+
'Some trailing text\r\n'
|
|
2192
|
+
].join('');
|
|
2193
|
+
|
|
2194
|
+
const noNextMeta = sessionManager.parseSessionMetadata(crlfNoNextSection);
|
|
2195
|
+
// Without a ### boundary, the \n\n lookahead fails on \r\n\r\n,
|
|
2196
|
+
// so [\s\S]*? extends to $ and captures everything including trailing text
|
|
2197
|
+
assert.ok(noNextMeta.completed.length >= 1,
|
|
2198
|
+
'Should find at least 1 completed item in CRLF-only content');
|
|
2199
|
+
})) passed++; else failed++;
|
|
2200
|
+
|
|
2201
|
+
// ── Round 117: getSessionSize boundary values — B/KB/MB formatting thresholds ──
|
|
2202
|
+
console.log('\nRound 117: getSessionSize (B/KB/MB formatting at exact boundary thresholds):');
|
|
2203
|
+
if (test('getSessionSize formats correctly at B→KB boundary (1023→"1023 B", 1024→"1.0 KB") and KB→MB', () => {
|
|
2204
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'r117-size-boundary-'));
|
|
2205
|
+
try {
|
|
2206
|
+
// Zero-byte file
|
|
2207
|
+
const zeroFile = path.join(tmpDir, '2026-01-01-session.tmp');
|
|
2208
|
+
fs.writeFileSync(zeroFile, '');
|
|
2209
|
+
assert.strictEqual(sessionManager.getSessionSize(zeroFile), '0 B',
|
|
2210
|
+
'Empty file should be "0 B"');
|
|
2211
|
+
|
|
2212
|
+
// 1 byte file
|
|
2213
|
+
const oneByteFile = path.join(tmpDir, '2026-01-02-session.tmp');
|
|
2214
|
+
fs.writeFileSync(oneByteFile, 'x');
|
|
2215
|
+
assert.strictEqual(sessionManager.getSessionSize(oneByteFile), '1 B',
|
|
2216
|
+
'Single byte file should be "1 B"');
|
|
2217
|
+
|
|
2218
|
+
// 1023 bytes — last value in B range (size < 1024)
|
|
2219
|
+
const file1023 = path.join(tmpDir, '2026-01-03-session.tmp');
|
|
2220
|
+
fs.writeFileSync(file1023, 'x'.repeat(1023));
|
|
2221
|
+
assert.strictEqual(sessionManager.getSessionSize(file1023), '1023 B',
|
|
2222
|
+
'1023 bytes is still in B range (< 1024)');
|
|
2223
|
+
|
|
2224
|
+
// 1024 bytes — first value in KB range (size >= 1024, < 1024*1024)
|
|
2225
|
+
const file1024 = path.join(tmpDir, '2026-01-04-session.tmp');
|
|
2226
|
+
fs.writeFileSync(file1024, 'x'.repeat(1024));
|
|
2227
|
+
assert.strictEqual(sessionManager.getSessionSize(file1024), '1.0 KB',
|
|
2228
|
+
'1024 bytes = exactly 1.0 KB');
|
|
2229
|
+
|
|
2230
|
+
// 1025 bytes — KB with decimal
|
|
2231
|
+
const file1025 = path.join(tmpDir, '2026-01-05-session.tmp');
|
|
2232
|
+
fs.writeFileSync(file1025, 'x'.repeat(1025));
|
|
2233
|
+
assert.strictEqual(sessionManager.getSessionSize(file1025), '1.0 KB',
|
|
2234
|
+
'1025 bytes rounds to 1.0 KB (1025/1024 = 1.000...)');
|
|
2235
|
+
|
|
2236
|
+
// Non-existent file returns '0 B'
|
|
2237
|
+
assert.strictEqual(sessionManager.getSessionSize('/nonexistent/file.tmp'), '0 B',
|
|
2238
|
+
'Non-existent file should return "0 B"');
|
|
2239
|
+
} finally {
|
|
2240
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
2241
|
+
}
|
|
2242
|
+
})) passed++; else failed++;
|
|
2243
|
+
|
|
2244
|
+
// ── Round 117: parseSessionFilename accepts uppercase, underscores, and short IDs ──
|
|
2245
|
+
console.log('\nRound 117: parseSessionFilename (uppercase, underscores, and short IDs are accepted):');
|
|
2246
|
+
if (test('parseSessionFilename accepts uppercase short IDs, underscores, and 7-char names', () => {
|
|
2247
|
+
const upper = sessionManager.parseSessionFilename('2026-01-15-ABCDEFGH-session.tmp');
|
|
2248
|
+
assert.notStrictEqual(upper, null,
|
|
2249
|
+
'All-uppercase ID should be accepted');
|
|
2250
|
+
assert.strictEqual(upper.shortId, 'ABCDEFGH');
|
|
2251
|
+
|
|
2252
|
+
const mixed = sessionManager.parseSessionFilename('2026-01-15-AbCdEfGh-session.tmp');
|
|
2253
|
+
assert.notStrictEqual(mixed, null,
|
|
2254
|
+
'Mixed-case ID should be accepted');
|
|
2255
|
+
assert.strictEqual(mixed.shortId, 'AbCdEfGh');
|
|
2256
|
+
|
|
2257
|
+
const lower = sessionManager.parseSessionFilename('2026-01-15-abcdefgh-session.tmp');
|
|
2258
|
+
assert.notStrictEqual(lower, null, 'All-lowercase ID should be accepted');
|
|
2259
|
+
assert.strictEqual(lower.shortId, 'abcdefgh');
|
|
2260
|
+
|
|
2261
|
+
const hexUpper = sessionManager.parseSessionFilename('2026-01-15-A1B2C3D4-session.tmp');
|
|
2262
|
+
assert.notStrictEqual(hexUpper, null, 'Uppercase hex ID should be accepted');
|
|
2263
|
+
assert.strictEqual(hexUpper.shortId, 'A1B2C3D4');
|
|
2264
|
+
|
|
2265
|
+
const underscored = sessionManager.parseSessionFilename('2026-01-15-ChezMoi_2-session.tmp');
|
|
2266
|
+
assert.notStrictEqual(underscored, null, 'IDs with underscores should be accepted');
|
|
2267
|
+
assert.strictEqual(underscored.shortId, 'ChezMoi_2');
|
|
2268
|
+
|
|
2269
|
+
const shortName = sessionManager.parseSessionFilename('2026-01-15-homelab-session.tmp');
|
|
2270
|
+
assert.notStrictEqual(shortName, null, '7-character names should be accepted');
|
|
2271
|
+
assert.strictEqual(shortName.shortId, 'homelab');
|
|
2272
|
+
})) passed++; else failed++;
|
|
2273
|
+
|
|
2274
|
+
// ── Round 119: parseSessionMetadata "Context to Load" code block extraction ──
|
|
2275
|
+
console.log('\nRound 119: parseSessionMetadata ("Context to Load" — code block extraction edge cases):');
|
|
2276
|
+
if (test('parseSessionMetadata extracts Context to Load from code block, handles missing/nested blocks', () => {
|
|
2277
|
+
// Valid context extraction
|
|
2278
|
+
const validContent = [
|
|
2279
|
+
'# Session\n\n',
|
|
2280
|
+
'### Context to Load\n',
|
|
2281
|
+
'```\n',
|
|
2282
|
+
'file1.js\n',
|
|
2283
|
+
'file2.ts\n',
|
|
2284
|
+
'```\n'
|
|
2285
|
+
].join('');
|
|
2286
|
+
const validMeta = sessionManager.parseSessionMetadata(validContent);
|
|
2287
|
+
assert.strictEqual(validMeta.context, 'file1.js\nfile2.ts',
|
|
2288
|
+
'Should extract content between ``` markers and trim');
|
|
2289
|
+
|
|
2290
|
+
// Missing closing backticks — regex doesn't match, context stays empty
|
|
2291
|
+
const noClose = [
|
|
2292
|
+
'# Session\n\n',
|
|
2293
|
+
'### Context to Load\n',
|
|
2294
|
+
'```\n',
|
|
2295
|
+
'file1.js\n',
|
|
2296
|
+
'file2.ts\n'
|
|
2297
|
+
].join('');
|
|
2298
|
+
const noCloseMeta = sessionManager.parseSessionMetadata(noClose);
|
|
2299
|
+
assert.strictEqual(noCloseMeta.context, '',
|
|
2300
|
+
'Missing closing ``` should result in empty context (regex no match)');
|
|
2301
|
+
|
|
2302
|
+
// No code block after header — just plain text
|
|
2303
|
+
const noBlock = [
|
|
2304
|
+
'# Session\n\n',
|
|
2305
|
+
'### Context to Load\n',
|
|
2306
|
+
'file1.js\n',
|
|
2307
|
+
'file2.ts\n'
|
|
2308
|
+
].join('');
|
|
2309
|
+
const noBlockMeta = sessionManager.parseSessionMetadata(noBlock);
|
|
2310
|
+
assert.strictEqual(noBlockMeta.context, '',
|
|
2311
|
+
'Plain text without ``` should not be captured as context');
|
|
2312
|
+
|
|
2313
|
+
// Nested code block — lazy [\s\S]*? stops at first ```
|
|
2314
|
+
const nested = [
|
|
2315
|
+
'# Session\n\n',
|
|
2316
|
+
'### Context to Load\n',
|
|
2317
|
+
'```\n',
|
|
2318
|
+
'first block\n',
|
|
2319
|
+
'```\n',
|
|
2320
|
+
'second block\n',
|
|
2321
|
+
'```\n'
|
|
2322
|
+
].join('');
|
|
2323
|
+
const nestedMeta = sessionManager.parseSessionMetadata(nested);
|
|
2324
|
+
assert.strictEqual(nestedMeta.context, 'first block',
|
|
2325
|
+
'Lazy quantifier should stop at first closing ``` (not greedy)');
|
|
2326
|
+
|
|
2327
|
+
// Empty code block
|
|
2328
|
+
const emptyBlock = '# Session\n\n### Context to Load\n```\n```\n';
|
|
2329
|
+
const emptyMeta = sessionManager.parseSessionMetadata(emptyBlock);
|
|
2330
|
+
assert.strictEqual(emptyMeta.context, '',
|
|
2331
|
+
'Empty code block should result in empty context (trim of empty)');
|
|
2332
|
+
})) passed++; else failed++;
|
|
2333
|
+
|
|
2334
|
+
// ── Round 120: parseSessionMetadata "Notes for Next Session" extraction edge cases ──
|
|
2335
|
+
console.log('\nRound 120: parseSessionMetadata ("Notes for Next Session" — extraction edge cases):');
|
|
2336
|
+
if (test('parseSessionMetadata extracts notes section — last section, empty, followed by ###', () => {
|
|
2337
|
+
// Notes as the last section (no ### or \n\n after)
|
|
2338
|
+
const lastSection = '# Session\n\n### Notes for Next Session\nRemember to review PR #42\nAlso check CI status';
|
|
2339
|
+
const lastMeta = sessionManager.parseSessionMetadata(lastSection);
|
|
2340
|
+
assert.strictEqual(lastMeta.notes, 'Remember to review PR #42\nAlso check CI status',
|
|
2341
|
+
'Notes as last section should capture everything to end of string via $ anchor');
|
|
2342
|
+
assert.strictEqual(lastMeta.hasNotes, undefined,
|
|
2343
|
+
'hasNotes is not a direct property of parseSessionMetadata result');
|
|
2344
|
+
|
|
2345
|
+
// Notes followed by another ### section
|
|
2346
|
+
const withNext = '# Session\n\n### Notes for Next Session\nImportant note\n### Context to Load\n```\nfiles\n```';
|
|
2347
|
+
const nextMeta = sessionManager.parseSessionMetadata(withNext);
|
|
2348
|
+
assert.strictEqual(nextMeta.notes, 'Important note',
|
|
2349
|
+
'Notes should stop at next ### header');
|
|
2350
|
+
|
|
2351
|
+
// Notes followed by \n\n (double newline)
|
|
2352
|
+
const withDoubleNewline = '# Session\n\n### Notes for Next Session\nNote here\n\nSome other text';
|
|
2353
|
+
const dblMeta = sessionManager.parseSessionMetadata(withDoubleNewline);
|
|
2354
|
+
assert.strictEqual(dblMeta.notes, 'Note here',
|
|
2355
|
+
'Notes should stop at \\n\\n boundary');
|
|
2356
|
+
|
|
2357
|
+
// Empty notes section (header only, followed by \n\n)
|
|
2358
|
+
const emptyNotes = '# Session\n\n### Notes for Next Session\n\n### Other Section';
|
|
2359
|
+
const emptyMeta = sessionManager.parseSessionMetadata(emptyNotes);
|
|
2360
|
+
assert.strictEqual(emptyMeta.notes, '',
|
|
2361
|
+
'Empty notes section should result in empty string after trim');
|
|
2362
|
+
|
|
2363
|
+
// Notes with markdown formatting
|
|
2364
|
+
const markdownNotes = '# Session\n\n### Notes for Next Session\n- [ ] Review **important** PR\n- [x] Check `config.js`\n\n### Done';
|
|
2365
|
+
const mdMeta = sessionManager.parseSessionMetadata(markdownNotes);
|
|
2366
|
+
assert.ok(mdMeta.notes.includes('**important**'),
|
|
2367
|
+
'Markdown bold should be preserved in notes');
|
|
2368
|
+
assert.ok(mdMeta.notes.includes('`config.js`'),
|
|
2369
|
+
'Markdown code should be preserved in notes');
|
|
2370
|
+
})) passed++; else failed++;
|
|
2371
|
+
|
|
2372
|
+
// ── Round 121: parseSessionMetadata Started/Last Updated time extraction ──
|
|
2373
|
+
console.log('\nRound 121: parseSessionMetadata (Started/Last Updated time extraction):');
|
|
2374
|
+
if (test('parseSessionMetadata extracts Started and Last Updated times from markdown', () => {
|
|
2375
|
+
// Standard format
|
|
2376
|
+
const standard = '# Session\n\n**Date:** 2026-01-15\n**Started:** 14:30\n**Last Updated:** 16:45';
|
|
2377
|
+
const stdMeta = sessionManager.parseSessionMetadata(standard);
|
|
2378
|
+
assert.strictEqual(stdMeta.started, '14:30', 'Should extract started time');
|
|
2379
|
+
assert.strictEqual(stdMeta.lastUpdated, '16:45', 'Should extract last updated time');
|
|
2380
|
+
|
|
2381
|
+
// With seconds in time
|
|
2382
|
+
const withSec = '# Session\n\n**Started:** 14:30:00\n**Last Updated:** 16:45:59';
|
|
2383
|
+
const secMeta = sessionManager.parseSessionMetadata(withSec);
|
|
2384
|
+
assert.strictEqual(secMeta.started, '14:30:00', 'Should capture seconds too ([\\d:]+)');
|
|
2385
|
+
assert.strictEqual(secMeta.lastUpdated, '16:45:59');
|
|
2386
|
+
|
|
2387
|
+
// Missing Started but has Last Updated
|
|
2388
|
+
const noStarted = '# Session\n\n**Last Updated:** 09:00';
|
|
2389
|
+
const noStartMeta = sessionManager.parseSessionMetadata(noStarted);
|
|
2390
|
+
assert.strictEqual(noStartMeta.started, null, 'Missing Started should be null');
|
|
2391
|
+
assert.strictEqual(noStartMeta.lastUpdated, '09:00', 'Last Updated should still be extracted');
|
|
2392
|
+
|
|
2393
|
+
// Missing Last Updated but has Started
|
|
2394
|
+
const noUpdated = '# Session\n\n**Started:** 08:15';
|
|
2395
|
+
const noUpdMeta = sessionManager.parseSessionMetadata(noUpdated);
|
|
2396
|
+
assert.strictEqual(noUpdMeta.started, '08:15', 'Started should be extracted');
|
|
2397
|
+
assert.strictEqual(noUpdMeta.lastUpdated, null, 'Missing Last Updated should be null');
|
|
2398
|
+
|
|
2399
|
+
// Neither present
|
|
2400
|
+
const neither = '# Session\n\nJust some text';
|
|
2401
|
+
const neitherMeta = sessionManager.parseSessionMetadata(neither);
|
|
2402
|
+
assert.strictEqual(neitherMeta.started, null, 'No Started in content → null');
|
|
2403
|
+
assert.strictEqual(neitherMeta.lastUpdated, null, 'No Last Updated in content → null');
|
|
2404
|
+
|
|
2405
|
+
// Loose regex: edge case with extra colons ([\d:]+ matches any digit-colon combo)
|
|
2406
|
+
const loose = '# Session\n\n**Started:** 1:2:3:4';
|
|
2407
|
+
const looseMeta = sessionManager.parseSessionMetadata(loose);
|
|
2408
|
+
assert.strictEqual(looseMeta.started, '1:2:3:4',
|
|
2409
|
+
'Loose [\\d:]+ regex captures any digits-and-colons combination');
|
|
2410
|
+
})) passed++; else failed++;
|
|
2411
|
+
|
|
2412
|
+
// ── Round 122: getSessionById old format (no-id) — noIdMatch path ──
|
|
2413
|
+
console.log('\nRound 122: getSessionById (old format no-id — date-only filename match):');
|
|
2414
|
+
if (test('getSessionById matches old format YYYY-MM-DD-session.tmp via noIdMatch path', () => {
|
|
2415
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'r122-old-format-'));
|
|
2416
|
+
const origHome = process.env.HOME;
|
|
2417
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
2418
|
+
const origDir = process.env.CLAUDE_DIR;
|
|
2419
|
+
try {
|
|
2420
|
+
// Set up isolated environment
|
|
2421
|
+
const claudeDir = path.join(tmpDir, '.claude');
|
|
2422
|
+
const sessionsDir = path.join(claudeDir, 'sessions');
|
|
2423
|
+
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
2424
|
+
process.env.HOME = tmpDir;
|
|
2425
|
+
process.env.USERPROFILE = tmpDir; // Windows: os.homedir() uses USERPROFILE
|
|
2426
|
+
delete process.env.CLAUDE_DIR;
|
|
2427
|
+
|
|
2428
|
+
// Clear require cache for fresh module with new HOME
|
|
2429
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
2430
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
2431
|
+
const freshSM = require('../../scripts/lib/session-manager');
|
|
2432
|
+
|
|
2433
|
+
// Create old-format session file (no short ID)
|
|
2434
|
+
const oldFile = path.join(sessionsDir, '2026-01-15-session.tmp');
|
|
2435
|
+
fs.writeFileSync(oldFile, '# Old Format Session\n\n**Date:** 2026-01-15\n');
|
|
2436
|
+
|
|
2437
|
+
// Search by date — triggers noIdMatch path
|
|
2438
|
+
const result = freshSM.getSessionById('2026-01-15');
|
|
2439
|
+
assert.ok(result, 'Should find old-format session by date string');
|
|
2440
|
+
assert.strictEqual(result.shortId, 'no-id',
|
|
2441
|
+
'Old format should have shortId "no-id"');
|
|
2442
|
+
assert.strictEqual(result.date, '2026-01-15');
|
|
2443
|
+
assert.strictEqual(result.filename, '2026-01-15-session.tmp');
|
|
2444
|
+
|
|
2445
|
+
// Search by non-matching date — should not find
|
|
2446
|
+
const noResult = freshSM.getSessionById('2026-01-16');
|
|
2447
|
+
assert.strictEqual(noResult, null,
|
|
2448
|
+
'Non-matching date should return null');
|
|
2449
|
+
} finally {
|
|
2450
|
+
process.env.HOME = origHome;
|
|
2451
|
+
if (origUserProfile !== undefined) process.env.USERPROFILE = origUserProfile;
|
|
2452
|
+
else delete process.env.USERPROFILE;
|
|
2453
|
+
if (origDir) process.env.CLAUDE_DIR = origDir;
|
|
2454
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
2455
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
2456
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
2457
|
+
}
|
|
2458
|
+
})) passed++; else failed++;
|
|
2459
|
+
|
|
2460
|
+
// ── Round 123: parseSessionMetadata with CRLF line endings — section boundaries break ──
|
|
2461
|
+
console.log('\nRound 123: parseSessionMetadata (CRLF section boundaries — \\n\\n fails to match \\r\\n\\r\\n):');
|
|
2462
|
+
if (test('parseSessionMetadata CRLF content: \\n\\n boundary fails, lazy match bleeds across sections', () => {
|
|
2463
|
+
// session-manager.js lines 119-134: regex uses (?=###|\n\n|$) to delimit sections.
|
|
2464
|
+
// On CRLF content, a blank line is \r\n\r\n, NOT \n\n. The \n\n alternation
|
|
2465
|
+
// won't match, so the lazy [\s\S]*? extends past the blank line until it hits
|
|
2466
|
+
// ### or $. This means completed items may bleed into following sections.
|
|
2467
|
+
//
|
|
2468
|
+
// However, \s* in /### Completed\s*\n/ DOES match \r\n (since \r is whitespace),
|
|
2469
|
+
// so section headers still match — only blank-line boundaries fail.
|
|
2470
|
+
|
|
2471
|
+
// Test 1: CRLF with ### delimiter — works because ### is an alternation
|
|
2472
|
+
const crlfWithHash = [
|
|
2473
|
+
'# Session Title\r\n',
|
|
2474
|
+
'\r\n',
|
|
2475
|
+
'### Completed\r\n',
|
|
2476
|
+
'- [x] Task A\r\n',
|
|
2477
|
+
'### In Progress\r\n',
|
|
2478
|
+
'- [ ] Task B\r\n'
|
|
2479
|
+
].join('');
|
|
2480
|
+
const meta1 = sessionManager.parseSessionMetadata(crlfWithHash);
|
|
2481
|
+
// ### delimiter still works — lazy match stops at ### In Progress
|
|
2482
|
+
assert.ok(meta1.completed.length >= 1,
|
|
2483
|
+
'Completed section should find at least 1 item with ### boundary on CRLF');
|
|
2484
|
+
// Check that Task A is found (may include \r in the trimmed text)
|
|
2485
|
+
const taskA = meta1.completed[0];
|
|
2486
|
+
assert.ok(taskA.includes('Task A'),
|
|
2487
|
+
'Should extract Task A from completed section');
|
|
2488
|
+
|
|
2489
|
+
// Test 2: CRLF with \n\n (blank line) delimiter — this is where it breaks
|
|
2490
|
+
const crlfBlankLine = [
|
|
2491
|
+
'# Session\r\n',
|
|
2492
|
+
'\r\n',
|
|
2493
|
+
'### Completed\r\n',
|
|
2494
|
+
'- [x] First task\r\n',
|
|
2495
|
+
'\r\n', // Blank line = \r\n\r\n — won't match \n\n
|
|
2496
|
+
'Some other text\r\n'
|
|
2497
|
+
].join('');
|
|
2498
|
+
const meta2 = sessionManager.parseSessionMetadata(crlfBlankLine);
|
|
2499
|
+
// On LF, blank line stops the lazy match. On CRLF, it bleeds through.
|
|
2500
|
+
// The lazy [\s\S]*? stops at $ if no ### or \n\n matches,
|
|
2501
|
+
// so "Some other text" may end up captured in the raw section text.
|
|
2502
|
+
// But the items regex /- \[x\]\s*(.+)/g only captures checkbox lines,
|
|
2503
|
+
// so the count stays correct despite the bleed.
|
|
2504
|
+
assert.strictEqual(meta2.completed.length, 1,
|
|
2505
|
+
'Even with CRLF bleed, checkbox regex only matches "- [x]" lines');
|
|
2506
|
+
|
|
2507
|
+
// Test 3: LF version of same content — proves \n\n works normally
|
|
2508
|
+
const lfBlankLine = '# Session\n\n### Completed\n- [x] First task\n\nSome other text\n';
|
|
2509
|
+
const meta3 = sessionManager.parseSessionMetadata(lfBlankLine);
|
|
2510
|
+
assert.strictEqual(meta3.completed.length, 1,
|
|
2511
|
+
'LF version: blank line correctly delimits section');
|
|
2512
|
+
|
|
2513
|
+
// Test 4: CRLF notes section — lazy match goes to $ when \n\n fails
|
|
2514
|
+
const crlfNotes = [
|
|
2515
|
+
'# Session\r\n',
|
|
2516
|
+
'\r\n',
|
|
2517
|
+
'### Notes for Next Session\r\n',
|
|
2518
|
+
'Remember to review\r\n',
|
|
2519
|
+
'\r\n',
|
|
2520
|
+
'This should be separate\r\n'
|
|
2521
|
+
].join('');
|
|
2522
|
+
const meta4 = sessionManager.parseSessionMetadata(crlfNotes);
|
|
2523
|
+
// On CRLF, \n\n fails → lazy match extends to $ → includes "This should be separate"
|
|
2524
|
+
// On LF, \n\n works → notes = "Remember to review" only
|
|
2525
|
+
const lfNotes = '# Session\n\n### Notes for Next Session\nRemember to review\n\nThis should be separate\n';
|
|
2526
|
+
const meta5 = sessionManager.parseSessionMetadata(lfNotes);
|
|
2527
|
+
assert.strictEqual(meta5.notes, 'Remember to review',
|
|
2528
|
+
'LF: notes stop at blank line');
|
|
2529
|
+
// CRLF notes will be longer (bleed through blank line)
|
|
2530
|
+
assert.ok(meta4.notes.length >= meta5.notes.length,
|
|
2531
|
+
'CRLF notes >= LF notes length (CRLF may bleed past blank line)');
|
|
2532
|
+
})) passed++; else failed++;
|
|
2533
|
+
|
|
2534
|
+
// ── Round 124: getAllSessions with invalid date format (strict equality, no normalization) ──
|
|
2535
|
+
console.log('\nRound 124: getAllSessions (invalid date format — strict !== comparison):');
|
|
2536
|
+
if (test('getAllSessions date filter uses strict equality so wrong format returns empty', () => {
|
|
2537
|
+
// session-manager.js line 228: `if (date && metadata.date !== date)` — strict inequality.
|
|
2538
|
+
// metadata.date is always "YYYY-MM-DD" format. Passing a different format like
|
|
2539
|
+
// "2026/01/15" or "Jan 15 2026" will never match, silently returning empty.
|
|
2540
|
+
// No validation or normalization occurs on the date parameter.
|
|
2541
|
+
const origHome = process.env.HOME;
|
|
2542
|
+
const origUserProfile = process.env.USERPROFILE;
|
|
2543
|
+
const origDir = process.env.CLAUDE_DIR;
|
|
2544
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'r124-date-format-'));
|
|
2545
|
+
const homeDir = path.join(tmpDir, 'home');
|
|
2546
|
+
fs.mkdirSync(path.join(homeDir, '.claude', 'sessions'), { recursive: true });
|
|
2547
|
+
|
|
2548
|
+
try {
|
|
2549
|
+
process.env.HOME = homeDir;
|
|
2550
|
+
process.env.USERPROFILE = homeDir; // Windows: os.homedir() uses USERPROFILE
|
|
2551
|
+
delete process.env.CLAUDE_DIR;
|
|
2552
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
2553
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
2554
|
+
const freshSM = require('../../scripts/lib/session-manager');
|
|
2555
|
+
|
|
2556
|
+
// Create a session file with valid date
|
|
2557
|
+
const sessionsDir = path.join(homeDir, '.claude', 'sessions');
|
|
2558
|
+
fs.writeFileSync(
|
|
2559
|
+
path.join(sessionsDir, '2026-01-15-abcd1234-session.tmp'),
|
|
2560
|
+
'# Test Session'
|
|
2561
|
+
);
|
|
2562
|
+
|
|
2563
|
+
// Correct format — should find 1 session
|
|
2564
|
+
const correct = freshSM.getAllSessions({ date: '2026-01-15' });
|
|
2565
|
+
assert.strictEqual(correct.sessions.length, 1,
|
|
2566
|
+
'Correct YYYY-MM-DD format should match');
|
|
2567
|
+
|
|
2568
|
+
// Wrong separator — strict !== means no match
|
|
2569
|
+
const wrongSep = freshSM.getAllSessions({ date: '2026/01/15' });
|
|
2570
|
+
assert.strictEqual(wrongSep.sessions.length, 0,
|
|
2571
|
+
'Slash-separated date does not match (strict string equality)');
|
|
2572
|
+
|
|
2573
|
+
// US format — no match
|
|
2574
|
+
const usFormat = freshSM.getAllSessions({ date: '01-15-2026' });
|
|
2575
|
+
assert.strictEqual(usFormat.sessions.length, 0,
|
|
2576
|
+
'MM-DD-YYYY format does not match YYYY-MM-DD');
|
|
2577
|
+
|
|
2578
|
+
// Partial date — no match
|
|
2579
|
+
const partial = freshSM.getAllSessions({ date: '2026-01' });
|
|
2580
|
+
assert.strictEqual(partial.sessions.length, 0,
|
|
2581
|
+
'Partial YYYY-MM does not match full YYYY-MM-DD');
|
|
2582
|
+
|
|
2583
|
+
// null date — skips filter, returns all
|
|
2584
|
+
const nullDate = freshSM.getAllSessions({ date: null });
|
|
2585
|
+
assert.strictEqual(nullDate.sessions.length, 1,
|
|
2586
|
+
'null date skips filter and returns all sessions');
|
|
2587
|
+
} finally {
|
|
2588
|
+
process.env.HOME = origHome;
|
|
2589
|
+
if (origUserProfile !== undefined) process.env.USERPROFILE = origUserProfile;
|
|
2590
|
+
else delete process.env.USERPROFILE;
|
|
2591
|
+
if (origDir) process.env.CLAUDE_DIR = origDir;
|
|
2592
|
+
delete require.cache[require.resolve('../../scripts/lib/utils')];
|
|
2593
|
+
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
|
|
2594
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
2595
|
+
}
|
|
2596
|
+
})) passed++; else failed++;
|
|
2597
|
+
|
|
2598
|
+
// ── Round 124: parseSessionMetadata title edge cases (no space, wrong level, multiple, empty) ──
|
|
2599
|
+
console.log('\nRound 124: parseSessionMetadata (title regex edge cases — /^#\\s+(.+)$/m):');
|
|
2600
|
+
if (test('parseSessionMetadata title: no space after # fails, ## fails, multiple picks first, empty trims', () => {
|
|
2601
|
+
// session-manager.js line 95: /^#\s+(.+)$/m
|
|
2602
|
+
// \s+ requires at least one whitespace after #, (.+) captures rest of line
|
|
2603
|
+
|
|
2604
|
+
// No space after # — \s+ fails to match
|
|
2605
|
+
const noSpace = '#NoSpaceTitle\n\nSome content';
|
|
2606
|
+
const meta1 = sessionManager.parseSessionMetadata(noSpace);
|
|
2607
|
+
assert.strictEqual(meta1.title, null,
|
|
2608
|
+
'#NoSpaceTitle has no whitespace after # → title is null');
|
|
2609
|
+
|
|
2610
|
+
// ## (H2) heading — ^ anchors to line start, but # matches first char only
|
|
2611
|
+
// /^#\s+/ matches the first # then \s+ would need whitespace, but ## has another #
|
|
2612
|
+
// Actually: /^#\s+(.+)$/ → "##" → # then \s+ → # is not whitespace → no match
|
|
2613
|
+
const h2 = '## Subtitle\n\nContent';
|
|
2614
|
+
const meta2 = sessionManager.parseSessionMetadata(h2);
|
|
2615
|
+
assert.strictEqual(meta2.title, null,
|
|
2616
|
+
'## heading does not match /^#\\s+/ because second # is not whitespace');
|
|
2617
|
+
|
|
2618
|
+
// Multiple # headings — first match wins (regex .match returns first)
|
|
2619
|
+
const multiple = '# First Title\n\n# Second Title\n\nContent';
|
|
2620
|
+
const meta3 = sessionManager.parseSessionMetadata(multiple);
|
|
2621
|
+
assert.strictEqual(meta3.title, 'First Title',
|
|
2622
|
+
'Multiple H1 headings: .match() returns first occurrence');
|
|
2623
|
+
|
|
2624
|
+
// # followed by spaces then text — leading spaces in capture are trimmed
|
|
2625
|
+
const padded = '# Padded Title \n\nContent';
|
|
2626
|
+
const meta4 = sessionManager.parseSessionMetadata(padded);
|
|
2627
|
+
assert.strictEqual(meta4.title, 'Padded Title',
|
|
2628
|
+
'Extra spaces: \\s+ matches multiple spaces, (.+) captures, .trim() cleans');
|
|
2629
|
+
|
|
2630
|
+
// # followed by just spaces (no actual title text)
|
|
2631
|
+
// Surprising: \s+ is greedy and includes \n, so it matches " \n\n" (spaces + newlines)
|
|
2632
|
+
// Then (.+) captures "Content" from the next non-empty line!
|
|
2633
|
+
const spacesOnly = '# \n\nContent';
|
|
2634
|
+
const meta5 = sessionManager.parseSessionMetadata(spacesOnly);
|
|
2635
|
+
assert.strictEqual(meta5.title, 'Content',
|
|
2636
|
+
'Spaces-only after # → \\s+ greedily matches spaces+newlines, (.+) captures next line text');
|
|
2637
|
+
|
|
2638
|
+
// Tab after # — \s includes tab
|
|
2639
|
+
const tabTitle = '#\tTab Title\n\nContent';
|
|
2640
|
+
const meta6 = sessionManager.parseSessionMetadata(tabTitle);
|
|
2641
|
+
assert.strictEqual(meta6.title, 'Tab Title',
|
|
2642
|
+
'Tab after # matches \\s+ (\\s includes \\t)');
|
|
2643
|
+
})) passed++; else failed++;
|
|
2644
|
+
|
|
2645
|
+
// Summary
|
|
2646
|
+
console.log(`\nResults: Passed: ${passed}, Failed: ${failed}`);
|
|
2647
|
+
process.exit(failed > 0 ? 1 : 0);
|
|
2648
|
+
}
|
|
2649
|
+
|
|
2650
|
+
runTests();
|