Merging main to fork - #10
Open
pablosanchez84 wants to merge 906 commits into
Open
Conversation
…omponents--apigee-devrel chore(main): release 1.16.0
Feat/retire kvm admin
…omponents--apigee-devrel chore(main): release 1.17.0
…proxy-generator Remove OAS => Configurable proxy generator
…ayaljindal/devrel into update/target-server-validator
Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.53 to 0.10.63. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](medikoo/es5-ext@v0.10.53...v0.10.63) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.53 to 0.10.63. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](medikoo/es5-ext@v0.10.53...v0.10.63) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.53 to 0.10.63. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](medikoo/es5-ext@v0.10.53...v0.10.63) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.53 to 0.10.63. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](medikoo/es5-ext@v0.10.53...v0.10.63) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
…-apigee-mock/es5-ext-0.10.63 chore(deps): bump es5-ext from 0.10.53 to 0.10.63 in /tools/oas-apigee-mock
…s/auth-schemes/es5-ext-0.10.63 chore(deps): bump es5-ext from 0.10.53 to 0.10.63 in /references/auth-schemes
…s/data-api/es5-ext-0.10.63 chore(deps): bump es5-ext from 0.10.53 to 0.10.63 in /references/data-api
…s/dutch-healthcare/healthcare-v1/es5-ext-0.10.63 chore(deps): bump es5-ext from 0.10.53 to 0.10.63 in /references/dutch-healthcare/healthcare-v1
…ayaljindal/devrel into update/target-server-validator
chore(lint): removing tests from bandit lint scope
Bumps [requests](https://github.com/psf/requests) from 2.32.4 to 2.33.0. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](psf/requests@v2.32.4...v2.33.0) --- updated-dependencies: - dependency-name: requests dependency-version: 2.33.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
Introducing the Apigee Config Diff Tool
…nt-unifier/requests-2.33.0 chore(deps): bump requests from 2.32.4 to 2.33.0 in /tools/proxy-endpoint-unifier
…alidator/pyasn1-0.6.3
Bumps [requests](https://github.com/psf/requests) from 2.32.0 to 2.33.0. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](psf/requests@v2.32.0...v2.33.0) --- updated-dependencies: - dependency-name: requests dependency-version: 2.33.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
…-modifier-validator/pyasn1-0.6.3 chore(deps): bump pyasn1 from 0.6.2 to 0.6.3 in /tools/apigee-proxy-modifier-validator
…r-validator/requests-2.33.0 chore(deps): bump requests from 2.32.0 to 2.33.0 in /tools/target-server-validator
Bumps [lxml](https://github.com/lxml/lxml) from 5.4.0 to 6.1.0. - [Release notes](https://github.com/lxml/lxml/releases) - [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt) - [Commits](lxml/lxml@lxml-5.4.0...lxml-6.1.0) --- updated-dependencies: - dependency-name: lxml dependency-version: 6.1.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
…-modifier-validator/lxml-6.1.0 chore(deps): bump lxml from 5.4.0 to 6.1.0 in /tools/apigee-proxy-modifier-validator
…t skill catalog Adds a new reference implementation under references/apigee-skills-serving demonstrating how to use Apigee API hub as a versioned, signed catalog of agent skills (SKILL.md bundles) discoverable and installable by LLM agent runtimes such as OpenCode, Claude Code, and Gemini CLI. What's included: * Publisher toolchain (scripts/): pack/sign/upload/register/update-taxonomy Python scripts that turn a directory of SKILL.md + manifest.yaml into a signed .skill archive uploaded to GCS and registered with API hub. * Locked v1 manifest schema (schema/skill-manifest.schema.yaml) with Ed25519 detached-signature support over canonical YAML serialisation. * Three example skills (skills/): currency-converter, weather-lookup, apigee-policy-top10 (a non-trivial skill that documents the ten most recommended Apigee policy patterns and enumerates which are deployed in your org). * One showcase example (examples/apigee-proxy-skill): a production-shaped skill that scaffolds, validates, packages, and deploys Apigee X / hybrid proxies via an MCP server. * End-to-end documentation (docs/): architecture, publish-and-install walkthrough, policy-skill-catalog deep-dive. * Hermetic test suite (tests/): 220 unit + in-process integration tests, all HTTP and ADC mocked, no live GCP needed, runs in ~1.3s. * pipeline.sh: devrel CI entry-point that installs deps into a venv and runs the test suite. Also updates: * CODEOWNERS: adds @gsjurseth as owner of the new reference. * README.md: adds the new reference to the References section. The implementation is independent of any specific agent runtime; the SKILL.md format and skill install path (~/.config/opencode/skills/) match the OpenCode convention, which is the closest thing to an emerging de-facto standard in the OSS agent runtime space.
Two CI fixes from PR #889 first run: 1. PYTHON_ISORT (Lint Codebase job): 12 Python files had import groupings that violate isort defaults (multi-line imports that fit on one line; trailing blank line after imports). Auto-fixed with `isort scripts/ tests/`. 2. License Headers job: 16 files in tests/ were missing the Apache 2.0 header. (My earlier bulk-header script targeted scripts/ and skills/ only; tests/ was overlooked.) All 16 now have the standard header. Verified locally: - isort --check-only scripts/ tests/ (clean) - pytest -q tests/ (220/220 pass)
Fixes remaining CI lint failures on PR #889 across four linters: flake8 (W391, F401, E265, E741): - Removed trailing blank line from 2 __init__.py files - Removed 7 unused imports across 5 test files - Renamed ambiguous variable `l` to `line` in a comprehension - Moved shebang to line 1 in top10.py (was below license header) bandit (B311, B405, B314): - Annotated random.randint() for retry jitter with `# nosec B311` (random is not used in a cryptographic context) - Annotated xml.etree.ElementTree import and ET.fromstring() with `# nosec B405` / `# nosec B314` (XML is fetched from authenticated Apigee API, not untrusted user input) yamllint (indentation): - Re-indented block sequences in 4 manifest.yaml files from 0-indent to 2-indent per yamllint default (`keywords:\n - item` instead of `keywords:\n- item`) Verified locally with CI-matching versions: - isort 5.9.3 --check-only: clean - flake8 7.3.0: clean - bandit 1.7.0: no issues - yamllint: clean - pytest -q tests/: 220/220 pass
…=100 Megalinter v4 invokes isort with an effective line-length of 100 (matching flake8's --max-line-length=100). Four files had imports wrapped across two lines that actually fit on a single 100-char line. CI's isort wants the unwrapped form; my local v8 isort defaulted to 79 and wrapped them. Verified with isort 5.9.3 (CI's version) at --line-length=100: clean. Tests: 220/220 still pass.
…up.sh
MegaLinter's shellcheck step blocks PR#889 with three SC2015 hits in
bin/demo-cleanup.sh (lines 90, 101, 111):
cmd && ((removed++)) || ((kept++))
This is the classic "A && B || C is not if-then-else" trap, and in
this script it is also a real double-counting bug, not just a style
nit:
- ((removed++)) is post-increment: bash arithmetic evaluates the
*current* value of `removed` first, then increments. So when
`removed` is still 0, ((removed++)) returns exit status 1
(because ((0)) is falsy), even though the rm succeeded.
- The `||` branch then fires and ((kept++)) also runs, so a
single successful removal increments BOTH counters and the
cleanup summary lies about what was removed vs. what was
already absent.
Replaced all three sites with explicit `if/then/else` blocks. Added a
short comment at the first occurrence so a future reader does not
"simplify" the if/else back to the broken short form.
Verified locally:
- shellcheck v0.11.0 on all five shell scripts in the PR: PASS
- bash -n on demo-cleanup.sh: PASS
- Full megalinter v4 run via podman against the entire devrel tree
(same env vars as .github/workflows/devrel-static-checks.yml):
"Successfully linted all files, but with ignored errors" -- zero
blocking failures, all remaining issues are pre-existing
non-blocking categories already present on main.
No other production-source files touched.
…ir patch
The Cloud Build pipeline (apigee-devrel-pr) runs pytest as root,
which exposed a latent bug in
test_env_enabled_readonly_dir_returns_UNDETECTABLE.
The test was trying to provoke an OSError by chmod'ing tmp_path
to 0o555 (read+exec, no write):
tmp_path.chmod(0o555)
state = detect_watcher(skills_dir=tmp_path, ...)
assert state == WatcherState.WATCHER_UNDETECTABLE
That works for an unprivileged user. It does not work for root,
which has CAP_DAC_OVERRIDE and silently ignores POSIX write bits.
On CI, mkdir then succeeded, detect_watcher returned ENABLED, and
the test failed with:
AssertionError: assert <WatcherState.WATCHER_ENABLED> ==
<WatcherState.WATCHER_UNDETECTABLE>
The contract under test is "if mkdir raises OSError, the probe
returns UNDETECTABLE so the caller can fall back to /reload-skills."
That contract does not depend on whether the filesystem actually
enforces 0o555 -- it depends on what happens when mkdir raises.
Replaced the chmod with a scoped monkeypatch on Path.mkdir that
raises PermissionError(13) for the .probe-<uuid> directory while
letting the outer skills_dir.mkdir(exist_ok=True) succeed (same
shape detect_watcher relies on). This tests the contract directly,
without depending on the runtime user.
Verified:
- Local pytest as user gsjurseth: 9/9 GREEN.
- podman run as uid=0(root) inside python:3.13-slim
(exact CI condition): 9/9 GREEN; full suite 220/220 GREEN.
…leanup.sh
bin/demo-cleanup.sh has called _remove_file since the file was first
committed (lines that clean up .staging.lock and .recent-install)
but the function itself was never defined. Operators hit four
"command not found" lines whenever they ran the script, and the
removed/kept counters reported wrong totals because every call
fell through to the missing-function path (exit status 127).
This was not caught by CI because:
- shellcheck does not flag undefined-function calls
- the pipeline pytest suite does not exercise the shell scripts
- the file/symlink targets often do not exist on the CI
container, so the cleanup loop never actually invokes the
failing branch in a way that surfaces
Added _remove_file as a sibling to _remove_dir:
- same (path, dry_run, verbose) interface
- same [[ -e || -L ]] guard so dangling symlinks are still
detected and cleaned
- uses `rm -f` rather than `rm -rf` because the cleanup
targets are normal files, not directory trees -- preserving
the original intent of the now-missing function
- separate "(file)" vs "(dir)" verbose-mode messages so the
operator can tell the two helpers apart
Verified locally with a dry-run (--dry-run --verbose): all six
cleanup targets are reported correctly, the counters add up
(2 would-remove + 4 already-absent = 6 total iterations), and
no "command not found" lines remain.
shellcheck on the modified file continues to PASS.
feat(apigee-skills-serving): add reference for Apigee API hub as agent skill catalog Inclusive Language check/action failed to run.
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.
Description
What's changed, or what was fixed?
Fixes: #issue
Housekeeping
(please check all that apply [X], do not edit the text)
CC: @apigee-devrel-reviewers