Compare commits

..

66 Commits

Author SHA1 Message Date
Bryan Thompson
76eacefa05 Add langfuse plugin 2026-06-09 16:37:36 -05:00
github-actions[bot]
df5224ba07 bump(aws-data-analytics): 7a1422d5 → c0991f46 (#2511)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:30:10 -05:00
github-actions[bot]
e832e2bf0d bump(carta-cap-table): 732981ca → c39482a4 (#2514)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:24:04 -05:00
github-actions[bot]
9895dfca58 bump(ai-plugins): 975f0ce4 → a6737fcf (#2507)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:23:54 -05:00
github-actions[bot]
83d32aefd5 bump(aws-core): 7a1422d5 → c0991f46 (#2510)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:23:28 -05:00
github-actions[bot]
2804bac441 bump(forge-skills): 02103cca → c7df9561 (#2522)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:23:02 -05:00
github-actions[bot]
a1936eee01 bump(nvidia-skills): d0e07bd3 → fd1e6fd1 (#2528)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:22:34 -05:00
github-actions[bot]
b8ecaf01a6 bump(pydantic-ai): e412b6d8 → ddc7d005 (#2530)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:22:07 -05:00
github-actions[bot]
d2bae5e20b bump(firecrawl): 6768fb78 → b3344758 (#2521)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:21:38 -05:00
github-actions[bot]
e96f539e2d bump(hunter): 494b0bd6 → 06bcb94a (#2523)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:21:10 -05:00
github-actions[bot]
77c424ab52 bump(hyperframes): 24279c8c → acd8e117 (#2524)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:20:41 -05:00
github-actions[bot]
a771b69148 bump(jfrog): 117febaa → 6788fe15 (#2525)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:20:11 -05:00
github-actions[bot]
301dfbc752 bump(logfire): e412b6d8 → ddc7d005 (#2526)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:19:41 -05:00
github-actions[bot]
6f5b19f93b bump(outputai): fc6a93e6 → 65cd0871 (#2529)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:19:10 -05:00
github-actions[bot]
85d6e100e2 bump(42crunch-api-security-testing): a5172167 → b7e131e3 (#2506)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:18:23 -05:00
github-actions[bot]
6829c593c8 bump(chrome-devtools-mcp): 702d3734 → 6bd8c916 (#2517)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:18:15 -05:00
github-actions[bot]
0c33859bd9 bump(fastly-agent-toolkit): 6bd17d68 → 73af5b94 (#2520)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:17:42 -05:00
github-actions[bot]
1c5aba82fb bump(migration-to-aws): b3e5ee48 → 3c5d6a7d (#2527)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:17:08 -05:00
github-actions[bot]
2092653e18 bump(snowflake-cortex-code): 2462e1ba → 7d2c7e7e (#2534)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:16:29 -05:00
github-actions[bot]
7ba21d89e2 bump(aws-agents): 7a1422d5 → c0991f46 (#2509)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:16:23 -05:00
github-actions[bot]
0445ef3cf4 bump(crowdstrike-falcon-foundry): c542c932 → 0a651a14 (#2518)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:15:50 -05:00
github-actions[bot]
190a64c2ed bump(carta-crm): 732981ca → c39482a4 (#2515)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:15:41 -05:00
github-actions[bot]
f7ac27f10c bump(togetherai-skills): fb94cc14 → 8aa08ca1 (#2535)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:15:36 -05:00
github-actions[bot]
488e71feb9 bump(carta-investors): 732981ca → c39482a4 (#2516)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:15:30 -05:00
github-actions[bot]
2e5bcca08e bump(sentry-cli): dc99b4d1 → 18111b95 (#2533)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:15:15 -05:00
github-actions[bot]
8681d8d6d1 bump(airtable): 21d2fe52 → 295ab93b (#2508)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:14:55 -05:00
github-actions[bot]
0ec0005a3c bump(azure): 02a614f6 → 966330ee (#2513)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:14:16 -05:00
github-actions[bot]
7f680b8500 bump(dataproc): 20eec06e → 80d126d2 (#2519)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:13:35 -05:00
github-actions[bot]
8f005f9b76 bump(sentry): 030b01fb → 87de81a1 (#2532)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 13:13:25 -05:00
Morgan Lunt
746c982737 Merge pull request #2467 from anthropics/morganl/code-mod-secrets-redaction
code-modernization: never write discovered credential values into findings
2026-06-09 08:49:47 -07:00
Morgan Lunt
88233b24ba Merge pull request #2468 from anthropics/morganl/code-mod-interactive-map
code-modernization: interactive topology map, preflight command, persona flows
2026-06-09 08:49:38 -07:00
Morgan Lunt
4f49895abd code-modernization: assess writes the full quarantine ignore set
assess only added SECRETS.local.md to analysis/.gitignore, leaving
*.local.patch uncovered until harden's own Step 0 ran. Both patterns are
now written by whichever command runs first.
2026-06-09 08:47:34 -07:00
Morgan Lunt
9d49c4b135 code-modernization: close remaining credential-leak paths
A red-team pass found four ways credential values still reached
shareable artifacts after the initial redaction:

- the remediation patch: a diff removing a hardcoded secret carries the
  raw value on its '-' lines by construction. harden now splits output:
  non-credential hunks in the shareable security_remediation.patch,
  credential hunks in a gitignored security_remediation.local.patch
  with comment-only placeholders in the shareable file
- the other four agents had no secret-handling rules. legacy-analyst
  (hardcoded-config evidence in tech-debt findings),
  business-rules-extractor (credentials recorded as rule parameters),
  test-engineer (legacy literals becoming committed test fixtures), and
  architecture-critic (quoted code in notes files) now all mask values
  and cite file:line; assess's tech-debt prompt and ASSESSMENT.md
  masking now cover every section, not just Security Findings
- non-git projects: a .gitignore protects nothing under SVN/Mercurial.
  Both commands now refuse --show-secrets without git and write the
  quarantine file to ~/.modernize/<system>/ outside the project tree
- the patch-apply instruction was wrong in both documented layouts
  (symlinked legacy/ broke relative paths). Patches are now written
  with project-root-relative paths and applied from the project root

Also: --show-secrets is now position-independent in both commands, and
the README documents the full model.
2026-06-09 08:47:34 -07:00
Morgan Lunt
ff5feaeb7f code-modernization: never write discovered credential values into findings
Legacy systems often contain live credentials, and assessment/findings
files get committed and shared. Previously the security-auditor agent
reported hardcoded secrets verbatim into ASSESSMENT.md and
SECURITY_FINDINGS.md.

- security-auditor: mandatory secret-handling rules — mask all credential
  values (file:line + 2-4 char preview), redact secrets from echoed tool
  output, recommend rotation for anything that looks live
- assess/harden: gitignore-verified SECRETS.local.md quarantine file for
  the per-credential inventory; findings files get masked entries and a
  pointer only
- new --show-secrets flag opts into raw values in the quarantine file
  (and only there)
- README: document the behavior and advise users of earlier versions to
  check for already-committed findings and rotate
2026-06-09 08:47:33 -07:00
github-actions[bot]
379a00dba5 bump(sap-fiori-mcp-server): fbfe8c32 → 604f2895 (#2500)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:53:05 -05:00
github-actions[bot]
0161a176c7 bump(airwallex): a903ab76 → a49ef1ec (#2499)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:52:43 -05:00
github-actions[bot]
7dd654e4ea bump(wix): 188ed338 → 9666bc8d (#2502)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:52:20 -05:00
github-actions[bot]
b167faa74a bump(data-agent-kit-starter-pack): fb908645 → b47cae53 (#2481)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:51:57 -05:00
github-actions[bot]
bdde825b98 bump(42crunch-api-security-testing): db2fb7e5 → a5172167 (#2469)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:51:45 -05:00
github-actions[bot]
cd49446ad3 bump(databases-on-aws): fc54dfa2 → d8243e5f (#2482)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:51:17 -05:00
github-actions[bot]
b667e7f193 bump(deploy-on-aws): fc54dfa2 → d8243e5f (#2484)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:51:06 -05:00
github-actions[bot]
a3a7e77735 bump(migration-to-aws): 1dd90935 → b3e5ee48 (#2488)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:59 -05:00
github-actions[bot]
6ab6953eee bump(snowflake-cortex-code): 6a22eb1f → 2462e1ba (#2495)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:48 -05:00
github-actions[bot]
27524414d8 bump(amazon-location-service): fc54dfa2 → d8243e5f (#2471)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:37 -05:00
github-actions[bot]
336212b41d bump(aws-data-analytics): 55b9acfe → 7a1422d5 (#2475)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:26 -05:00
github-actions[bot]
dd7fcb43f2 bump(carta-cap-table): 9eb31290 → 732981ca (#2478)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:15 -05:00
github-actions[bot]
ebecea5c95 bump(aws-startup-advisor): 1dd90935 → b3e5ee48 (#2477)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:11 -05:00
github-actions[bot]
8525d71094 bump(adobe-for-creativity): e23271f6 → 253f5690 (#2470)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:50:01 -05:00
github-actions[bot]
8288a4a320 bump(sagemaker-ai): fc54dfa2 → d8243e5f (#2493)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:49:30 -05:00
github-actions[bot]
0d91490722 bump(quarkus-agent): e711107a → 91c7986e (#2492)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:49:23 -05:00
github-actions[bot]
de6b8cf296 bump(carta-investors): 9eb31290 → 732981ca (#2480)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:49:11 -05:00
github-actions[bot]
b4f01b62bf bump(carta-crm): 9eb31290 → 732981ca (#2479)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:48:59 -05:00
github-actions[bot]
d7d03756e2 bump(nvidia-skills): 0482ebce → d0e07bd3 (#2490)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:48:47 -05:00
github-actions[bot]
54eb24e9d6 bump(netlify-skills): 5f777ba6 → 22025ef6 (#2489)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:48:35 -05:00
github-actions[bot]
8acfe8b3cb bump(aws-core): 55b9acfe → 7a1422d5 (#2474)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:48:23 -05:00
github-actions[bot]
1fb5d16181 bump(aws-serverless): fc54dfa2 → d8243e5f (#2476)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:48:12 -05:00
github-actions[bot]
8aac392a4d bump(aws-amplify): fc54dfa2 → d8243e5f (#2473)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:48:00 -05:00
github-actions[bot]
eeb0e11315 bump(aws-agents): 55b9acfe → 7a1422d5 (#2472)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:47:53 -05:00
github-actions[bot]
22be09177b bump(sentry-cli): 9e9fe0fb → dc99b4d1 (#2494)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:47:34 -05:00
github-actions[bot]
1f5ce124fa bump(hyperframes): 25420bf4 → 24279c8c (#2487)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:44:01 -05:00
github-actions[bot]
30f8e267a1 bump(dataverse): 2d50cf65 → 2c373943 (#2483)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:43:23 -05:00
github-actions[bot]
7be381f4cf bump(exa): f0838825 → 9ea4ba3e (#2485)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 07:05:31 -05:00
github-actions[bot]
3175a58228 bump(figma): a742f0a7 → 54ad1560 (#2486)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 06:30:13 -05:00
github-actions[bot]
c78c61e117 bump(outputai): 2cc4685e → fc6a93e6 (#2491)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 05:05:03 -05:00
github-actions[bot]
e7710f24ba bump(sumup): 715464b4 → 5b9b2d72 (#2496)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 04:21:58 -05:00
github-actions[bot]
2fe8c1d7ad bump(workos): e8900cc5 → 2c3acef6 (#2497)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 03:21:25 -05:00
10 changed files with 232 additions and 69 deletions

View File

@@ -19,7 +19,7 @@
"url": "https://github.com/42Crunch-AI/claude-plugins.git",
"path": "plugins/api-security-testing",
"ref": "v1.5.5",
"sha": "db2fb7e53e3d93a863930b6f6b7895be5ee01f21"
"sha": "b7e131e30ff033be2176faf796c94c151a68c63a"
},
"homepage": "https://42crunch.com"
},
@@ -35,7 +35,7 @@
"url": "https://github.com/adobe/skills.git",
"path": "plugins/creative-cloud/adobe-for-creativity",
"ref": "main",
"sha": "e23271f65aa7572f567d085d6baec5c2408e2ad5"
"sha": "253f56901e058800ccb97ffd5bf1e3329d5f2e00"
},
"homepage": "https://github.com/adobe/skills/tree/main/plugins/creative-cloud/adobe-for-creativity"
},
@@ -67,7 +67,7 @@
"source": {
"source": "url",
"url": "https://github.com/endorlabs/ai-plugins.git",
"sha": "975f0ce422b1f2677681ffd085aef34ea1826b70"
"sha": "a6737fcf72336399e212e45cd25a250c2df3b7b4"
},
"homepage": "https://www.endorlabs.com"
},
@@ -93,7 +93,7 @@
"url": "https://github.com/Airtable/skills.git",
"path": "plugins/airtable",
"ref": "main",
"sha": "21d2fe52774d861e2f2f997eeac2bf965e8590b8"
"sha": "295ab93b7d765912ee1a0dc7f1abb0ecaf73f138"
},
"homepage": "https://www.airtable.com"
},
@@ -109,7 +109,7 @@
"url": "https://github.com/airwallex/airwallex-marketplace.git",
"path": "plugins/airwallex",
"ref": "master",
"sha": "a903ab7693a5f6d46f2fab6f895a2f96a879ee0f"
"sha": "a49ef1ec801fd776adc4db9f2bb4a78463981bc9"
},
"homepage": "https://www.airwallex.com/docs"
},
@@ -150,7 +150,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/amazon-location-service",
"ref": "main",
"sha": "fc54dfa24a1f05095b9fcbb4baa4750996bb171d"
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -291,7 +291,7 @@
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
"path": "plugins/aws-agents",
"ref": "main",
"sha": "55b9acfefdcf0866b6bc6cc56c16e6e18e65bd2b"
"sha": "c0991f463b54ac94af32a730d6d13293dcff98cf"
},
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
},
@@ -304,7 +304,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/aws-amplify",
"ref": "main",
"sha": "fc54dfa24a1f05095b9fcbb4baa4750996bb171d"
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -320,7 +320,7 @@
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
"path": "plugins/aws-core",
"ref": "main",
"sha": "55b9acfefdcf0866b6bc6cc56c16e6e18e65bd2b"
"sha": "c0991f463b54ac94af32a730d6d13293dcff98cf"
},
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
},
@@ -336,7 +336,7 @@
"url": "https://github.com/aws/agent-toolkit-for-aws.git",
"path": "plugins/aws-data-analytics",
"ref": "main",
"sha": "55b9acfefdcf0866b6bc6cc56c16e6e18e65bd2b"
"sha": "c0991f463b54ac94af32a730d6d13293dcff98cf"
},
"homepage": "https://github.com/aws/agent-toolkit-for-aws"
},
@@ -365,7 +365,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/aws-serverless",
"ref": "main",
"sha": "fc54dfa24a1f05095b9fcbb4baa4750996bb171d"
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -381,7 +381,7 @@
"url": "https://github.com/awslabs/startups.git",
"path": "advisor/plugins/aws-startup-advisor",
"ref": "main",
"sha": "1dd909352dc228f978c2685724cb38e64efe6be4"
"sha": "b3e5ee487ed27d8c776d9b854d7e109f1514c75b"
},
"homepage": "https://github.com/awslabs/startups"
},
@@ -392,7 +392,7 @@
"source": {
"source": "url",
"url": "https://github.com/microsoft/azure-skills.git",
"sha": "02a614f6ee1f052826f834d65c61e430ad152c8e"
"sha": "966330ee4fc61978b6e324993687e917125a1f36"
},
"homepage": "https://github.com/microsoft/azure-skills"
},
@@ -502,7 +502,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-cap-table",
"ref": "main",
"sha": "9eb312908f4a2e2d15e4e935320981433a549f77"
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
},
"homepage": "https://carta.com"
},
@@ -518,7 +518,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-crm",
"ref": "main",
"sha": "9eb312908f4a2e2d15e4e935320981433a549f77"
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
},
"homepage": "https://carta.com"
},
@@ -534,7 +534,7 @@
"url": "https://github.com/carta/plugins.git",
"path": "plugins/carta-investors",
"ref": "main",
"sha": "9eb312908f4a2e2d15e4e935320981433a549f77"
"sha": "c39482a45c1e4c02922fe5cef3d61fb010a0b2d9"
},
"homepage": "https://carta.com"
},
@@ -561,7 +561,7 @@
"source": {
"source": "url",
"url": "https://github.com/ChromeDevTools/chrome-devtools-mcp.git",
"sha": "702d3734f276a18efd67561ae00b88ce954cc515"
"sha": "6bd8c91678035b5aa18ee40f72e1f630aa528837"
},
"homepage": "https://github.com/ChromeDevTools/chrome-devtools-mcp"
},
@@ -872,7 +872,7 @@
"source": {
"source": "url",
"url": "https://github.com/CrowdStrike/foundry-skills.git",
"sha": "c542c932956fd19177a62b94577f288c832d4680"
"sha": "0a651a1472e4c03603780517374c654236bcce8b"
},
"homepage": "https://github.com/CrowdStrike/foundry-skills"
},
@@ -943,7 +943,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/data-agent-kit-starter-pack.git",
"sha": "fb9086456d5fbc780edf86f0ac413345ba628173"
"sha": "b47cae53405e90dd97d1ecde890a8d4707d1f115"
},
"homepage": "https://github.com/gemini-cli-extensions/data-agent-kit-starter-pack"
},
@@ -966,7 +966,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/databases-on-aws",
"ref": "main",
"sha": "fc54dfa24a1f05095b9fcbb4baa4750996bb171d"
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -1008,7 +1008,7 @@
"source": {
"source": "url",
"url": "https://github.com/gemini-cli-extensions/dataproc.git",
"sha": "20eec06eee7683311689f4a1437cbb14ac8cd33e"
"sha": "80d126d27d84ded752c84668472dd6f75896fc59"
},
"homepage": "https://github.com/gemini-cli-extensions/dataproc"
},
@@ -1035,7 +1035,7 @@
"url": "https://github.com/microsoft/Dataverse-skills.git",
"path": ".github/plugins/dataverse",
"ref": "main",
"sha": "2d50cf65f80efc17ac50632222d61fb374115a70"
"sha": "2c37394346be1afc1db12cc5b89f5dee3617c45c"
},
"homepage": "https://github.com/microsoft/Dataverse-skills"
},
@@ -1048,7 +1048,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/deploy-on-aws",
"ref": "main",
"sha": "fc54dfa24a1f05095b9fcbb4baa4750996bb171d"
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -1126,7 +1126,7 @@
"source": {
"source": "url",
"url": "https://github.com/exa-labs/exa-mcp-server.git",
"sha": "f08388256c5806f457fae777b5528eb02a48e703"
"sha": "9ea4ba3e67f87c462c3e06b192470e837ed9009e"
},
"homepage": "https://exa.ai/docs/reference/exa-mcp"
},
@@ -1166,7 +1166,7 @@
"source": {
"source": "url",
"url": "https://github.com/fastly/fastly-agent-toolkit.git",
"sha": "6bd17d685a1b361a2b368bf0236f39efb1be62d6"
"sha": "73af5b94a98448ffeed6e2993495dc83c9a597be"
},
"homepage": "https://github.com/fastly/fastly-agent-toolkit/blob/main/README.md"
},
@@ -1198,7 +1198,7 @@
"source": {
"source": "url",
"url": "https://github.com/figma/mcp-server-guide.git",
"sha": "a742f0a700a7772ff5ed85f7c9fc1dad5afa9fcc"
"sha": "54ad156019d7362a56d8024b9adbe99952aa29b6"
},
"homepage": "https://github.com/figma/mcp-server-guide"
},
@@ -1216,7 +1216,7 @@
"source": {
"source": "url",
"url": "https://github.com/firecrawl/firecrawl-claude-plugin.git",
"sha": "6768fb78185aab9e5b5a04777f84703863fb025b"
"sha": "b33447585ac521b091eae672bd4cad4ec1d093f6"
},
"homepage": "https://github.com/firecrawl/firecrawl-claude-plugin.git"
},
@@ -1244,7 +1244,7 @@
"source": {
"source": "url",
"url": "https://github.com/atlassian/forge-skills.git",
"sha": "02103cca4addb4c42d64d4e18a9d1a7f186edf6c"
"sha": "c7df956176eb1c2a10ffabc4eaacc5d843d8bede"
},
"homepage": "https://developer.atlassian.com/platform/forge/"
},
@@ -1347,7 +1347,7 @@
"source": {
"source": "url",
"url": "https://github.com/hunter-io/claude-plugin.git",
"sha": "494b0bd6ac252c7c8d78402cb51c7f635b1469ad"
"sha": "06bcb94a4e6498d8557a4543f8d5c4ea429b0c0a"
},
"homepage": "https://hunter.io"
},
@@ -1361,7 +1361,7 @@
"source": {
"source": "url",
"url": "https://github.com/heygen-com/hyperframes.git",
"sha": "25420bf4cfc37b179b4efeace9db25a7178b61bf"
"sha": "acd8e11789a7bf92f0ed4fac24ff030cd758da37"
},
"homepage": "https://hyperframes.heygen.com"
},
@@ -1415,7 +1415,7 @@
"source": "github",
"repo": "jfrog/claude-plugin",
"commit": "259c8e718266c16e99b4f30ae9b1ed0f9f00d98d",
"sha": "117febaa29cbe9449cfb42d1c39b83b858d801a1"
"sha": "6788fe15d4a63d47f038c05e58ae533aeb2dadb6"
},
"homepage": "https://jfrog.com"
},
@@ -1458,6 +1458,20 @@
}
}
},
{
"name": "langfuse",
"description": "Skills for working with Langfuse, the open-source LLM engineering platform for tracing, prompt management, and evaluation.",
"author": {
"name": "Langfuse"
},
"category": "monitoring",
"source": {
"source": "url",
"url": "https://github.com/langfuse/skills.git",
"sha": "84657a123c12e87d7fa32cbc20197144674e110a"
},
"homepage": "https://langfuse.com"
},
{
"name": "laravel-boost",
"description": "Laravel development toolkit MCP server. Provides intelligent assistance for Laravel applications including Artisan commands, Eloquent queries, routing, migrations, and framework-specific code generation.",
@@ -1540,7 +1554,7 @@
"url": "https://github.com/pydantic/skills.git",
"path": "plugins/logfire",
"ref": "main",
"sha": "e412b6d8d4b6199ac577c5ee8653dcff840b3e92"
"sha": "ddc7d00569458f3838c6cf489f5be6c59afaf8c1"
},
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/logfire"
},
@@ -1708,7 +1722,7 @@
"url": "https://github.com/awslabs/startups.git",
"path": "migrate/plugins/migration-to-aws",
"ref": "main",
"sha": "1dd909352dc228f978c2685724cb38e64efe6be4"
"sha": "3c5d6a7deb24c3318be8b78ef75545539ab1bbcd"
},
"homepage": "https://github.com/awslabs/startups"
},
@@ -1770,7 +1784,7 @@
"source": {
"source": "url",
"url": "https://github.com/netlify/context-and-tools.git",
"sha": "5f777ba63df12f4eb189be4c58bd35d0c8316505"
"sha": "22025ef6c9dc9ef88d0c9c047980c10cacb178ee"
},
"homepage": "https://github.com/netlify/context-and-tools"
},
@@ -1839,7 +1853,7 @@
"url": "https://github.com/NVIDIA/skills.git",
"path": "plugins/nvidia-skills",
"ref": "main",
"sha": "0482ebce81bd8f2d39990317bb3cfb07637e39fd"
"sha": "fd1e6fd1971eb7113a4dd206a028246fa4b3d8b4"
},
"homepage": "https://github.com/NVIDIA/skills"
},
@@ -1885,7 +1899,7 @@
"url": "https://github.com/growthxai/output.git",
"path": "coding_assistants/claude/plugins/outputai",
"ref": "main",
"sha": "2cc4685ebadfba9586f01890df48e1b25bd1049a"
"sha": "65cd087132dce880362c52384b8237eb9202ceea"
},
"homepage": "https://output.ai"
},
@@ -2050,7 +2064,7 @@
"url": "https://github.com/pydantic/skills.git",
"path": "plugins/ai",
"ref": "main",
"sha": "e412b6d8d4b6199ac577c5ee8653dcff840b3e92"
"sha": "ddc7d00569458f3838c6cf489f5be6c59afaf8c1"
},
"homepage": "https://github.com/pydantic/skills/tree/main/plugins/ai"
},
@@ -2127,7 +2141,7 @@
"source": {
"source": "url",
"url": "https://github.com/quarkusio/quarkus-agent-mcp.git",
"sha": "e711107a1171507212dd0edd17b5a922212c3a97"
"sha": "91c7986e41234827db2632ed07770301468c9dbc"
},
"homepage": "https://quarkus.io"
},
@@ -2300,7 +2314,7 @@
"url": "https://github.com/awslabs/agent-plugins.git",
"path": "plugins/sagemaker-ai",
"ref": "main",
"sha": "fc54dfa24a1f05095b9fcbb4baa4750996bb171d"
"sha": "d8243e5f8f3933d656b3bdfe09cd658a5d9b9fac"
},
"homepage": "https://github.com/awslabs/agent-plugins"
},
@@ -2348,7 +2362,7 @@
"url": "https://github.com/SAP/open-ux-tools.git",
"path": "packages/fiori-mcp-server",
"ref": "main",
"sha": "fbfe8c32fb9fc64583aa72ac03ab64f553c407ee"
"sha": "604f28952b720579ca9369978ba73493092fdf13"
},
"homepage": "https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server"
},
@@ -2415,7 +2429,7 @@
"source": {
"source": "url",
"url": "https://github.com/getsentry/sentry-for-claude.git",
"sha": "030b01fb76b21f5d7ef6af5a3c3dfa658a9b5024"
"sha": "87de81a1300acc03fffa2438877fa2dcf078e703"
},
"homepage": "https://github.com/getsentry/sentry-for-claude/tree/main"
},
@@ -2431,7 +2445,7 @@
"url": "https://github.com/getsentry/cli.git",
"path": "plugins/sentry-cli",
"ref": "main",
"sha": "9e9fe0fb6444f18ed109058b2749cced3c21f87e"
"sha": "18111b95ac8819d58e4f0334d4b8ee8f72513d1e"
},
"homepage": "https://sentry.io"
},
@@ -2534,7 +2548,7 @@
"url": "https://github.com/Snowflake-Labs/snowflake-ai-kit.git",
"path": "plugins/cortex-code",
"ref": "main",
"sha": "6a22eb1ff3b451c35e40468a118bbee54610c9bd"
"sha": "7d2c7e7e0788e255019a64a8690aa5f85d073a2c"
},
"homepage": "https://docs.snowflake.com/en/user-guide/cortex-code"
},
@@ -2620,7 +2634,7 @@
"source": "url",
"url": "https://github.com/sumup/sumup-skills.git",
"path": "providers/claude/plugin",
"sha": "715464b459def2d16e930e9ec8008f60e18a8b4d"
"sha": "5b9b2d72c63fefd9038db0a9c571d3d64ff6353c"
},
"homepage": "https://www.sumup.com/"
},
@@ -2707,7 +2721,7 @@
"source": {
"source": "url",
"url": "https://github.com/togethercomputer/skills.git",
"sha": "fb94cc1402900eb608c31e7102fc23566f8b0363"
"sha": "8aa08ca126a50d5e76f6d378f47386cee4267984"
},
"homepage": "https://www.together.ai"
},
@@ -2881,7 +2895,7 @@
"source": {
"source": "url",
"url": "https://github.com/wix/skills.git",
"sha": "188ed338f39d70e5aef7f9a2582bbf338f223b78"
"sha": "9666bc8d4856d9028e815610c23ab4f48d8ddd3b"
},
"homepage": "https://dev.wix.com/docs/wix-cli/guides/development/about-wix-skills"
},
@@ -2907,7 +2921,7 @@
"url": "https://github.com/workos/skills.git",
"path": "plugins/workos",
"ref": "main",
"sha": "e8900cc504fd759407d1a963d13f59383fa39ebc"
"sha": "2c3acef61ea29296cb6e73e0c59fb5e98f0b1847"
},
"homepage": "https://workos.com"
},

