Skip to content

Add Kiro IDE support (.kiro/)#548

Open
ihimanss wants to merge 1 commit intoaffaan-m:mainfrom
ihimanss:feat/kiro-support
Open

Add Kiro IDE support (.kiro/)#548
ihimanss wants to merge 1 commit intoaffaan-m:mainfrom
ihimanss:feat/kiro-support

Conversation

@ihimanss
Copy link

@ihimanss ihimanss commented Mar 17, 2026

Summary

  • Adds full Kiro IDE + CLI support to ECC via .kiro/ directory
  • 16 dual-format agents (JSON for CLI, MD for IDE), 18 skills, 10 IDE hooks, 16 steering files, 2 scripts, MCP example config
  • Includes install script, documentation (longform, shortform, security guides), and hooks README

This is a contribution from the kiro-everything-claude-code project, adapting ECC workflows for Kiro's native format.

What's included

Component Count Location
Agents (JSON + MD) 32 .kiro/agents/
Skills 18 .kiro/skills/*/SKILL.md
Steering Files 16 .kiro/steering/*.md
IDE Hooks 10 .kiro/hooks/*.kiro.hook
Scripts 2 .kiro/scripts/
MCP Config 1 .kiro/settings/mcp.json.example
Docs 3 .kiro/docs/
Install Script 1 .kiro/install.sh
README 1 .kiro/README.md

Note for maintainers

Only the .kiro/ folder is included in this PR. Other files (README.md, CONTRIBUTING.md, cross-tool parity table, FAQ, etc.) will need updating to reference Kiro support — happy to help with those changes or leave it to you.

Contributors

Test plan

  • All .kiro/ files validated against Kiro's expected format
  • Agents available in both JSON (CLI) and MD (IDE) formats
  • Skills use standard SKILL.md format compatible with Kiro's / menu
  • Hooks use .kiro.hook extension with correct trigger types
  • Steering files include proper YAML frontmatter (inclusion type, fileMatchPattern)
  • Install script tested with non-destructive copy

🤖 Generated with Claude Code


Summary by cubic

Adds native Kiro IDE and CLI support via a self-contained .kiro/ bundle and installer. Enables ECC workflows in Kiro with agents, skills, hooks, steering, scripts, and docs without touching app code.

  • New Features

    • Dual-format agents (IDE .md, CLI .json) for planning, reviews, security, TDD, build fixes, E2E, and Go/Python reviews.
    • 16 agents, 18 skills, 10 IDE hooks, steering files, scripts, and docs added under .kiro/.
    • IDE hooks for formatting, type checks, TDD reminders, quality gate, session summaries, and safe shell reviews.
    • Scripts: install.sh (non-destructive), scripts/quality-gate.sh, scripts/format.sh.
    • Example MCP config at .kiro/settings/mcp.json.example plus short/longform and security guides.
  • Migration

    • Install with ./.kiro/install.sh [path|~]; safe copy with no overwrites.
    • In Kiro IDE, enable hooks from the Agent Hooks panel as needed.
    • Use agents via IDE (swap) or CLI (JSON); run bash .kiro/scripts/quality-gate.sh on demand.
    • No breaking changes; all additions live under .kiro/.

Written for commit 278964c. Summary will update on new commits.

Summary by CodeRabbit

  • Documentation

    • Added comprehensive guides for agentic workflows, security practices, and development patterns.
    • Added specialized skill documentation for API design, testing, backend patterns, database migrations, and deployment.
  • Chores

    • Added agent configurations for code review, architecture, testing, security, and build optimization.
    • Added automation hooks for formatting, type checking, and quality gates.
    • Added installation and quality assurance scripts.

Co-Authored-By: Sungmin Hong <hsungmin@amazon.com>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 17, 2026

📝 Walkthrough

Walkthrough

Adds comprehensive documentation and configuration for the Everything Claude Code (ECC) agentic engineering framework. Includes a root README, 20+ agent specifications with configuration and guidance documents, 13+ development skill guides, steering files for project context, 10+ IDE/CLI hook definitions, installation scripts, and example configurations—establishing a complete framework for AI-assisted software development workflows without modifying runtime code.

Changes

Cohort / File(s) Summary
Core Documentation & Guides
.kiro/README.md, .kiro/docs/longform-guide.md, .kiro/docs/shortform-guide.md, .kiro/docs/security-guide.md
Comprehensive documentation suite detailing ECC integration, agentic workflows, philosophy, specialized agent roles, security practices, and quick-reference guides for installation, usage, and customization.
Agent Configurations & Documentation
.kiro/agents/{architect,build-error-resolver,chief-of-staff,code-reviewer,database-reviewer,doc-updater,e2e-runner,go-build-resolver,go-reviewer,harness-optimizer,loop-operator,planner,python-reviewer,refactor-cleaner,security-reviewer,tdd-guide}.{json,md}
20+ agent specifications with JSON configuration files (metadata, MCP settings, tool permissions, comprehensive prompts) and accompanying Markdown documentation detailing workflows, responsibilities, diagnostic commands, review checklists, and best practices for each specialized agent role.
Development Skills
.kiro/skills/{agentic-engineering,api-design,backend-patterns,coding-standards,database-migrations,deployment-patterns,docker-patterns,e2e-testing,frontend-patterns,golang-patterns,golang-testing,postgres-patterns,python-patterns,python-testing,search-first,security-review,tdd-workflow,verification-loop}/SKILL.md
18+ skill documentation files providing comprehensive guides and patterns for development domains including API design, deployment, testing frameworks, language-specific patterns (Go, Python, TypeScript), database operations, and verification workflows.
Steering Files (Context & Guidance)
.kiro/steering/{coding-style,dev-mode,development-workflow,git-workflow,golang-patterns,lessons-learned,patterns,performance,python-patterns,research-mode,review-mode,security,swift-patterns,testing,typescript-patterns,typescript-security}.md
16+ guidance documents defining project-specific context, coding standards, workflow recommendations, security policies, design patterns, and mode-specific instructions (dev, research, review) for agent and developer decision-making.
Hook Configurations
.kiro/hooks/{README.md,auto-format,code-review-on-write,console-log-check,doc-file-warning,extract-patterns,git-push-review,quality-gate,session-summary,tdd-reminder,typecheck-on-edit}.kiro.hook
11 hook manifests with JSON configurations defining IDE/CLI automation triggers (fileEdited, postToolUse, agentStop, userTriggered) that integrate agents into development workflows for formatting, code review, type checking, quality gates, and pattern extraction.
Installation & Utility Scripts
.kiro/install.sh, .kiro/scripts/{format.sh,quality-gate.sh}
Bash scripts for ECC installation (copying agents/skills/steering/hooks into projects), automatic code formatting detection and application, and comprehensive quality gate checks (build, type check, lint, tests) with multi-language and package manager support.
Settings & Examples
.kiro/settings/mcp.json.example
Example MCP (Model Context Protocol) server configuration file demonstrating setup of multiple MCP servers with command, arguments, environment variables, and optional auto-approval settings.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • PR #139 — Adds Python code reviewer agent and comprehensive review documentation, covering the same python-reviewer agent files and guidance as this PR.
  • PR #83 — Introduces Go-focused agents and patterns (go-reviewer, go-build-resolver, golang-patterns/testing skills), directly overlapping with Go-related content in this PR.
  • PR #48 — Adds the PostgreSQL database-reviewer agent and postgres-patterns skill documentation, matching corresponding files introduced here.

Suggested labels

documentation, configuration, tooling

Suggested reviewers

  • affaan-m

Poem

🐰 Hop, hop! A framework takes shape so grand,
Agents and skills working hand-in-hand,
Hooks and steering to light the way,
Kiro helps Claude code every day!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: adding Kiro IDE support to the .kiro/ directory.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

CodeRabbit can use oxc to improve the quality of JavaScript and TypeScript code reviews.

Add a configuration file to your project to customize how CodeRabbit runs oxc.

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 17, 2026

Greptile Summary

This PR adds full Kiro IDE/CLI support to the Everything Claude Code repository by introducing a new .kiro/ directory containing 16 dual-format agents, 18 skills, 10 IDE hooks, 16 steering files, 2 shell scripts, an MCP config example, and supporting documentation.

Key issues found:

  • Critical — install.sh installs nothing: SOURCE_KIRO is set to $SCRIPT_DIR/.kiro, but since the script lives at .kiro/install.sh, SCRIPT_DIR resolves to the .kiro/ directory itself, making SOURCE_KIRO point to the non-existent .kiro/.kiro/. With nullglob active, all copy loops silently iterate zero times. The fix is SOURCE_KIRO="$SCRIPT_DIR".
  • Missing docs install: The SUBDIRS variable in install.sh omits docs, so the three documentation files (longform-guide.md, security-guide.md, shortform-guide.md) are never copied to the target project — despite being listed in the README's component table.
  • Stale comments in scripts: format.sh and quality-gate.sh both reference their triggering hook with a .json extension (e.g. auto-format.json, quality-gate.json) whereas the actual files use .kiro.hook.
  • Double agentStop firing: Both session-summary.kiro.hook and extract-patterns.kiro.hook use "type": "agentStop", so the agent receives two separate follow-up prompts after every session. Consider consolidating them or defaulting extract-patterns to enabled: false.
  • Missing trailing newline: mcp.json.example ends without a newline character.

Confidence Score: 2/5

  • Not safe to merge in current state — the install script is broken and will silently install nothing.
  • The content itself (agents, skills, steering files, hooks) is well-crafted and ready to use within Kiro directly. However, the install.sh script — the primary mechanism for users to adopt these workflows into their own projects — has a path bug that causes it to copy zero files. This is a high-visibility functional failure that would immediately affect anyone who follows the documented quick-start steps. The secondary omission of the docs directory compounds the issue. These are straightforward to fix, but must be resolved before the PR is mergeable.
  • .kiro/install.sh requires immediate attention for the SOURCE_KIRO path bug and the missing docs directory in SUBDIRS.

Important Files Changed

Filename Overview
.kiro/install.sh Critical bug: SOURCE_KIRO is set to $SCRIPT_DIR/.kiro but the script lives inside .kiro/, so SCRIPT_DIR already is the .kiro/ directory — all copy operations silently copy nothing. Also omits the docs subdirectory from the install loop.
.kiro/scripts/format.sh Correctly detects biome/prettier and formats the target file; stale header comment references auto-format.json instead of auto-format.kiro.hook.
.kiro/scripts/quality-gate.sh Well-structured multi-language quality gate; stale header comment references quality-gate.json instead of quality-gate.kiro.hook.
.kiro/hooks/session-summary.kiro.hook Valid hook, but both session-summary and extract-patterns share the agentStop trigger — both fire after every session, creating double post-session prompting noise.
.kiro/hooks/extract-patterns.kiro.hook Useful pattern-extraction hook, but shares agentStop trigger with session-summary; consider defaulting to enabled: false to reduce post-session overhead.
.kiro/settings/mcp.json.example Valid MCP example config with Bedrock AgentCore, CDK, Strands, and React Docs servers; missing trailing newline at end of file.
.kiro/agents/security-reviewer.md Comprehensive security review agent with OWASP Top 10 coverage, clear escalation steps, and well-structured vulnerability pattern table.
.kiro/agents/chief-of-staff.md Detailed communication triage agent with 4-tier classification system and post-send follow-through enforcement; references external tools (gog, SOUL.md) that users must configure independently.
.kiro/steering/typescript-security.md Solid TypeScript/JS security steering file with code examples for XSS, prototype pollution, SQL injection, and path traversal prevention.
.kiro/steering/lessons-learned.md Well-designed template for capturing project-specific patterns with useful inline documentation about the installer's additive-only behaviour and hook design choices.
.kiro/README.md Comprehensive README with component inventory, usage examples, and quick-start guide; the documented cd .kiro && ./install.sh flow will silently install nothing until the SOURCE_KIRO bug in install.sh is fixed.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[User runs install.sh /target] --> B{Resolve SCRIPT_DIR}
    B --> C["SCRIPT_DIR = /path/to/repo/.kiro"]
    C --> D["SOURCE_KIRO = SCRIPT_DIR + /.kiro\n❌ Points to .kiro/.kiro/ — does not exist"]
    D --> E{nullglob active}
    E --> F["Globs expand to empty list\nAll copy loops = 0 iterations"]
    F --> G["Summary shows: 0 agents, 0 skills, 0 steering..."]
    G --> H["✗ Silent failure — nothing installed"]

    C --> I["Fix: SOURCE_KIRO = SCRIPT_DIR\n✅ Points to .kiro/ — exists"]
    I --> J{SUBDIRS loop}
    J --> K["agents / skills / steering / hooks / scripts / settings\n❌ Missing: docs"]
    K --> L["Copy files non-destructively"]
    L --> M["✓ Most components installed\n✗ docs/*.md not installed"]

    style D fill:#ffcccc,stroke:#cc0000
    style H fill:#ffcccc,stroke:#cc0000
    style I fill:#ccffcc,stroke:#009900
    style K fill:#fff3cc,stroke:#cc8800
    style M fill:#fff3cc,stroke:#cc8800
Loading

Last reviewed commit: 278964c

Comment on lines +19 to +20
SOURCE_KIRO="$SCRIPT_DIR/.kiro"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P0 Incorrect SOURCE_KIRO path — all copy operations silently fail

The script lives at .kiro/install.sh, so SCRIPT_DIR resolves to the .kiro/ directory itself. Setting SOURCE_KIRO="$SCRIPT_DIR/.kiro" makes it point to .kiro/.kiro/, a path that doesn't exist. Because shopt -s nullglob is set, every glob ("$SOURCE_KIRO/agents"/*.json, etc.) expands to an empty list, all loops have zero iterations, and the counters stay at 0. The installation appears to succeed but copies nothing.

The comment on line 19 says "the repo root", which is also wrong — SCRIPT_DIR is the .kiro/ directory, not the repo root.

Fix: drop the .kiro suffix since SCRIPT_DIR already IS the .kiro/ directory:

Suggested change
SOURCE_KIRO="$SCRIPT_DIR/.kiro"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SOURCE_KIRO="$SCRIPT_DIR"


# Create all required .kiro/ subdirectories
for dir in $SUBDIRS; do
mkdir -p "$TARGET/.kiro/$dir"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 docs directory missing from SUBDIRS

The docs subdirectory (containing longform-guide.md, security-guide.md, shortform-guide.md) is listed in the README as an installed component, but it is not in the SUBDIRS string and has no corresponding copy loop. These files are never installed.

Suggested change
mkdir -p "$TARGET/.kiro/$dir"
SUBDIRS="agents skills steering hooks scripts settings docs"

A corresponding copy block should also be added after the settings block:

# Copy docs
if [ -d "$SOURCE_KIRO/docs" ]; then
  mkdir -p "$TARGET/.kiro/docs"
  for f in "$SOURCE_KIRO/docs"/*.md; do
    local_name=$(basename "$f")
    if [ ! -f "$TARGET/.kiro/docs/$local_name" ]; then
      cp "$f" "$TARGET/.kiro/docs/" 2>/dev/null || true
    fi
  done
fi

# ─────────────────────────────────────────────────────────────
# Format — auto-format a file using detected formatter
# Detects: biome or prettier
# Used by: .kiro/hooks/auto-format.json (fileEdited)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Stale comment references wrong filename

The comment says auto-format.json but the actual hook file is auto-format.kiro.hook. The same issue exists in .kiro/scripts/quality-gate.sh line 5, where the comment references quality-gate.json instead of quality-gate.kiro.hook.

Suggested change
# Used by: .kiro/hooks/auto-format.json (fileEdited)
# Used by: .kiro/hooks/auto-format.kiro.hook (fileEdited)

# ─────────────────────────────────────────────────────────────
# Quality Gate — full project quality check
# Runs: build, type check, lint, tests
# Used by: .kiro/hooks/quality-gate.json (userTriggered)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Stale comment references wrong filename

The comment says quality-gate.json but the actual hook file is quality-gate.kiro.hook.

Suggested change
# Used by: .kiro/hooks/quality-gate.json (userTriggered)
# Used by: .kiro/hooks/quality-gate.kiro.hook (userTriggered)

"enabled": true,
"description": "Generate a brief summary of what was accomplished after agent execution completes",
"when": {
"type": "agentStop"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Double agentStop trigger may cause noisy post-session prompts

Both session-summary.kiro.hook and extract-patterns.kiro.hook use "type": "agentStop" as their trigger. When both hooks are enabled, the agent will receive two separate follow-up prompts after every single session — one asking for a summary and one asking for patterns to extract. This doubles the post-session overhead and could be confusing or annoying for users.

Consider either:

  1. Consolidating both prompts into one hook, or
  2. Defaulting one (e.g., extract-patterns) to "enabled": false so users opt in deliberately.

]
}
}
} No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Missing newline at end of file

The file ends without a trailing newline (the diff shows \ No newline at end of file). Many tools and editors expect text files to end with a newline.

Suggested change
}
}
}

(add a trailing newline after the closing brace)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@ihimanss
Copy link
Author

Hi @affaan-m 👋

Thanks for maintaining this great project! We'd love to continue contributing Kiro support and keep it in sync with future ECC releases.

Would you be open to granting write access to @ihimanss as a collaborator? This would make it easier to push branches directly and iterate on updates (README, CONTRIBUTING, cross-tool parity table, etc.) without the fork overhead.

Happy to discuss further — thanks for considering!

@ihimanss
Copy link
Author

cc @aws-hsungmin

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

40 issues found across 85 files

Note: This PR contains a large number of files. cubic only reviews up to 75 files per PR, so some files may not have been reviewed.

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".kiro/install.sh">

<violation number="1" location=".kiro/install.sh:19">
P1: Installer source path is miscomputed as `.kiro/.kiro`, causing copy steps to be skipped.</violation>

<violation number="2" location=".kiro/install.sh:56">
P2: Copy/chmod failures are ignored but the script still increments the installed counters, so the summary can report success when files were not actually installed.</violation>
</file>

<file name=".kiro/agents/go-reviewer.md">

<violation number="1" location=".kiro/agents/go-reviewer.md:12">
P1: Changed-file detection uses working-tree diff (`git diff -- '*.go'`), which can miss committed PR changes on a clean branch.</violation>

<violation number="2" location=".kiro/agents/go-reviewer.md:15">
P2: Agent workflow violates team pre-review policy by starting review immediately without checking CI status and merge conflicts.</violation>
</file>

<file name=".kiro/agents/code-reviewer.json">

<violation number="1" location=".kiro/agents/code-reviewer.json:9">
P1: Reviewer agent is over-privileged with `shell`, creating avoidable prompt-injection command-execution risk and violating repo security guidance.</violation>
</file>

<file name=".kiro/agents/architect.json">

<violation number="1" location=".kiro/agents/architect.json:10">
P1: `architect` is granted auto-approved `shell` access, which over-privileges a primarily advisory agent and conflicts with least-privilege/security guidance.</violation>
</file>

<file name=".kiro/agents/build-error-resolver.md">

<violation number="1" location=".kiro/agents/build-error-resolver.md:92">
P1: The new build-error resolver hard-codes npm/package-lock recovery steps, which conflicts with the repo’s multi-package-manager design and can produce incorrect dependency state in pnpm/yarn/bun projects.</violation>
</file>

<file name=".kiro/docs/security-guide.md">

<violation number="1" location=".kiro/docs/security-guide.md:381">
P1: The security guide recommends a fragile `.env` loading command (`export $(cat .env | xargs)`) that mangles valid secret values containing spaces/quotes.</violation>
</file>

<file name=".kiro/skills/security-review/SKILL.md">

<violation number="1" location=".kiro/skills/security-review/SKILL.md:88">
P1: Security guidance for file uploads is incomplete: it treats MIME type + extension checks as sufficient without requiring content/signature validation, which can allow spoofed malicious files.</violation>
</file>

<file name=".kiro/scripts/format.sh">

<violation number="1" location=".kiro/scripts/format.sh:46">
P1: Auto-format hook executes `npx` without disabling installs, allowing implicit package fetch/exec when formatter isn’t locally installed.</violation>
</file>

<file name=".kiro/hooks/typecheck-on-edit.kiro.hook">

<violation number="1" location=".kiro/hooks/typecheck-on-edit.kiro.hook:5">
P2: The hook claims to run TypeScript type checking, but it only asks an agent to review the edited file, creating misleading assurance and missing compiler-backed checks.</violation>
</file>

<file name=".kiro/agents/e2e-runner.md">

<violation number="1" location=".kiro/agents/e2e-runner.md:76">
P2: Playwright guidance is incorrect: `page.click(selector)` also auto-waits, so this line teaches a false API behavior.</violation>

<violation number="2" location=".kiro/agents/e2e-runner.md:93">
P2: Recommending `networkidle` as a generic stabilization step can cause tests to hang/time out on apps with background requests; Playwright discourages using it for readiness. Prefer waiting for specific UI conditions or assertions instead.</violation>
</file>

<file name=".kiro/settings/mcp.json.example">

<violation number="1" location=".kiro/settings/mcp.json.example:6">
P2: Example MCP config executes external packages with floating/unpinned versions (`@latest` or no version), creating reproducibility and supply-chain risk for users who copy this file.</violation>
</file>

<file name=".kiro/skills/python-patterns/SKILL.md">

<violation number="1" location=".kiro/skills/python-patterns/SKILL.md:183">
P2: Singleton class-decorator example replaces the class with a function, breaking expected class/type semantics (`isinstance`, subclassing, type usage).</violation>

<violation number="2" location=".kiro/skills/python-patterns/SKILL.md:223">
P2: The async context manager example uses `async with` and `await` at module scope, which is invalid Python syntax. Wrap this in an `async def` and run it via the event loop to provide a valid example.</violation>
</file>

<file name=".kiro/hooks/extract-patterns.kiro.hook">

<violation number="1" location=".kiro/hooks/extract-patterns.kiro.hook:7">
P2: Enabled `agentStop` + `askAgent` hook unconditionally adds a second agent pass after every completion, increasing baseline latency/token cost.</violation>
</file>

<file name=".kiro/skills/postgres-patterns/SKILL.md">

<violation number="1" location=".kiro/skills/postgres-patterns/SKILL.md:84">
P2: Cursor pagination example uses non-PostgreSQL placeholder syntax (`$last_id`), making the documented SQL invalid as written.</violation>

<violation number="2" location=".kiro/skills/postgres-patterns/SKILL.md:108">
P2: The FK-index diagnostic checks per-column index membership, which can miss improperly indexed composite foreign keys and report false safety.</violation>
</file>

<file name=".kiro/agents/database-reviewer.md">

<violation number="1" location=".kiro/agents/database-reviewer.md:25">
P2: Interactive `psql` invocation in diagnostic commands can block autonomous shell execution; use a non-interactive `-c` command instead.</violation>
</file>

<file name=".kiro/skills/verification-loop/SKILL.md">

<violation number="1" location=".kiro/skills/verification-loop/SKILL.md:26">
P2: Piping verification commands through tail/head masks non-zero exit codes unless pipefail is enabled, so failed builds/tests can still appear successful.</violation>

<violation number="2" location=".kiro/skills/verification-loop/SKILL.md:81">
P2: Diff review commands only inspect working tree or the latest commit, so they can miss files changed earlier in a multi-commit PR.</violation>
</file>

<file name=".kiro/skills/golang-patterns/SKILL.md">

<violation number="1" location=".kiro/skills/golang-patterns/SKILL.md:212">
P2: Test helper teaches unsafe SQLite in-memory usage: `:memory:` is per connection, but `*sql.DB` is pooled, which can cause flaky/missing-table tests.</violation>
</file>

<file name=".kiro/skills/frontend-patterns/SKILL.md">

<violation number="1" location=".kiro/skills/frontend-patterns/SKILL.md:179">
P2: `useQuery` example is vulnerable to async race conditions: older requests can resolve later and overwrite newer state because results are committed without cancellation or stale-response guards.</violation>

<violation number="2" location=".kiro/skills/frontend-patterns/SKILL.md:189">
P2: The `useQuery` example passes inline `fetcher`/`options` while `refetch` is memoized on the full `options` object, so `useEffect` can re-run every render and continuously refetch.</violation>

<violation number="3" location=".kiro/skills/frontend-patterns/SKILL.md:580">
P2: Dropdown keyboard example does not guard empty options, allowing invalid index and `onSelect(undefined)` on Enter.</violation>
</file>

<file name=".kiro/agents/build-error-resolver.json">

<violation number="1" location=".kiro/agents/build-error-resolver.json:2">
P2: Agent success criteria require tests to be passing, but the workflow never runs tests and defers test failures elsewhere, allowing false "done" states versus required green checks.</violation>

<violation number="2" location=".kiro/agents/build-error-resolver.json:16">
P2: The new reusable build agent hardcodes npm-specific commands and lockfile handling, which is inconsistent with multi-package-manager project usage and can fail or create unintended `package-lock.json` changes in non-npm repos.</violation>
</file>

<file name=".kiro/skills/docker-patterns/SKILL.md">

<violation number="1" location=".kiro/skills/docker-patterns/SKILL.md:47">
P2: `redis` is only gated by `service_started`, which does not guarantee readiness and can cause app startup races when connecting to Redis.</violation>

<violation number="2" location=".kiro/skills/docker-patterns/SKILL.md:195">
P2: The comment incorrectly claims loopback port binding makes the service unreachable from the Docker network, which can mislead readers about actual container-to-container exposure.</violation>
</file>

<file name=".kiro/skills/python-testing/SKILL.md">

<violation number="1" location=".kiro/skills/python-testing/SKILL.md:49">
P2: Async fixture example uses `@pytest.fixture` on `async def`, which is incompatible with pytest-asyncio strict mode and can mislead users into broken setup.</violation>

<violation number="2" location=".kiro/skills/python-testing/SKILL.md:257">
P2: Coverage config example incorrectly claims a TOML-only section works in `pytest.ini`.</violation>
</file>

<file name=".kiro/skills/golang-testing/SKILL.md">

<violation number="1" location=".kiro/skills/golang-testing/SKILL.md:48">
P2: Table-driven subtest example closes over loop variable `tt` without per-iteration rebinding, which is unsafe for pre-Go-1.22 (especially with parallel subtests).</violation>

<violation number="2" location=".kiro/skills/golang-testing/SKILL.md:170">
P2: Benchmark example ignores the function result, which can let compiler optimizations invalidate the measurement.</violation>
</file>

<file name=".kiro/scripts/quality-gate.sh">

<violation number="1" location=".kiro/scripts/quality-gate.sh:85">
P2: ESLint config detection omits valid filenames (e.g., .eslintrc.cjs/.eslintrc.yaml and eslint.config.cjs/ts), so linting can be skipped even when ESLint is configured.</violation>
</file>

<file name=".kiro/skills/database-migrations/SKILL.md">

<violation number="1" location=".kiro/skills/database-migrations/SKILL.md:87">
P2: The zero-downtime rename example drops the old column immediately after a dual-write deploy, skipping the required read-from-new-only/soak phase. This is inconsistent with the later strategy section and can mislead teams into an unsafe rename sequence.</violation>
</file>

<file name=".kiro/skills/e2e-testing/SKILL.md">

<violation number="1" location=".kiro/skills/e2e-testing/SKILL.md:208">
P2: The trace example uses Chromium-only `browser.startTracing` and outputs `trace.json`, which is not the Playwright Trace Viewer format and doesn’t match the cross-browser trace workflow used elsewhere. This will mislead users and produce artifacts that can’t be opened as Playwright traces.</violation>
</file>

<file name=".kiro/steering/git-workflow.md">

<violation number="1" location=".kiro/steering/git-workflow.md:17">
P2: Kiro steering references Claude’s settings file (`~/.claude/settings.json`), which is misleading in a `.kiro` workflow doc and can send users to the wrong configuration source.</violation>
</file>

<file name=".kiro/agents/tdd-guide.md">

<violation number="1" location=".kiro/agents/tdd-guide.md:27">
P2: Generic TDD agent text is coupled to npm/Playwright commands, which can misguide or fail in projects with different tooling.</violation>
</file>

<file name=".kiro/skills/coding-standards/SKILL.md">

<violation number="1" location=".kiro/skills/coding-standards/SKILL.md:402">
P2: The “GOOD” memoization example mutates the source array with `sort()`, which teaches a React props/state mutation pattern and contradicts the doc’s immutability rule. Use a copy before sorting to avoid side effects.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.


# Resolve the directory where this script lives (the repo root)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SOURCE_KIRO="$SCRIPT_DIR/.kiro"
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Installer source path is miscomputed as .kiro/.kiro, causing copy steps to be skipped.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/install.sh, line 19:

<comment>Installer source path is miscomputed as `.kiro/.kiro`, causing copy steps to be skipped.</comment>

<file context>
@@ -0,0 +1,139 @@
+
+# Resolve the directory where this script lives (the repo root)
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+SOURCE_KIRO="$SCRIPT_DIR/.kiro"
+
+# Target directory: argument or current working directory
</file context>
Suggested change
SOURCE_KIRO="$SCRIPT_DIR/.kiro"
SOURCE_KIRO="$SCRIPT_DIR"
Fix with Cubic

You are a senior Go code reviewer ensuring high standards of idiomatic Go and best practices.

When invoked:
1. Run `git diff -- '*.go'` to see recent Go file changes
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Changed-file detection uses working-tree diff (git diff -- '*.go'), which can miss committed PR changes on a clean branch.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/agents/go-reviewer.md, line 12:

<comment>Changed-file detection uses working-tree diff (`git diff -- '*.go'`), which can miss committed PR changes on a clean branch.</comment>

<file context>
@@ -0,0 +1,77 @@
+You are a senior Go code reviewer ensuring high standards of idiomatic Go and best practices.
+
+When invoked:
+1. Run `git diff -- '*.go'` to see recent Go file changes
+2. Run `go vet ./...` and `staticcheck ./...` if available
+3. Focus on modified `.go` files
</file context>
Fix with Cubic

"@builtin"
],
"allowedTools": [
"fs_read",
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Reviewer agent is over-privileged with shell, creating avoidable prompt-injection command-execution risk and violating repo security guidance.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/agents/code-reviewer.json, line 9:

<comment>Reviewer agent is over-privileged with `shell`, creating avoidable prompt-injection command-execution risk and violating repo security guidance.</comment>

<file context>
@@ -0,0 +1,16 @@
+    "@builtin"
+  ],
+  "allowedTools": [
+    "fs_read",
+    "shell"
+  ],
</file context>
Fix with Cubic

],
"allowedTools": [
"fs_read",
"shell"
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: architect is granted auto-approved shell access, which over-privileges a primarily advisory agent and conflicts with least-privilege/security guidance.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/agents/architect.json, line 10:

<comment>`architect` is granted auto-approved `shell` access, which over-privileges a primarily advisory agent and conflicts with least-privilege/security guidance.</comment>

<file context>
@@ -0,0 +1,16 @@
+  ],
+  "allowedTools": [
+    "fs_read",
+    "shell"
+  ],
+  "resources": [],
</file context>
Fix with Cubic

rm -rf .next node_modules/.cache && npm run build

# Reinstall dependencies
rm -rf node_modules package-lock.json && npm install
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The new build-error resolver hard-codes npm/package-lock recovery steps, which conflicts with the repo’s multi-package-manager design and can produce incorrect dependency state in pnpm/yarn/bun projects.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/agents/build-error-resolver.md, line 92:

<comment>The new build-error resolver hard-codes npm/package-lock recovery steps, which conflicts with the repo’s multi-package-manager design and can produce incorrect dependency state in pnpm/yarn/bun projects.</comment>

<file context>
@@ -0,0 +1,116 @@
+rm -rf .next node_modules/.cache && npm run build
+
+# Reinstall dependencies
+rm -rf node_modules package-lock.json && npm install
+
+# Fix ESLint auto-fixable
</file context>
Fix with Cubic


Types: feat, fix, refactor, docs, test, chore, perf, ci

Note: Attribution disabled globally via ~/.claude/settings.json.
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Kiro steering references Claude’s settings file (~/.claude/settings.json), which is misleading in a .kiro workflow doc and can send users to the wrong configuration source.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/steering/git-workflow.md, line 17:

<comment>Kiro steering references Claude’s settings file (`~/.claude/settings.json`), which is misleading in a `.kiro` workflow doc and can send users to the wrong configuration source.</comment>

<file context>
@@ -0,0 +1,29 @@
+
+Types: feat, fix, refactor, docs, test, chore, perf, ci
+
+Note: Attribution disabled globally via ~/.claude/settings.json.
+
+## Pull Request Workflow
</file context>
Fix with Cubic

[ -f "$f" ] || continue
local_name=$(basename "$f")
if [ ! -f "$TARGET/.kiro/agents/$local_name" ]; then
cp "$f" "$TARGET/.kiro/agents/" 2>/dev/null || true
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Copy/chmod failures are ignored but the script still increments the installed counters, so the summary can report success when files were not actually installed.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/install.sh, line 56:

<comment>Copy/chmod failures are ignored but the script still increments the installed counters, so the summary can report success when files were not actually installed.</comment>

<file context>
@@ -0,0 +1,139 @@
+    [ -f "$f" ] || continue
+    local_name=$(basename "$f")
+    if [ ! -f "$TARGET/.kiro/agents/$local_name" ]; then
+      cp "$f" "$TARGET/.kiro/agents/" 2>/dev/null || true
+      agents=$((agents + 1))
+    fi
</file context>
Fix with Cubic


### 2. Run Test -- Verify it FAILS
```bash
npm test
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Generic TDD agent text is coupled to npm/Playwright commands, which can misguide or fail in projects with different tooling.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/agents/tdd-guide.md, line 27:

<comment>Generic TDD agent text is coupled to npm/Playwright commands, which can misguide or fail in projects with different tooling.</comment>

<file context>
@@ -0,0 +1,93 @@
+
+### 2. Run Test -- Verify it FAILS
+```bash
+npm test
+```
+
</file context>
Fix with Cubic

### Phase 1: Build Verification
```bash
# Check if project builds
npm run build 2>&1 | tail -20
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Piping verification commands through tail/head masks non-zero exit codes unless pipefail is enabled, so failed builds/tests can still appear successful.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/skills/verification-loop/SKILL.md, line 26:

<comment>Piping verification commands through tail/head masks non-zero exit codes unless pipefail is enabled, so failed builds/tests can still appear successful.</comment>

<file context>
@@ -0,0 +1,128 @@
+### Phase 1: Build Verification
+```bash
+# Check if project builds
+npm run build 2>&1 | tail -20
+# OR
+pnpm build 2>&1 | tail -20
</file context>
Fix with Cubic


// ✅ GOOD: Memoize expensive computations
const sortedMarkets = useMemo(() => {
return markets.sort((a, b) => b.volume - a.volume)
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The “GOOD” memoization example mutates the source array with sort(), which teaches a React props/state mutation pattern and contradicts the doc’s immutability rule. Use a copy before sorting to avoid side effects.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .kiro/skills/coding-standards/SKILL.md, line 402:

<comment>The “GOOD” memoization example mutates the source array with `sort()`, which teaches a React props/state mutation pattern and contradicts the doc’s immutability rule. Use a copy before sorting to avoid side effects.</comment>

<file context>
@@ -0,0 +1,532 @@
+
+// ✅ GOOD: Memoize expensive computations
+const sortedMarkets = useMemo(() => {
+  return markets.sort((a, b) => b.volume - a.volume)
+}, [markets])
+
</file context>
Fix with Cubic

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

🟠 Major comments (21)
.kiro/agents/refactor-cleaner.md-1-8 (1)

1-8: ⚠️ Potential issue | 🟠 Major

Frontmatter is missing required agent metadata fields.

Lines 1-8 define name/description/allowedTools but omit tools and model, which can break tooling that parses agent specs in this repo.

Suggested fix
 ---
 name: refactor-cleaner
 description: Dead code cleanup and consolidation specialist. Use PROACTIVELY for removing unused code, duplicates, and refactoring. Runs analysis tools (knip, depcheck, ts-prune) to identify dead code and safely removes it.
+tools:
+  - read
+  - write
+  - shell
+model: sonnet-4.6
 allowedTools:
   - read
   - write
   - shell
 ---

Based on learnings: "Applies to agents/**/*.md : Agents should be formatted as Markdown with YAML frontmatter containing name, description, tools, and model fields."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/refactor-cleaner.md around lines 1 - 8, The YAML frontmatter
for the agent (fields name, description, allowedTools) is missing required
fields `tools` and `model`; update the frontmatter in the refactor-cleaner agent
(the top YAML block) to include a `tools` list mirroring or mapping allowedTools
and a `model` string (e.g., the repo-standard model name), ensuring the
frontmatter contains name, description, tools, allowedTools, and model so it
conforms to the agents/**/*.md schema used by tooling.
.kiro/skills/coding-standards/SKILL.md-316-337 (1)

