Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
c2e03b7
Create config.yml (#56)
Dargon789 Sep 23, 2025
a272a7c
Merge branch 'Uniswap:main' into circleci-project-setup
Dargon789 Sep 26, 2025
4e41d0b
Merge pull request #62 from Dargon789/circleci-project-setup
Dargon789 Sep 27, 2025
b7ece14
fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnera…
Dargon789 Sep 28, 2025
58d9f6c
build(deps): bump the npm_and_yarn group across 6 directories with 5 …
dependabot[bot] Sep 28, 2025
607e2db
Potential fix for code scanning alert no. 19: Incomplete regular expr…
Dargon789 Sep 29, 2025
036022c
Update issue templates (#64)
Dargon789 Sep 29, 2025
87893de
Potential fix for code scanning alert no. 17: Incomplete regular expr…
Dargon789 Sep 30, 2025
8e3b4a5
Update tag_and_release.yml (#66)
Dargon789 Sep 30, 2025
4b5c40f
Update tag_and_release.yml (#67)
Dargon789 Oct 1, 2025
008555b
Potential fix for code scanning alert no. 10: Incomplete regular expr…
Dargon789 Feb 1, 2025
085f13d
Create SECURITY.md
Dargon789 Feb 1, 2025
a6b4970
Potential fix for code scanning alert no. 11: Incomplete string escap…
Dargon789 Feb 1, 2025
8a4ae07
Create static.yml
Dargon789 Jan 24, 2025
46b0af5
Create jekyll-gh-pages.yml
Dargon789 Jan 24, 2025
bdef851
fix: packages/ui/package.json to reduce vulnerabilities
snyk-bot Feb 15, 2025
d061a4d
Update tag_and_release.yml (#68)
Dargon789 Oct 1, 2025
0b9e0dc
Create config.yml (#75)
Dargon789 Oct 9, 2025
158f514
fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnera…
snyk-io[bot] Oct 9, 2025
1cbe82b
build(deps): bump the npm_and_yarn group across 7 directories with 5 …
dependabot[bot] Oct 9, 2025
9ec565f
Create notify vercel.yml
Dargon789 Oct 9, 2025
6fec7e2
Delete .github/workflows/notify vercel.yml
Dargon789 Oct 9, 2025
ab61fb4
Merge branch 'main' of https://github.com/Dargon789/interface
Dargon789 Oct 9, 2025
3f6d466
build(deps-dev): bump playwright
dependabot[bot] Oct 20, 2025
8d28ba5
build(deps): bump hono
dependabot[bot] Oct 24, 2025
9095c2c
Merge branch 'Uniswap:main' into main
Dargon789 Oct 25, 2025
7f595cd
Create docker.yml (#87)
Dargon789 Oct 26, 2025
557b3bd
ci(release): publish latest release
hello-happy-puppy Oct 28, 2025
c7e7311
build(deps-dev): bump js-yaml
dependabot[bot] Nov 16, 2025
479fb28
fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnera…
snyk-bot Dec 24, 2025
398296f
build(deps): bump the npm_and_yarn group across 3 directories with 4 …
dependabot[bot] Jan 16, 2026
6ad0d16
Potential fix for code scanning alert no. 9: Incomplete regular expre…
Dargon789 Jan 19, 2026
2aea294
Uniswap/main (#98)
Dargon789 Jan 19, 2026
7cd9f46
build(deps): bump the npm_and_yarn group across 1 directory with 2 up…
dependabot[bot] Jan 20, 2026
664d157
build(deps-dev): bump the npm_and_yarn group across 2 directories wit…
dependabot[bot] Feb 2, 2026
f20697b
Merge remote-tracking branch 'upstream/main'
googleworkspace-bot Mar 5, 2026
37afe8b
Merge remote-tracking branch 'upstream/main'
googleworkspace-bot Apr 6, 2026
8ac9c76
fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnera…
Dargon789 Apr 7, 2026
5aeb7ce
Merge remote-tracking branch 'upstream/main'
googleworkspace-bot Apr 13, 2026
0c1bb25
build(deps): bump the npm_and_yarn group across 7 directories with 7 …
dependabot[bot] Apr 14, 2026
23813b0
Merge remote-tracking branch 'upstream/main'
googleworkspace-bot Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/configuration-reference
version: 2.1

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs
jobs:
say-hello:
# Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub.
# See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job
docker:
# Specify the version you desire here
# See: https://circleci.com/developer/images/image/cimg/base
- image: cimg/base:current

# Add steps to the job
# See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps
steps:
# Checkout the code as the first step.
- checkout
- run:
name: "Say hello"
command: "echo Hello, World!"

# Orchestrate jobs using workflows
# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows
workflows:
say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow.
# Inside the workflow, you define the jobs you want to run.
jobs:
- say-hello
100 changes: 100 additions & 0 deletions .circleci/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
name: Docker

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

on:
schedule:
- cron: '21 12 * * *'
push:
branches: [ "master" ]
# Publish semver tags as releases.
tags: [ 'v*.*.*' ]
pull_request:
branches: [ "master" ]

env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}


jobs:
build:
- name: Build the Docker image
run: docker build . --file path/to/Dockerfile --tag my-image-name:$(date +%s)

runs-on: ubuntu-latest
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

# Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer
- name: Install cosign
if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0
with:
cosign-release: 'v2.2.4'

# Set up BuildKit Docker container builder to be able to build
# multi-platform images and export cache
# https://github.com/docker/setup-buildx-action
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0

# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v5.0.0
with:
context: ./
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

# Sign the resulting Docker image digest except on PRs.
# This will only write to the public Rekor transparency log when the Docker
# repository is public to avoid leaking data. If you would like to publish
# transparency data even for private images, pass --force to cosign below.
# https://github.com/sigstore/cosign
- name: Sign the published Docker image
if: ${{ github.event_name != 'pull_request' }}
env:
# https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
TAGS: ${{ steps.meta.outputs.tags }}
DIGEST: ${{ steps.build-and-push.outputs.digest }}
# This step uses the identity token to provision an ephemeral certificate
# against the sigstore community Fulcio instance.
run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
6 changes: 6 additions & 0 deletions .claude/hooks/skill-activation-prompt.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
# Copied from https://github.com/diet103/claude-code-infrastructure-showcase/blob/c586f9d8854989abbe9040cde61527888ded3904/.claude/hooks/skill-activation-prompt.sh
set -e

cd "$CLAUDE_PROJECT_DIR/.claude/hooks"
cat | bun run skill-activation-prompt.ts
132 changes: 132 additions & 0 deletions .claude/hooks/skill-activation-prompt.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#!/usr/bin/env node
/** biome-ignore-all lint/suspicious/noConsole: script output */
// Copied from https://github.com/diet103/claude-code-infrastructure-showcase/blob/c586f9d8854989abbe9040cde61527888ded3904/.claude/hooks/skill-activation-prompt.ts
import { readFileSync } from 'fs'
import { join } from 'path'

interface HookInput {
session_id: string
transcript_path: string
cwd: string
permission_mode: string
prompt: string
}

interface PromptTriggers {
keywords?: string[]
intentPatterns?: string[]
}

interface SkillRule {
type: 'guardrail' | 'domain'
enforcement: 'block' | 'suggest' | 'warn'
priority: 'critical' | 'high' | 'medium' | 'low'
promptTriggers?: PromptTriggers
}

interface SkillRules {
version: string
skills: Record<string, SkillRule>
}

interface MatchedSkill {
name: string
matchType: 'keyword' | 'intent'
config: SkillRule
}

async function main() {
try {
// Read input from stdin
const input = readFileSync(0, 'utf-8')
const data: HookInput = JSON.parse(input)
const prompt = data.prompt.toLowerCase()

// Load skill rules
const projectDir = process.env.CLAUDE_PROJECT_DIR || '$HOME/project'
const rulesPath = join(projectDir, '.claude', 'skills', 'skill-rules.json')
const rules: SkillRules = JSON.parse(readFileSync(rulesPath, 'utf-8'))

const matchedSkills: MatchedSkill[] = []

// Check each skill for matches
for (const [skillName, config] of Object.entries(rules.skills)) {
const triggers = config.promptTriggers
if (!triggers) {
continue
}

// Keyword matching
if (triggers.keywords) {
const keywordMatch = triggers.keywords.some((kw) => prompt.includes(kw.toLowerCase()))
if (keywordMatch) {
matchedSkills.push({ name: skillName, matchType: 'keyword', config })
continue
}
}

// Intent pattern matching
if (triggers.intentPatterns) {
const intentMatch = triggers.intentPatterns.some((pattern) => {
const regex = new RegExp(pattern, 'i')
return regex.test(prompt)
})
if (intentMatch) {
matchedSkills.push({ name: skillName, matchType: 'intent', config })
}
}
}

// Generate output if matches found
if (matchedSkills.length > 0) {
let output = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'
output += '🎯 SKILL ACTIVATION CHECK\n'
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n'

// Group by priority
const critical = matchedSkills.filter((s) => s.config.priority === 'critical')
const high = matchedSkills.filter((s) => s.config.priority === 'high')
const medium = matchedSkills.filter((s) => s.config.priority === 'medium')
const low = matchedSkills.filter((s) => s.config.priority === 'low')

if (critical.length > 0) {
output += '⚠️ CRITICAL SKILLS (REQUIRED):\n'
critical.forEach((s) => (output += ` → ${s.name}\n`))
output += '\n'
}

if (high.length > 0) {
output += '📚 RECOMMENDED SKILLS:\n'
high.forEach((s) => (output += ` → ${s.name}\n`))
output += '\n'
}

if (medium.length > 0) {
output += '💡 SUGGESTED SKILLS:\n'
medium.forEach((s) => (output += ` → ${s.name}\n`))
output += '\n'
}

if (low.length > 0) {
output += '📌 OPTIONAL SKILLS:\n'
low.forEach((s) => (output += ` → ${s.name}\n`))
output += '\n'
}

output += 'ACTION: Use Skill tool BEFORE responding\n'
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'

console.log(output)
}

process.exit(0)
} catch (err) {
console.error('Error in skill-activation-prompt hook:', err)
process.exit(1)
}
}

main().catch((err) => {
console.error('Uncaught error:', err)
process.exit(1)
})
32 changes: 32 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"permissions": {
"deny": [
"Read(**/.env)",
"Edit(**/.env)",
"Read(~/.aws/**)",
"Edit(~/.aws/**)",
"Read(~/.ssh/**)",
"Edit(~/.ssh/**)",
"Read(~/.gnupg/**)",
"Edit(~/.gnupg/**)",
"Read(~/.git-credentials)",
"Edit(~/.git-credentials)",
"Read($HOME/Library/Keychains/**)",
"Edit($HOME/Library/Keychains/**)",
"Read(/private/etc/**)",
"Edit(/private/etc/**)"
]
},
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/skill-activation-prompt.sh"
}
]
}
]
}
}
29 changes: 29 additions & 0 deletions .claude/skills/skill-rules.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"version": "1.0",
"description": "Skill activation triggers for Claude Code. Controls when skills automatically suggest or block actions.",
"skills": {
"web-e2e": {
"type": "domain",
"enforcement": "block",
"priority": "critical",
"description": "Run, debug, and create Playwright e2e tests for the web app.",
"promptTriggers": {
"keywords": ["e2e", "end-to-end", "playwright"],
"intentPatterns": ["(run|start|debug|create|explain).*?e2e"]
}
}
},
"notes": {
"enforcement_types": {
"suggest": "Skill suggestion appears but doesn't block execution",
"block": "Requires skill to be used before proceeding (guardrail)",
"warn": "Shows warning but allows proceeding"
},
"priority_levels": {
"critical": "Highest - Always trigger when matched",
"high": "Important - Trigger for most matches",
"medium": "Moderate - Trigger for clear matches",
"low": "Optional - Trigger only for explicit matches"
}
}
}
Loading