Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
19 changes: 19 additions & 0 deletions .agents/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# SPDX-FileCopyrightText: Copyright © 2026 Caleb Cushing
#
# SPDX-License-Identifier: CC0-1.0

/.yarn/** linguist-vendored
/.yarn/releases/* binary
/.yarn/plugins/**/* binary
/.pnp.* binary linguist-generated
*.jar binary linguist-vendored
*.bat text eol=crlf linguist-vendored
*.cmd text eol=crlf linguist-vendored
/gradlew text eol=lf linguist-vendored
/mvnw text eol=lf linguist-vendored
**/*lockfile text linguist-generated
yarn.lock text linguist-generated

# ours
*.sh text eol=lf
* text=auto eol=lf
63 changes: 63 additions & 0 deletions .agents/.github/renovate.json5
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// SPDX-FileCopyrightText: Copyright © 2024-2026 Caleb Cushing
//
// SPDX-License-Identifier: CC0-1.0

{
$schema: "https://docs.renovatebot.com/renovate-schema.json",
extends: ["config:recommended"],
dependencyDashboard: true,
timezone: "UTC",
platformAutomerge: true,
automergeStrategy: "squash",
// Rebase whenever PR falls behind base branch to keep them mergeable
rebaseWhen: "behind-base-branch",
// Subtrees are excluded - updates should be pulled via git subtree pull, not Renovate
// Squash merges break subtree history
ignorePaths: [".share/**", ".agents/**"],
// Remove the 'controls' section from PR body to avoid config noise in squash commits
prBodyTemplate: "{{{header}}}{{{table}}}{{{notes}}}{{{changelogs}}}{{{footer}}}",
hostRules: [
{
hostType: "maven",
matchHost: "https://maven.pkg.github.com",
},
],
packageRules: [
{
matchManagers: ["maven"],
matchUpdateTypes: ["major", "minor", "patch"],
automerge: true,
},
{
// Python deps via uv: Run daily at 03:00 UTC (after update-java)
schedule: ["* 3 * * *"],
matchManagers: ["pep621"],
automerge: true,
},
{
matchManagers: ["pyenv"],
automerge: true,
},
{
matchManagers: ["github-actions"],
automerge: true,
},
{
// Pin xenoterracide org actions to commit SHAs for build reproducibility
// Only these get digest pins; other actions get normal version tag updates
matchManagers: ["github-actions"],
matchDepNames: ["xenoterracide/**"],
automerge: true,
pinDigests: true,
},
{
// Run every Wednesday
// Window: 04:00 UTC hour on Wednesday (Renovate cron uses '*' for minutes)
schedule: ["* 4 * * 3"],
matchManagers: ["npm", "asdf"],
groupName: "devDependencies",
matchUpdateTypes: ["minor", "patch", "pin"],
automerge: true,
},
],
}
14 changes: 14 additions & 0 deletions .agents/.github/workflows/pre-commit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# SPDX-FileCopyrightText: Copyright © 2024-2026 Caleb Cushing
#
# SPDX-License-Identifier: CC0-1.0
# SPDX-License-Identifier: MIT

name: precommit
on: push
permissions:
contents: read
jobs:
license:
uses: xenoterracide/github/.github/workflows/license.yml@4b90dec8413886f0137c1cd21468a85fc993c7c4 # develop
prettier:
uses: xenoterracide/github/.github/workflows/prettier.yml@4b90dec8413886f0137c1cd21468a85fc993c7c4 # develop
168 changes: 168 additions & 0 deletions .agents/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
# SPDX-FileCopyrightText: Copyright © 2025, 2026 Caleb Cushing
#
# SPDX-License-Identifier: CC0-1.0

target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store

### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional stylelint cache
.stylelintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/

# vuepress build output
.vuepress/dist

# vuepress v2.x temp and cache directory
.temp
.cache

# Docusaurus cache and generated files
.docusaurus

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
52 changes: 52 additions & 0 deletions .agents/.lintstagedrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// SPDX-FileCopyrightText: Copyright © 2026 Caleb Cushing
//
// SPDX-License-Identifier: MIT

const shfmt = "shfmt --write";
const prettier = "prettier --cache --ignore-unknown --write";
const reuse = "uv run --frozen --group dev reuse annotate";
const copyright = "--copyright 'Caleb Cushing' --merge-copyrights";
const symbol = "--copyright-prefix spdx-string-symbol";

const licenseCode = "--license 'GPL-3.0-or-later'";
const licenseConfiguration = "--license 'CC0-1.0' --fallback-dot-license";
const licenseDocumentation = "--license 'CC-BY-NC-SA-4.0";
Copy link

Copilot AI Apr 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

licenseDocumentation string is missing its closing quote (and closing ' around the SPDX ID), which makes this config invalid JavaScript and will break lint-staged execution. Close the string literal and keep the license value exactly CC-BY-NC-SA-4.0.

Suggested change
const licenseDocumentation = "--license 'CC-BY-NC-SA-4.0";
const licenseDocumentation = "--license 'CC-BY-NC-SA-4.0'";

Copilot uses AI. Check for mistakes.
const licenseScripts = "--license 'MIT' --fallback-dot-license";

const withoutYarn = (files) => files.filter((file) => !file.includes("/.yarn/") && !file.startsWith(".yarn/"));

const withFiles = (command, files) => `${command} ${files.map((file) => `"${file.replace(/"/g, '\\"')}"`).join(" ")}`;

const run = (commands) => (files) => {
const filtered = withoutYarn(files);

if (!filtered.length) {
return [];
}

const cmds = Array.isArray(commands) ? commands : [commands];
return cmds.map((command) => withFiles(command, filtered));
};

module.exports = {
"!(package).json": run([`${reuse} ${copyright} ${symbol} ${licenseConfiguration}`, prettier]),
// package.json can contain logic via the scripts segment
"package.json": run([`${reuse} ${copyright} ${symbol} ${licenseScripts}`, prettier]),
"{.config/git/hooks/**,**/*.*sh}": run([`${reuse} ${copyright} ${symbol} ${licenseScripts} --style python`, shfmt]),
"*.adoc": run([`${reuse} ${copyright} ${symbol} ${licenseDocumentation}`, prettier]),
// don't run reuse for markdown in this repo because it doesn't deal with frontmatter properly
"*.md": run([prettier]),
"*.{xml,yaml,properties,toml,json5}": run([`${reuse} ${copyright} ${licenseConfiguration} ${symbol}`, prettier]),
// yml is different from yaml extension as the only known yaml required file is for git-conventional-commits, but yml
// contains files like GitHub workflows which can have significant logic
"*.{js,cjs,yml}": run([`${reuse} ${copyright} ${symbol} ${licenseScripts}`, prettier]),
".{*ignore,editorconfig,gitattributes,mailmap}": run([
`${reuse} ${copyright} ${symbol} ${licenseConfiguration}`,
prettier,
]),
// JetBrains obnoxiously assume that properties files aren't utf8 by default, and so to avoid rendering issues we
// avoid adding the Unicode copyright symbol
"*.properties": run([`${reuse} ${copyright} ${licenseConfiguration}`, prettier]),
// code our real business logic lives in
"*.{ts,java}": run([`${reuse} ${copyright} ${symbol} ${licenseCode}`, prettier]),
};
15 changes: 15 additions & 0 deletions .agents/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# SPDX-FileCopyrightText: Copyright © 2025, 2026 Caleb Cushing
#
# SPDX-License-Identifier: CC0-1.0

.agents/
.share/
.pnp.cjs
uv.lock
.venv/
.yarn/
node_modules/
build/
.idea/
mvnw*
.mvn/wrapper/*
17 changes: 17 additions & 0 deletions .agents/.prettierrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-FileCopyrightText: Copyright © 2025, 2026 Caleb Cushing
//
// SPDX-License-Identifier: CC0-1.0
// SPDX-License-Identifier: MIT

/** @type {import('prettier').Options} */
module.exports = {
printWidth: 120,
xmlWhitespaceSensitivity: "ignore",
keySeparator: "=",
plugins: [
require.resolve("@prettier/plugin-xml"),
require.resolve("prettier-plugin-properties"),
require.resolve("prettier-plugin-java"),
require.resolve("prettier-plugin-toml"),
],
};
1 change: 1 addition & 0 deletions .agents/.share/.agents/.agents
1 change: 1 addition & 0 deletions .agents/.share/.agents/mcp/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
3 changes: 3 additions & 0 deletions .agents/.share/.agents/mcp/mcp.json.license
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SPDX-FileCopyrightText: Copyright © 2026 Caleb Cushing

SPDX-License-Identifier: CC0-1.0
Loading
Loading