Repository navigation
Feature/provider dev - #1
Merged
Merged
Conversation
Repository layout per CLAUDE.md: bin/ wrappers (k8s feature/provider-dev pattern), provider-dev pipeline directories, package.json on @stackql/provider-utils 0.7.6 (latest), .npmrc for the JSR-scoped dependency, README with the tier model and auth follow-ups, and the any-sdk oci_signing_v1 issue contract copied to provider-dev/config. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The auth type has not landed upstream in any-sdk (no branch, tag, or commit; released binaries lack the type string) and no OCI credentials exist on this machine. NOTES.md records the evidence, the unblock list, and the live-tenancy verification runbook to execute unchanged once a build with oci_signing_v1 and Always Free credentials are available. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
harvest_catalog.mjs builds spec_catalog.csv from the API reference index
(specs/index.json - content-addressed spec URLs whose basename is the
SHA-256 pin): 20 tier-1 specs mapped to StackQL services, 137 tier-2
entries deferred with reasons. Host templates are derived from the
commercial-realm endpoint lists ({region} label), and the version-date
segment is recorded with its location (basePath for most, path for kms,
none for object storage).
fetch-specs.sh downloads tier-1 snapshots and verifies each against its
pin. clean_specs.mjs applies deterministic fixes (x-obmcs-* top-level
extension strips), converts Swagger 2.0 -> OAS 3.0, validates with
swagger-parser, and writes cleaned specs plus spec_clean_report.json.
All 20 specs validate: 1583 operations total, zero converter patches.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
opc-next-page is expressible in pagination config (responseToken location: header) but any-sdk hardwires the Link rel=next regex for every header key, so bare-token headers silently end traversal after page 1. NOTES.md records the evidence with file/line citations, the drafted any-sdk ticket (raw header value when not Link-framed, plus the []string vs http.Header inconsistency), and the interim first-page posture. Response headers are not projectable into result rows, so opc-work-request-id follows the body-projection posture; recorded in the same mechanism family. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
build_inventory.mjs classifies all 1583 tier-1 operations via the shared lib/classify.mjs rules (operationId-led with path context) and the tag-driven core split (lib/core_split.mjs: virtualNetwork -> network, compute/computeManagement -> compute, blockstorage -> block_storage). endpoint_inventory.csv records routing facts (host template, version date), scope facts (compartmentId 248, page param 317, work-request header 404), response shapes (277 bare arrays; ListObjects-style envelopes recorded as object), and the proposed mapping per operation: 636 select / 362 exec / 190 update / 182 insert / 174 delete / 39 reason-coded skips (per-vault KMS endpoints, data planes, HEAD ops) over 452 resources. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
23 services decided from the endpoint inventory. Deviation from the
candidate list, with reason: kms/vault/secrets stay three services
because the three vendor specs route to three host templates
(kms.{region} / vaults.{region} / secrets.vaults.{region}) and a
service carries one server template. Core iaas divides by operation
tag per lib/core_split.mjs. CLAUDE.md candidate list updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
split.mjs consumes the cleaned OAS3 specs catalog-driven (core iaas divides by tag; --only for pilot scope); npm scripts invoke the node wrappers directly per the toolchain rules. map_operations.mjs fills the stackql_* columns in all_services.csv via the shared classifier, with object keys mirroring provider-utils normalize wrapper-key derivation for bare arrays and array-property resolution for envelopes (ListObjects -> $.objects, ListObjectVersions -> $.items). Validation: completeness against the split specs, unique method names per resource, unique required-param signatures per overloaded verb - all green: 471 mapped operations over 138 resources (identity 46, network 71, object_storage 21), 3 reason-coded skips. One genuine collision found and resolved deterministically: GetCompartment shares its required-param signature (compartmentId) with ListCompartments, so it demotes to exec. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
NOTES.md sections 4-10: {region} routing (dot-free label, jira
precedent transfers; shared iaas host disambiguated by version-date
base paths), version-date placement (basePath / path / none, recorded
per spec), PUT update-details partial semantics (incl the object
storage POST-update deviation), bare-array wrapping mirrored between
map_operations and normalize with envelope exceptions recorded, the
GetCompartment select-overload demotion, the Always Free smoke design,
the tier-2 mechanical-addition process, and the open-items list.
README steps 0-2 now document the working pipeline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tion
- split all 22 tier-1 services (core iaas divides by tag), normalize
- map 1,544 operations over 452 resources (37 skipped with reason codes)
- generate provider with auth type only (oci_signing_v1 per any-sdk
v0.5.4-alpha01 - credentials come from the runtime auth context)
- method-level requestBodyTranslate: naive on POST/PUT/PATCH bodies
- post_process.mjs: catalog-driven per-service regional servers with
{region} defaulting to us-ashburn-1 and resolving from OCI_CLI_REGION
via x-stackQL-envVar; service-level opc-next-page header pagination
with a method override for object storage ListObjects
(start/nextStartWith)
- bump @stackql/provider-utils to 0.7.7
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- method-level queryParamPushdown.top on every operation declaring a `limit` query parameter (313 methods), maxValue from the declared schema maximum (1000 when silent) - SQL LIMIT pushes to the wire - queryParamPushdown.select on operations with an enumerated `fields` query parameter (object storage x3) - SQL projection pushes to `fields`, allowlist from the spec enum, inert unless fully covered - filter/orderBy pushdown not emitted: the any-sdk rendering engine is OData-syntax-only and OCI does not speak OData; WHERE pushdown stays ordinary query-parameter mapping (recorded in NOTES) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- provider.yaml config.snake_case_aliases: true - SELECT/DESCRIBE column names present as snake_case aliases of the camelCase wire properties - request.nativeCasing: camel on every method - snake_case WHERE and INSERT keys resolve against the camelCase wire parameters and body attributes (any-sdk reverse-casing lookup); wire casing untouched - SHOW METHODS RequiredParams remain wire-cased (engine presentation, same as the aws provider); both casings resolve in queries Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- tests/integration/mock_oci_server.mjs: zero-dependency mock enforcing the oci_signing_v1 contract (three-header GET/DELETE, six-header POST/PUT with x-content-sha256 digest verification), serving real wire shapes: bare arrays, compartmentId scoping, two-page opc-next-page traversal, ListObjects nextStartWith envelope - tests/integration/run_integration_tests.mjs: materialises a registry copy with servers rewritten to the mock (fixed-domain templates are not redirectable at query time - jira finding), throwaway RSA key, STACKQL_OCI_TESTING_* namespaced env; 12-case matrix - results with the local any-sdk v0.5.4-alpha01 build: 24 pass, 0 fail, 2 documented warns (bare-header-token pagination stops after page 1 - NOTES #2 engine gap; fields projection pushdown blocked by the WHERE-column union - new NOTES item) - select pushdown supportedColumns now carry snake aliases alongside wire names; exec vars resolve by wire name only (documented) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- docgen: headerContent1/2 (OCI_CLI_* auth variants, compartment scope pattern, estate + IAM audit + provisioning + four-hyperscaler union examples); generate-docs wrapper; website/docs generated (22 services, 474 resource pages) and MDX-sanitized - website: Docusaurus 3.10.2 microsite on the vendored shared-config pattern (openai template): thin config wrappers, registry-branded logos, CNAME oci-provider.stackql.io, GH Pages deploy workflows; yarn.lock to follow after first install completes - tests/smoke_test.py: live smoke suite (stdlib only) - reads across identity/network/compute/object storage, Always Free write lifecycle (VCN, subnet, bucket, VM.Standard.E2.1.Micro with capacity degradation), stackql-smoke tagging with pre-run sweep, --live flag targets the published provider for post-publish verification - Makefile: full pipeline (specs -> build -> tests -> docs), make all; STACKQL_BIN variable for the local engine build - examples/stackql-deploy/oci-networking: manifest + VCN/subnet/bucket iql resources with exports chaining and env-keyed CIDRs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…and casing notes - NOTES: oci_signing_v1 verified against the signed mock (v0.5.4-alpha01); pagination re-verified (bare header tokens still gated, body tokens work); new sections 11-13 (pushdown facts, snake_case surface, naive body translate + exec body quirk); open items refreshed with the release gate - CLAUDE/README: env var convention moved to the OCI CLI names (OCI_CLI_TENANCY etc), auth type only in the provider doc, region via OCI_CLI_REGION x-stackQL-envVar, Makefile-first test layers, smoke deviation note (stdlib over pystackql, with reason) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Terraform never read OCI_CLI_* (it reads TF_VAR_*/OCI_*) and CLI-configured users are served by the ~/.oci/config variant, so the CLI-name coupling bought nothing. OCI_FINGERPRINT and OCI_REGION coincide with Terraform's accepted bare names. Docs now state the config-file zero---auth path (type-only doc auth block becomes the default auth context); doc-level raw env-var defaults recorded as an engine follow-up (NOTES open item 3). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… exec demotion Live run: GETs authenticated, every signed POST 401'd. any-sdk builds path?query even when the query is empty; OCI normalises the request line before verifying, so the signature over 'post /path?' never matches. Fixed on any-sdk branch fix/empty-query-request-target; mock now rejects dangling ? and enforces concrete content-length, content-type on body verbs. GetNamespace (bare-string response) demoted to exec - scalar responses cannot project as SELECT rows; smoke discovers the namespace via the exec method. Instance lifecycle extended to the full state walk (stop/start/rename with SELECT verification at each state). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces the exec demotion: namespaces stays a SELECT. post_process
injects transform (golang_template_text_v0.1.0 regex lift of the bare
JSON string into a {namespace} row), schema_override (documented by
provider-utils 0.7.7 docgen - the docs now show a real namespace
column), and overrideMediaType (required to activate the engine's
transform path). Integration scenario 13 exercises it against the
mock; verified live (namespace resolves through the template).
Smoke exec power actions now pass the required actionType body attr;
Makefile smoke targets stream with python3 -u.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
InstanceAction's optional InstancePowerActionDetails body only admits reset-family actionType discriminators; plain STOP/START must send no body, but the engine's exec surface forces every required body attr whenever a requestBody or request block is declared. post_process OPTIONAL_BODY_DROPS strips the body, requestBodyTranslate config and request block from compute.instances.instance_action; integration scenario 10 asserts the empty body on the wire (26 checks green). provider.yaml now ships doc-level env var defaults (tenancy_ocid_envvar etc., any-sdk fix/empty-query-request-target branch) - zero --auth for a populated OCI_* environment once stackql wires the doc-level getters onto the runtime AuthCtx; inert and harmless before that. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…RLs resolve The shared docusaurus-config sets trailingSlash: false, which makes Docusaurus emit <route>.html; GitHub Pages then returns 404 for the same URL with a trailing slash. Dropping the setting restores <route>/index.html, which is served for both forms. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.