Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
78978b4
Merge pull request #741 from opsmill/stable
ogenstad Jan 9, 2026
a8d2eb5
Merge pull request #743 from opsmill/develop
ogenstad Jan 9, 2026
6c0bf35
IHS-183: Fix typing errors for protocols (#749)
solababs Jan 21, 2026
d619c6f
IHS-183: Fix typing errors for protocols (#749) (#752)
infrahub-github-bot-app[bot] Jan 21, 2026
715e28b
Merge pull request #754 from opsmill/stable
ogenstad Jan 21, 2026
d6404eb
Merge pull request #755 from opsmill/develop
ogenstad Jan 22, 2026
bb2f761
Revert "IHS-183: Fix typing errors for protocols (#749)" (#760)
solababs Jan 22, 2026
56b59aa
Revert "IHS-183: Fix typing errors for protocols (#749)" (#760) (#762)
infrahub-github-bot-app[bot] Jan 22, 2026
d6dc732
Merge pull request #761 from opsmill/stable
ogenstad Jan 27, 2026
7cf8924
Merge pull request #770 from opsmill/develop
ogenstad Jan 27, 2026
10e642b
Merge pull request #775 from opsmill/stable
ogenstad Jan 27, 2026
4843e01
Merge pull request #782 from opsmill/stable
ogenstad Jan 28, 2026
424e0ca
Merge pull request #787 from opsmill/develop
ogenstad Jan 29, 2026
4b786ff
Upgrade infrahub-testcontainers to 1.7 (#793)
gmazoyer Feb 3, 2026
2c07085
Merge pull request #796 from opsmill/develop
ogenstad Feb 4, 2026
ec009b3
Merge pull request #791 from opsmill/stable
ogenstad Feb 5, 2026
fdebb9d
Merge pull request #800 from opsmill/develop
ogenstad Feb 5, 2026
504a618
IHS-193 Add support for file upload/download for `CoreFileObject` (#792)
gmazoyer Feb 6, 2026
2e6c3f8
Fix infrahubctl proposed change table generation (#805)
gmazoyer Feb 6, 2026
829800d
IFC-2184: Add to branch status (#794)
solababs Feb 9, 2026
7acb4d8
migrate from pre-commit to prek (#789)
solababs Feb 9, 2026
95b9cf6
Merge branch 'stable' into 'develop' with resolved conflicts
ogenstad Feb 9, 2026
c340321
migrate from pre-commit to prek (#789) (#808)
infrahub-github-bot-app[bot] Feb 9, 2026
c29ede9
Merge pull request #809 from opsmill/pog-stable-to-develop-20260209
ogenstad Feb 9, 2026
ceb7e61
docs: fix docusaurus icon interpretation IHS-198
a-delannoy Jul 23, 2025
8175d22
docs: Docusaurus sidebar configuration -> new sdk reference section I…
a-delannoy Jul 23, 2025
4a8818e
feat: new invoke command generate-sdk-api-docs IHS-196
a-delannoy Jul 23, 2025
673fd75
chore: add mdxify package IHS-196
a-delannoy Jul 23, 2025
a6d8d05
feat: new ci check to ensure sdk api documentation is up to date IHS-197
a-delannoy Jul 23, 2025
f9d63f2
internal: fixing docstrings & misspelling IHS-196
a-delannoy Jul 23, 2025
a7e5c63
chore: add towncrier changelog fragment for #201
a-delannoy Jul 25, 2025
9c1a8bf
Merge branch 'develop' into 'infrahub-develop' with resolved conflicts
ogenstad Feb 10, 2026
9e42f1f
Use ternary operator if ALIAS_KEY in value and value[ALIAS_KEY] else …
ogenstad Feb 10, 2026
0abb16d
Add integration tests for file objects (#802)
gmazoyer Feb 10, 2026
84682b1
Merge pull request #813 from opsmill/pog-develop-to-infrahub-develop-…
ogenstad Feb 10, 2026
6983fa5
docs: generation of documentation after legacy work IHS-199
polmichel Feb 10, 2026
93eeff9
feat: Adapted mdxify commit to uv, as poetry was used before IHS-195
polmichel Feb 10, 2026
03fa402
refactor: made the Jinja2Template extends the ATemplate class, allowi…
polmichel Feb 10, 2026
62fcd75
Merge pull request #814 from opsmill/pog-SIM108
ogenstad Feb 11, 2026
813f3c0
Merge pull request #816 from opsmill/stable
ogenstad Feb 11, 2026
652bc25
Merge pull request #817 from opsmill/develop
ogenstad Feb 11, 2026
fcb0d5b
refactor: get a ACommand class, allowing next documentation generatio…
polmichel Feb 10, 2026
9ca9490
refactor: extract logic to documentation generation method class hier…
polmichel Feb 10, 2026
09707f5
refactor: it seems that two of the four methods that were used can be…
polmichel Feb 10, 2026
2cb708d
refactor: new objects representing Documentation pages IHS-201
polmichel Feb 10, 2026
bd716a6
refactor: plug the new code into documentation generation commands IH…
polmichel Feb 10, 2026
161f673
refactor: moved the docs_generation folder to docs IHS-201
polmichel Feb 10, 2026
bd17565
feat: enhanced PSDK Configuration Documentation format IHS-200
polmichel Feb 10, 2026
16116f7
feat: InfrahubCtl documentation dynamically rendering all the documen…
polmichel Feb 10, 2026
54f3a4c
Linting: Incorrect import of `pytest`; use `import pytest` instead
ogenstad Feb 13, 2026
8959d12
Merge pull request #824 from opsmill/pog-PT013
ogenstad Feb 13, 2026
37db419
chore: adds the dependency to vitest & markdownlint-cli2 IHS-200
polmichel Feb 10, 2026
f3ec276
feat: PSDK Documentation auto rendering all files in topics, ref & gu…
polmichel Feb 10, 2026
23af927
docs: update AGENTS.md documentation with new rules and features IHS-200
polmichel Feb 10, 2026
0ead93b
refactor: encapsulate in a folder sidebars management IHS-200
polmichel Feb 10, 2026
d239d46
feat: enhanced CI docs-validate check: robustify and refactor package…
polmichel Feb 11, 2026
d64dde3
docs: AGENTS.md documentation updated IHS-197
polmichel Feb 11, 2026
de50398
docs: PSDK API documentation generation IHS-199
polmichel Feb 11, 2026
e5ecfd0
upgrade Docusaurus to the same version that infrahub-docs version (3.…
polmichel Feb 12, 2026
900096c
feat: mdxify does not correctly handle code examples in docstring IHS…
polmichel Feb 12, 2026
6c5a6ad
Revert "refactor: made the Jinja2Template extends the ATemplate class…
polmichel Feb 13, 2026
6d9e056
test: Adapt internal tests due to refactoring revert of ATemplate cla…
polmichel Feb 13, 2026
91ff77c
Avoid + operator to concatenate collections
ogenstad Feb 16, 2026
7c8ce06
fix: correct path fixed about sidebars folder which will be copied to…
polmichel Feb 16, 2026
7ce5078
fix: fixing wrong path stored in the MdxFile class depending on tmp f…
polmichel Feb 16, 2026
9464c05
docs: fixing misspelled term in documentation IHS-199
polmichel Feb 16, 2026
636de56
fix: avoiding unlink method to be skipped if an exception occur durin…
polmichel Feb 16, 2026
294d265
docs: unable python references on general documentation / enable the …
polmichel Feb 16, 2026
c486893
docs: fix comments on Icon management IHS-198
polmichel Feb 16, 2026
9b341cd
Break apart ty violations into smaller components
ogenstad Feb 16, 2026
c58b476
Merge pull request #825 from opsmill/stable
ogenstad Feb 16, 2026
e1ad3d7
Merge pull request #826 from opsmill/pog-RUF005
ogenstad Feb 17, 2026
0176b8e
Merge pull request #828 from opsmill/pog-break-ty-rules
ogenstad Feb 17, 2026
d1f6584
Merge pull request #830 from opsmill/develop
ogenstad Feb 17, 2026
19a6622
chore: fixed towncrier changelog fragment for #201
polmichel Feb 17, 2026
6f07577
feat: add MdxSection reordering if priority has been given on certain…
polmichel Feb 16, 2026
471d3c0
feat: class methods can be prioritized over others in the API Documen…
polmichel Feb 16, 2026
40f559e
refactor: encapsulate re-ordering complexity into a composition class…
polmichel Feb 16, 2026
6d1d14a
feat: error management related to item proritization in doc_generatio…
polmichel Feb 16, 2026
7b83953
docs: generating SDK API Documentation once first items prioritized I…
polmichel Feb 16, 2026
805b7e3
docs: Class should be put before functions into SDK API documentation…
polmichel Feb 16, 2026
a694e59
docs: generating SDK API Documentation after Class versus Functions r…
polmichel Feb 16, 2026
8c8c758
refactor: cleaned static methods and misplaced logic IHS-205
polmichel Feb 17, 2026
1e67930
refactor: test files are no split and clarified depending on the scen…
polmichel Feb 17, 2026
9a3eed6
feat: add collapsible sections into the documentation to contain meth…
polmichel Feb 17, 2026
47988d9
docs: new documentation using the collapsible sections IHS-206
polmichel Feb 17, 2026
bf88b02
refactor: simplifying code + avoid testing logic + separate test file…
polmichel Feb 17, 2026
004fc67
Add py.typed
ogenstad Sep 10, 2025
809ea5e
Set version to 1.19.0b0
ogenstad Feb 18, 2026
f84bbd2
Merge pull request #543 from opsmill/pog-py.typed
ogenstad Feb 18, 2026
ca223c9
fix: getter / setter / deleter where considered as overloads in the d…
polmichel Feb 19, 2026
5d4704a
docs: update API documentation regarding overloads fix on getter & se…
polmichel Feb 19, 2026
4937d1b
Fix invalid-argument-type in exception class
ogenstad Feb 19, 2026
b391934
Merge pull request #822 from opsmill/pmi-20260210-sdk-api-documentation
polmichel Feb 19, 2026
04fd475
Merge pull request #832 from opsmill/pmi-20260216-sdk-api-doc-priorit…
polmichel Feb 19, 2026
dda5236
Merge pull request #833 from opsmill/pmi-20260217-sdk-api-doc-collaps…
polmichel Feb 19, 2026
0bf611d
Merge remote-tracking branch 'origin/develop' into merge-822-832-deve…
polmichel Feb 19, 2026
17edb63
Merge PRs 822 832 833 into develop: fixing linter
polmichel Feb 19, 2026
b29fcbb
docs: Fixing wrong documentation format related to Python code exampl…
polmichel Feb 19, 2026
0b99ab7
docs: Updating related SDK API docs IHS-193
polmichel Feb 19, 2026
3064a1f
Merge pull request #838 from opsmill/pog-exception-invalid-argument-type
ogenstad Feb 19, 2026
b417aaf
Fix invalid-argument-type violations
ogenstad Feb 19, 2026
7aeb880
Merge pull request #840 from opsmill/merge-822-832-833-develop-to-inf…
polmichel Feb 19, 2026
e8e933b
Merge pull request #831 from opsmill/stable
ogenstad Feb 19, 2026
a48fa78
Merge pull request #841 from opsmill/pog-timestamp-argument
ogenstad Feb 19, 2026
5864562
Fix: Wrong type passed to first argument of `pytest.mark.parametrize`…
ogenstad Feb 19, 2026
df74df0
Reraise exceptions where applicable
ogenstad Feb 20, 2026
96c5051
Merge pull request #845 from opsmill/pog-B904
ogenstad Feb 20, 2026
928e723
new Claude command /pre-ci running locally a subset of the commands t…
polmichel Feb 20, 2026
2eaaf98
Merge pull request #842 from opsmill/develop
ogenstad Feb 20, 2026
ecdacc6
Merge pull request #844 from opsmill/pog-PT006
ogenstad Feb 20, 2026
cf06649
new Claude command /feedback to identify missing project documentation
polmichel Feb 23, 2026
03fe2dc
would be more convenient to have all the results at once after /pre-c…
polmichel Feb 23, 2026
9f13097
Merge pull request #849 from opsmill/stable
ogenstad Feb 24, 2026
a17f18b
Merge pull request #851 from opsmill/develop
ogenstad Feb 24, 2026
bc144dd
encapsulating the 4th command into a subshell to avoid changing the w…
polmichel Feb 24, 2026
514d7d3
new blank line to make linters happy
polmichel Feb 24, 2026
8abbde2
replaced ambiguous term "session" with "conversation" into feedback c…
polmichel Feb 24, 2026
6387a79
additional blank lines
polmichel Feb 25, 2026
998e3fe
Merge pull request #829 from opsmill/pmi-20260216-new-ci-skill
polmichel Feb 25, 2026
d748a00
IHS-156 / #497 : support from_pool attributes on Python SDK queries (…
polmichel Feb 26, 2026
af650de
Merge remote-tracking branch 'origin/develop' into pmi-20260226-merge…
polmichel Feb 26, 2026
dd38027
Adapted documentation to new rules in infrahub-develop
polmichel Feb 26, 2026
52d475e
Adapted test typing of merged tests from develop
polmichel Feb 26, 2026
1c1407d
Merge pull request #856 from opsmill/pmi-20260226-merge-develop-into-…
polmichel Feb 27, 2026
56b6e2d
docs: Updating AGENTS.md rules regarding documentation generation
polmichel Feb 20, 2026
bd27571
Merge pull request #846 from opsmill/pmi-20260220-update-AGENTS-rules
polmichel Feb 27, 2026
f186180
Merge pull request #857 from opsmill/develop
polmichel Feb 27, 2026
7390d88
Set version to 1.19.0 release candidate 0
ogenstad Feb 27, 2026
f737549
Merge pull request #858 from opsmill/pog-1.19.0rc0
ogenstad Feb 27, 2026
9b30a09
bump version to 1.19.0
Mar 16, 2026
4814eba
add CHANGELOG entry
Mar 16, 2026
fe5fe71
exclude test_schema_export.py from ty linting test
Mar 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/file-filters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ markdown_all: &markdown_all

infrahub_reference_generated: &infrahub_reference_generated
- "docs/docs/infrahubctl/*.mdx"
- "docs/docs/python-sdk/reference/config.mdx"
- "docs/docs/python-sdk/reference/*.mdx"
- "docs/docs/python-sdk/sdk_ref/**/*.mdx"

documentation_all:
- *development_files
Expand Down
18 changes: 15 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ jobs:
- name: "Linting: markdownlint"
uses: DavidAnson/markdownlint-cli2-action@v22
with:
config: .markdownlint.yaml
config: docs/.markdownlint.yaml
globs: |
**/*.{md,mdx}
!changelog/*.md
Expand Down Expand Up @@ -176,7 +176,7 @@ jobs:
uses: actions/setup-node@v5
with:
node-version: 20
cache: 'npm'
cache: "npm"
cache-dependency-path: docs/package-lock.json
- name: "Install dependencies"
run: npm install
Expand Down Expand Up @@ -207,6 +207,15 @@ jobs:
uses: "actions/checkout@v6"
with:
submodules: true
- name: Install NodeJS
uses: actions/setup-node@v5
with:
node-version: 20
cache: "npm"
cache-dependency-path: docs/package-lock.json
- name: "Install npm dependencies"
run: npm install
working-directory: ./docs
- name: Set up Python
uses: actions/setup-python@v6
with:
Expand All @@ -217,9 +226,11 @@ jobs:
version: "${{ needs.prepare-environment.outputs.UV_VERSION }}"
- name: Install dependencies
run: uv sync --all-groups --all-extras
- name: Docs unit tests
run: npx --no-install vitest run
working-directory: ./docs
- name: Validate generated documentation
run: uv run invoke docs-validate

validate-documentation-style:
if: |
always() && !cancelled() &&
Expand All @@ -236,6 +247,7 @@ jobs:

# The official GitHub Action for Vale doesn't work, installing manually instead:
# https://github.com/errata-ai/vale-action/issues/103
# cf -> https://github.com/nf-core/website/pull/3509
- name: Download Vale
run: |
curl -sL "https://github.com/errata-ai/vale/releases/download/v${VALE_VERSION}/vale_${VALE_VERSION}_Linux_64-bit.tar.gz" -o vale.tar.gz
Expand Down
10 changes: 6 additions & 4 deletions .github/workflows/sync-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ on:
- stable
paths:
- 'docs/docs/**'
- 'docs/sidebars-infrahubctl.ts'
- 'docs/sidebars-python-sdk.ts'
- 'docs/sidebars/sidebars-infrahubctl.ts'
- 'docs/sidebars/sidebars-python-sdk.ts'
- 'docs/sidebars/sidebar-utils.ts'

jobs:
sync:
Expand All @@ -33,8 +34,9 @@ jobs:
rm -f target-repo/docs/sidebars-python-sdk.ts
rm -f target-repo/docs/sidebars-infrahubctl.ts
cp -r source-repo/docs/docs/* target-repo/docs/docs-python-sdk/
cp source-repo/docs/sidebars-infrahubctl.ts target-repo/docs/
cp source-repo/docs/sidebars-python-sdk.ts target-repo/docs/
cp source-repo/docs/sidebars/sidebars-infrahubctl.ts target-repo/docs/
cp source-repo/docs/sidebars/sidebars-python-sdk.ts target-repo/docs/
cp source-repo/docs/sidebars/sidebar-utils.ts target-repo/docs/
cd target-repo
git config user.name github-actions
git config user.email github-actions@github.com
Expand Down
7 changes: 7 additions & 0 deletions .vale.ini
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,10 @@ BasedOnStyles =

[*]
BasedOnStyles = Infrahub

# Generated API reference docs: use GeneratedRef spelling (allows snake_case)
# instead of global Infrahub spelling. Must be last to override [*].
[docs/docs/python-sdk/sdk_ref/**/*.mdx]
BasedOnStyles = Infrahub, GeneratedRef
Infrahub.spelling = NO
BlockIgnores = (?s) *((import.*?\n)|(```.*?```\n))
10 changes: 10 additions & 0 deletions .vale/styles/GeneratedRef/spelling.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
extends: spelling
message: "Did you really mean '%s'?"
level: error
filters:
- '[pP]y.*\b'
- '\bimport_.*\b' # Ignore variables starting with 'import_'
- '\w+__value' # Skip Infrahub filters in documentation (name__value)
- '\b\w+_\w+\b' # Ignore snake_case identifiers in generated API reference docs
ignore: spelling-exceptions.txt
1 change: 1 addition & 0 deletions .vale/styles/Infrahub/sentence-case.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ exceptions:
- Jinja
- Jinja2
- JWT
- MDX
- Namespace
- NATS
- Node
Expand Down
4 changes: 2 additions & 2 deletions .vale/styles/Infrahub/spelling.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ message: "Did you really mean '%s'?"
level: error
filters:
- '[pP]y.*\b'
- '\bimport_.*\b' # New filter to ignore variables starting with 'import_'
- '\w+__value' # New filter to skip Infrahub filters in documentation (name__value)
- '\bimport_.*\b' # Ignore variables starting with 'import_'
- '\w+__value' # Skip Infrahub filters in documentation (name__value)
ignore: spelling-exceptions.txt
2 changes: 2 additions & 0 deletions .vale/styles/spelling-exceptions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ Alibaba
Ansible
append_git_suffix
APIs
Args
artifact_definitions
artifact_name
async
Expand Down Expand Up @@ -78,6 +79,7 @@ kbps
Keycloak
Loopbacks
markdownlint
MDX
max_count
memgraph
menu_placement
Expand Down
6 changes: 4 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ Infrahub Python SDK - async/sync client for Infrahub infrastructure management.
```bash
uv sync --all-groups --all-extras # Install all deps
uv run invoke format # Format code
uv run invoke lint # All linters (code + yamllint + documentation)
uv run invoke lint # Full pipeline: ruff, yamllint, ty, mypy, markdownlint, vale
uv run invoke lint-code # All linters for Python code
uv run invoke docs-generate # Generate all docs (CLI + SDK)
uv run invoke docs-validate # Check generated docs match committed version
uv run pytest tests/unit/ # Unit tests
uv run pytest tests/integration/ # Integration tests
```
Expand Down Expand Up @@ -54,7 +56,7 @@ Key rules:
✅ **Always**

- Run `uv run invoke format lint-code` before committing Python code
- Run `uv run invoke generate-sdk generate-infrahubctl` after changing CLI commands or SDK config
- Run `uv run invoke docs-generate` after creating, modifying or deleting CLI commands, SDK config, or Python docstrings
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Keep docs-validate in the required workflow.

Line 59 now calls out docs-generate, but it drops the follow-up validation step the repo expects after code changes. Please mention uv run invoke docs-validate here as well so the “Always” checklist matches the documented docs workflow.

Suggested wording
-- Run `uv run invoke docs-generate` after creating, modifying or deleting CLI commands, SDK config, or Python docstrings
+- Run `uv run invoke docs-generate` after creating, modifying or deleting CLI commands, SDK config, or Python docstrings
+- Run `uv run invoke docs-validate` after making code changes to verify documentation is current

Based on learnings, Run uv run invoke docs-validate after making code changes to verify documentation is current.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Run `uv run invoke docs-generate` after creating, modifying or deleting CLI commands, SDK config, or Python docstrings
- Run `uv run invoke docs-generate` after creating, modifying or deleting CLI commands, SDK config, or Python docstrings
- Run `uv run invoke docs-validate` after making code changes to verify documentation is current
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@AGENTS.md` at line 59, Update the checklist entry that currently only
mentions "Run `uv run invoke docs-generate`" to include the follow-up validation
command; change the instruction so it reads that after
creating/modifying/deleting CLI commands, SDK config, or Python docstrings you
must run both `uv run invoke docs-generate` and `uv run invoke docs-validate`
(or the suggested wording "Run `uv run invoke docs-validate` after making code
changes to verify documentation is current") so the documented workflow includes
the required validation step.

- Run markdownlint before committing markdown changes
- Follow async/sync dual pattern for new features
- Use type hints on all function signatures
Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the changes for the upcoming release can be found in <https://github.com/opsmill/infrahub/tree/develop/infrahub/python_sdk/changelog/>.

<!-- towncrier release notes start -->

## [1.19.0](https://github.com/opsmill/infrahub-sdk-python/tree/v1.19.0) - 2026-03-16

### Added

- Added support for FileObject nodes with file upload and download capabilities. New methods `upload_from_path(path)` and `upload_from_bytes(content, name)` allow setting file content before saving, while `download_file(dest)` enables downloading files to memory or streaming to disk for large files. ([#ihs193](https://github.com/opsmill/infrahub-sdk-python/issues/ihs193))
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix the broken issue link in the FileObject changelog bullet.

The current GitHub issue URL uses a non-numeric path (/issues/ihs193) and is likely a dead link.

Suggested edit
-- Added support for FileObject nodes with file upload and download capabilities. New methods `upload_from_path(path)` and `upload_from_bytes(content, name)` allow setting file content before saving, while `download_file(dest)` enables downloading files to memory or streaming to disk for large files. ([`#ihs193`](https://github.com/opsmill/infrahub-sdk-python/issues/ihs193))
+- Added support for FileObject nodes with file upload and download capabilities. New methods `upload_from_path(path)` and `upload_from_bytes(content, name)` allow setting file content before saving, while `download_file(dest)` enables downloading files to memory or streaming to disk for large files. (Issue: ihs193)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Added support for FileObject nodes with file upload and download capabilities. New methods `upload_from_path(path)` and `upload_from_bytes(content, name)` allow setting file content before saving, while `download_file(dest)` enables downloading files to memory or streaming to disk for large files. ([#ihs193](https://github.com/opsmill/infrahub-sdk-python/issues/ihs193))
- Added support for FileObject nodes with file upload and download capabilities. New methods `upload_from_path(path)` and `upload_from_bytes(content, name)` allow setting file content before saving, while `download_file(dest)` enables downloading files to memory or streaming to disk for large files. (Issue: ihs193)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` at line 18, The changelog bullet referencing FileObject
(methods upload_from_path, upload_from_bytes, download_file) has a broken issue
link using "/issues/ihs193"; update the markdown to point to the correct GitHub
issue URL (replace `/issues/ihs193` with the numeric issue path, e.g.
`/issues/193`, or the proper full issue URL) so the link resolves correctly.

- Python SDK API documentation is now generated directly from the docstrings of the classes, functions, and methods contained in the code. ([#201](https://github.com/opsmill/infrahub-sdk-python/issues/201))
- Added a 'py.typed' file to the project. This is to enable type checking when the Infrahub SDK is imported from other projects. The addition of this file could cause new typing issues in external projects until all typing issues have been resolved. Adding it to the project now to better highlight remaining issues.

### Changed

- Updated branch report command to use node metadata for proposed change creator information instead of the deprecated relationship-based approach. Requires Infrahub 1.7 or above.

### Fixed

- Allow SDK tracking feature to continue after encountering delete errors due to impacted nodes having already been deleted by cascade delete. ([#265](https://github.com/opsmill/infrahub-sdk-python/issues/265))
- Fixed Python SDK query generation regarding from_pool generated attribute value ([#497](https://github.com/opsmill/infrahub-sdk-python/issues/497))

## [1.18.1](https://github.com/opsmill/infrahub-sdk-python/tree/v1.18.1) - 2026-01-08

### Fixed
Expand Down
1 change: 0 additions & 1 deletion changelog/265.fixed.md

This file was deleted.

92 changes: 92 additions & 0 deletions dev/commands/feedback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Session Feedback

Analyze this conversation and identify what documentation or context was missing, incomplete, or incorrect. The goal is to continuously improve the project's knowledge base so future conversations are more efficient.

## Step 1: Session Analysis

Reflect on the work done in this conversation. For each area, identify friction points:

1. **Exploration overhead**: What parts of the codebase did you have to discover by searching that should have been documented? (e.g., patterns, conventions, module responsibilities)
2. **Wrong assumptions**: Did you make incorrect assumptions due to missing or misleading documentation?
3. **Repeated patterns**: Did you discover recurring patterns or conventions that aren't documented anywhere?
4. **Missing context**: What background knowledge would have helped you start faster? (e.g., architecture decisions, data flow, naming conventions)
5. **Tooling gaps**: Were there commands, scripts, or workflows that you had to figure out?

## Step 2: Documentation Audit

For each friction point identified, determine the appropriate fix. Check the existing documentation to avoid duplicating what's already there:

- `AGENTS.md` — Top-level project instructions and component map
- `CLAUDE.md` — Entry point referencing AGENTS.md
- `docs/AGENTS.md` — Documentation site guide
- `infrahub_sdk/ctl/AGENTS.md` — CLI development guide
- `infrahub_sdk/pytest_plugin/AGENTS.md` — Pytest plugin guide
- `tests/AGENTS.md` — Testing guide

Read the relevant existing files to understand what's already documented before proposing changes.

## Step 3: Generate Report

Present the feedback as a structured report with the following sections. Only include sections that have content — skip empty sections.

### Format

```markdown
## Session Feedback Report

### What I Was Working On
<!-- Brief summary of the task(s) performed in this conversation -->

### Documentation Gaps
<!-- Things that should be documented but aren't -->

For each gap:

- **Topic**: What's missing
- **Where**: Which file should contain this (existing file to update, or new file to create)
- **Why**: How this would have helped during this conversation
- **Suggested content**: A draft of what should be added (be specific and actionable)

### Documentation Corrections
<!-- Things that are documented but wrong or misleading -->

For each correction:

- **File**: Path to the file
- **Issue**: What's wrong or misleading
- **Fix**: What it should say instead

### Discovered Patterns
<!-- Conventions or patterns found in the code that aren't documented -->

For each pattern:

- **Pattern**: Description of the convention
- **Evidence**: Where in the code this pattern is used (file paths)
- **Where to document**: Which AGENTS.md or guide file should capture this

### Memory Updates
<!-- Propose additions/changes to MEMORY.md for cross-session persistence -->

For each update:

- **Action**: Add / Update / Remove
- **Content**: What to write
- **Reason**: Why this is worth remembering across sessions
```

## Step 4: Apply Changes

After presenting the report, ask the user which changes they want to apply. Present the options:

1. **Apply all** — Create/update all proposed documentation files and memory
2. **Cherry-pick** — Let the user select which changes to apply
3. **None** — Just keep the report as reference, don't modify any files


For approved changes:

- Edit existing files when updating documentation
- Create new files only when no appropriate existing file exists
- Update `MEMORY.md` with approved memory changes
- Keep all changes minimal and focused — don't over-document
Comment on lines +89 to +92
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add a trailing blank line after the final list.

The last list ends at EOF without a blank line after it, which breaks the repository markdown spacing rule.

As per coding guidelines: "Add blank lines before and after lists in Markdown files".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dev/commands/feedback.md` around lines 89 - 92, The final unordered list
(lines containing "Edit existing files when updating documentation", "Create new
files only when no appropriate existing file exists", "Update `MEMORY.md` with
approved memory changes", "Keep all changes minimal and focused — don't
over-document") ends at EOF without a trailing blank line; add a single newline
character after the last list item so the file ends with a blank line and ensure
Markdown lists have blank lines before and after (apply the same fix in the
feedback.md final list).

36 changes: 36 additions & 0 deletions dev/commands/pre-ci.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
Run a subset of fast CI checks locally. These are lightweight validations that catch common issues before pushing. Run all steps and report a summary at the end.

## Steps

1. **Format** Python code:
```bash
uv run invoke format
```

2. **Lint** (YAML, Ruff, ty, mypy, markdownlint, vale):
```bash
uv run invoke lint
```

3. **Python unit tests**:
```bash
uv run pytest tests/unit/
```

4. **Docs unit tests** (vitest):
```bash
(cd docs && npx --no-install vitest run)
```

5. **Validate generated documentation** (regenerate and check for drift):
```bash
uv run invoke docs-validate
```

## Instructions

- Run each step in order using the Bash tool.
- If a step fails, continue with the remaining steps.
- At the end, print a summary table of all steps with pass/fail status.
- Do NOT commit or push anything.

File renamed without changes.
30 changes: 21 additions & 9 deletions docs/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# docs/AGENTS.md
# Documentation agents

Docusaurus documentation following Diataxis framework.

Expand All @@ -8,8 +8,10 @@ Docusaurus documentation following Diataxis framework.
cd docs && npm install # Install deps
cd docs && npm start # Dev server at localhost:3000
cd docs && npm run build # Build static site
uv run invoke docs # Generate auto-docs
uv run invoke docs-validate # Validate docs are current
cd docs && npm test # Run sidebar utility tests
uv run invoke docs # Build documentation website
uv run invoke docs-generate # Regenerate all docs (infrahubctl CLI + Python SDK)
uv run invoke docs-validate # Check that generated docs match committed files
```

## Structure
Expand All @@ -23,13 +25,21 @@ docs/docs/
└── infrahubctl/ # CLI docs (auto-generated)
```

## Adding Documentation
## Sidebars

Sidebar navigation is dynamic: `sidebars-*.ts` files read the filesystem at build time via utility functions in `sidebar-utils.ts`.

- **infrahubctl**: all `.mdx` files are discovered automatically and sorted alphabetically.
- **python-sdk**: guides, topics, and reference sections preserve a defined display order; new files are appended alphabetically at the end.

No manual sidebar update is needed when adding a new `.mdx` file. However, to control the display order of a new page, add its doc ID to the ordered list in the corresponding `sidebars-*.ts` file.
Comment on lines +32 to +35
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Insert a blank line after the sidebar bullet list.

The paragraph starting at Line 35 should be separated from the list by a blank line.

✏️ Suggested fix
 - **infrahubctl**: all `.mdx` files are discovered automatically and sorted alphabetically.
 - **python-sdk**: guides, topics, and reference sections preserve a defined display order; new files are appended alphabetically at the end.
+
 No manual sidebar update is needed when adding a new `.mdx` file. However, to control the display order of a new page, add its doc ID to the ordered list in the corresponding `sidebars-*.ts` file.

As per coding guidelines "Add blank lines before and after lists in Markdown files".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/AGENTS.md` around lines 32 - 35, Insert a single blank line after the
sidebar bullet list (the two bullets that start with "**infrahubctl**" and
"**python-sdk**") so the following paragraph ("No manual sidebar update is
needed when adding a new `.mdx` file...") is separated from the list; ensure
there is one empty line before and after the list per the Markdown guideline.


## Adding documentation

1. Create MDX file in appropriate directory
2. Add frontmatter with `title`
3. Update `sidebars-*.ts` for navigation

## MDX Pattern
## MDX pattern

Use Tabs for async/sync examples, callouts for notes:

Expand All @@ -52,9 +62,11 @@ Use callouts for important notes.
✅ **Always**

- Include both async/sync examples using Tabs
- Run `uv run invoke docs-validate` after code changes
- Run `uv run invoke docs-validate` after code changes to verify generated docs are up to date

🚫 **Never**

- Edit `docs/infrahubctl/*.mdx` directly (regenerate with `uv run invoke generate-infrahubctl`)
- Edit `docs/python-sdk/reference/config.mdx` directly (regenerate with `uv run invoke generate-sdk`)
- Edit `docs/infrahubctl/*.mdx` directly (regenerate with `uv run invoke docs-generate`)
- Edit `docs/python-sdk/reference/config.mdx` directly (regenerate with `uv run invoke docs-generate`)
- Edit `docs/python-sdk/reference/templating.mdx` directly (regenerate with `uv run invoke docs-generate`)
- Edit `docs/python-sdk/sdk_ref/**/*.mdx` directly (regenerate with `uv run invoke docs-generate`)
Empty file added docs/__init__.py
Empty file.
2 changes: 0 additions & 2 deletions docs/_templates/sdk_config.j2
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ The following settings can be defined in the `Config` class
{% for property in properties %}
<!-- vale off -->
## {{ property.name }}

**Property**: {{ property.name }}<br />
<!-- vale on -->
**Description**: {% if '\n' in property.description %} {% endif %}{{ property.description }}<br />
**Type**: `{{ property.type }}`<br />
Expand Down
2 changes: 1 addition & 1 deletion docs/docs/python-sdk/guides/client.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ Your client is now configured to use the specified default branch instead of `ma

## Hello world example

Let's create a simple "Hello World" example to verify your client configuration works correctly. This example will connect to your Infrahub instance and query the available accounts.
Let's create a "Hello World" example to verify your client configuration works correctly. This example will connect to your Infrahub instance and query the available accounts.

1. Create a new file called `hello_world.py`:

Expand Down
Loading
Loading