316-337: 🛠️ Refactor suggestion | 🟠 Major

Add file size standards to File Organization section.

The File Organization section should include file size guidelines that are emphasized across the codebase. Based on learnings, files should be kept focused and maintainable: typically 200-400 lines, with a maximum of 800 lines per file.

📏 Proposed addition for file size standards

Add this subsection after line 337:

### File Size Guidelines

```typescript
// ✅ GOOD: Focused, single-responsibility files
// File: components/MarketCard.tsx (250 lines)
// File: hooks/useMarketData.ts (180 lines)

// ❌ BAD: Large, multi-responsibility files
// File: utils/helpers.ts (1200 lines) - split into specific utilities
// File: components/Dashboard.tsx (900 lines) - extract sub-components

Guidelines:

  • Target: 200-400 lines per file
  • Maximum: 800 lines per file
  • Prefer many small, focused files over few large files
  • Organize by functionality/domain rather than by type
  • Extract sub-components when files grow too large

</details>

Based on learnings, files should be kept focused and specialized (less than 800 lines per file, ideally 200-400 lines).

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/coding-standards/SKILL.md around lines 316 - 337, Add a new
subsection titled "### File Size Guidelines" to the File Organization section
(immediately after the Project Structure block / the existing File Organization
text) that states the target file size (200-400 lines) and maximum (800 lines),
includes the proposed example filenames (components/MarketCard.tsx,
hooks/useMarketData.ts, utils/helpers.ts, components/Dashboard.tsx) and the
short bullet guidelines (prefer small focused files, organize by
functionality/domain, extract sub-components), and include the proposed
fenced-code example block and brief Guidelines list exactly as shown in the
proposal so the standard is enforced across the docs.


</details>

</blockquote></details>
<details>
<summary>.kiro/settings/mcp.json.example-11-16 (1)</summary><blockquote>

`11-16`: _⚠️ Potential issue_ | _🟠 Major_

**Use least-privilege defaults for an example config.**

Default-enabled servers plus populated `autoApprove` lists are too permissive for a starter template. Prefer opt-in defaults (`disabled: true`) and empty/omitted `autoApprove` so tool calls require interactive user approval by default.

<details>
<summary>Proposed change</summary>

```diff
-      "disabled": false,
-      "autoApprove": [
-        "search_agentcore_docs",
-        "fetch_agentcore_doc",
-        "manage_agentcore_memory"
-      ]
+      "disabled": true,
+      "autoApprove": []
@@
-      "disabled": false,
-      "autoApprove": [
-        "search_docs",
-        "fetch_doc"
-      ]
+      "disabled": true,
+      "autoApprove": []

