mirror of
https://github.com/we-promise/sure.git
synced 2026-09-08 16:14:23 +00:00
* Document instruction inventory and preservation decisions Trace main history from September 2025 through September 2026, including earlier policy origins. Record preserved requirements, detailed-guide destinations, stale facts, harness boundaries and explicit policy-strength decisions before consolidating instruction sources. * Consolidate repository instructions into shared guidance Keep AGENTS concise and vendor neutral, move detailed conventions into shared guides, and use thin adapters with preserved Cursor scopes. Preserve the strict pre-PR checks globally and document the stronger scope, retired migration pin and rule-generation trigger. Update existing API guidance verification without changing application behavior. * Narrow the always-on Cursor UI adapter and correct the SimpleFIN comment Split the design-system guidance out of docs/llm-guides/ui.md into docs/llm-guides/design-system.md. The ui-ux-design-guidelines rule is alwaysApply: true, so importing all of ui.md loaded the Stimulus, localization and ViewComponent guidance (previously confined to scoped rules) on every Cursor session; the always-on adapter now imports only the design-system guide, matching the scope it had before the consolidation. view_conventions and stimulus_conventions keep the full UI guide. Also correct the stale Provider::Simplefin header comment: pending inclusion defaults on and is resolved by the importer (explicit argument, then SIMPLEFIN_INCLUDE_PENDING, then Setting.syncs_include_pending); the previous comment described the flag as default-off. * Read guidance files as UTF-8 in the API consistency validators The frontmatter regex match ran against content read with the locale default external encoding; the Cursor rule's description contains an em dash, so under US-ASCII (LC_ALL=C) Regexp#match raised ArgumentError, breaking the standalone no-Rails fallback the docs point contributors to. Read all checked files with an explicit UTF-8 encoding in both the standalone script and the Rails test.
75 lines
2.9 KiB
Ruby
75 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Verifies the shared API checklist and its canonical/scoped entry points (issue #944).
|
|
# If Rails fails to load (e.g. Sidekiq::Throttled), run the standalone script instead:
|
|
# ruby test/support/verify_api_endpoint_consistency.rb
|
|
|
|
require "test_helper"
|
|
require "yaml"
|
|
|
|
class ApiEndpointConsistencyRuleTest < ActiveSupport::TestCase
|
|
RULE_PATH = ".cursor/rules/api-endpoint-consistency.mdc"
|
|
GUIDE_PATH = "docs/llm-guides/api-endpoint-consistency.md"
|
|
AGENTS_PATH = "AGENTS.md"
|
|
|
|
def root
|
|
@root ||= Rails.root
|
|
end
|
|
|
|
test "rule file exists" do
|
|
assert File.exist?(root.join(RULE_PATH)), "Expected #{RULE_PATH} to exist"
|
|
end
|
|
|
|
test "rule preserves exact API v1 applicability and imports shared guide" do
|
|
content = File.read(root.join(RULE_PATH), encoding: "UTF-8")
|
|
frontmatter = content.match(/\A---\r?\n(?<yaml>.*?)\r?\n---\r?\n(?<body>.*)\z/m)
|
|
assert frontmatter, "Expected frontmatter at the start of the rule"
|
|
keys = YAML.parse(frontmatter[:yaml]).root.children.each_slice(2).map { |key, _value| key.value }
|
|
assert_equal %w[alwaysApply description globs], keys.sort
|
|
metadata = YAML.safe_load(frontmatter[:yaml])
|
|
|
|
assert_equal false, metadata.fetch("alwaysApply")
|
|
assert_equal [
|
|
"app/controllers/api/v1/**/*.rb",
|
|
"spec/requests/api/v1/**/*.rb",
|
|
"test/controllers/api/v1/**/*.rb"
|
|
], metadata.fetch("globs").split(",").map(&:strip)
|
|
assert_equal "@#{GUIDE_PATH}", frontmatter[:body].strip
|
|
end
|
|
|
|
test "shared guide includes Minitest behavioral coverage section" do
|
|
content = File.read(root.join(GUIDE_PATH), encoding: "UTF-8")
|
|
assert_includes content, "Minitest behavioral coverage"
|
|
assert_includes content, "test/controllers/api/v1/{resource}_controller_test.rb"
|
|
assert_includes content, "api_headers"
|
|
assert_includes content, "X-Api-Key"
|
|
end
|
|
|
|
test "shared guide includes rswag docs-only section" do
|
|
content = File.read(root.join(GUIDE_PATH), encoding: "UTF-8")
|
|
assert_includes content, "rswag is docs-only"
|
|
assert_includes content, "expect"
|
|
assert_includes content, "assert_"
|
|
assert_includes content, "run_test!"
|
|
assert_includes content, "rswag:specs:swaggerize"
|
|
end
|
|
|
|
test "shared guide includes same API key auth section" do
|
|
content = File.read(root.join(GUIDE_PATH), encoding: "UTF-8")
|
|
assert_includes content, "Same API key auth"
|
|
assert_includes content, "ApiKey.generate_secure_key"
|
|
assert_includes content, "plain_key"
|
|
assert_includes content, "Doorkeeper"
|
|
end
|
|
|
|
test "AGENTS.md references post-commit API consistency" do
|
|
assert File.exist?(root.join(AGENTS_PATH)), "Expected #{AGENTS_PATH} to exist"
|
|
content = File.read(root.join(AGENTS_PATH), encoding: "UTF-8")
|
|
assert_includes content, "Post-commit API consistency"
|
|
assert_includes content, GUIDE_PATH
|
|
assert_includes content, "Minitest"
|
|
assert_includes content, "rswag"
|
|
assert_includes content, "X-Api-Key"
|
|
end
|
|
end
|