Skip to content

feat: add Konductor Kiro Power (powers/konductor/) - #29

Merged
knihit merged 37 commits into
mainfrom
feat/kiro-power
Oct 16, 2026
Merged

knihit merged 37 commits into
mainfrom
feat/kiro-power

Conversation

@knihit

@knihit knihit commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Description

Adds the Konductor Kiro Power at powers/konductor/, imported directly from
https://github.com/aws-solutions/konductor/tree/v1.1.0/powers/konductor -- no separate publish
branch needed, since that directory is already the flat, importable shape Kiro's GitHub import
expects. That tag resolves only once this PR merges and the release workflow publishes v1.1.0; it
404s until then. Once installed, saying "konductor" or using Try power installs Konductor into
whichever project you invoke it in.

  • konductor-setup: onboards a project end to end -- Step 0 consent disclosure, pinned
    checksum-verified download with a source-build fallback on Intel Mac (Windows not supported
    natively, use WSL), per-target power-cli.json binary tracking written via a random temp
    name (not a predictable one), release tag/version validated before any path, URL, or git-ref
    use, TLS 1.2+ pinned on the binary download, doctor wiring, update/uninstall with
    --confirmed, and --no-telemetry. update/uninstall resolve the right binary through
    power-cli.json or the CLI's own manifest file, never telemetry's install-info.json -- a
    target onboarded with --no-telemetry can still be updated and uninstalled.
  • konductor-help: answers CLI/doctor/SOP questions against an existing install.
  • 13 activation keywords on plugin.json: 9 konductor-qualified action phrases plus 4 broader
    discovery phrases.
  • make kiro-power-check validates the committed powers/konductor/ tree in place, wired into
    validate-pr.yml: VERSION/plugin.json drift, every committed import URL naming the matching
    release tag, the Agent Plugins v1.0.0 schema, skill frontmatter, and the full test suite.
    plugin.json is edited directly; there is no template or render step.
  • Manual "bring your own MCP server" docs for AWS lookups: the aws-mcp key, the Agent Toolkit
    for AWS's own command, all 8 tools reachable (5 pre-approved, 3 prompting), IAM guardrails.
  • Bumps VERSION (and cli/konductor-rs's Cargo version) to 1.1.0.

Type of Change

New skill · CLI (cli/) change -- Rust, version bump only · Infrastructure / pipeline · Documentation

Testing

  • make kiro-power-check: 262 assertions, 0 failed, under both the local ShellCheck and CI's
    pinned 0.9.0; also runs the plugin.json schema-sync and skill-frontmatter pytest suite and the
    import-URL-version check
  • Verified against a bash 3.2.57 build (compiled from GNU source) in addition to the system
    bash: all 262 assertions pass under both, with no bash 4+ syntax (negative array indexing) or
    set -u-unsafe empty-array expansions left in konductor-setup's scripts or tests/kiro-power/
  • actionlint on .github/workflows/*.yml: clean
  • shellcheck on konductor-setup's scripts/, tests/kiro-power/, and the touched
    plugin-publish scripts under scripts/: clean
  • cd cli/konductor-rs && cargo test --release -- --test-threads=1: 1,776 passed, 0 failed,
    builds konductor v1.1.0
  • python3 -m pytest tests/ -q: 152 passed
  • make claude-plugin-check: marketplace.json and the assembled flat plugin tree both validate;
    the rendered .claude-plugin/plugin.json reports version 1.1.0
  • make guide-check: 1 failure, pre-existing on main, unrelated to this PR
  • docs/index.html / docs/site/user-guide.html match origin/main byte-for-byte -- the
    earlier partial regen has been reverted; a full regen is deferred to a later PR (see
    Follow-ups)

Agents Affected

N/A -- agents/k-architect.agent-spec.json and agents/k-developer.agent-spec.json now match
main exactly (both PRs pinned mcp-proxy-for-aws-cli==1.7.0 independently), so this PR carries
no agent-spec diff of its own.

Follow-ups

  • Pages HTML regen must include this PR's new install-kiro-power.md page; its own follow-up
    PR, since the AI-driven build-user-guide.sh step needs an interactive session, and their
    one-line, ~600KB diff here was mostly unrelated wording and made CodeQL misattribute
    pre-existing alerts to this PR.
  • Manual import test in Kiro IDE:
    https://github.com/aws-solutions/konductor/tree/feat/kiro-power/powers/konductor, confirming
    only konductor-setup and konductor-help load.
  • Optional: submit to kiro.dev/powers/submit once merged.

Notes for Reviewers

  • Merging this PR bumps VERSION to 1.1.0 and releases it, covering both the Kiro Power and the
    Claude Code plugin marketplace channels in one release. The push to main also runs
    publish-claude-plugin for the first time, opening the first plugin-candidate draft pull
    request into release/plugins.
  • After merge, a brief window exists before the release finishes publishing v1.1.0's assets.
    During it, konductor-setup fails closed with a tag-not-found error rather than installing the
    wrong version -- expected, and self-resolves once the release finishes. The README/install-guide
    import URLs point at that same v1.1.0 tag and 404 during the identical window.
  • scripts/check-kiro-power-import-url-version.sh (new, wired into make kiro-power-check)
    fails if any committed .../tree/<tag>/powers/konductor URL names a tag other than
    v$(cat VERSION), so a future VERSION bump forces these docs to move with it.

Ships the Kiro Power at powers/konductor/, imported directly from
github.com/aws-solutions/konductor/tree/main/powers/konductor -- no
separate publish branch or assembly step, since that directory is
already the flat, importable shape Kiro's GitHub import expects.

- konductor-setup: onboards a project end to end, with Step 0 consent
  disclosure, pinned checksum-verified download (cargo fallback on
  Intel Mac, Windows out of scope for v1), per-target power-cli.json
  binary tracking, doctor wiring, update/uninstall with --confirmed,
  and --no-telemetry.
- konductor-help: answers CLI/doctor/SOP questions against an existing
  install.
- Thirteen activation keywords in plugin.json, in two tiers: nine
  konductor-qualified action phrases and four broader discovery
  phrases.
- make kiro-power / make kiro-power-check validate the committed
  powers/konductor/ tree in place; wired into validate-pr.yml so every
  PR checks it.
- Manual AWS MCP bring-your-own docs (aws-mcp key, Agent Toolkit
  command, all eight tools reachable, IAM guardrails).
- Bumps VERSION (and cli/konductor-rs's Cargo version) to 1.1.0.
… refusal

CI's Validate PR job runs ShellCheck 0.9.0 (GitHub-hosted ubuntu-latest's
pinned version, per actions/runner-images), which flags SC2120/SC2119 on
resolve_plugin_version's $1 (a ${1:-default} fallback, never otherwise
called with an argument in resolve-version.sh itself). A local ShellCheck
0.11.0+ no longer flags that pattern, so make kiro-power-check passed
locally while CI failed on the identical command. Reproduced the failure
locally against a downloaded 0.9.0 binary before fixing it.

- resolve-version.sh: pass the already-computed script dir explicitly at
  the file's one internal call site instead of relying on the function's
  own default. The function keeps its documented [script-dir] optional
  argument for any other caller. No behavior change -- all 13
  resolve-version tests still pass.
- Makefile: kiro-power-check now warns (non-fatal) when the installed
  ShellCheck version differs from CI's pinned 0.9.0, and also shellchecks
  tests/kiro-power/ (previously unchecked; swept clean under both
  versions).
- link-binary.sh: the foreign-file refusal matched -e && ! -L, which also
  catches a FIFO/socket/device node, not just a regular file. Reworded the
  message to 'something other than a symlink this Power created' and
  updated the matching test assertion.
- Reverted docs/index.html and docs/site/user-guide.html to origin/main:
  their one-line, ~600KB diff was mostly an unrelated wording edit and was
  making CodeQL misattribute pre-existing alerts to this PR. The full
  Pages HTML regen (including this PR's new page) is a separate follow-up
  PR; build-user-guide.sh --check now reports them stale against the
  markdown, as expected.
… guide

Rewords every comment across the Kiro Power scripts and tests that cited
"adversarial-review finding I1/C1/etc." or konductor-power-design.md
section numbers (a doc that does not exist in this repo). Each now states
the invariant or rationale it protects directly instead of narrating the
review that found it. The underlying fixes are untouched: the consent
gates, the source-redirection check, the symlink trust boundary, and the
per-target CLI-binary resolution all keep their exact behavior.

Also removes every em dash from docs/user-guide/tasks/install-kiro-power.md
and the new "Installing via a Kiro Power" section of README.md, replacing
each with plain punctuation.

Reviewed the 9 setup scripts, 5 validator/schema files, and 10 test files
for genuine KISS/YAGNI overreach. Found the file-per-step decomposition,
the trust-boundary checks in lib.sh, and the test-file granularity all
load-bearing against specific, reproduced bugs (a permanent lockout, a
directory-symlink footgun, and a CI shellcheck-version mismatch); no
scripts or tests were merged or cut.

make kiro-power-check: 158 assertions, 0 failed, under both local
ShellCheck 0.11.0 and CI's pinned 0.9.0.
A final compliance sweep of the full committed tree (not just this PR's
diff hunks) found a handful of references that only make sense to a
reader with access to Amazon-internal tooling and documents, surviving
because they lived in parts of PR-touched files nobody re-diffed:

- CHANGELOG.md and README.md's Project Structure section named the
  private source package this content originates from, rather than
  Konductor's own public identity, and listed a build-metadata file
  that isn't part of this repo at all.
- tools/build-user-guide/BUILD_USER_GUIDE_PROMPT.md used that same
  private package name as a negative example for agent-name prefixes.
- tests/kiro-power/helpers.sh explained a `bats`-on-PATH ambiguity by
  naming a specific unrelated internal CLI; reworded to state the
  ambiguity generically, since it can hold for any same-named tool.
- konductor-setup/SKILL.md and konductor-help/SKILL.md cited a design
  doc section number and "the design doc" for a document that was
  never committed to this repo and has no public counterpart.
- Makefile cited an internal review-round finding ID in a code comment
  with no meaning outside that review.
- cli/konductor-rs/Cargo.toml justified every pinned dependency version
  against a private package registry mirror throughout, even though
  this is a public repo built with a plain `cargo build` against the
  public registry.

No behavior changes. make kiro-power-check: 158 assertions, 0 failed.
commit a6c2015 fixed 8 internal-reference leaks found in a compliance
sweep of the full committed tree, not just this PR's own diff hunks.
Four of those fixes touched content this PR's own diff never modifies:

- CHANGELOG.md's header line names the private source package; this
  PR only appends a new dated entry below it.
- README.md's Project Structure listing includes aim.json; this PR
  only adds a new section elsewhere in the file.
- BUILD_USER_GUIDE_PROMPT.md's runtime-switcher paragraph uses the
  private package name as a negative example; this PR only adds an
  unrelated table row earlier in the file.
- Cargo.toml's dependency comments justify pinned versions against an
  internal registry mirror; this PR's only change to the file is the
  version-number bump at the top.

Each of these was already present, unchanged, on origin/main before
this PR started, and this PR's own hunks never touch the section in
question -- so whether they're internal references is real, but fixing
them is a separate cleanup task, not this PR's job.

The remaining 4 fixes from a6c2015 stay: three live entirely inside
files this PR creates from scratch (tests/kiro-power/helpers.sh,
konductor-setup/SKILL.md, konductor-help/SKILL.md -- none exist on
origin/main, so there's no pre-existing content to be out of scope),
and the Makefile one sits inside a comment block this PR's own diff
introduces (the kiro-power-check recipe), so the PR's own change is
what made that finding-ID reference stale.

make kiro-power-check: 158 assertions, 0 failed.
# Conflicts:
#	CHANGELOG.md
#	VERSION
#	cli/konductor-rs/Cargo.lock
#	cli/konductor-rs/Cargo.toml
…apping

A few comments referenced "the design" for decisions that are just
stated directly now (default-on telemetry, SKILL.md as the source of
truth), and several multi-line comments had awkward line-wrap splits
left over from earlier edits. No behavior changes.
Copy verified and source-built binaries to a temporary file inside the shared release cache, then atomically rename them into place. This prevents another Power invocation from resolving a partially-written cache entry.\n\nPin the documented AWS MCP proxy and tighten the Kiro Power guide, setup skill, and help skill to keep operational guidance concise and current.
Keep the Kiro Power skills concise, but restore explicit consent, source-redirection, credential, telemetry, update, uninstall, diagnostic, and MCP instructions required for safe agent execution.
Standardize agent specs, docs, and generated user-guide pages on
mcp-proxy-for-aws-cli==1.7.0 instead of the floating
mcp-proxy-for-aws@latest. Generated HTML pages were updated through
the sync-html-content.py generator, not hand-edited.
konductor_write_power_cli_record built its temp file path as
"${power_cli_json}.tmp.$$", derivable from the target directory and
the caller's own PID alone. A symlink planted at that exact path ahead
of time turned the write into a write-through-symlink into whatever it
pointed at, before the final rename ever ran.

Use mktemp in the same directory instead, matching the pattern
konductor_publish_cached_binary already uses, and clean up the temp
file on every failure path.

Adds a test that plants a symlink at the old predictable path and
confirms the symlink's target is left untouched and power-cli.json
ends up a regular file.
construct_tag, fetch_verify_binary, and build_from_source each embed
their tag or version argument directly into a filename, a download
URL, a cache path under ~/.konductor/cli-releases, or a git clone
--branch ref, with no validation. A tag can arrive from --tag or
KONDUCTOR_POWER_VERSION, so an unvalidated value such as
"../../etc/cron.d/x" would turn any of those into a path-traversal
write or a git-ref injection.

Validate against a bare-semver or v-prefixed-semver regex (reusing the
existing KONDUCTOR_CLI_VERSION_REGEX for the bare form, and adding
KONDUCTOR_CLI_TAG_REGEX for the v-prefixed form) at each entry point,
before the value is used anywhere. No pre-release suffix is accepted:
this repo's own release pipeline (validate-version-semver.sh,
release.yml) never produces one either.

Also adds --proto '=https' --tlsv1.2 to both curl calls in
fetch_verify_binary, so the download is pinned to https and TLS 1.2+
independent of what the URL string says.

Two existing test fixtures used a tag shape that is no longer
well-formed (used only to simulate a tag that doesn't exist upstream);
updated to a validly-shaped nonexistent tag so they still exercise
that scenario.
validate-kiro-power-skill-frontmatter.py's frontmatter parser reads
each key: value line verbatim and never expands multi-line YAML. If
name or description were written as a block scalar (name: |,
description: >-, etc.), the real value lives on the following indented
lines, which the parser never reads -- it silently treated the bare
indicator character itself as the whole value instead of failing with
a clear error.

Reject name/description values matching a block-scalar indicator
(|, >, optionally with a chomping or indentation modifier) with a
specific error naming the field and stating block scalars aren't
supported, rather than letting them fall through to the generic
name-pattern or length checks.
validate-kiro-power-plugin-json.py is a hand-written, stdlib-only
stand-in for a real JSON Schema validator, checked against
scripts/agent-plugins.schema.json by eye. Nothing enforced that its
constants stayed in sync with the schema file after an edit to either
one.

Add a test that reads the schema's own required list, root
additionalProperties, name.pattern, and author.additionalProperties
and asserts each against the checker's own module-level constants,
imported directly.

Exposes the required-fields list as a named _REQUIRED_ROOT_FIELDS
constant (it was previously two separate inline checks) so the test
has something to import; the checks themselves produce the same
errors in the same order as before.
…ipts

check-plugin-json-version-drift.sh read plugin.json's version field
with a bare python3 -c one-liner: malformed JSON or a missing
'version' key surfaced as an uncaught Python traceback with no
'[check-plugin-json-version-drift]' prefix, instead of this script's
own error format. Guard both cases explicitly and keep the non-zero
exit.

render-kiro-power-plugin-json.py wrote the rendered plugin.json
directly with write_text. Write it through a same-directory temp file
and os.replace instead, so a reader (or a concurrent 'make
kiro-power') never observes a partially-written file, and clean up
the temp file if the write or replace fails.
kiro-power-check printed the same '=== All checks passed ===' line
whether or not shellcheck actually ran, so a developer without
shellcheck on PATH had no way to tell a full pass from a run that
quietly skipped the shellcheck step. Track whether it was skipped and
say so in the final line; CI (which has shellcheck) is unaffected.
[1.1.0] was dated 2026-09-30, before [1.0.3]'s 2026-10-01, breaking the
changelog's newest-first ordering. Date it today, and add a Security
entry for konductor-setup's new tag/version validation.
Both carried a partial regen (a bundled template diff) not otherwise
needed by this branch. Reverted byte-for-byte to origin/main; a full
regen is deferred to a later PR.
Brings in the Claude Code plugin marketplace (publish-claude-plugin
workflow, generated/claude-plugin assembly, marketplace.json, and the
AWS MCP pin to mcp-proxy-for-aws-cli==1.7.0) alongside the Kiro Power
install path already on this branch.

Resolved conflicts:
- CHANGELOG.md: folded main's [Unreleased] entries into this branch's
  [1.1.0] section, grouped by subsection (Added/Changed/Fixed/Security).
- Makefile: combined .PHONY lists (claude-plugin/claude-plugin-check
  plus kiro-power/kiro-power-check).
- docs/user-guide/README.md, docs/user-guide/tasks/README.md: list both
  install paths (Kiro Power and the Claude Code plugin marketplace)
  side by side.
- docs/user-guide/agents.md: kept main's more detailed k-architect MCP
  row (per-runtime tool counts) over this branch's shorter version.
- tools/build-user-guide/BUILD_USER_GUIDE_PROMPT.md: kept both guide
  page ids (install-power and install-plugin).
…ll paths

install-claude-code.md's footer pointed "Next" at install-kiro-power.md,
which has no forward link of its own -- readers following the tour never
reached initialize-a-project.md. Restored the footer to point there
directly, and added install-kiro-power.md to this page's Related list
alongside the plugin marketplace entry.

install-kiro-power.md and install-claude-plugin-marketplace.md now also
cross-link each other under Related, so all three install paths
(Kiro CLI, Claude Code, Kiro Power, and the Claude Code plugin
marketplace) reference one another consistently.

Also corrects the 1.1.0 changelog entry's date.
simonkrol
simonkrol previously approved these changes Oct 14, 2026
Comment thread powers/konductor/skills/konductor-setup/scripts/run-onboarding.sh
Comment thread powers/konductor/skills/konductor-setup/scripts/run-update.sh Outdated
run-onboarding.sh now writes power-cli.json as soon as `konductor
install` succeeds, before running `konductor doctor`. Doctor can fail
on its own (a real, non-zero exit the script still propagates) after
install has already written real files; a target in that state still
needs run-update.sh/run-uninstall.sh to resolve the CLI binary that
performed the install.

Adds test-record-written-before-doctor.sh, pinning that power-cli.json
exists with the right cli_version/binary even when install succeeds
and doctor subsequently fails. Updates test-fail-stop.sh's doctor
rate-limit stub to also answer `--version`, now required for that
scenario to reach doctor at all.
…tall.sh

A target that tracks more than one harness makes a bare `konductor
update`/`uninstall` a usage error asking which one to act on. Both
wrapper scripts now accept an optional --harness <name>, validated
against a safe name shape (lowercase letters, digits, hyphens) and
forwarded verbatim as --harness <name> to the underlying CLI call.
Omitted, behavior is unchanged. The CLI itself still validates the
name against its own registered harnesses, so no second allowlist is
kept here.

run-uninstall.sh validates --harness independently of --dry-run/
--confirmed, since it names which harness to act on rather than
whether to act at all.

Documents the new flag in SKILL.md and the user guide's install task,
each with a short note on retrying with --harness <name> after a
multi-harness usage error.

Adds test-harness-flag.sh covering: the value is forwarded verbatim
when given; nothing is forwarded when omitted; an unsafe value is
rejected before the underlying CLI runs; and --dry-run/--confirmed
gating on run-uninstall.sh is unaffected by --harness being present.
run-uninstall.sh deleted <target>/.konductor/power-cli.json after any
real removal, including a --harness <name> uninstall that leaves
another harness still tracked at the target. That stranded the
surviving harness: its next update/uninstall fell to
konductor_resolve_target_binary's legacy fallback, which trusts the
shared ~/.local/bin/konductor with no version check.

Clear power-cli.json only once <target>/.konductor/manifest itself no
longer exists -- the signal `konductor uninstall` already maintains
for "nothing is tracked here anymore" (it deletes that file outright
rather than leaving an empty strategies list). A target still tracking
another harness afterward keeps its power-cli.json record.
run-onboarding.sh only checked BINARY_OWN_VERSION for emptiness before
writing it into power-cli.json. A binary whose `--version` output
isn't the expected "konductor <semver>" shape (e.g. corrupted stdout,
an unrelated tool at that path) could still get a non-semver value
recorded there.

Validate it against KONDUCTOR_CLI_VERSION_REGEX, the same bare-semver
shape konductor_resolve_target_binary itself requires before trusting
a recorded cli_version, right after extracting it and before the
record is written. A malformed value now fails onboarding closed, with
no power-cli.json written at all.
simonkrol
simonkrol previously approved these changes Oct 14, 2026

@ihmaws ihmaws left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for this change.

I checked out 00eee63 and ran it on an Apple Silicon Mac. Here's what I covered:

  • Build and tests: built the 1.1.0 CLI; make kiro-power-check passes 255/255 under bash 5.2.
  • End to end: onboarding, update, and uninstall against the real v1.0.2 release, in a throwaway HOME and project.
  • Gates: consent, source redirection, and fail-closed on the unpublished v1.1.0 tag all behave as described.
  • Multi-harness: the --harness handling works end to end with the 1.1.0 CLI.

Update and uninstall fail (see inline comments). Those two need fixing before merge.

  1. How was the Power itself tested? The Kiro IDE import is listed as a follow-up, and it's the PR's headline claim. Please run it before merge and post a screenshot of the installed Power and its two skills. (The description also says 158 assertions; the suite runs 255.)
  2. Shipping from main. Users import from tree/main/powers/konductor, so any script change merged to main reaches every user before a release exists (the tag-not-found window you describe is one symptom of this). Did you consider pointing the docs at a release tag URL instead? What does Kiro's "Check for updates" do in each case? Let me know your thoughts.
  3. Comment volume. About 1,030 of the ~1,850 lines in konductor-setup/scripts/ are comments (lib.sh alone is 338 of 611), and there's a ~38-line block above kiro-power-check in the Makefile. Could these be cut down to the invariant each one protects, with the history and rationale left to the PR? As written, every future change has to keep that prose in sync. Not blocking, but strongly recommend.
  4. Size. At +5.9k lines across 53 files this is a lot for one review. For next time, a split like this would make it much easier to review:
    • PR 1: the Power and its scripts, with tests.
    • PR 2: validation tooling and CI.
    • PR 3: docs.
  5. History. Recommend a squash merge, with an edited message rather than the concatenated default.
  6. Pre-existing cleanup. The CHANGELOG header and the README structure listing on main still reference internal package metadata, and that isn't part of this diff. Could you open an issue to track it?

Comment thread powers/konductor/skills/konductor-setup/scripts/lib.sh Outdated
Comment thread powers/konductor/skills/konductor-setup/scripts/run-update.sh Outdated
Comment thread Makefile
Comment thread powers/konductor/skills/konductor-setup/scripts/detect-platform.sh
Comment thread scripts/render-kiro-power-plugin-json.py Outdated
Comment thread docs/user-guide/tasks/install-kiro-power.md Outdated
Comment thread docs/user-guide/tasks/install-kiro-power.md Outdated
Comment thread README.md Outdated
Comment thread CHANGELOG.md Outdated
…nstall-info.json

konductor_resolve_target_binary refused update/uninstall for any target
onboarded with --no-telemetry, because konductor install --no-telemetry
never writes install-info.json (finalize_install_telemetry only writes it
when telemetry is on), and update --no-telemetry deletes it on a target
that previously had one.

Gate on this Power's own power-cli.json instead, falling back to the
CLI's own manifest file for a legacy target with no power-cli.json yet.
Both are written unconditionally of telemetry, so update and uninstall
now work for an opted-out target. The legacy-fallback and trust-boundary
logic below the precondition is unchanged.

Adds a regression test that onboards with --no-telemetry, then runs
update and uninstall against the same target.
run-update.sh and run-uninstall.sh expanded possibly-empty arrays
("${arr[@]}") under set -u, which bash 3.2 (stock macOS) treats as an
unbound variable. Switch to ${arr[@]+"${arr[@]}"}, which short-circuits
to nothing before set -u ever sees it.

Several test stubs used ${args[-1]} for negative array indexing, a bash
4.3+ feature; replaced with ${args[$((${#args[@]} - 1))]}.

Verified against a bash 3.2.57 build (compiled from GNU source) and the
system bash: all 262 kiro-power assertions pass under both.
…in CI

tests/test_validate_kiro_power_plugin_json_schema_sync.py and
tests/test_validate_kiro_power_skill_frontmatter.py existed but were never
run by make kiro-power-check or CI. Add them to that target via
python3 -m pytest, and install pytest on the validate-pr.yml runner first
since it is not preinstalled on ubuntu-latest and these are plain assert
functions, not unittest.TestCase subclasses.
The update/telemetry-opt-out/uninstall examples ran konductor via PATH,
contradicting the text that says the Power resolves the per-project CLI
binary instead of the shared ~/.local/bin/konductor symlink. Reword each
to tell the user to ask the Power to run the action, noting that the raw
command invokes whichever konductor is first on PATH.

Also link the Playwright MCP setup note to the playwright-mcp entry in
the CLI reference instead of pointing at an unnamed "project's MCP
integration documentation".
Drop the "Per Kiro's own docs" attribution and state plainly what
choosing Install does (registers the Power's manifest) and that
onboarding itself runs separately, the first time the Power is invoked.
doctor/power-cli ordering, harness-scoped uninstall cleanup, malformed-
tag rejection, and binary --version validation all fix konductor-setup
code that is part of this same unreleased [1.1.0] Power and never
shipped on its own. Remove the entries instead of describing a fix to
something nobody ever saw broken. PR #28's Claude plugin entries are
unchanged.
…r step

Remove scripts/kiro-power.template.json, scripts/render-kiro-power-plugin-json.py,
and the make kiro-power target. powers/konductor/plugin.json is now edited
directly; check-plugin-json-version-drift.sh keeps guarding that its
version field matches VERSION. validate-kiro-power-plugin-json.py and its
schema-sync test are unaffected -- they validate plugin.json's content
against the schema, independent of how it was produced.

Updates every doc that pointed at the removed render step (README,
CHANGELOG, the install guide) to say to edit plugin.json directly and
bump its version alongside VERSION.
Users import the Power from a GitHub tree URL. Point every one of them
at tree/v1.1.0 (the tag this release will create), not tree/main's
moving HEAD, matching how the konductor CLI itself is released. Updates
README, the install guide, and CHANGELOG; rewords the "imported from
main" comments in check-plugin-json-version-drift.sh and validate-pr.yml
to describe the tagged-release convention generically.

Add check-kiro-power-import-url-version.sh, wired into
make kiro-power-check, which fails if any committed
.../tree/<tag>/powers/konductor URL names a tag other than
v$(cat VERSION) -- a VERSION bump now forces these URLs to move with it.

release.yml's gh release create pins the new tag to the exact commit
that triggered the release, and that commit is on main after the
VERSION-bump PR merges, so the v1.1.0 tag will contain powers/konductor/
once this merges. Until then, the v1.1.0 URL 404s.
…ation

Per this repo's code-discipline convention, keep a comment only when the
code can't speak for itself: state the why in one or two lines, drop
restatement, history, and repeated rationale already said once elsewhere
in the same file. Comment-only change: every non-comment, non-blank line
is byte-identical to before this commit (verified file by file).

Keeps the safety-rule comments a future editor could break: checksum
fail-closed, the trust boundary on which binary gets executed, mktemp's
unpredictable temp names, tag/version validation before use, Step 0
SOURCE disclosure and --allow-non-default-repo, --confirmed gating, the
record written before doctor runs, power-cli.json kept until the
manifest is gone, link-binary's refusals, the ShellCheck 0.9.0
SC2119/SC2120 workaround, and the bash 3.2 array idiom.

Line/comment counts (total lines / comment lines), before -> after:
  lib.sh             623/350 -> 470/196
  run-onboarding.sh  322/182 -> 258/118
  run-uninstall.sh   159/95  -> 121/57
  link-binary.sh     156/92  -> 104/40
  build-from-source.sh 135/65 -> 113/43
  run-update.sh      135/82  -> 98/45
  fetch-verify-binary.sh 132/70 -> 102/40
  resolve-version.sh 121/65  -> 100/44
  detect-platform.sh 89/50   -> 69/30
  Total              1872/1051 -> 1435/613

Also trims the Makefile's kiro-power-check comment block (38 -> 21
comment lines), same rule, same non-comment-identical guarantee.
konductor-setup and the Kiro Power install guide both told every user
to run `kiro-cli chat --agent konductor` after a successful install,
which gives Kiro IDE users nothing to act on. Add an "In Kiro IDE"
step (open the agent selector in the chat input bar and choose
`konductor` or a specialist agent, then ask a plain-language question
to trigger the about-konductor orientation) alongside the existing
"In kiro-cli" step, with links to the agents reference and
about-konductor pages for more detail.
The sentence now ends after the example question instead of describing
which orientation it triggers.
@knihit

knihit commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor Author
Screenshot 2026-10-15 at 10 32 11 PM Screenshot 2026-10-15 at 10 32 28 PM Screenshot 2026-10-15 at 10 33 30 PM

Updates for the review summary:

  • Shipping from main: the import URL in README, the install guide and CHANGELOG now points at the release tag (tree/v1.1.0/powers/konductor), matching how the CLI is released. scripts/check-kiro-power-import-url-version.sh fails kiro-power-check if that tag ever differs from VERSION. The URL resolves once the 1.1.0 release is published.
  • Comment volume: trimmed the konductor-setup scripts from 1,051 to 613 comment lines (lib.sh 350 to 196) and the kiro-power-check Makefile block from 38 to 21, keeping the ones that document safety rules. Non-comment lines are unchanged.
  • Manual test: imported the Power in Kiro IDE on macOS from the feat/kiro-power branch. Onboarding against v1.1.0 stops with a tag-not-found error, as expected before the release; with --tag v1.0.3 --allow-non-default-repo it installed and doctor passed.

@ihmaws ihmaws left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚀

@knihit
knihit merged commit 139cc79 into main Oct 16, 2026
6 checks passed
@knihit
knihit deleted the feat/kiro-power branch October 16, 2026 15:04
knihit added a commit that referenced this pull request Oct 16, 2026
Resolve the README conflict with the Kiro Power section from #29. Keep the
refreshed Quick start layout and fold the Power install into a collapsible
section, with the reviewed step wording unchanged.
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.

3 participants