Also applies to: 26-30

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/settings/mcp.json.example around lines 11 - 16, Change the example MCP
config to use least-privilege defaults: set the "disabled" property to true and
remove or empty the "autoApprove" array so no tools are pre-approved; update the
JSON entries shown (the "disabled" key and the "autoApprove" list in
.kiro/settings/mcp.json.example) and apply the same change to the other instance
referenced (lines 26-30) so tool calls require interactive approval by default.
.kiro/skills/frontend-patterns/SKILL.md-165-198 (1)

165-198: ⚠️ Potential issue | 🟠 Major

Fix dependency issues to prevent infinite re-renders.

The useQuery hook has several dependency-related issues that can cause infinite re-renders:

  1. Lines 189, 195: fetcher and options in dependency arrays will recreate refetch on every render if the caller doesn't memoize them.
  2. Line 195: Using options?.enabled means any change to the options object (not just enabled) triggers a refetch.
  3. Missing cleanup: No abort controller for the async operation, which can cause state updates on unmounted components.
♻️ Proposed fix to stabilize dependencies and add cleanup
 export function useQuery<T>(
   key: string,
   fetcher: () => Promise<T>,
   options?: UseQueryOptions<T>
 ) {
   const [data, setData] = useState<T | null>(null)
   const [error, setError] = useState<Error | null>(null)
   const [loading, setLoading] = useState(false)
+  
+  // Stabilize options to avoid recreating refetch
+  const enabledRef = useRef(options?.enabled)
+  useEffect(() => {
+    enabledRef.current = options?.enabled
+  })
+  
+  const onSuccessRef = useRef(options?.onSuccess)
+  const onErrorRef = useRef(options?.onError)
+  useEffect(() => {
+    onSuccessRef.current = options?.onSuccess
+    onErrorRef.current = options?.onError
+  })
 
   const refetch = useCallback(async () => {
+    let cancelled = false
     setLoading(true)
     setError(null)
 
     try {
       const result = await fetcher()
+      if (cancelled) return
       setData(result)
-      options?.onSuccess?.(result)
+      onSuccessRef.current?.(result)
     } catch (err) {
+      if (cancelled) return
       const error = err as Error
       setError(error)
-      options?.onError?.(error)
+      onErrorRef.current?.(error)
     } finally {
+      if (!cancelled) {
         setLoading(false)
+      }
     }
-  }, [fetcher, options])
+    
+    return () => {
+      cancelled = true
+    }
+  }, [fetcher])
 
   useEffect(() => {
-    if (options?.enabled !== false) {
-      refetch()
+    if (enabledRef.current !== false) {
+      const cleanup = refetch()
+      return cleanup
     }
-  }, [key, refetch, options?.enabled])
+  }, [key, refetch])
 
   return { data, error, loading, refetch }
 }