View File

@@ -29,6 +29,10 @@ The commands degrade gracefully, but each of these makes the output meaningfully
- **The whole system in the tree**: deployment descriptors (JCL, CICS definitions, route configs), copybooks/includes, and DDL/schemas. Entry-point detection and data lineage in `/modernize-map` are guesswork without them.
- **Production telemetry** (optional): an observability MCP server or batch job logs enable the runtime overlay in `/modernize-assess` and timing annotations on critical paths.
## Secret handling
Legacy systems routinely contain live credentials, and assessment artifacts get committed and shared. **Every agent in this plugin masks credential values** — findings, rule-card parameters, architecture notes, and test fixtures cite `file:line` with a masked preview (`AKIA****`), never the value. When credentials are found, a per-credential inventory (type, location, blast radius, rotation recommendation) is written to `analysis/<system>/SECRETS.local.md`, which the commands gitignore before writing; on non-git projects the quarantine file goes to `~/.modernize/<system>/` instead. `/modernize-harden` splits its remediation diff so credential-removal hunks (which necessarily contain the raw value) land in a gitignored `security_remediation.local.patch`, never the shareable patch. Pass `--show-secrets` to include raw values in the quarantine file (and only there). If you ran an earlier version of this plugin on a real system, check whether `analysis/` artifacts containing credentials were committed or shared, and rotate anything that was.
## Commands
The commands are designed to be run in order, but each produces a standalone artifact so you can stop, review, and resume.

