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
2 changes: 1 addition & 1 deletion .agents/shared
Submodule shared updated 44 files
+477 −0 .agents/tasks/pre-pr-gate-cross-repo.md
+75 −0 .agents/tasks/version-gate-fallback-refuses.md
+167 −0 .agents/tasks/worktree-aware-hook-scripts.md
+11 −7 claude/agents/dependency-audit.md
+6 −1 claude/commands/bump-gradle.md
+51 −0 claude/commands/cascade.md
+7 −1 claude/commands/dependency-update.md
+2 −1 claude/commands/pre-pr.md
+2 −1 docs/project.md
+2 −0 guidelines/_TOC.md
+56 −6 guidelines/documentation.md
+25 −0 guidelines/english-style.md
+6 −3 guidelines/protobuf.md
+31 −10 guidelines/safety-rules.md
+31 −0 guidelines/version-policy.md
+4 −1 scripts/git-hooks/pre-commit
+369 −23 scripts/pre-pr-gate.sh
+54 −4 scripts/publish-version-gate.sh
+32 −3 scripts/secret-scan-gate.sh
+81 −0 scripts/session-work-tree.sh
+1,212 −0 scripts/tests/test_hooks.py
+1,042 −0 scripts/tests/test_kotlin_cap.py
+35 −5 scripts/update-copyright.sh
+57 −1 skills/bump-gradle/SKILL.md
+2 −1 skills/bump-gradle/agents/openai.yaml
+33 −12 skills/bump-version/SKILL.md
+118 −0 skills/cascade-adapt/SKILL.md
+7 −0 skills/cascade-adapt/agents/openai.yaml
+40 −16 skills/check-links/SKILL.md
+59 −15 skills/dependency-audit/SKILL.md
+2 −1 skills/dependency-audit/agents/openai.yaml
+81 −7 skills/dependency-update/SKILL.md
+4 −1 skills/dependency-update/agents/openai.yaml
+16 −0 skills/dependency-update/references/buildsrc-build-script.md
+4 −0 skills/dependency-update/references/version-discovery.md
+58 −0 skills/dependency-update/scenarios.md
+177 −0 skills/kotlin-version-cap/SKILL.md
+8 −0 skills/kotlin-version-cap/agents/openai.yaml
+848 −0 skills/kotlin-version-cap/scripts/kotlin_cap.py
+3 −1 skills/pre-pr/SKILL.md
+15 −9 skills/review-docs/SKILL.md
+12 −0 skills/update-copyright/SKILL.md
+100 −12 skills/update-copyright/scripts/update_copyright.py
+250 −0 skills/update-copyright/tests/test_update_copyright.py
13 changes: 11 additions & 2 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
"Bash(git switch:*)",
"Bash(git checkout:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git restore:*)",
"Bash(git stash:*)",
"Bash(git fetch:*)",
"Bash(git push:*)",
"Bash(git rev-parse:*)",
"Bash(git ls-files:*)",
"Bash(git mv:*)",
Expand All @@ -36,7 +38,6 @@
"Skill(pre-pr:*)"
],
"deny": [
"Bash(git push:*)",
"Bash(git reset --hard:*)",
"Bash(git clean -fdx:*)",
"Bash(rm -rf /:*)",
Expand All @@ -45,7 +46,15 @@
"Bash(gh release create:*)"
],
"ask": [
"Bash(git commit:*)",
"Bash(git push --force*)",
"Bash(git push * --force*)",
"Bash(git push -f*)",
"Bash(git push * -f*)",
"Bash(git push -uf*)",
"Bash(git push * -uf*)",
"Bash(git push * +*)",
"Bash(git push --mirror*)",
"Bash(git push * --mirror*)",
"Bash(git rebase:*)",
"Bash(git merge:*)",
"Bash(git cherry-pick:*)"
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/check-links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ env:
# SHA256 of the above tarball, pinned at download time. Update alongside
# LYCHEE_VERSION_TAG whenever the binary is upgraded.
LYCHEE_SHA256: "1f4e0ef7f6554a6ed33dd7ac144fb2e1bbed98598e7af973042fc5cd43951c9a"
# Pinned to the release the Spine sites were checked with. Newer releases
# add Sass deprecations, which nobody has checked against those sites yet.
DART_SASS_VERSION: 1.99.0
# SHA256 of `dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz`, from the GitHub release.
# Update alongside DART_SASS_VERSION.
Expand Down Expand Up @@ -83,6 +85,13 @@ jobs:
hugo-version: ${{ env.HUGO_VERSION }}
extended: true

# The Spine Hugo theme compiles its SCSS with Dart Sass, because Hugo
# deprecated LibSass in v0.153.0 and will remove it. Hugo does not
# bundle Dart Sass: it runs the `sass` binary it finds on `PATH`, and
# a site on that theme fails to build without one. The release
# tarball is standalone, so no Node or Dart setup is needed. The
# checksum guards the download, as it does for Lychee below. Sites
# still on LibSass ignore the binary.
- name: Install Dart Sass
if: steps.docs.outputs.present == 'true'
run: |
Expand All @@ -94,6 +103,9 @@ jobs:
echo "${RUNNER_TEMP}/dart-sass" >> "${GITHUB_PATH}"

# Hugo finds Dart Sass on `PATH`. `hugo env` lists it when it does.
# `GITHUB_PATH` only takes effect from the next step on, so this check
# cannot live in the install step above. It fails here, rather than
# mid-build, if the install did not put `sass` where Hugo looks.
- name: Check Dart Sass
if: steps.docs.outputs.present == 'true'
run: hugo env | grep 'github.com/sass/dart-sass'
Expand Down
17 changes: 17 additions & 0 deletions .lycheeignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Lychee skips the URLs matching these patterns. It reads this file from the
# directory it runs in, the repository root. `lychee.toml` comes from `config`
# and `./config/pull` overwrites it, so links specific to this site go here.
#
# These links are broken in the docs of `SpineEventEngine/validation`, which
# `docs/hugo.toml` imports as a module, so they can only be fixed there.
# Remove a pattern once the module update that fixes its link lands here.
# See https://github.com/SpineEventEngine/documentation/issues/97.
^https://github\.com/SpineEventEngine/validation/blob/master/\.agents/running-builds\.md$
^https://github\.com/SpineEventEngine/validation/blob/master/\.agents/documentation-guidelines\.md$
^https://github\.com/SpineEventEngine/embed-code-go/blob/master/EMBEDDING\.md$
^https://github\.com/SpineEventEngine/embed-code-go/tree/master/bin$
^https://plugins\.gradle\.org/plugin/io\.spine\.validation$
# Relative links that resolve outside the module's pages.
^http://localhost:[0-9]+/06-developers-guide/$
^http://localhost:[0-9]+/developer/$
^http://localhost:[0-9]+/typical_custom_option\.jpg$
34 changes: 23 additions & 11 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,29 @@ Shared skills, scripts, and guidelines come from the `.agents/shared` submodule
(and some shallow clones / cloud checkouts) start with NO submodules checked out, so
those symlinks dangle and no skills are found. Bootstrap such a tree with
**`./init-submodules`** — a root script that materializes the missing
*config-managed* submodules at their pinned commits: `config` itself, plus every
submodule that declares a tracked `branch` in `.gitmodules` (`.agents/shared`, and
any shared submodule added later) — the same rule `./config/pull` uses to decide
what it floats. Submodules the consumer owns (a Hugo theme, a vendored library,
doc-example submodules, …) declare no tracked branch and are left untouched, so the
automatic `SessionStart` run never tries to clone — or fail on credentials for — a
submodule this project does not manage. It depends on no pre-existing `config`
submodule, so it works before `./config/pull` (which lives inside the `config`
submodule) can. Claude Code runs it automatically via a `SessionStart` hook; other
agents and humans run it by hand, then `./config/pull` to float the shared submodules
to their branch tips.
*config-managed* submodules at the tip of their branch (`master` for `config`, the
tracked `branch` for the rest): `config` itself, plus every submodule that declares
a tracked `branch` in `.gitmodules` (`.agents/shared`, and any shared submodule
added later) — the same rule `./config/pull` uses to decide what it floats. It
deliberately does not stop at the commit the superproject pins for such a
submodule: nothing keeps that pin current — `ignore = all` hides the submodule from
`git status`, and `./config/pull` floats the on-disk copy without committing the
moved gitlink — so materializing the pin as-is means months-old hook scripts,
skills, and guidelines. If the float fails — a branch the remote does not have,
say — a warning is printed and the submodule is left wherever the steps that
did succeed put it, at worst the pin, so a session still starts with a usable
tree; it is not retried on a later run, which is why that warning points at
`./config/pull`. With no network at all the clone itself fails and the
submodule is left uninitialized, as it was before. Submodules the consumer owns
(a Hugo theme, a vendored library, doc-example submodules, …) declare no tracked
branch and are left untouched, so the automatic `SessionStart` run never tries
to clone — or fail on credentials for — a submodule this project does not
manage. A submodule that is already checked out is left exactly as it is, which
keeps repeated runs cheap and offline-safe and never rewinds a tree someone
parked on a particular commit; run `./config/pull` to float those. It depends on
no pre-existing `config` submodule, so it works before `./config/pull` (which
lives inside the `config` submodule) can. Claude Code runs it automatically via
a `SessionStart` hook; other agents and humans run it by hand.

## Commit and history safety

Expand Down
2 changes: 1 addition & 1 deletion config
Submodule config updated 156 files
2 changes: 1 addition & 1 deletion docs/_preview/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/SpineEventEngine/documentation/docs/_preview
go 1.27.3

require (
github.com/SpineEventEngine/site-commons v0.0.0-20261030153256-b79100d8a139 // indirect
github.com/SpineEventEngine/site-commons v0.0.0-20261030172811-9216e48eb656 // indirect
github.com/SpineEventEngine/validation/docs v0.0.0-20260902132507-6465029c83b9 // indirect
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20800 // indirect
github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2 v2.21100.20000 // indirect
Expand Down
6 changes: 2 additions & 4 deletions docs/_preview/go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
github.com/SpineEventEngine/site-commons v0.0.0-20261001182820-d2b63aedd0f4 h1:PoGISjoFRXwKpWwG/oTaGuSG6qF3I3THV2p+/r7qgk0=
github.com/SpineEventEngine/site-commons v0.0.0-20261001182820-d2b63aedd0f4/go.mod h1:tkAl4StIREKmz9r5PiJtuDhvwMMkFXKWcaTyxhIikho=
github.com/SpineEventEngine/site-commons v0.0.0-20261030153256-b79100d8a139 h1:DOYFVaEw9v3dML+40FysPUaTczyqK5+LqWJZQkK4Hs0=
github.com/SpineEventEngine/site-commons v0.0.0-20261030153256-b79100d8a139/go.mod h1:TfFFABXgPop1uc4eBdfWZF0Es06TGmNHfReiOzkZqrk=
github.com/SpineEventEngine/site-commons v0.0.0-20261030172811-9216e48eb656 h1:9H15KSiUrQP3U/uhDfVgSXMwqS7ehUppeqtQzRxR6LE=
github.com/SpineEventEngine/site-commons v0.0.0-20261030172811-9216e48eb656/go.mod h1:TfFFABXgPop1uc4eBdfWZF0Es06TGmNHfReiOzkZqrk=
github.com/SpineEventEngine/validation/docs v0.0.0-20260205202311-181ba8844107 h1:2DHRIwwLudP6l3Kh7Nd4KR4uXcsDtIAXE9adW68ivME=
github.com/SpineEventEngine/validation/docs v0.0.0-20260205202311-181ba8844107/go.mod h1:STHyjXejVvPmfrxujfDvhofmjg55mMk+fwI3TVL0b4Y=
github.com/SpineEventEngine/validation/docs v0.0.0-20260522175555-cf09b4c706ea h1:YEMSlr5KJXkZdK7epMSnN+6HSr2K41n8O3c8OhtF8pM=
Expand Down
2 changes: 1 addition & 1 deletion docs/content/docs/guides/validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ represented by required fields of an entity state, a Command, an Event, etc.
{{% note-block class="note" %}}
Protobuf 2 used to have native support for required fields.
However, from the serialization perspective, that proved to be
a [design mistake](https://stackoverflow.com/a/31814967/3183076). If a required field was missing,
a [design mistake](https://stackoverflow.com/questions/31801257/why-were-required-and-optional-removed-in-protocol-buffers-3/31814967#31814967). If a required field was missing,
the message could not be serialized and sent over the wire. Also, it is often too easy to add a new
required field, thereby breaking backwards-compatibility of the message type. In Protobuf 3 all
the fields are optional.
Expand Down
Loading
Loading