Based on learnings, custom React hooks should implement proper useEffect cleanup for side effects.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/frontend-patterns/SKILL.md around lines 165 - 198, The useQuery
hook recreates refetch on every render and triggers extra refetches because it
depends on unstable objects; to fix, extract and memoize individual option
fields and the fetcher: in useQuery, replace direct dependencies on fetcher and
options with stable refs/values (e.g., const fetcherRef = useRef(fetcher) and
update it in an effect, and destructure options into enabled, onSuccess,
onError) and update useCallback(refetch) to depend only on those stable
refs/primitive values; also add abort/cleanup logic inside refetch and the
effect (create an AbortController or mounted flag, pass its signal to the async
work, and ensure you don't call setState if aborted/unmounted) so refetch and
the useEffect that triggers it (useEffect watching key and enabled only) no
longer cause infinite re-renders.
.kiro/skills/deployment-patterns/SKILL.md-15-22 (1)

15-22: 🛠️ Refactor suggestion | 🟠 Major

Consolidate duplicate sections and align with skill format.

The skill has two "when to use" sections at lines 15-22 ("When to Activate") and lines 433-440 ("When to Use This Skill") with identical content. Additionally, per learnings, skills should follow a clear structure with "When to Use", "How It Works", and "Examples" sections, but this skill embeds content in topical sections instead.

Suggested structure:

  • Keep one "When to Use" section
  • Add "How It Works" section explaining deployment workflow concepts
  • Add "Examples" section with all the code samples

Based on learnings: Skills should be formatted as Markdown with clear sections for When to Use, How It Works, and Examples.

📋 Proposed structural reorganization
-## When to Activate
+## When to Use

 - Setting up CI/CD pipelines
 - Dockerizing an application
 - Planning deployment strategy (blue-green, canary, rolling)
 - Implementing health checks and readiness probes
 - Preparing for a production release
 - Configuring environment-specific settings

+## How It Works
+
+This skill covers production deployment workflows through several key areas:
+
+1. **Deployment Strategies**: Rolling, blue-green, and canary patterns for zero-downtime releases
+2. **Containerization**: Multi-stage Docker builds optimized for production
+3. **CI/CD Pipelines**: Automated testing, building, and deployment workflows
+4. **Health Checks**: Application readiness and liveness probes
+5. **Configuration Management**: Environment-based config following 12-factor principles
+6. **Rollback Procedures**: Safe recovery mechanisms for failed deployments
+7. **Production Readiness**: Comprehensive checklists across application, infrastructure, monitoring, security, and operations
+
+## Examples

 ## Deployment Strategies
 
 (keep all existing content from Deployment Strategies through Production Readiness Checklist)

-## When to Use This Skill
-
-- Setting up CI/CD pipelines
-- Dockerizing applications
-- Planning deployment strategies
-- Implementing health checks
-- Preparing for production releases
-- Troubleshooting deployment issues

Also applies to: 433-440

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/deployment-patterns/SKILL.md around lines 15 - 22, Consolidate
the duplicate "When to Activate" and "When to Use This Skill" sections into a
single "When to Use" section (replace the header "When to Activate" with "When
to Use" and remove the other duplicate), then add a new "How It Works" section
that explains high-level deployment workflow concepts (blue-green, canary,
rolling, health/readiness, CI/CD and env config) and a separate "Examples"
section that collects all code samples now scattered in topical sections; ensure
headings are exactly "When to Use", "How It Works", and "Examples" and
move/remove the duplicated content so the file follows the required skill
format.
.kiro/skills/deployment-patterns/SKILL.md-142-142 (1)

142-142: ⚠️ Potential issue | 🟠 Major

Add wget to Alpine base image dependencies.

The HEALTHCHECK command on line 142 uses wget, but it is not installed in the Alpine 3.19 image. The minimal Alpine image does not include wget by default; only BusyBox provides a limited applet. This will cause the health check to fail at runtime.

Fix
-RUN apk --no-cache add ca-certificates
+RUN apk --no-cache add ca-certificates wget
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/deployment-patterns/SKILL.md at line 142, The HEALTHCHECK uses
wget but the Alpine 3.19 base image doesn't include it; update the image's
package installation to add wget (e.g., add apk add --no-cache wget in the
Dockerfile or the base-image setup referenced by this SKILL) so the HEALTHCHECK
line (HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO-
http://localhost:8080/health || exit 1) can run successfully; ensure the change
is applied to the stage that produces the runtime image so wget is present when
the container starts.
.kiro/skills/golang-patterns/SKILL.md-89-102 (1)

89-102: ⚠️ Potential issue | 🟠 Major

Worker-pool example can block indefinitely.

This pattern can deadlock if results is not drained while workers are sending.

🔧 Safer pattern
-func workerPool(jobs <-chan Job, results chan<- Result, workers int) {
+func workerPool(jobs <-chan Job, workers int) <-chan Result {
+    results := make(chan Result, workers)
     var wg sync.WaitGroup
     for i := 0; i < workers; i++ {
         wg.Add(1)
         go func() {
             defer wg.Done()
             for job := range jobs {
                 results <- processJob(job)
             }
         }()
     }
-    wg.Wait()
-    close(results)
+    go func() {
+        wg.Wait()
+        close(results)
+    }()
+    return results
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/golang-patterns/SKILL.md around lines 89 - 102, The workerPool
can deadlock because goroutines send to the results channel while no receiver
may be draining it; update workerPool (and its use of jobs, results, workers,
processJob, wg) to ensure sends never block by either creating/using a buffered
results channel (e.g., capacity >= workers or number of jobs) or by spawning an
internal goroutine that consumes worker outputs and forwards them to the
provided results channel; keep the existing wg.Done/close(results) logic so
results is closed only after all workers finish.
.kiro/skills/docker-patterns/SKILL.md-141-146 (1)

141-146: ⚠️ Potential issue | 🟠 Major

Use cpus and mem_limit instead of deploy.resources.limits for Docker Compose non-Swarm mode.

The deploy.resources.limits section is ignored by docker compose up (non-Swarm) and will not enforce the specified CPU or memory limits. Use service-level fields instead: cpus for CPU constraints and mem_limit for hard memory limits (optionally mem_reservation for soft limits).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/docker-patterns/SKILL.md around lines 141 - 146, The current
Docker Compose snippet uses deploy.resources.limits (deploy.resources.limits ->
cpus: "1.0", memory: 512M) which is ignored by non‑Swarm docker compose; update
the service definition to use service‑level fields instead (replace
deploy.resources.limits with cpus and mem_limit, and optionally mem_reservation)
so that docker compose up will enforce CPU and memory limits (e.g., set cpus:
"1.0" and mem_limit: 512M on the service config).
.kiro/docs/shortform-guide.md-286-290 (1)

286-290: ⚠️ Potential issue | 🟠 Major

Remove reference to missing documentation file or create it.

The guide references docs/migration-from-ecc.md (line 288), but this file does not exist in the repository. Either create the missing file or remove the reference from the documentation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/docs/shortform-guide.md around lines 286 - 290, The docs reference to
`docs/migration-from-ecc.md` in the shortform guide must be resolved: either add
the missing migration document with the expected content or remove/update the
bullet referencing `docs/migration-from-ecc.md` in
`.kiro/docs/shortform-guide.md` so it no longer points to a non-existent file;
ensure the change keeps the surrounding bullets (`Longform Guide`, `Security
Guide`, `GitHub Issues`, `Kiro Documentation`) consistent and the link
text/format remains valid if you replace it with an alternative resource.
.kiro/scripts/format.sh-30-33 (1)

30-33: ⚠️ Potential issue | 🟠 Major

Formatter detection and execution paths are inconsistent.

detect_formatter accepts globally installed formatters (lines 30–33), but the execution logic (lines 44–61) hard-requires npx. If npx is unavailable while a global formatter exists, the script exits with an error despite having a valid formatter to use.

For example, a user with biome installed globally but no npx will see the script detect biome but then fail with "Error: npx not found (required for Biome)".

Suggested fix
   biome)
-    if command -v npx &>/dev/null; then
+    if command -v npx &>/dev/null; then
       echo "Formatting $FILE with Biome..."
-      npx biome format --write "$FILE"
+      npx biome format --write -- "$FILE"
+      exit $?
+    elif command -v biome &>/dev/null; then
+      echo "Formatting $FILE with Biome (global)..."
+      biome format --write -- "$FILE"
       exit $?
     else
-      echo "Error: npx not found (required for Biome)"
+      echo "Error: Neither npx nor biome executable found"
       exit 1
     fi
     ;;
@@
   prettier)
     if command -v npx &>/dev/null; then
       echo "Formatting $FILE with Prettier..."
-      npx prettier --write "$FILE"
+      npx prettier --write -- "$FILE"
+      exit $?
+    elif command -v prettier &>/dev/null; then
+      echo "Formatting $FILE with Prettier (global)..."
+      prettier --write -- "$FILE"
       exit $?
     else
-      echo "Error: npx not found (required for Prettier)"
+      echo "Error: Neither npx nor prettier executable found"
       exit 1
     fi
     ;;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/scripts/format.sh around lines 30 - 33, The formatter detection
(detect_formatter) allows globally installed tools like "biome" or "prettier"
but the execution block later assumes npx is mandatory; update the execution
logic to first check whether the detected formatter binary (e.g., "biome" or
"prettier") exists in PATH and, if so, invoke that global command directly, only
falling back to requiring npx when the binary is not present; ensure references
to the detected value from detect_formatter are used and that the error message
about "npx not found" is only shown when npx is actually required for the chosen
formatter.
.kiro/skills/database-migrations/SKILL.md-110-129 (1)

110-129: ⚠️ Potential issue | 🟠 Major

Add execution-context warnings to migration examples.

The DO $$ ... $$ block at line 127 contains COMMIT inside the block, which only works when invoked at the database's "top level"—not inside a transaction. Similarly, the golang-migrate example at lines 293–295 uses CREATE INDEX CONCURRENTLY, which cannot run inside a transaction block. golang-migrate's Postgres driver disables multi-statement mode by default, meaning all statements in a migration file execute within a single transaction, causing CREATE INDEX CONCURRENTLY to fail.

While a warning about CONCURRENTLY exists at lines 69–70, it's in the PostgreSQL section and not visible to users following the golang-migrate section. Add explicit guidance to both examples:

  • Line 110–129: Document that the DO block requires non-transaction execution context and may need to be run separately in golang-migrate or other transaction-bound runners.
  • Lines 293–295: Repeat or reference the CONCURRENTLY warning and explain how to handle it in golang-migrate (e.g., separate the CREATE INDEX into its own migration or enable x-multi-statement with transaction handling).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/database-migrations/SKILL.md around lines 110 - 129, The DO $$
... $$ block that contains COMMIT (the anonymous PL/pgSQL block) must be
documented as requiring top-level/non-transaction execution (cannot be run
inside a transaction block), so update the SKILL.md example around the DO $$
block to warn readers to run that block as a standalone migration or outside
transaction-bound runners (or split into separate statements) when using tools
like golang-migrate; likewise, for the CREATE INDEX CONCURRENTLY example
referenced earlier, add or repeat a clear note explaining that CREATE INDEX
CONCURRENTLY cannot run inside a transaction and advise concrete remedies for
golang-migrate users (e.g., place the CONCURRENTLY statement in its own
single-statement migration or enable multi-statement handling with correct
transaction control).
.kiro/install.sh-56-57 (1)

56-57: ⚠️ Potential issue | 🟠 Major

Don’t suppress copy failures while counting them as successful installs.

On these lines, cp ... || true hides failures, but counters are still incremented, so the summary can be incorrect.

💡 Suggested pattern
-      cp "$f" "$TARGET/.kiro/agents/" 2>/dev/null || true
-      agents=$((agents + 1))
+      if cp "$f" "$TARGET/.kiro/agents/"; then
+        agents=$((agents + 1))
+      else
+        echo "Warning: failed to copy $f" >&2
+      fi

Also applies to: 69-70, 80-81, 92-94, 103-106, 116-117

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/install.sh around lines 56 - 57, The copy commands currently swallow
failures with "|| true" but still increment counters (e.g., the cp "$f"
"$TARGET/.kiro/agents/" 2>/dev/null || true followed by agents=$((agents + 1))),
producing incorrect install summaries; change the flow to run cp without
unconditionally ignoring errors, capture its exit status, increment the
corresponding counter (agents and the other counters referenced in the comment)
only when cp succeeds, and log or surface failures (preserve stderr) instead of
discarding them so the summary accurately reflects successful installs.
.kiro/skills/api-design/SKILL.md-308-308 (1)

308-308: ⚠️ Potential issue | 🟠 Major

Replace the secret-like API key example to avoid scanner hits.

Line 308 uses a token pattern (sk_live_abc123) that can trip secret scanners and CI checks.

💡 Proposed fix
-X-API-Key: sk_live_abc123
+X-API-Key: <YOUR_API_KEY>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/api-design/SKILL.md at line 308, Replace the secret-like API
key example "X-API-Key: sk_live_abc123" with a non-sensitive placeholder to
avoid scanner/CI hits; update the example to use a clearly synthetic token such
as "X-API-Key: sk_test_XXXX" or "X-API-Key: <API_KEY_PLACEHOLDER>" so the string
no longer matches live-token patterns while preserving the example intent.
.kiro/agents/chief-of-staff.json-16-16 (1)

16-16: ⚠️ Potential issue | 🟠 Major

Avoid unconditional git commit & push in the default workflow.

Line 16 hardcodes commit/push as mandatory after each send; this can cause unintended remote writes. Gate push behind explicit user confirmation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/chief-of-staff.json at line 16, The PostToolUse hook currently
enforces unconditional "Git commit & push" in the post-send checklist (the
checklist item "Git commit & push"); change it so the hook still performs a
local git commit (or stages changes) but does not perform a remote push without
explicit user confirmation. Update the PostToolUse logic to: 1) replace
mandatory push with a gated action (e.g., require a "confirm_push" boolean or an
interactive confirmation prompt), 2) ensure commits are created/recorded by the
hook (so changes are saved locally) using the same hook name PostToolUse, and 3)
surface the push decision in the UI/briefing output as an explicit [Push] button
or confirmation message before executing git push.
.kiro/agents/chief-of-staff.md-1-8 (1)

