skills/secrets/SKILL.md
Use this skill when a user wants to store, manage, or work with Goldsky secrets — the named credential objects used by pipeline sinks. This includes: creating a new secret from a connection string or credentials, listing or inspecting existing secrets, updating or rotating credentials after a password change, and deleting secrets that are no longer needed. Trigger for any query where the user mentions 'goldsky secret', wants to securely store database credentials for a pipeline, or is working with sink authentication for PostgreSQL, Neon, Supabase, ClickHouse, Kafka, S3, Google Cloud Pub/Sub, Elasticsearch, DynamoDB, SQS, OpenSearch, or webhooks.
npx skillsauth add goldsky-io/goldsky-agent secretsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create and manage secrets for pipeline sink credentials.
When this skill is invoked, follow this streamlined workflow:
Run goldsky secret list to confirm authentication and show existing secrets.
If authentication fails: Invoke the auth-setup skill first.
Skip unnecessary questions. If the user's intent is clear from context, proceed directly:
Only use AskUserQuestion if intent is genuinely unclear.
If user provides a connection string, parse it directly instead of asking questions.
PostgreSQL connection string format:
postgres://USER:PASSWORD@HOST:PORT/DATABASE?sslmode=require
postgresql://USER:PASSWORD@HOST/DATABASE
Parsing logic:
user, password, host, port (default 5432), databaseNameExample - user provides:
postgresql://neondb_owner:[email protected]/neondb?sslmode=require
Create using the connection string directly:
goldsky secret create --name SUGGESTED_NAME
# When prompted, paste the connection string:
# postgresql://neondb_owner:[email protected]/neondb?sslmode=require
Neon:
postgresql://USER:[email protected]/neondbSupabase:
postgresql://postgres:[email protected]:5432/postgresPlanetScale (MySQL):
"protocol": "mysql" and port 3306Once you have credentials (from parsing or user input), create immediately:
goldsky secret create \
--name SECRET_NAME \
--value '{"type":"jdbc","protocol":"postgres",...}' \
--description "Optional description"
Naming convention: PROJECT_PROVIDER (e.g., TRADEWATCH_NEON, ANALYTICS_SUPABASE)
Run goldsky secret list to confirm creation.
JSON schema files are available in the
schemas/folder. Each file contains the full schema with examples.
| Secret Type | Schema File | Type Field | Use Case |
| ------------- | -------------------- | --------------- | ------------------------------- |
| PostgreSQL | postgres.json | jdbc | Database sink |
| MySQL | postgres.json | jdbc | Database sink (protocol: mysql) |
| ClickHouse | clickhouse.json | clickHouse | Analytics database |
| Kafka | kafka.json | kafka | Event streaming |
| AWS S3 | s3.json | s3 | Object storage |
| Google Pub/Sub| — | pubsub | GCP Pub/Sub topic (Turbo-only) |
| ElasticSearch | elasticsearch.json | elasticSearch | Search engine |
| DynamoDB | dynamodb.json | dynamodb | NoSQL database |
| SQS | sqs.json | sqs | Message queue |
| OpenSearch | opensearch.json | opensearch | Search/analytics |
| Webhook | webhook.json | httpauth | HTTP endpoints |
Schema location: schemas/ (relative to this skill's directory)
PostgreSQL — Connection string format:
postgres://username:password@host:port/database
goldsky secret create --name MY_POSTGRES_SECRET
# The CLI will prompt for the connection string interactively
ClickHouse — Connection string format:
https://username:password@host:port/database
Kafka — JSON format:
{
"type": "kafka",
"bootstrapServers": "broker:9092",
"securityProtocol": "SASL_SSL",
"saslMechanism": "PLAIN",
"saslJaasUsername": "user",
"saslJaasPassword": "pass"
}
S3 — Colon-separated format:
access_key_id:secret_access_key
Or with session token: access_key_id:secret_access_key:session_token
Google Cloud Pub/Sub — JSON format (Turbo-only):
{
"type": "pubsub",
"projectId": "goldsky-prod",
"credentialsJson": "{\"type\":\"service_account\",\"project_id\":\"goldsky-prod\",...}"
}
The CLI prompts for the GCP project id and asks for the entire service-account JSON key as a single-line paste; it validates the paste is JSON with type === "service_account".
IAM requirements: the service account must have roles/pubsub.publisher AND roles/pubsub.viewer. The viewer role is required by the sink's topic-existence pre-check during initialization — a publish-only SA will fail sink init with a PermissionDenied error.
The Pub/Sub topic itself must exist in the GCP project before deploying the pipeline; Goldsky does not auto-create topics.
Webhook:
Note: Turbo pipeline webhook sinks do not support Goldsky's native secrets management. Include auth headers directly in the pipeline YAML
headers:field instead.
For PostgreSQL, use the helper script to parse connection strings:
./scripts/parse-connection-string.sh "postgresql://user:pass@host:5432/dbname"
# Output: JSON ready for goldsky secret create --value
Show the user what will be created (mask password with ***) and ask for confirmation before running the command.
Run goldsky secret list to confirm the secret was created.
| Action | Command |
| ------ | --------------------------------------------------- |
| Create | goldsky secret create --name NAME --value "value" |
| List | goldsky secret list |
| Reveal | goldsky secret reveal NAME |
| Update | goldsky secret update NAME --value "new-value" |
| Delete | goldsky secret delete NAME |
goldsky login)Pipelines that write to external sinks (PostgreSQL, ClickHouse, Kafka, S3) need credentials to connect. Instead of putting credentials directly in your pipeline YAML, you store them as secrets and reference them by name.
Benefits:
| Command | Purpose | Key Flags |
| ------------------------------ | ------------------- | ------------------------------------ |
| goldsky secret create | Create a new secret | --name, --value, --description |
| goldsky secret list | List all secrets | |
| goldsky secret reveal <name> | Show secret value | |
| goldsky secret update <name> | Update secret value | --value, --description |
| goldsky secret delete <name> | Delete a secret | -f (force, skip confirmation) |
goldsky secret create --name PROD_POSTGRES
# When prompted, provide the connection string:
# postgres://admin:[email protected]:5432/mydb
Pipeline usage:
sinks:
output:
type: postgres
from: my_source
schema: public
table: transfers
secret_name: PROD_POSTGRES
goldsky secret create --name CLICKHOUSE_ANALYTICS
# When prompted, provide the connection string:
# https://default:[email protected]:8443/analytics
Pipeline usage:
sinks:
output:
type: clickhouse
from: my_source
table: events
secret_name: CLICKHOUSE_ANALYTICS
primary_key: id
Update an existing secret without changing pipeline configs:
goldsky secret update MY_POSTGRES_SECRET --value 'postgres://admin:[email protected]:5432/mydb'
Active pipelines will pick up the new credentials on their next connection.
# With confirmation prompt
goldsky secret delete OLD_SECRET
# Skip confirmation (for scripts)
goldsky secret delete OLD_SECRET -f
Warning: Deleting a secret that's in use will cause pipeline failures.
Use descriptive, uppercase names with underscores:
| Good | Bad |
| -------------------- | ----------- |
| PROD_POSTGRES_MAIN | secret1 |
| STAGING_CLICKHOUSE | my-secret |
| KAFKA_PROD_CLUSTER | postgres |
Include environment and purpose in the name for clarity.
Error: Secret 'MY_SECRET' not found
Cause: The secret name doesn't exist or is misspelled.
Fix: Run goldsky secret list to see available secrets and check the exact name.
Error: Secret 'MY_SECRET' already exists
Cause: Attempting to create a secret with a name that's already in use.
Fix: Use goldsky secret update MY_SECRET --value "new-value" to update, or choose a different name.
Error: Invalid JSON in secret value
Cause: JSON syntax error in the secret value.
Fix: Validate your JSON before creating the secret:
# Test JSON validity
echo '{"url":"...","user":"..."}' | jq .
Cause: The credentials in the secret are incorrect or the database is unreachable.
Fix:
psql "postgresql://..."goldsky secret reveal MY_SECRETCause: Username or password in the secret is incorrect. Fix: Update the secret with correct credentials:
goldsky secret update MY_SECRET --value 'postgres://correct:credentials@host:5432/db'
Cause: JSON strings with special characters need proper escaping. Fix: Use proper JSON escaping for special characters in password fields:
\\\"\nWith the structured JSON format, most special characters in passwords work without URL encoding since the password is a separate field.
/turbo-builder — Build and deploy pipelines that use these secrets/auth-setup — Invoke this if user is not logged in/turbo-pipelines — Pipeline YAML configuration referencedevelopment
Turbo pipeline YAML reference and architecture guide. Covers: YAML field syntax (start_at, from, version, primary_key), source/transform/sink configuration, validation errors, resource sizing (xs–xxl), architecture decisions (dataset vs kafka, streaming vs job, fan-out vs fan-in, sink selection, pipeline splitting). Triggers on: 'what does field X do', 'what fields does a postgres sink need', 'what resource size', 'should I use kafka or dataset', 'how to structure my pipeline'. For writing transforms, use /turbo-transforms. For end-to-end building, use /turbo-builder.
tools
Build and deploy new Goldsky Turbo pipelines from scratch. Triggers on: 'build a pipeline', 'index X on Y chain', 'set up a pipeline', 'track transfers to postgres', or any request describing data to move from a chain/contract to a destination (postgres, mysql, clickhouse, kafka, pubsub, s3, sqs, webhook). Covers the full workflow: requirements → dataset selection → YAML generation → validation → deploy. Not for debugging (use /turbo-doctor) or syntax lookups (use /turbo-pipelines).
development
Write SQL, TypeScript, and dynamic table transforms for Turbo pipelines. Covers: decoding EVM logs with _gs_log_decode, filtering/casting blockchain data, UNION ALL for combining events, TypeScript/WASM transforms (invoke function), dynamic lookup tables (dynamic_table_check), transform chaining, and Solana decoding. Triggers on: 'decode Transfer events', 'write a SQL transform', 'filter by contract', 'TypeScript transform', 'dynamic table', 'UNION ALL'. For pipeline YAML structure, use /turbo-pipelines. For end-to-end building, use /turbo-builder.
tools
Use this skill when the user needs to look up or verify Goldsky blockchain dataset names, chain prefixes, dataset types, or versions. Triggers on questions like 'what\'s the dataset name for X?', 'what prefix does Goldsky use for chain Y?', 'what version should I use for Z?', or 'what datasets are available for Solana/Stellar/Arbitrum/etc?'. Also use for chain-specific dataset questions (e.g., polygon vs matic prefix, stellarnet balance datasets, solana token transfer dataset names). Do NOT trigger for questions about CLI commands, pipeline setup, or general Goldsky architecture unless the core question is about finding the right dataset name or chain prefix.