This document helps AI agents contribute effectively to OliveTin.
If you are looking for OliveTin's AI policy, you can find it in AI.md.
service/ with business logic under service/internal/*
service/internal/apiservice/internal/executorservice/internal/httpserversservice/internal/config, service/internal/entitiesfrontend/ (served by the service)integration-tests/proto/, service/gen/...specs/ — Markdown specs that define how code should behave in human-readable form. When changing behavior in a spec-covered area, keep implementation and tests aligned with the spec; do not reference code or symbols in specs (English only).go run ./servicecd service && make unittestsservice/):
cd service && make codestylecd integration-tests && npx --yes mocha test/general.mjscd integration-tests && npx --yes mochaunittests; use cd service && make unittests.GetNewHandler(ex) and serve under /api/.document.body attribute loaded-dashboard="<name>" when loading a dashboard. Integration helpers that test dashboard functionality wait for this before selecting elements. Certain conditions enforcing login will mean that this attribute is not set until a user is logged in..action-button button./logs and /diagnostics.contentActions) no longer exist; prefer class-based selectors.showFooter from Init API; tests may assert the footer is absent when config disables it.req.Binding and req.Binding.Action).Init, GetDashboard, StartAction).executor.ExecutionRequest and calls Executor.ExecRequest.ExecutionStatus/GetLogs.config.yaml and ensure executor.RebuildActionMap() is called when needed.service/internal/api/dashboards.go and apiActions.go.frontend/resources/vue/router.jsfrontend/resources/vue/App.vuefrontend/resources/vue/ActionButton.vueCONTRIBUTING.adoc.AI.md..github/PULL_REQUEST_TEMPLATE.md.specs/, ensure implementation and tests match the spec.Use conventional-commit-style branch names with a type prefix, optional issue reference, and a short kebab-case description:
feat/[#123]-add-justification-promptfix/[#456]-websocket-reconnectDo not use feat-..., feature/..., or other variants. Omit the [#<issue>] segment only when there is no linked issue.
/api/ and the client targets that base URL.Binding/Action and add guards in step functions.loaded-dashboard and use selectors matching the Vue UI.