academic-research-comp…
Guide a research project through the full academic lifecycle — from raw idea to concrete research question, literature grounding, methodology, writing,…
Deploys AWS CloudFormation infrastructure stacks for the website (S3, CloudFront, Route 53, ACM, and optionally contact form API).
$ npx -y skills add GRCEngClub/claude-grc-engineering --skill website-infra --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/website-infraContext preview
The summary Claude sees to decide when to auto-load this skill.
Deploys AWS CloudFormation infrastructure stacks for the website (S3, CloudFront, Route 53, ACM, and optionally contact form API).
name: website-infra description: Deploys AWS CloudFormation infrastructure stacks for the website (S3, CloudFront, Route 53, ACM, and optionally contact form API). allowed-tools: Bash, Read, Write, Edit, Glob
You are running the `/grc-portfolio:infra` skill. Your job is to deploy the AWS infrastructure needed to host the website using CloudFormation.
Find `site-config.json`:
Read it and validate that `status.preflightComplete === true`. If not, tell the user to run `/grc-portfolio:preflight` first.
Based on `features.customDomain`:
Run the validation script:
$TOOLKIT_DIR/scripts/validate-stack.sh <template-path> <aws.profile>
If validation fails, report the error and stop.
Use `aws cloudformation deploy` — it is idempotent (creates the stack on first run, applies a change-set on subsequent runs) and waits for completion inline, so the user doesn't need a separate `wait` step.
**With custom domain:**
aws cloudformation deploy \
--stack-name <aws.stackName> \
--template-file <template-path> \
--parameter-overrides \
ProjectName=<projectName> \
DomainName=<aws.domain> \
HostedZoneId=<aws.hostedZoneId> \
CertificateArn=<aws.certArn> \
--profile <aws.profile> \
--region us-east-1 \
--no-fail-on-empty-changeset**Without custom domain:**
aws cloudformation deploy \ --stack-name <aws.stackName> \ --template-file <template-path> \ --parameter-overrides ProjectName=<projectName> \ --profile <aws.profile> \ --region us-east-1 \ --no-fail-on-empty-changeset
Note: Check the actual template parameters first by reading the template file, as parameter names may differ from the examples above. Use the actual parameter names from the template.
The deploy command can take 5-15 minutes (especially with CloudFront distribution creation). Tell the user it's in progress and approximately how long it might take.
If the deploy fails, retrieve the failure reason:
aws cloudformation describe-stack-events \ --stack-name <aws.stackName> \ --profile <aws.profile> \ --region us-east-1 \ --query "StackEvents[?ResourceStatus=='CREATE_FAILED' || ResourceStatus=='UPDATE_FAILED'].[LogicalResourceId,ResourceStatusReason]" \ --output table
aws cloudformation describe-stacks \ --stack-name <aws.stackName> \ --profile <aws.profile> \ --region us-east-1 \ --query "Stacks[0].Outputs"
Extract and save to `site-config.json`:
If `features.contactForm` is true:
1. Ask the user for two SES-verified email addresses (no defaults — the stack will refuse to deploy without them):
If either is not yet verified in SES, stop and instruct the user to verify them in the AWS Console (`SES → Verified identities → Create identity`) before continuing. Save both to `aws.sesFromEmail` and `aws.sesToEmail` in `site-config.json`.
2. Deploy the contact form stack:
aws cloudformation deploy \ --template-file $TOOLKIT_DIR/cloudformation/contact-form-api.yaml \ --stack-name <projectName>-contact-form-api \ --parameter-overrides "SESFromEmail=<aws.sesFromEmail>" "SESToEmail=<aws.sesToEmail>" \ --capabilities CAPABILITY_IAM \ --profile <aws.profile> \ --region us-east-1 \ --no-fail-on-empty-changeset
3. Retrieve the API endpoint:
aws cloudformation describe-stacks \ --stack-name <projectName>-contact-form-api \ --profile <aws.profile> \ --region us-east-1 \ --query "Stacks[0].Outputs[?OutputKey=='ApiEndpoint'].OutputValue" \ --output text
4. Save to `aws.contactApiEndpoint` in config.
5. Package and deploy the Lambda function code (reference `$TOOLKIT_DIR/scripts/deploy-contact-api.sh` for the pattern -- create temp dir, copy handler, install @aws-sdk/client-ses, zip, update function code). The function name is `<projectName>-contact-form-api-handler` (derived from the stack name in the template).
If using a custom domain, tell the user:
Get the nameservers:
aws route53 get-hosted-zone --id <aws.hostedZoneId> --profile <aws.profile> --query "DelegationSet.NameServers"
Update `site-config.json`:
Tell the user:
Open-source GRC Engineering resource for Claude. claude-grc-engineering turns technical evidence from cloud, SaaS, code, and security tools into framework-aligned findings, gap reports, remediation guidance, evidence packages, and OSCAL workflows.
Repo: GRCEngClub/claude-grc-engineering
Guide a research project through the full academic lifecycle — from raw idea to concrete research question, literature grounding, methodology, writing,…
Expertise in evaluating AWS accounts for compliance — what checks are meaningful, which SCF controls they map to, and how to interpret aws CLI output.
Use when interpreting AWS Secrets Manager connector output, deciding between inspector and retrieve modes, drafting SCF-mapped controls for rotation / KMS /…
Expertise in evaluating Azure subscription findings from azure-inspector and mapping them to SCF controls.
Interpret CrowdStrike Falcon findings for sensor coverage, policy visibility, and host group scoping.
Interpret datadog-inspector findings and translate Datadog monitoring, audit, log-retention, SSO, and RBAC results into GRC evidence and remediation.