1-8: ⚠️ Potential issue | 🟠 Major

Add missing frontmatter fields required for agent definitions.

This frontmatter omits tools and model, which can break consistency with existing agent metadata conventions.

💡 Example frontmatter shape
 ---
 name: chief-of-staff
 description: Personal communication chief of staff that triages email, Slack, LINE, and Messenger. Classifies messages into 4 tiers (skip/info_only/meeting_info/action_required), generates draft replies, and enforces post-send follow-through via hooks. Use when managing multi-channel communication workflows.
+tools:
+  - read
+  - write
+  - shell
+model: sonnet
 allowedTools:
   - read
   - write
   - shell
 ---

Based on learnings: Applies to agents/**/*.md : Agents should be formatted as Markdown with YAML frontmatter containing name, description, tools, and model fields.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/chief-of-staff.md around lines 1 - 8, The YAML frontmatter for
the agent "chief-of-staff" is missing the required tools and model fields;
update the frontmatter block in .kiro/agents/chief-of-staff.md to include a
tools list (matching allowedTools like read/write/shell) and a model entry
(e.g., a model name or version used by your agents), ensuring the frontmatter
contains name, description, tools, and model keys so the agent metadata aligns
with other agents' definitions.
.kiro/agents/chief-of-staff.json-14-16 (1)

14-16: ⚠️ Potential issue | 🟠 Major

Configure the PostToolUse hook in the hooks object to match the prompt's design intent.

The hooks object (line 14) is empty, but the prompt (line 16+) describes a PostToolUse hook that enforces the post-send checklist. Move the hook definition from the prompt documentation into the hooks configuration so the enforcement is actually active.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/chief-of-staff.json around lines 14 - 16, The hooks object is
empty but the prompt describes a PostToolUse hook that must enforce the
post-send checklist; add a PostToolUse entry into the "hooks" object that
references the enforcement logic (e.g., a hook named "PostToolUse" that invokes
the checklist handler), ensure its configuration keys match the prompt's
behavior (block completion until checklist steps complete, intercept gmail send
and conversations_add_message), and wire it to the existing checklist
handler/module referenced by the agent (PostToolUse hook name and checklist
enforcement handler) so the documented enforcement is actually active.
.kiro/hooks/extract-patterns.kiro.hook-7-11 (1)

