Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Builds the React/Vite site, syncs to S3, and invalidates CloudFront cache. Uses the plugin's bundled deploy.sh script.
.claude/skills/grcengclub-website-deploy/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -24% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -22% | 0% |
You are running the /grc-portfolio:deploy skill. Your job is to build the website and deploy it to the AWS infrastructure created by /grc-portfolio:infra.
Find site-config.json:
$ARGUMENTS for a project directory pathRead it and validate that status.infraDeployed === true. If not, tell the user to run /grc-portfolio:infra first.
Also validate that status.buildComplete === true. If not, tell the user to run /grc-portfolio:build first.
Extract needed values:
aws.bucketNameaws.distributionIdaws.profileaws.contactApiEndpoint (if contact form enabled)aws.cloudFrontUrlaws.domain (if custom domain)If features.contactForm is true and aws.contactApiEndpoint is set, ensure .env in the project directory contains:
VITE_CONTACT_API_ENDPOINT=<aws.contactApiEndpoint>Update the file non-destructively — do not overwrite an existing .env:
.env does not exist, create it with just this line..env exists and already has a VITE_CONTACT_API_ENDPOINT= line, replace only that line..env exists but does not contain VITE_CONTACT_API_ENDPOINT=, append the line.Preserve any other variables the user has set (e.g. VITE_GA_ID, analytics keys, feature flags).
bashcd <projectDir> npm run build
Verify the dist/ directory was created and contains files.
If the build fails, diagnose and fix the issue.
Use the toolkit's deploy script:
bash$TOOLKIT_DIR/scripts/deploy.sh <aws.bucketName> <aws.distributionId> <aws.profile>
Run this from the project directory (it expects dist/ in the current working directory).
Wait a moment for CloudFront to propagate, then tell the user their site is live.
Provide the URL:
https://<aws.domain>https://<aws.cloudFrontUrl>Update site-config.json:
status.siteDeployed = trueTell the user:
/grc-portfolio:repo to create a GitHub repo (if not done)/grc-portfolio:cicd to set up automatic deployments on push$TOOLKIT_DIR = read from site-config.json toolkitDir field$ARGUMENTS = arguments passed after /deploy (expected: project directory path)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,204 | 9,832 | -49% | 1 | 1 | 0% | 3,047 | 1,036 | -66% | 0 | 0 | — |
case-02 | fail→fail | 4,088 | 4,749 | +16% | 1 | 1 | 0% | 183 | 909 | +397% | 0 | 0 | — |
case-03 | fail→fail | 5,556 | 4,997 | -10% | 1 | 1 | 0% | 333 | 1,010 | +203% | 0 | 0 | — |
case-04 | fail→pass | 12,907 | 4,298 | -67% | 1 | 1 | 0% | 2,297 | 1,456 | -37% | 0 | 0 | — |
case-05 | fail→pass | 8,165 | 7,615 | -7% | 1 | 1 | 0% | 1,306 | 1,968 | +51% | 0 | 0 | — |
case-06 | pass→pass | 8,499 | 8,700 | +2% | 1 | 1 | 0% | 1,460 | 1,958 | +34% | 0 | 0 | — |
case-07 | pass→pass | 5,995 | 9,343 | +56% | 1 | 1 | 0% | 1,090 | 2,612 | +140% | 0 | 0 | — |
case-08 | fail→pass | 8,256 | 11,045 | +34% | 1 | 1 | 0% | 1,445 | 2,172 | +50% | 0 | 0 | — |
case-09 | pass→pass | 11,168 | 9,747 | -13% | 1 | 1 | 0% | 1,611 | 2,434 | +51% | 0 | 0 | — |
case-10 | pass→pass | 4,541 | 2,792 | -39% | 1 | 1 | 0% | 716 | 1,218 | +70% | 0 | 0 | — |
case-11 | pass→pass | 6,118 | 2,046 | -67% | 1 | 1 | 0% | 918 | 1,017 | +11% | 0 | 0 | — |
case-12 | fail→pass | 9,590 | 3,082 | -68% | 1 | 1 | 0% | 1,686 | 1,284 | -24% | 0 | 0 | — |
case-13 | pass→fail | 8,898 | 4,248 | -52% | 1 | 1 | 0% | 1,386 | 1,157 | -17% | 0 | 0 | — |
case-14 | fail→fail | 9,864 | 1,645 | -83% | 1 | 1 | 0% | 1,444 | 963 | -33% | 0 | 0 | — |
case-15 | fail→pass | 9,904 | 2,617 | -74% | 1 | 1 | 0% | 1,423 | 1,111 | -22% | 0 | 0 | — |
case-16 | fail→pass | 7,357 | 3,154 | -57% | 1 | 1 | 0% | 1,078 | 1,309 | +21% | 0 | 0 | — |
case-17 | fail→pass | 10,017 | 2,679 | -73% | 1 | 1 | 0% | 1,649 | 1,170 | -29% | 0 | 0 | — |
case-18 | pass→pass | 8,584 | 3,973 | -54% | 1 | 1 | 0% | 1,388 | 1,354 | -2% | 0 | 0 | — |
case-19 | pass→pass | 16,349 | 17,992 | +10% | 1 | 1 | 0% | 3,199 | 3,570 | +12% | 0 | 0 | — |
case-20 | pass→pass | 11,015 | 5,715 | -48% | 1 | 1 | 0% | 1,920 | 1,830 | -5% | 0 | 0 | — |
case-21 | pass→fail | 10,789 | 5,120 | -53% | 1 | 1 | 0% | 1,911 | 1,043 | -45% | 0 | 0 | — |
case-22 | fail→fail | 9,636 | 3,896 | -60% | 1 | 1 | 0% | 1,560 | 1,380 | -12% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +23 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.