View File

@@ -29,6 +29,12 @@ For **transformed code**:
- Does the test suite actually pin behavior, or just exercise code paths?
- What would the on-call engineer need at 3am that isn't here?
## Secret handling (mandatory)
When a finding quotes code containing a credential, key, token, or
connection string, mask the value (`'Pr0d****'`) and cite `file:line`
findings get appended verbatim to committed notes files.
## Output
Findings ranked **Blocker / High / Medium / Nit**. Each with: what, where,

View File

@@ -40,6 +40,15 @@ of the technology, skip it.
from structure/names), **Low** (ambiguous; needs SME).
6. If confidence < High, write the exact question an SME must answer.
## Secret handling (mandatory)
Rule parameters sometimes *are* credentials — hardcoded passwords in auth
checks, API keys in partner-service calls, connection strings in batch
routines. Record the **rule**, never the **value**: write the parameter as
`<credential — masked, see file:line>` with at most a 24 character
preview. Rule cards flow into briefs and steering decks; a raw credential
in a parameter list is a leak.
## Output format
One "Rule Card" per rule (see the format in the `/modernize-extract-rules`

View File

@@ -32,6 +32,15 @@ and explain it in terms a modern engineer can act on.
- **Note what's missing.** Unhandled error paths, TODO comments, commented-out
blocks, magic numbers — these are signals about history and risk.
## Secret handling (mandatory)
Legacy code is full of live credentials, and your findings get copied into
shareable reports. When the evidence for a finding — hardcoded config,
dead code, debt, an interface payload — includes a credential, API key,
token, connection string, or private key, **never reproduce the value**.
Cite `file:line` with a masked preview (`VALUE 'Pr0d****'`,
`password=****`). The finding is the practice, not the value.
## Output format
Default to structured markdown: tables for inventories, Mermaid for graphs,

View File

@@ -39,7 +39,30 @@ terminal/screen items don't apply to a SPA. Work through what's relevant:
Use available SAST where it helps (npm audit, pip-audit, grep for known-bad
patterns) but **read the code** — tools miss logic flaws. Show tool output
verbatim, then add your manual findings.
verbatim — except secret values, which you redact (see below) — then add
your manual findings.
## Secret handling (mandatory)
Legacy codebases routinely contain live production credentials, and your
findings get pasted into decks, tickets, and committed markdown. Copying a
secret into a report multiplies the exposure you were hired to find.
When you discover a hardcoded credential, API key, token, connection
string, or private key:
- **Never write the secret's value into any output** — no finding table,
no report, no quoted code excerpt, no echoed tool output. Mask it to the
first 24 identifying characters plus `****` (`AKIA****`,
`postgres://app_user:****@db-prod…`). If a scanner prints a secret,
redact it before including the excerpt.
- Cite `file:line`. The source file is the canonical location — anyone who
legitimately needs the value can open it there.
- State what the credential appears to grant access to (database, queue,
cloud account, third-party API) and whether it looks like a production
or test credential.
- Recommend rotation for anything that looks live — exposure in source
means it is already compromised, independent of any modernization plan.
## Reporting standard

View File

@@ -28,6 +28,15 @@ someone thinks it should do) so that a rewrite can be proven equivalent.
`@Disabled("pending RULE-NNN")` / `@pytest.mark.skip` / `it.todo()` — never
deleted.
## Secret handling (mandatory)
Never copy credential-like literals — passwords, API keys, tokens,
connection strings — from legacy code into test fixtures. Tests live in
the deliverable codebase and get committed. Substitute clearly-fake values
of the same shape and length and note the substitution in a comment.
Anything a test genuinely needs live (e.g. a real database connection for
a dual-run harness) is read from an environment variable, never inlined.
## Output
Idiomatic tests for the requested target stack (JUnit 5 / pytest / Vitest /

View File

@@ -1,11 +1,13 @@
---
description: Full discovery & portfolio analysis of a legacy system — inventory, complexity, debt, effort estimation
argument-hint: <system-dir> | --portfolio <parent-dir>
argument-hint: <system-dir> [--show-secrets] | --portfolio <parent-dir>
---
**Mode select.** If `$ARGUMENTS` starts with `--portfolio`, run **Portfolio
mode** against the directory that follows. Otherwise run **Single-system
mode** against `legacy/$1`.
mode** against the system dir. Parse flags positionally-independently:
`--show-secrets` may appear before or after the system dir — the system
dir is the first non-flag token.
---
@@ -108,12 +110,16 @@ Spawn three subagents **in parallel**:
2. **legacy-analyst** — "Identify technical debt in legacy/$1: dead code,
deprecated APIs, copy-paste duplication, god objects/programs, missing
error handling, hardcoded config. Return the top 10 findings ranked by
remediation value, each with file:line evidence."
remediation value, each with file:line evidence. If evidence contains a
credential value, mask it per your secret-handling rules — never quote
it."
3. **security-auditor** — "Scan legacy/$1 for security vulnerabilities:
injection, auth weaknesses, hardcoded secrets, vulnerable dependencies,
missing input validation. Return findings in CWE-tagged table form with
file:line evidence and severity."
file:line evidence and severity. Mask every discovered credential value
per your secret-handling rules — file:line plus a 24 character masked
preview, never the value itself."
Wait for all three. Synthesize their findings.
@@ -141,6 +147,31 @@ need explained.
## Step 6 — Write the assessment
**Secrets quarantine first.** The assessment gets shared and committed —
discovered credential values must never appear in it. If the
security-auditor found any hardcoded credentials:
1. Ensure `analysis/.gitignore` exists and contains the lines
`SECRETS.local.md` and `*.local.patch` (create or append as needed —
the patch pattern is used by `/modernize-harden`; writing both now
means the ignore set is complete from first contact). If the project is a
git repo, verify with `git check-ignore -q analysis/$1/SECRETS.local.md`
— do not write any findings until the check passes. If there is **no
git repo** (check for `.svn`/`.hg`/`CVS` too — a `.gitignore` protects
nothing under another VCS): refuse `--show-secrets` and write
`SECRETS.local.md` to `~/.modernize/$1/` instead of the project tree,
telling the user where it went and why.
2. Write `SECRETS.local.md`: one row per credential — masked preview,
`file:line`, credential type, what it grants access to,
production/test guess, rotation recommendation. Only if the user passed
`--show-secrets`, add the raw value column here — this file only, never
ASSESSMENT.md.
3. Masking applies to **every section of ASSESSMENT.md**, whichever agent
produced the finding — the Technical Debt section quotes hardcoded
config; those quotes follow the same masking rule as Security Findings.
The Security Findings section adds a one-line pointer:
"Credential inventory in SECRETS.local.md (gitignored; not for sharing)."
Create `analysis/$1/ASSESSMENT.md` with these sections:
- **Executive Summary** (3-4 sentences: what it is, how big, how risky, headline recommendation)
- **System Inventory** (the scc table + tech fingerprint)

View File

@@ -46,7 +46,7 @@ Merge the three result sets. Deduplicate. For each distinct rule, write a
When <trigger>
Then <outcome>
[And <additional outcome>]
**Parameters:** <constants, rates, thresholds with their current values>
**Parameters:** <constants, rates, thresholds with their current values — credentials masked: `<credential — masked, see file:line>`>
**Edge cases handled:** <list>
**Suspected defect:** <optional — legacy behavior that looks wrong; decide preserve-vs-fix during transform>
**Confidence:** High | Medium | Low — <why; if < High, state the exact SME question>

View File

@@ -1,14 +1,42 @@
---
description: Security vulnerability scan with a reviewable remediation patch — OWASP, CWE, CVE, secrets, injection
argument-hint: <system-dir>
argument-hint: <system-dir> [--show-secrets]
---
Run a **security hardening pass** on `legacy/$1`: find vulnerabilities, rank
them, and produce a reviewable patch for the critical ones.
Run a **security hardening pass** on the legacy system: find
vulnerabilities, rank them, and produce a reviewable patch for the
critical ones. Parse arguments flag-independently: the system dir
(referred to as `$1` below) is the first non-flag token in `$ARGUMENTS`;
`--show-secrets` may appear anywhere.
This command never edits `legacy/` — it writes findings and a proposed patch
to `analysis/$1/`. The user reviews and applies (or not).
## Step 0 — Secrets quarantine setup
Findings files get shared, committed, and pasted into decks — discovered
credential values must never land in them. Before any scanning:
1. Ensure `analysis/.gitignore` exists and contains the lines
`SECRETS.local.md` and `*.local.patch`. Create the file or append the
missing lines.
2. If the project is a git repo, verify with
`git check-ignore -q analysis/$1/SECRETS.local.md` — if that exits
non-zero, fix the ignore rule before proceeding. Do not write any
findings until this check passes.
3. **If there is no git repo** (check for `.svn`/`.hg`/`CVS` too — a
`.gitignore` protects nothing under another VCS): refuse
`--show-secrets`, and write `SECRETS.local.md` and any `.local.patch`
file to `~/.modernize/$1/` instead of the project tree, telling the
user where they went and why.
All secret values in every shareable artifact this command produces are
**masked** (`AKIA****`, `password=****`) and cited by `file:line`. Raw
values may appear in exactly two places, both gitignored: the
`*.local.patch` remediation hunks (unavoidably — see Remediate) and, only
with `--show-secrets`, `SECRETS.local.md`. Never in SECURITY_FINDINGS.md
or patch commentary.
## Scan
Spawn the **security-auditor** subagent:
@@ -20,7 +48,9 @@ hardcoded secrets, vulnerable dependency versions, missing input validation,
path traversal. For each finding return: CWE ID, severity
(Critical/High/Med/Low), file:line, one-sentence exploit scenario, and
recommended fix. Run any available SAST tooling (npm audit, pip-audit,
OWASP dependency-check) and include its raw output."
OWASP dependency-check) and include its raw output. Mask every discovered
credential value per your secret-handling rules — file:line plus a 24
character masked preview, never the value itself."
## Triage
@@ -29,26 +59,50 @@ Write `analysis/$1/SECURITY_FINDINGS.md`:
- Findings table sorted by severity
- Dependency CVE table (package, installed version, CVE, fixed version)
If any hardcoded credentials were found, also write
`analysis/$1/SECRETS.local.md` (the gitignored quarantine file from Step 0):
one row per credential — masked preview, `file:line`, credential type, what
it appears to grant access to, production/test guess, and a rotation
recommendation. With `--show-secrets`, append the raw value column here —
this file only. SECURITY_FINDINGS.md gets a one-line pointer:
"N hardcoded credentials found — inventory in SECRETS.local.md (gitignored;
not for sharing)."
## Remediate
For each **Critical** and **High** finding, draft a minimal, targeted fix.
Do **not** edit `legacy/` — write all fixes as a single unified diff to
`analysis/$1/security_remediation.patch`, with a comment line above each
hunk citing the finding ID it addresses (`# SEC-001: parameterize the query`).
Do **not** edit `legacy/` — write fixes as unified diffs with **paths
relative to the project root** (`legacy/$1/...`), applied from the project
root, with a comment line above each hunk citing the finding ID it
addresses (`# SEC-001: parameterize the query`).
**Credential findings split into two files.** A diff that removes a
hardcoded secret necessarily contains the raw value on its `-` and
context lines — that cannot go in the shareable patch:
- `analysis/$1/security_remediation.patch` (shareable) — every
non-credential hunk, plus for each credential finding a comment-only
placeholder: `# SEC-NNN: credential remediation — hunk in
security_remediation.local.patch (gitignored; not for sharing)`.
- `analysis/$1/security_remediation.local.patch` (gitignored in Step 0) —
the real, applyable hunks for credential findings only.
Add a **Remediation Log** section to SECURITY_FINDINGS.md mapping each
finding ID → one-line summary of the proposed fix and the patch hunk that
implements it.
finding ID → one-line summary of the proposed fix and which patch file
carries the hunk.
## Verify
Spawn the **security-auditor** again to **review the patch** against the
original code:
Spawn the **security-auditor** again to **review both patches** against
the original code:
"Review analysis/$1/security_remediation.patch against legacy/$1. For each
"Review analysis/$1/security_remediation.patch and
analysis/$1/security_remediation.local.patch against legacy/$1. For each
hunk: does it fully remediate the cited finding? Does it introduce new
vulnerabilities or change behavior beyond the fix? Return one verdict per
hunk: RESOLVES / PARTIAL / INTRODUCES-RISK, with a one-line reason."
vulnerabilities or change behavior beyond the fix? Confirm no raw
credential values appear anywhere in the shareable patch. Return one
verdict per hunk: RESOLVES / PARTIAL / INTRODUCES-RISK, with a one-line
reason."
Add a **Patch Review** section to SECURITY_FINDINGS.md with the verdicts.
If any hunk is PARTIAL or INTRODUCES-RISK, revise the patch and re-review.
@@ -57,8 +111,12 @@ If any hunk is PARTIAL or INTRODUCES-RISK, revise the patch and re-review.
Tell the user the artifacts are ready:
- `analysis/$1/SECURITY_FINDINGS.md` — findings, remediation log, patch review
- `analysis/$1/security_remediation.patch` — review, then apply if appropriate
with `git -C legacy/$1 apply ../../analysis/$1/security_remediation.patch`
- `analysis/$1/security_remediation.patch` — review, then apply **from the
project root**: `git apply analysis/$1/security_remediation.patch`
(if `legacy/$1` is a symlink, use `git apply --unsafe-paths` or apply
with `patch -p0` from the project root)
- `analysis/$1/security_remediation.local.patch` — the credential fixes;
apply the same way, and rotate the affected credentials regardless
- Re-run `/modernize-harden $1` after applying to confirm resolution
Suggest: `glow -p analysis/$1/SECURITY_FINDINGS.md`