7-11: ⚠️ Potential issue | 🟠 Major

Replace agentStopaskAgent with a guarded pattern to prevent recursive hook triggers.

The agentStop event fires when an agent turn completes. When triggered by a hook, askAgent starts a new agent loop that will itself emit agentStop on completion, re-triggering the hook unless guarded. Use runCommand with a lock/sentinel instead:

Recommended guard pattern
{
  "when": { "type": "agentStop" },
  "then": {
    "type": "runCommand",
    "command": "bash -lc '\nLOCK=.kiro/.hook-lock/after-stop.lock\nmkdir -p .kiro/.hook-lock\nif [ -f \"$LOCK\" ]; then exit 0; fi\ntrap \"rm -f $LOCK\" EXIT\ntouch \"$LOCK\"\n# Trigger follow-up agent work here\n'"
  }
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/hooks/extract-patterns.kiro.hook around lines 7 - 11, The hook
currently triggers on "agentStop" and directly uses "askAgent", which can
re-enter the agent loop and retrigger "agentStop"; replace the "then":
{"type":"askAgent", ...} block with a guarded "runCommand" pattern that creates
and checks a sentinel lock (e.g., .kiro/.hook-lock/after-stop.lock), exits
immediately if the lock exists, sets a trap to remove the lock on exit,
touches/creates the lock, and then invokes the follow-up agent action; reference
the "agentStop" trigger, remove or replace "askAgent", and implement
"runCommand" with the lock sentinel to prevent recursive hook execution.
.kiro/agents/tdd-guide.json-16-16 (1)

16-16: ⚠️ Potential issue | 🟠 Major

Prompt hardcodes npm commands, which breaks cross-language applicability.

Line 16 instructs npm test and npm run test:coverage directly. For Go/Python/Java repos this produces incorrect execution guidance. Please replace with project-native command placeholders and short examples by ecosystem.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/tdd-guide.json at line 16, The prompt string under the "prompt"
key hardcodes npm commands (`npm test`, `npm run test:coverage`) which are not
portable; update the "prompt" value to use a configurable placeholder (e.g.,
{run_tests_command}, {coverage_command}) and include a short example list of
ecosystem-specific commands (Node: npm/yarn, Python: pytest/coverage, Go: go
test, Java/Maven: mvn test) so the guidance shows how to map the placeholders to
project-native commands; ensure references to the test and coverage steps (the
"Write Test First (RED)" and "Verify Coverage" sections) use the placeholders
rather than literal npm commands.
.kiro/hooks/doc-file-warning.kiro.hook-5-13 (1)

5-13: ⚠️ Potential issue | 🟠 Major

Hook must implement path-based filtering inside the command logic.

The hook fires for all write operations regardless of target file, creating noise for non-documentation edits. Kiro's preToolUse matchers cannot filter by file path at the manifest level—filtering must be implemented inside the hook command by inspecting tool_input.operations[].path. Check if each write operation targets documentation patterns (README, CHANGELOG, docs/, etc.) and only prompt when appropriate.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/hooks/doc-file-warning.kiro.hook around lines 5 - 13, The hook
currently prompts on every write because path filtering is missing; update the
hook's command logic (the code executed for the "then" action in
.kiro/hooks/doc-file-warning.kiro.hook) to inspect tool_input.operations[].path
and only trigger the askAgent prompt when at least one operation path matches
documentation patterns (e.g., /^README/i, /^CHANGELOG/i, /^docs[\/\\]/,
/^docs\//, files under /docs/, or other project-specific doc filenames). If no
operations match those patterns, skip the askAgent prompt and allow the write to
proceed unprompted; if some match, run the existing prompt logic but restrict
the message/context to only the matched operation(s).
.kiro/hooks/tdd-reminder.kiro.hook-8-8 (1)

8-8: ⚠️ Potential issue | 🟠 Major

Use recursive globs for nested TypeScript files.

Kiro pattern matching is path-based where * matches only within a single path segment (doesn't cross /). The patterns "*.ts" and "*.tsx" match only root-level files like foo.ts, not nested files like src/app/foo.ts. This hook won't trigger for most TypeScript files in the project.

Proposed matcher update
-    "patterns": ["*.ts", "*.tsx"]
+    "patterns": ["**/*.ts", "**/*.tsx"]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/hooks/tdd-reminder.kiro.hook at line 8, The hook's file-matching
patterns ("*.ts", "*.tsx") only match single-segment paths and miss nested
files; update the patterns in .kiro/hooks/tdd-reminder.kiro.hook to use
recursive globs (e.g., "**/*.ts" and "**/*.tsx") so the matcher includes nested
TypeScript files like src/app/foo.ts and src/components/foo.tsx; locate the
"patterns" array and replace the single-segment globs with the double-star
recursive variants.
.kiro/skills/tdd-workflow/SKILL.md-184-234 (1)

184-234: 🛠️ Refactor suggestion | 🟠 Major

Replace waitForTimeout with explicit waits for reliable tests.

Line 199 uses page.waitForTimeout(600), which Playwright explicitly discourages and marks for debugging-only use. Fixed sleeps don't wait for actual application state—they're inherently racy and fail when the app is slower than expected. The expect(results).toHaveCount(5, { timeout: 5000 }) on line 204 already provides an explicit retry-based wait, making the waitForTimeout both redundant and anti-pattern.

♻️ Recommended fix
   // Search for markets
   await page.fill('input[placeholder="Search markets"]', 'election')
 
-  // Wait for debounce and results
-  await page.waitForTimeout(600)
-
   // Verify search results displayed
   const results = page.locator('[data-testid="market-card"]')
   await expect(results).toHaveCount(5, { timeout: 5000 })

The expect(...).toHaveCount(...) with its timeout automatically polls the element count until the condition is met or timeout expires. If you need to explicitly wait for a network request, use page.waitForResponse() instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/tdd-workflow/SKILL.md around lines 184 - 234, In the "user can
search and filter markets" test remove the hard sleep call
page.waitForTimeout(600) and rely on the existing retryable assertion
expect(results).toHaveCount(5, { timeout: 5000 }) (results is the locator
defined as page.locator('[data-testid="market-card"]')); if you actually need to
wait for a specific network response before asserting, replace the sleep with an
explicit wait like page.waitForResponse(...) targeting the backend endpoint that
returns market results or use page.waitForSelector(...) for a known element,
then keep the expect(results).toHaveCount assertion.
🟡 Minor comments (16)
.kiro/agents/harness-optimizer.json-1-15 (1)

1-15: ⚠️ Potential issue | 🟡 Minor

Inconsistent allowedTools value between JSON and MD formats.

The JSON file specifies "fs_read" in allowedTools (line 9), while the companion .kiro/agents/harness-optimizer.md specifies read in its frontmatter (line 5). These dual-format files should be consistent to avoid confusion when the agent is invoked via CLI vs IDE.

Proposed fix (align with JSON naming)

In .kiro/agents/harness-optimizer.md, update the frontmatter:

 allowedTools:
-  - read
+  - fs_read

Or, if read is the correct Kiro IDE convention, update the JSON:

   "allowedTools": [
-    "fs_read"
+    "read"
   ],
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/harness-optimizer.json around lines 1 - 15, The allowedTools
entry is inconsistent between the harness-optimizer JSON ("allowedTools":
["fs_read"]) and the harness-optimizer MD frontmatter (`read`); pick one
canonical tool name and make both files match—preferably update the
.kiro/agents/harness-optimizer.md frontmatter to use fs_read to mirror the JSON
(or if you decide `read` is canonical, update the JSON allowedTools to "read");
ensure the keys named allowedTools and the literal tool token ("fs_read" vs
"read") are identical across both files and run the agent/CI to validate no
tooling errors.
.kiro/skills/coding-standards/SKILL.md-1-21 (1)

1-21: ⚠️ Potential issue | 🟡 Minor

Add missing "How it works" and "Examples" sections to match skill documentation standards.

The file currently uses "When to Activate" followed by topical sections with embedded examples. Per skill formatting guidelines, add dedicated "How it works" and "Examples" sections. You can structure it as: frontmatter → "When to Activate" → "How it works" (explaining the approach) → "Examples" → topical sections.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/coding-standards/SKILL.md around lines 1 - 21, The document is
missing dedicated "How it works" and "Examples" sections per skill formatting;
after the frontmatter and the existing "When to Activate" heading, add a "How it
works" section that succinctly explains the approach and rationale for the
coding standards (e.g., scope, enforcement, examples of patterns to follow) and
then an "Examples" section that provides concrete, short examples/snippets or
usage scenarios illustrating the standards; keep the existing topical sections
(like the list items under "When to Activate") after the new "Examples" section
so the file follows the required order: frontmatter → When to Activate → How it
works → Examples → topical sections.
.kiro/skills/frontend-patterns/SKILL.md-111-125 (1)

111-125: ⚠️ Potential issue | 🟡 Minor

Add cleanup to prevent state updates on unmounted component.

The useEffect hook fetches data but doesn't clean up if the component unmounts during the fetch. This can cause React warnings about setting state on an unmounted component and potential memory leaks.

🛡️ Proposed fix using AbortController
 export function DataLoader<T>({ url, children }: DataLoaderProps<T>) {
   const [data, setData] = useState<T | null>(null)
   const [loading, setLoading] = useState(true)
   const [error, setError] = useState<Error | null>(null)
 
   useEffect(() => {
+    const controller = new AbortController()
+    
-    fetch(url)
+    fetch(url, { signal: controller.signal })
       .then(res => res.json())
       .then(setData)
-      .catch(setError)
+      .catch(err => {
+        if (err.name !== 'AbortError') {
+          setError(err)
+        }
+      })
       .finally(() => setLoading(false))
+    
+    return () => controller.abort()
   }, [url])
 
   return <>{children(data, loading, error)}</>
 }

Based on learnings, custom React hooks should implement proper useEffect cleanup for side effects.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/frontend-patterns/SKILL.md around lines 111 - 125, The
DataLoader component's useEffect can set state after unmount; modify the effect
in DataLoader to create an AbortController and pass controller.signal to fetch,
and in the cleanup call controller.abort(); also guard state setters (setData,
setError, setLoading) so they only run when the fetch wasn't aborted (check
error.name !== 'AbortError' or track a mounted flag), and ensure finally still
sets loading to false only if not aborted—update the useEffect that references
url, fetch, setData, setError, setLoading to implement this cleanup and abort
handling.
.kiro/steering/golang-patterns.md-9-9 (1)

9-9: ⚠️ Potential issue | 🟡 Minor

Use a hyphenated adjective on Line 9.

“Go-specific” is the correct form here.

Suggested patch
-> This file extends the common patterns with Go specific content.
+> This file extends the common patterns with Go-specific content.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/steering/golang-patterns.md at line 9, Replace the unhyphenated
adjective in the sentence "This file extends the common patterns with Go
specific content." by changing "Go specific" to the hyphenated form
"Go-specific" so the line reads "This file extends the common patterns with
Go-specific content."; locate that exact sentence in the document and update the
wording accordingly.
.kiro/steering/typescript-patterns.md-3-4 (1)

3-4: ⚠️ Potential issue | 🟡 Minor

Align the frontmatter scope with the stated TypeScript/JavaScript intent.

Line 3 currently excludes JavaScript files even though Lines 4 and 9 describe TS/JS coverage.

Suggested patch
-fileMatchPattern: "*.ts,*.tsx"
+fileMatchPattern: "*.ts,*.tsx,*.js,*.jsx"

Based on learnings: Applies to **/*.{ts,tsx,js,jsx} : Use the ApiResponse interface pattern with generic type parameter.

Also applies to: 9-9

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/steering/typescript-patterns.md around lines 3 - 4, Update the
frontmatter fileMatchPattern to include JavaScript extensions so the scope
matches the stated TS/JS intent: locate the frontmatter key fileMatchPattern and
change its value from "*.ts,*.tsx" to a glob that includes js and jsx (e.g.,
"*.{ts,tsx,js,jsx}"), and similarly update the other occurrence that restricts
patterns (the second fileMatchPattern-like entry referenced in the comment) to
the same combined glob so examples like the ApiResponse generic pattern apply to
.ts/.tsx/.js/.jsx files.
.kiro/steering/typescript-patterns.md-9-9 (1)

9-9: ⚠️ Potential issue | 🟡 Minor

Minor doc polish on Line 9: hyphenate the compound adjective.

Use “TypeScript/JavaScript-specific”.

Suggested patch
-> This file extends the common patterns rule with TypeScript/JavaScript specific content.
+> This file extends the common patterns rule with TypeScript/JavaScript-specific content.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/steering/typescript-patterns.md at line 9, Update the sentence "This
file extends the common patterns rule with TypeScript/JavaScript specific
content." to hyphenate the compound adjective as
"TypeScript/JavaScript-specific" so it reads "This file extends the common
patterns rule with TypeScript/JavaScript-specific content."; locate and edit
that exact line in the document to apply the change.
.kiro/hooks/console-log-check.kiro.hook-8-8 (1)

8-8: ⚠️ Potential issue | 🟡 Minor

Add .jsx to the monitored patterns on Line 8.

Without it, React JSX files are excluded from the console-log check.

Suggested patch
-    "patterns": ["*.js", "*.ts", "*.tsx"]
+    "patterns": ["*.js", "*.ts", "*.tsx", "*.jsx"]

Based on learnings: Applies to **/*.{ts,tsx,js,jsx} : Warn about console.log statements in edited files.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/hooks/console-log-check.kiro.hook at line 8, The "patterns" array in
the hook configuration currently monitors "*.js", "*.ts", and "*.tsx" but omits
React .jsx files; update the patterns array used by the console-log check (the
"patterns" entry) to include "*.jsx" so files matching .jsx are also scanned
(i.e., apply the same glob set used elsewhere such as /*.{ts,tsx,js,jsx}).
.kiro/hooks/auto-format.kiro.hook-8-8 (1)

8-8: ⚠️ Potential issue | 🟡 Minor

Include .jsx in the file patterns on Line 8.

Right now JSX files won’t trigger this formatter hook.

Suggested patch
-    "patterns": ["*.ts", "*.tsx", "*.js"]
+    "patterns": ["*.ts", "*.tsx", "*.js", "*.jsx"]

Based on learnings: Applies to **/*.{ts,tsx,js,jsx} : Auto-format JavaScript/TypeScript files using Prettier after edit.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/hooks/auto-format.kiro.hook at line 8, Update the hook's file patterns
so JSX files are included: modify the "patterns" array in
.kiro/hooks/auto-format.kiro.hook (the entry currently ["*.ts", "*.tsx",
"*.js"]) to also match .jsx files (e.g., add "*.jsx" or replace with a single
glob like "*.{ts,tsx,js,jsx}") so the Auto-format JavaScript/TypeScript Prettier
hook triggers for .jsx files as well.
.kiro/steering/git-workflow.md-17-17 (1)

17-17: ⚠️ Potential issue | 🟡 Minor

Avoid tool-specific settings path in Kiro steering.

The note points to ~/.claude/settings.json, which is likely confusing in this Kiro-specific workflow doc.

🔧 Proposed wording
- Note: Attribution disabled globally via ~/.claude/settings.json.
+ Note: Attribution behavior is controlled by the active client's global settings.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/steering/git-workflow.md at line 17, Replace the tool-specific path
"~/.claude/settings.json" with a generic, Kiro-appropriate note: remove the
explicit ~/.claude path and reword the sentence to say something like
"Attribution is disabled via the user's assistant tool settings" or "Attribution
disabled via local assistant settings" so the Kiro steering doc avoids
referencing a third-party tool; update the line containing
"~/.claude/settings.json" accordingly.
.kiro/skills/verification-loop/SKILL.md-82-83 (1)

82-83: ⚠️ Potential issue | 🟡 Minor

Use a branch-aware diff instead of HEAD~1.

git diff HEAD~1 --name-only only compares the last commit and can miss current staged/unstaged scope.

🔧 Proposed update
- git diff HEAD~1 --name-only
+ git diff --name-only
+ # For PR scope:
+ git diff [base-branch]...HEAD --name-only
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/verification-loop/SKILL.md around lines 82 - 83, Replace the
brittle `git diff HEAD~1 --name-only` with a branch-aware comparison using the
merge-base (e.g. `git diff --name-only $(git merge-base origin/main
HEAD)..HEAD`) and include staged changes as needed (use `--cached` for staged)
so the command in SKILL.md compares your current branch against the target
branch instead of only the last commit; update the example/command text to show
both the working-tree and cached variants if you want to capture unstaged and
staged changes respectively.
.kiro/docs/shortform-guide.md-5-15 (1)

5-15: ⚠️ Potential issue | 🟡 Minor

Installation instructions contain incorrect URLs and script paths.

Line 7 uses placeholder yourusername instead of the actual repository owner. Lines 11 and 14 reference ./install.sh, but the install script is located at .kiro/install.sh.

Suggested fix
 # Clone the repository
-git clone https://github.com/yourusername/ecc-kiro-public-repo.git
+git clone https://github.com/affaan-m/everything-claude-code.git
 cd ecc-kiro-public-repo
 
 # Install to current project
-./install.sh
+.kiro/install.sh
 
 # Install globally to ~/.kiro/
-./install.sh ~
+.kiro/install.sh ~
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/docs/shortform-guide.md around lines 5 - 15, Replace the placeholder
repo URL and incorrect script paths in the shortform guide: update the git clone
URL (currently "https://github.com/yourusername/ecc-kiro-public-repo.git") to
use the real repository owner/org or a canonical repo URL, and change all
references to "./install.sh" to the correct ".kiro/install.sh" script path so
the three example install commands point to the actual install script; update
text surrounding the commands if necessary to keep phrasing consistent with the
new URL and path.
.kiro/README.md-598-598 (1)

598-598: ⚠️ Potential issue | 🟡 Minor

Fix spelling: "Contributers" → "Contributors"

Static analysis flagged this typo.

📝 Proposed fix
-## Contributers
+## Contributors
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/README.md at line 598, Replace the misspelled header "## Contributers"
in the README entry with the correct spelling "## Contributors"; update the
header line in .kiro/README.md where the symbol "## Contributers" appears so it
reads "## Contributors".
.kiro/skills/backend-patterns/SKILL.md-188-206 (1)

188-206: ⚠️ Potential issue | 🟡 Minor

SQL dollar-quoting syntax is incomplete.

The PL/pgSQL function uses $ as the delimiter, but PostgreSQL requires $$ (double dollar signs) for dollar-quoting. This will cause a syntax error if copied directly.

🐛 Proposed fix
 // SQL function in Supabase
 CREATE OR REPLACE FUNCTION create_market_with_position(
   market_data jsonb,
   position_data jsonb
 )
 RETURNS jsonb
 LANGUAGE plpgsql
-AS $
+AS $$
 BEGIN
   -- Start transaction automatically
   INSERT INTO markets VALUES (market_data);
   INSERT INTO positions VALUES (position_data);
   RETURN jsonb_build_object('success', true);
 EXCEPTION
   WHEN OTHERS THEN
     -- Rollback happens automatically
     RETURN jsonb_build_object('success', false, 'error', SQLERRM);
 END;
-$;
+$$;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/backend-patterns/SKILL.md around lines 188 - 206, The function
create_market_with_position uses a single-dollar delimiter which is invalid;
change the PL/pgSQL dollar-quoting to use double dollar signs so the block is
wrapped with AS $$ ... $$; and ensure the closing delimiter is $$ followed by
the terminating semicolon. Locate the CREATE FUNCTION
create_market_with_position declaration and replace the single $ delimiters
surrounding the body with $$ for both the opening (AS $$) and closing ($$;)
delimiters.
.kiro/steering/typescript-security.md-9-9 (1)

9-9: ⚠️ Potential issue | 🟡 Minor

Hyphenate the compound modifier for clarity.

Line 9 should use TypeScript/JavaScript-specific instead of TypeScript/JavaScript specific.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/steering/typescript-security.md at line 9, Replace the phrase
"TypeScript/JavaScript specific" with the hyphenated compound
"TypeScript/JavaScript-specific" in the document comment that reads "This file
extends the common security rule with TypeScript/JavaScript specific content."
to ensure correct compound-modifier punctuation.
.kiro/scripts/quality-gate.sh-5-5 (1)

5-5: ⚠️ Potential issue | 🟡 Minor

Update the hook filename in the header comment.

Line 5 references .kiro/hooks/quality-gate.json, but this PR adds .kiro/hooks/quality-gate.kiro.hook.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/scripts/quality-gate.sh at line 5, Update the header comment in the
.kiro/scripts/quality-gate.sh file so the referenced hook filename matches the
new file added in this PR: replace the old `.kiro/hooks/quality-gate.json`
reference with `.kiro/hooks/quality-gate.kiro.hook` in the comment at the top of
the script (the line currently saying "Used by: .kiro/hooks/quality-gate.json").
.kiro/agents/e2e-runner.md-74-79 (1)

74-79: ⚠️ Potential issue | 🟡 Minor

Incorrect auto-wait statement for page.click().

Line 76 states that page.locator().click() auto-waits while page.click() doesn't. This is inaccurate for modern Playwright—page.click(selector) also auto-waits for the element. The key difference is that page.locator() returns a reusable locator object with better assertion support.

📝 Suggested fix
-- **Auto-wait built in**: `page.locator().click()` auto-waits; raw `page.click()` doesn't
+- **Prefer locators**: `page.locator().click()` is preferred over `page.click(selector)` for reusability and better assertions
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/agents/e2e-runner.md around lines 74 - 79, The statement claiming
`page.locator().click()` auto-waits while `page.click()` doesn't is incorrect;
update the line to say that both `page.click(selector)` and `locator.click()`
perform Playwright's built-in auto-waiting, and highlight that `page.locator()`
(the `Locator` object) is reusable and provides richer assertion methods (e.g.,
`locator.waitFor()`, `expect(locator).toHaveText()`) and chaining benefits
compared to the one-off `page.click(selector)` call; replace the inaccurate
wording on the `page.click()` vs `page.locator()` difference accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7831620c-1430-42ce-96ff-6099b1fe312e

📥 Commits

Reviewing files that changed from the base of the PR and between 7cf07ca and 278964c.

📒 Files selected for processing (85)
  • .kiro/README.md
  • .kiro/agents/architect.json
  • .kiro/agents/architect.md
  • .kiro/agents/build-error-resolver.json
  • .kiro/agents/build-error-resolver.md
  • .kiro/agents/chief-of-staff.json
  • .kiro/agents/chief-of-staff.md
  • .kiro/agents/code-reviewer.json
  • .kiro/agents/code-reviewer.md
  • .kiro/agents/database-reviewer.json
  • .kiro/agents/database-reviewer.md
  • .kiro/agents/doc-updater.json
  • .kiro/agents/doc-updater.md
  • .kiro/agents/e2e-runner.json
  • .kiro/agents/e2e-runner.md
  • .kiro/agents/go-build-resolver.json
  • .kiro/agents/go-build-resolver.md
  • .kiro/agents/go-reviewer.json
  • .kiro/agents/go-reviewer.md
  • .kiro/agents/harness-optimizer.json
  • .kiro/agents/harness-optimizer.md
  • .kiro/agents/loop-operator.json
  • .kiro/agents/loop-operator.md
  • .kiro/agents/planner.json
  • .kiro/agents/planner.md
  • .kiro/agents/python-reviewer.json
  • .kiro/agents/python-reviewer.md
  • .kiro/agents/refactor-cleaner.json
  • .kiro/agents/refactor-cleaner.md
  • .kiro/agents/security-reviewer.json
  • .kiro/agents/security-reviewer.md
  • .kiro/agents/tdd-guide.json
  • .kiro/agents/tdd-guide.md
  • .kiro/docs/longform-guide.md
  • .kiro/docs/security-guide.md
  • .kiro/docs/shortform-guide.md
  • .kiro/hooks/README.md
  • .kiro/hooks/auto-format.kiro.hook
  • .kiro/hooks/code-review-on-write.kiro.hook
  • .kiro/hooks/console-log-check.kiro.hook
  • .kiro/hooks/doc-file-warning.kiro.hook
  • .kiro/hooks/extract-patterns.kiro.hook
  • .kiro/hooks/git-push-review.kiro.hook
  • .kiro/hooks/quality-gate.kiro.hook
  • .kiro/hooks/session-summary.kiro.hook
  • .kiro/hooks/tdd-reminder.kiro.hook
  • .kiro/hooks/typecheck-on-edit.kiro.hook
  • .kiro/install.sh
  • .kiro/scripts/format.sh
  • .kiro/scripts/quality-gate.sh
  • .kiro/settings/mcp.json.example
  • .kiro/skills/agentic-engineering/SKILL.md
  • .kiro/skills/api-design/SKILL.md
  • .kiro/skills/backend-patterns/SKILL.md
  • .kiro/skills/coding-standards/SKILL.md
  • .kiro/skills/database-migrations/SKILL.md
  • .kiro/skills/deployment-patterns/SKILL.md
  • .kiro/skills/docker-patterns/SKILL.md
  • .kiro/skills/e2e-testing/SKILL.md
  • .kiro/skills/frontend-patterns/SKILL.md
  • .kiro/skills/golang-patterns/SKILL.md
  • .kiro/skills/golang-testing/SKILL.md
  • .kiro/skills/postgres-patterns/SKILL.md
  • .kiro/skills/python-patterns/SKILL.md
  • .kiro/skills/python-testing/SKILL.md
  • .kiro/skills/search-first/SKILL.md
  • .kiro/skills/security-review/SKILL.md
  • .kiro/skills/tdd-workflow/SKILL.md
  • .kiro/skills/verification-loop/SKILL.md
  • .kiro/steering/coding-style.md
  • .kiro/steering/dev-mode.md
  • .kiro/steering/development-workflow.md
  • .kiro/steering/git-workflow.md
  • .kiro/steering/golang-patterns.md
  • .kiro/steering/lessons-learned.md
  • .kiro/steering/patterns.md
  • .kiro/steering/performance.md
  • .kiro/steering/python-patterns.md
  • .kiro/steering/research-mode.md
  • .kiro/steering/review-mode.md
  • .kiro/steering/security.md
  • .kiro/steering/swift-patterns.md
  • .kiro/steering/testing.md
  • .kiro/steering/typescript-patterns.md
  • .kiro/steering/typescript-security.md

Comment on lines +18 to +20
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SOURCE_KIRO="$SCRIPT_DIR/.kiro"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix source path resolution; it currently points to a non-existent directory.

Line 19 sets SOURCE_KIRO="$SCRIPT_DIR/.kiro", but this script already lives in .kiro, so it resolves to .../.kiro/.kiro.

💡 Proposed fix
-# Resolve the directory where this script lives (the repo root)
+# Resolve the directory where this script lives (.kiro)
 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
-SOURCE_KIRO="$SCRIPT_DIR/.kiro"
+SOURCE_KIRO="$SCRIPT_DIR"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/install.sh around lines 18 - 20, The SOURCE_KIRO variable is
incorrectly set to "$SCRIPT_DIR/.kiro" causing a duplicated .kiro path; update
SOURCE_KIRO in .kiro/install.sh to point to the script directory itself (i.e.,
set SOURCE_KIRO to "$SCRIPT_DIR" or to the resolved parent as appropriate) so
references use the actual .kiro directory, and verify any subsequent uses of
SOURCE_KIRO still work with the new value (look for usages of SOURCE_KIRO
elsewhere in the script to confirm no other path joins are required).

│ Define what functionality is needed │
│ Identify language/framework constraints │
├─────────────────────────────────────────────┤
│ 2. PARALLEL SEARCH (researcher agent) │
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check for researcher agent in .kiro/agents/

# Search for researcher agent files
fd -e md -e json 'researcher' .kiro/agents/

# Also search for any references to researcher in agent files
rg -l 'researcher' .kiro/agents/

Repository: affaan-m/everything-claude-code

Length of output: 57


🏁 Script executed:

# Check if .kiro/agents/ exists and what's in it
ls -la .kiro/agents/ 2>&1 || echo "Directory may not exist"

# List all agent-related files
fd . .kiro/agents/ 2>&1 | head -20

# Check the full SKILL.md file to see context around line 32
cat -n .kiro/skills/search-first/SKILL.md | head -90

# Search for any references to "agent" in the codebase
rg 'agent' .kiro/ -i --count | head -20

Repository: affaan-m/everything-claude-code

Length of output: 7441


Add missing researcher agent or update documentation.

The workflow diagram (line 32) and Full Mode instructions (lines 77-87) reference a "researcher agent" subagent that does not exist in .kiro/agents/. Either implement this agent or clarify in the documentation that this feature is aspirational or requires manual research steps.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/search-first/SKILL.md at line 32, The doc references a
non-existent "researcher agent" in the PARALLEL SEARCH workflow and Full Mode
instructions; either implement that subagent with the same agent interface used
by other subagents in .kiro/agents/ (name it researcher-agent or
researcherAgent, accept the same init/config and message/execute handlers as
other agents, and wire it into the PARALLEL SEARCH orchestration), or update
.kiro/skills/search-first/SKILL.md to remove/annotate the researcher agent
references and change Full Mode steps (lines referencing "researcher agent") to
explain the manual research steps or that the feature is aspirational. Ensure
the chosen fix keeps naming consistent with other agents (use the exact symbol
"researcher agent" in docs or "researcher-agent"/"researcherAgent" in code) so
cross-references resolve.

Comment on lines +344 to +361
import { verify } from '@solana/web3.js'

async function verifyWalletOwnership(
publicKey: string,
signature: string,
message: string
) {
try {
const isValid = verify(
Buffer.from(message),
Buffer.from(signature, 'base64'),
Buffer.from(publicKey, 'base64')
)
return isValid
} catch (error) {
return false
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

How to verify wallet signature in @solana/web3.js latest version

💡 Result:

Verify a signed message (wallet signature) — current Solana JS SDKs

Option A (recommended if you’re on @solana/web3.js v2 / “CryptoKey” APIs): verifySignature

@solana/web3.js v2 exposes verifySignature(publicKeyCryptoKey, signatureBytes, messageBytes) and returns a boolean. (tessl.io)

import { verifySignature } from "@solana/web3.js";

const messageBytes = new TextEncoder().encode(message);     // EXACT bytes that were signed
const signatureBytes = signature;                           // Uint8Array (64 bytes)
const publicKeyCryptoKey = publicKey;                       // CryptoKey (Ed25519 public key)

const ok = await verifySignature(publicKeyCryptoKey, signatureBytes, messageBytes);

If your wallet library gives you a base58 signature string, decode it to bytes first (e.g., with a base58 decoder), then verify. (The Solana Cookbook’s current examples show this flow, though using @solana/kit.) (solana.com)

Option B (if you’re on legacy @solana/web3.js v1 / PublicKey class): use Ed25519 verify (tweetnacl)

In v1, wallet public keys are PublicKey, and signatures are verified via Ed25519 detached verification (commonly tweetnacl.sign.detached.verify) using:

  • messageBytes
  • signatureBytes (Uint8Array)
  • publicKey.toBytes() (32-byte Uint8Array)

(This is the standard approach when you have PublicKey + signature bytes, but verifySignature(CryptoKey, ...) isn’t available.)


Verify a transaction’s signatures

If you’re verifying a serialized transaction (not a signMessage signature), deserialize and call:

import { Transaction } from "@solana/web3.js";

const tx = Transaction.from(rawTxBytes);
const ok = tx.verifySignatures(); // boolean

Transaction.verifySignatures(requireAllSignatures?: boolean) is documented in @solana/web3.js. (solana-foundation.github.io)

Citations:


🏁 Script executed:

#!/bin/bash

# Check if there's a package.json or npm registry info we can examine
# Let's search for `@solana/web3.js` imports in the codebase to understand which version is being used
rg "@solana/web3.js" -A 2 -B 2 | head -50

Repository: affaan-m/everything-claude-code

Length of output: 2008


🌐 Web query:

@solana/web3.js verify function export documentation

💡 Result:

There isn’t a top-level verify() export in @solana/web3.js (legacy). Signature verification is exposed as:

  • Legacy transactions: Transaction.prototype.verifySignatures(requireAllSignatures?: boolean): boolean (a method on Transaction, not a standalone export). [1]

    import { Transaction } from "@solana/web3.js";
    
    const tx = Transaction.from(rawTxBytes);
    const ok = tx.verifySignatures();      // requireAllSignatures defaults to true
  • web3.js v2-style “signing/authentication” helpers (standalone exports):

    • verifyTransactionSignatures(transaction): Promise<{ valid: boolean; invalidSignatures: Address[] }>
    • verifyMessageSignature(message, signature, publicKey): Promise<boolean> [2]
    import { verifyMessageSignature, verifyTransactionSignatures } from "@solana/web3.js";

Docs: Transaction verifySignatures API page [1]; v2 signing/authentication doc showing the verification exports [2].

References:
[1] (solana-foundation.github.io)
[2] (tessl.io)

Citations:


🌐 Web query:

@solana/web3.js verifySignature v2 latest documentation

💡 Result:

  • API (web3.js v2): verifySignature(key: CryptoKey, signature: SignatureBytes, data: ReadonlyUint8Array): Promise<boolean> and it’s used with Web Crypto CryptoKey public keys (Ed25519). [1][3]
  • Example (v2):
    import { generateKeyPair, signBytes, verifySignature } from "@solana/web3.js";
    
    const { privateKey, publicKey } = await generateKeyPair();
    const message = new TextEncoder().encode("Hello, Solana!");
    const sig = await signBytes(privateKey, message);
    
    const ok = await verifySignature(publicKey, sig, message);
    [1][3]
  • Modular package doc (same function): verifySignature is also documented as import { verifySignature } from "@solana/keys"; with the same behavior/signature. [2]

Sources: [1] @solana/web3.js “Technology Preview” (npm docs) • [2] @solana/keys verifySignature API doc • [3] web3.js v2 cryptography docs (verifySignature signature + example)


Use correct signature verification API from @solana/web3.js.

The verify function does not exist in @solana/web3.js. Use verifySignature (v2) instead:

import { verifySignature } from "@solana/web3.js";

const ok = await verifySignature(
  publicKeyCryptoKey,  // CryptoKey (Ed25519 public key)
  signatureBytes,      // Uint8Array (64 bytes)
  messageBytes         // Uint8Array (exact bytes that were signed)
);

The current code imports a non-existent function and uses incorrect parameter formats (base64 instead of CryptoKey/Uint8Array), causing a runtime error.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.kiro/skills/security-review/SKILL.md around lines 344 - 361, The
verifyWalletOwnership function is using a non-existent verify API and wrong
parameter formats; replace the import with verifySignature from `@solana/web3.js`,
convert the public key bytes into an Ed25519 CryptoKey (or obtain a CryptoKey
via WebCrypto importKey) and convert signature and message into Uint8Array
(signature 64 bytes, message exact bytes), then call await
verifySignature(publicKeyCryptoKey, signatureBytes, messageBytes) and return its
boolean result inside verifyWalletOwnership while preserving the current
try/catch error handling.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant