simplenote-mcp-server / workflows
AGENTS.md21 starsChanged 24 days agoMITView on GitHub
CI/CD pipeline definitions. unified-ci.yml is the main pipeline (validate → test → security → status jobs); release.yml is manual-dispatch-only (see root AGENTS.md); others handle Dependabot automation, security scanning, docs, and evaluations.
- Reads credentials
In this repository16 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .claude/skills/AGENTS.mdAGENTS.md
- helm/AGENTS.mdAGENTS.md
- scripts/AGENTS.mdAGENTS.md
- tests/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- dependabotSkill
- docs-sync-auditSkill
- github-actions-hardeningSkill
- mcp-implementation-security-reviewSkill
- mcp-release-qaSkill
- mcp-security-auditSkill
- pytest-coverageSkill
- security-reviewSkill
- test-gap-auditSkill
The file
Files
.github/workflows/
Purpose
CI/CD pipeline definitions. unified-ci.yml is the main pipeline (validate → test → security → status jobs); release.yml is manual-dispatch-only (see root AGENTS.md); others handle Dependabot automation, security scanning, docs, and evaluations.
Ownership
unified-ci.yml— thin caller:validate(→reusable-python-lint.yml),test(→reusable-python-test.yml, bothtests/andsimplenote_mcp/tests/preserved as separate pytest processes),security(→reusable-security-scan.yml, shared withmonitoring-consolidated.yml),build_and_publish(→reusable-docker-build.yml; pushesmain/latest/date-SHA image tags, never version tags, since this workflow doesn't run on tags),local-test(→reusable-local-test.yml),status(aggregation, stays inline — needsneeds.*.resultfrom sibling jobs in the same file). Blocks on version consistency andpre-commit run --all-filesbefore test/build/security run. A failedvalidateleavestest / Testandsecurity / Securityuncreated (verified on #980's run), so it blocks merges although it isn't itself a required check.test/securityjob IDs are load-bearing: their displayed check names (test / Test,security / Security) are live required branch-protection status checks (validate / Validateis not required, despite existing) — do not rename these job IDs, or the internalname:field of the reusable workflows they call, without first reading the actual resulting check name off a live PR and updating branch protection in the same window (see the 2026-08-13 Phase 9 refactor for the verification protocol).security.yml,dependency-review.yml— Bandit/pip-audit/CodeQL-style scanning.auto-fix.yml— thin caller:resolve-targetjob (inline branch/fix-type allowlist validation, no checkout needed) →reusable-auto-fix-apply.yml(checkout target branch, ruff fix/commit/push — kept inline rather than script-extracted, since the target branch may predate this refactor and lackscripts/) →reusable-auto-fix-notify.yml(PR comment via.github/scripts/find-associated-pr.js/comment-auto-fix.js, summary).auto-merge.yml— thin caller:auto-merge(→reusable-auto-merge-pr.yml) +dependabot-auto-merge(→reusable-dependabot-auto-merge.yml, gated ongithub.actor/github.event_nameat the caller job level, not inside the reusable workflow, sincegithub.event_nameinside a calledworkflow_calljob is not reliably the original triggering event). Neither reusable workflow adds a checkout step — both are triggered by fork-reachable PR events with write-level permissions, so checking out PR content andrequire()-ing a script from it would be a "pwn request" vector; theirgithub-scriptbodies stay inline instead. Theclaude-dependabot-merge.ymlandclaude-status-check.ymlcallers were removed on 2026-10-21: the org orchestrator indocdyhr/.githubchecks this repo itself and never dispatched them.evaluation-quality-gate.yml— thin caller:reusable-eval-quality-run.yml(the npm eval suite on Node 24 frompackage-lock.jsonvianpm ci, gated onOPENAI_API_KEYpresence, because everyevals/*.yamlusesprovider: openai; Dependabot/fork PRs get a placeholder that parses asskipped) →reusable-eval-quality-report.yml(PR comment + check-run via.github/scripts/post-quality-gate-comment.js/create-quality-gate-check.js).scripts/ci/parse_eval_results.pyreads mcp-evals 2.x output: per eval, the grader's five 1–5 ratings, which pass at a mean ≥ 3.5; mcp-evals' all-zero placeholder (Error running evaluation:, when the grader's reply isn't plain JSON) is reported as ungraded and left out of the pass rate (graded evals only; none graded is an error). A crash, a non-zero mcp-evals exit or zero evals exits 1, so the run job fails visibly; it never reports 0 tests as "below threshold". mcp-evals needs Node ≥ 20.19 (require(esm)); under Node 18 every run crashed withERR_REQUIRE_ESM.mcp-evaluations.yml("Eval File Check") — thin caller:reusable-mcp-eval-pr-check.ymlonly (scripts/ci/validate_eval_yaml.pyon changedevals/*.yaml, PR comment via.github/scripts/comment-eval-files-changed.js). Its formermclenhard/mcp-evalsrun was removed in 2026-10: it passed the.pyserver to mcp-evals, which only loads JS/TS (ERR_UNKNOWN_FILE_EXTENSION), so it never produced a result.release.yml— manualworkflow_dispatchversion bump/release (patch/minor/major); thin caller:reusable-release-prepare.yml(version bump viascripts/release/bump_version.sh, changelog viascripts/release/generate_release_changelog.sh, commit/push, tag the release PR's merge commit (notorigin/main's HEAD) viascripts/release/tag_release_commit.sh, GitHub-Release — single job, see in-file overage note; the merge wait allows 5.5 h for someone to approve the bot PR's runs; the last step deletes the mergedrelease/vX.Y.Zbranch, whichgh pr merge --auto --delete-branchcan't do once auto-merge merges later) →reusable-release-build.yml(build/twine, then SBOM+vuln reports viascripts/generate_release_security_reports.py --pythonagainst a clean venv holding only the built wheel; no pre-commit here, since it runs after the tag and release exist andvalidatealready runs it on every PR) →reusable-release-attach-reports.yml;docker-publish(→docker-release.yml, which validates the tag and callsreusable-docker-build.ymlwithversion, pushing thevX.Y.ZandX.Y.Zimage tags to Docker Hub and GHCR; the Helm chart's defaultimage.tagdepends on these existing).docker-release.ymlalso takesworkflow_dispatchwith ataginput, to backfill an existing release's image.notifyjob stays inline in the caller.release-finish.yml—workflow_dispatch(tag, optionaldocker) recovery path for a releaserelease.ymldidn't finish (merge wait expired, build failed): tags the mergedrelease/vX.Y.ZPR's commit if the tag is missing, creates the GitHub Release from the tag's CHANGELOG section if missing, then rerunsreusable-release-build.yml+reusable-release-attach-reports.yml(anddocker-release.ymlif asked). Also regenerates reports for old tags: the build runs the report script from the workflow's own commit, not the tag. The attach step usesgh release upload --clobber, so a release's body and latest flag are never touched.update-version.yml— thin caller (reusable-version-sync.yml); triggers onv*.*.*tag push (also acceptsworkflow_dispatchwith a manualtaginput, for testing), syncs version references post-release viascripts/release/sync_version_references.sh.docs.yml— thin caller (docs build viareusable-docs-build.yml, Pages deploy viareusable-docs-deploy.yml, link check viareusable-docs-link-check.yml).monitoring-consolidated.yml— thin caller (reusable-security-scan.yml— parametrized for eventual reuse byunified-ci.yml'ssecurityjob —reusable-health-check.yml,reusable-badge-check.yml— adoptsscripts/validate-badges.py—reusable-monitoring-summary.yml).publish-pypi.yml— PyPI publish.reusable-*.yml— localworkflow_callreusable workflows, each owned by and used only by the caller(s) listed against it above. Not standalone triggers; see the owning caller foron:semantics. Introduced 2026-08-12 as part of a phased thin-caller refactor (org-standard ≤80-line-per-file check) — the docdyhr org's usual pattern delegates to the separatedocdyhr/.githubrepo (seesecurity.ymlbelow), but these use local composition instead by deliberate choice (no cross-repo versioning/tagging overhead for logic specific to this repo).
Local Contracts
yaml.safe_load()is not sufficient to validateuses:lines. A YAML-valid-but-schema-invaliduses:value (e.g. a bare SHA with the tag comment misplaced, instead ofowner/repo@<sha> # tag) parses cleanly but makes GitHub run zero jobs for every workflow referencing it. Only a schema-aware linter (actionlint) catches this class of bug — not currently run in CI. Runactionlinton any.github/workflows/*.ymledit before considering it done, especially SHA-pinning changes.github-scriptsteps must pass untrusted values viaenv:, never interpolate${{ needs.*.outputs.* }}/${{ github.event.inputs.* }}/${{ steps.*.outputs.* }}directly into thescript:body — an injected value could break out of the JS string literal (script-injection). Read viaprocess.env.*instead; see the existing pattern and comment inauto-fix.yml.dependabot.yml(one directory up, at.github/dependabot.yml) covers four ecosystems:pip,npm,docker,github-actions— keep all four current when adding a new dependency manager to the project.auto-merge.yml'sdependabot-auto-mergejob auto-approves and merges patch/minor Dependabot PRs, but skips any PR touching a security-sensitive package (cryptography,requests,urllib3,aiohttp— matched viacontains()againstdependency-names, so those PRs always fall through to manual review regardless of update type). Add to that list when a new security-sensitive dependency is introduced.mainbranch protection requires 3 status checks (configured 2026-08-11, contexts updated 2026-08-13 after the thin-caller refactor changed their displayed names):test / Test,security / Security,Dependency Review.Validatewas never in the required list, so its post-refactor name (validate / Validate) isn't either. Renamingunified-ci.yml'stest/securityjob IDs, or the internalname:field ofreusable-python-test.yml/reusable-security-scan.yml, changes these check names again — update branch protection (gh api repos/docdyhr/simplenote-mcp-server/branches/main/protection --method PUT, see git history around 2026-08-13 for the exact JSON body shape) in the same window as any such rename, or every subsequent PR becomes permanently unmergeable.
Verification
actionlinton any changed workflow file (manual — not yet wired into CI itself)- Push/PR and watch the
validatejob inunified-ci.ymlactually queues and runs
Child DOX Index
None.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

