pal-found-cli 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. pal_found_cli-0.1.2/.env.example +56 -0
  2. pal_found_cli-0.1.2/.github/workflows/ci.yml +140 -0
  3. pal_found_cli-0.1.2/.github/workflows/publish.yml +116 -0
  4. pal_found_cli-0.1.2/.gitignore +32 -0
  5. pal_found_cli-0.1.2/PKG-INFO +74 -0
  6. pal_found_cli-0.1.2/README.md +57 -0
  7. pal_found_cli-0.1.2/conda.recipe/meta.yaml +50 -0
  8. pal_found_cli-0.1.2/pyproject.toml +136 -0
  9. pal_found_cli-0.1.2/setup.cfg +4 -0
  10. pal_found_cli-0.1.2/src/pal_found_cli/__init__.py +1 -0
  11. pal_found_cli-0.1.2/src/pal_found_cli/_version.py +24 -0
  12. pal_found_cli-0.1.2/src/pal_found_cli/admin/__init__.py +2 -0
  13. pal_found_cli-0.1.2/src/pal_found_cli/admin/scripts/__init__.py +2 -0
  14. pal_found_cli-0.1.2/src/pal_found_cli/admin/scripts/pal_found_admin_cli.py +600 -0
  15. pal_found_cli-0.1.2/src/pal_found_cli/aip_agents/__init__.py +1 -0
  16. pal_found_cli-0.1.2/src/pal_found_cli/aip_agents/metadata-allow-list.md +20 -0
  17. pal_found_cli-0.1.2/src/pal_found_cli/aip_agents/scripts/__init__.py +1 -0
  18. pal_found_cli-0.1.2/src/pal_found_cli/aip_agents/scripts/pal_found_aip_agents_cli.py +704 -0
  19. pal_found_cli-0.1.2/src/pal_found_cli/audit/__init__.py +1 -0
  20. pal_found_cli-0.1.2/src/pal_found_cli/audit/metadata-allow-list.md +4 -0
  21. pal_found_cli-0.1.2/src/pal_found_cli/audit/scripts/__init__.py +1 -0
  22. pal_found_cli-0.1.2/src/pal_found_cli/audit/scripts/pal_found_audit_cli.py +387 -0
  23. pal_found_cli-0.1.2/src/pal_found_cli/checkpoints/__init__.py +9 -0
  24. pal_found_cli-0.1.2/src/pal_found_cli/checkpoints/metadata-allow-list.md +7 -0
  25. pal_found_cli-0.1.2/src/pal_found_cli/checkpoints/scripts/__init__.py +1 -0
  26. pal_found_cli-0.1.2/src/pal_found_cli/checkpoints/scripts/pal_found_checkpoints_cli.py +527 -0
  27. pal_found_cli-0.1.2/src/pal_found_cli/common/__init__.py +56 -0
  28. pal_found_cli-0.1.2/src/pal_found_cli/common/access_control_guard.py +591 -0
  29. pal_found_cli-0.1.2/src/pal_found_cli/common/async_client_factory.py +161 -0
  30. pal_found_cli-0.1.2/src/pal_found_cli/common/auth_provider.py +82 -0
  31. pal_found_cli-0.1.2/src/pal_found_cli/common/binary_download_handler.py +288 -0
  32. pal_found_cli-0.1.2/src/pal_found_cli/common/config_loader.py +388 -0
  33. pal_found_cli-0.1.2/src/pal_found_cli/common/error_serializer.py +412 -0
  34. pal_found_cli-0.1.2/src/pal_found_cli/common/log_setup.py +241 -0
  35. pal_found_cli-0.1.2/src/pal_found_cli/common/metadata-allow-list.md +169 -0
  36. pal_found_cli-0.1.2/src/pal_found_cli/common/output_formatter.py +267 -0
  37. pal_found_cli-0.1.2/src/pal_found_cli/common/pagination_helper.py +212 -0
  38. pal_found_cli-0.1.2/src/pal_found_cli/common/retry.py +617 -0
  39. pal_found_cli-0.1.2/src/pal_found_cli/common/sdk_error_utils.py +112 -0
  40. pal_found_cli-0.1.2/src/pal_found_cli/common/session_manager.py +461 -0
  41. pal_found_cli-0.1.2/src/pal_found_cli/common/tracing_provider.py +107 -0
  42. pal_found_cli-0.1.2/src/pal_found_cli/connectivity/__init__.py +9 -0
  43. pal_found_cli-0.1.2/src/pal_found_cli/connectivity/metadata-allow-list.md +24 -0
  44. pal_found_cli-0.1.2/src/pal_found_cli/connectivity/scripts/__init__.py +1 -0
  45. pal_found_cli-0.1.2/src/pal_found_cli/connectivity/scripts/pal_found_connectivity_cli.py +720 -0
  46. pal_found_cli-0.1.2/src/pal_found_cli/data_health/__init__.py +9 -0
  47. pal_found_cli-0.1.2/src/pal_found_cli/data_health/metadata-allow-list.md +10 -0
  48. pal_found_cli-0.1.2/src/pal_found_cli/data_health/scripts/__init__.py +1 -0
  49. pal_found_cli-0.1.2/src/pal_found_cli/data_health/scripts/pal_found_data_health_cli.py +458 -0
  50. pal_found_cli-0.1.2/src/pal_found_cli/datasets/__init__.py +1 -0
  51. pal_found_cli-0.1.2/src/pal_found_cli/datasets/scripts/__init__.py +1 -0
  52. pal_found_cli-0.1.2/src/pal_found_cli/datasets/scripts/pal_found_datasets_cli.py +732 -0
  53. pal_found_cli-0.1.2/src/pal_found_cli/filesystem/__init__.py +2 -0
  54. pal_found_cli-0.1.2/src/pal_found_cli/filesystem/scripts/__init__.py +2 -0
  55. pal_found_cli-0.1.2/src/pal_found_cli/filesystem/scripts/pal_found_filesystem_cli.py +659 -0
  56. pal_found_cli-0.1.2/src/pal_found_cli/functions/__init__.py +2 -0
  57. pal_found_cli-0.1.2/src/pal_found_cli/functions/scripts/__init__.py +2 -0
  58. pal_found_cli-0.1.2/src/pal_found_cli/functions/scripts/pal_found_functions_cli.py +389 -0
  59. pal_found_cli-0.1.2/src/pal_found_cli/language_models/__init__.py +1 -0
  60. pal_found_cli-0.1.2/src/pal_found_cli/language_models/metadata-allow-list.md +6 -0
  61. pal_found_cli-0.1.2/src/pal_found_cli/language_models/scripts/__init__.py +1 -0
  62. pal_found_cli-0.1.2/src/pal_found_cli/language_models/scripts/pal_found_language_models_cli.py +342 -0
  63. pal_found_cli-0.1.2/src/pal_found_cli/media_sets/__init__.py +9 -0
  64. pal_found_cli-0.1.2/src/pal_found_cli/media_sets/metadata-allow-list.md +23 -0
  65. pal_found_cli-0.1.2/src/pal_found_cli/media_sets/scripts/__init__.py +1 -0
  66. pal_found_cli-0.1.2/src/pal_found_cli/media_sets/scripts/pal_found_media_sets_cli.py +642 -0
  67. pal_found_cli-0.1.2/src/pal_found_cli/models/__init__.py +5 -0
  68. pal_found_cli-0.1.2/src/pal_found_cli/models/metadata-allow-list.md +27 -0
  69. pal_found_cli-0.1.2/src/pal_found_cli/models/scripts/__init__.py +1 -0
  70. pal_found_cli-0.1.2/src/pal_found_cli/models/scripts/pal_found_models_cli.py +714 -0
  71. pal_found_cli-0.1.2/src/pal_found_cli/ontologies/__init__.py +1 -0
  72. pal_found_cli-0.1.2/src/pal_found_cli/ontologies/scripts/__init__.py +1 -0
  73. pal_found_cli-0.1.2/src/pal_found_cli/ontologies/scripts/pal_found_ontologies_cli.py +1225 -0
  74. pal_found_cli-0.1.2/src/pal_found_cli/orchestration/__init__.py +9 -0
  75. pal_found_cli-0.1.2/src/pal_found_cli/orchestration/metadata-allow-list.md +24 -0
  76. pal_found_cli-0.1.2/src/pal_found_cli/orchestration/scripts/__init__.py +1 -0
  77. pal_found_cli-0.1.2/src/pal_found_cli/orchestration/scripts/pal_found_orchestration_cli.py +640 -0
  78. pal_found_cli-0.1.2/src/pal_found_cli/sql_queries/__init__.py +9 -0
  79. pal_found_cli-0.1.2/src/pal_found_cli/sql_queries/metadata-allow-list.md +9 -0
  80. pal_found_cli-0.1.2/src/pal_found_cli/sql_queries/scripts/__init__.py +1 -0
  81. pal_found_cli-0.1.2/src/pal_found_cli/sql_queries/scripts/pal_found_sql_queries_cli.py +514 -0
  82. pal_found_cli-0.1.2/src/pal_found_cli/streams/__init__.py +9 -0
  83. pal_found_cli-0.1.2/src/pal_found_cli/streams/metadata-allow-list.md +19 -0
  84. pal_found_cli-0.1.2/src/pal_found_cli/streams/scripts/__init__.py +1 -0
  85. pal_found_cli-0.1.2/src/pal_found_cli/streams/scripts/pal_found_streams_cli.py +615 -0
  86. pal_found_cli-0.1.2/src/pal_found_cli/third_party_applications/__init__.py +9 -0
  87. pal_found_cli-0.1.2/src/pal_found_cli/third_party_applications/metadata-allow-list.md +13 -0
  88. pal_found_cli-0.1.2/src/pal_found_cli/third_party_applications/scripts/__init__.py +1 -0
  89. pal_found_cli-0.1.2/src/pal_found_cli/third_party_applications/scripts/pal_found_third_party_applications_cli.py +547 -0
  90. pal_found_cli-0.1.2/src/pal_found_cli/widgets/__init__.py +9 -0
  91. pal_found_cli-0.1.2/src/pal_found_cli/widgets/metadata-allow-list.md +12 -0
  92. pal_found_cli-0.1.2/src/pal_found_cli/widgets/scripts/__init__.py +1 -0
  93. pal_found_cli-0.1.2/src/pal_found_cli/widgets/scripts/pal_found_widgets_cli.py +571 -0
  94. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/PKG-INFO +74 -0
  95. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/SOURCES.txt +140 -0
  96. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/dependency_links.txt +1 -0
  97. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/entry_points.txt +19 -0
  98. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/requires.txt +11 -0
  99. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/scm_file_list.json +135 -0
  100. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/scm_version.json +8 -0
  101. pal_found_cli-0.1.2/src/pal_found_cli.egg-info/top_level.txt +1 -0
  102. pal_found_cli-0.1.2/tests/__init__.py +0 -0
  103. pal_found_cli-0.1.2/tests/test_access_control_guard.py +829 -0
  104. pal_found_cli-0.1.2/tests/test_admin_console_wrapper.py +68 -0
  105. pal_found_cli-0.1.2/tests/test_aip_agents_console_wrapper.py +16 -0
  106. pal_found_cli-0.1.2/tests/test_audit_console_wrapper.py +280 -0
  107. pal_found_cli-0.1.2/tests/test_binary_download.py +281 -0
  108. pal_found_cli-0.1.2/tests/test_checkpoints_console_wrapper.py +34 -0
  109. pal_found_cli-0.1.2/tests/test_data_health_console_wrapper.py +34 -0
  110. pal_found_cli-0.1.2/tests/test_datasets_console_wrapper.py +30 -0
  111. pal_found_cli-0.1.2/tests/test_exec_common_components.py +643 -0
  112. pal_found_cli-0.1.2/tests/test_exec_retry_error_output_log.py +989 -0
  113. pal_found_cli-0.1.2/tests/test_filesystem_console_wrapper.py +70 -0
  114. pal_found_cli-0.1.2/tests/test_functions_console_wrapper.py +71 -0
  115. pal_found_cli-0.1.2/tests/test_language_models_console_wrapper.py +16 -0
  116. pal_found_cli-0.1.2/tests/test_ontologies_console_wrapper.py +70 -0
  117. pal_found_cli-0.1.2/tests/test_pagination_helper.py +310 -0
  118. pal_found_cli-0.1.2/tests/test_pal_found_admin_cli.py +478 -0
  119. pal_found_cli-0.1.2/tests/test_pal_found_aip_agents_cli.py +514 -0
  120. pal_found_cli-0.1.2/tests/test_pal_found_audit_cli.py +1218 -0
  121. pal_found_cli-0.1.2/tests/test_pal_found_checkpoints_cli.py +666 -0
  122. pal_found_cli-0.1.2/tests/test_pal_found_connectivity_cli.py +1248 -0
  123. pal_found_cli-0.1.2/tests/test_pal_found_data_health_cli.py +810 -0
  124. pal_found_cli-0.1.2/tests/test_pal_found_filesystem_cli.py +441 -0
  125. pal_found_cli-0.1.2/tests/test_pal_found_functions_cli.py +334 -0
  126. pal_found_cli-0.1.2/tests/test_pal_found_language_models_cli.py +366 -0
  127. pal_found_cli-0.1.2/tests/test_pal_found_media_sets_cli.py +976 -0
  128. pal_found_cli-0.1.2/tests/test_pal_found_models_cli.py +1066 -0
  129. pal_found_cli-0.1.2/tests/test_pal_found_orchestration_cli.py +847 -0
  130. pal_found_cli-0.1.2/tests/test_pal_found_sql_queries_cli.py +678 -0
  131. pal_found_cli-0.1.2/tests/test_pal_found_streams_cli.py +961 -0
  132. pal_found_cli-0.1.2/tests/test_pal_found_third_party_applications_cli.py +950 -0
  133. pal_found_cli-0.1.2/tests/test_pal_found_widgets_cli.py +951 -0
  134. pal_found_cli-0.1.2/tests/test_release_artifacts.py +33 -0
  135. pal_found_cli-0.1.2/tests/test_rename_migration.py +51 -0
  136. pal_found_cli-0.1.2/tests/test_repository_hygiene.py +54 -0
  137. pal_found_cli-0.1.2/tests/test_session_manager.py +249 -0
  138. pal_found_cli-0.1.2/tests/test_third_party_applications_console_wrapper.py +36 -0
  139. pal_found_cli-0.1.2/tests/test_tracing_provider.py +242 -0
  140. pal_found_cli-0.1.2/tests/test_widgets_console_wrapper.py +37 -0
  141. pal_found_cli-0.1.2/tests/unit_test_common_components.py +1128 -0
  142. pal_found_cli-0.1.2/tests/unit_test_retry_error_output_log.py +1844 -0
@@ -0,0 +1,56 @@
1
+ # Foundry CLI Environment Configuration
2
+ # Copy this file to .env and fill in actual values.
3
+ # DO NOT commit .env to version control.
4
+
5
+ # Required: Authentication
6
+ # Your Foundry API token (personal or service account)
7
+ FOUNDRY_TOKEN=your_foundry_api_token_here
8
+
9
+ # Required: Target Foundry instance hostname
10
+ # E.g., https://foundry.example.com
11
+ FOUNDRY_HOSTNAME=your_foundry_hostname_here
12
+
13
+ # Optional: Explicit .env file override (ADR-006)
14
+ # If set, loads from this exact path; no fallback to git root.
15
+ # FOUNDRY_AGENTIC_CLI_ENV_FILE=/path/to/.env
16
+
17
+ # Optional: Request timeout in seconds (default: 30, ADR-002; valid range 1-3600)
18
+ # FOUNDRY_AGENTIC_CLI_TIMEOUT_S=30
19
+
20
+ # Optional: Output format auto-selection (json | toon | auto)
21
+ # FOUNDRY_AGENTIC_CLI_DEFAULT_FORMAT=auto
22
+
23
+ # Optional: Global read-only access guard (true | false)
24
+ # FOUNDRY_AGENTIC_CLI_READONLY=false
25
+
26
+ # Optional: Global metadata-only output guard (true | false)
27
+ # FOUNDRY_AGENTIC_CLI_METADATA_ONLY=false
28
+
29
+ # Optional: Attribution propagation
30
+ # FOUNDRY_AGENTIC_CLI_ENABLE_ATTRIBUTION=false
31
+ # FOUNDRY_AGENTIC_CLI_ATTRIBUTION_RIDS=rid-a,rid-b
32
+
33
+ # Optional: B3 tracing propagation
34
+ # FOUNDRY_AGENTIC_CLI_ENABLE_TRACING=false
35
+
36
+ # Optional: Structured logging level for stderr (ADR-005)
37
+ # FOUNDRY_AGENTIC_CLI_LOG_LEVEL=WARNING
38
+
39
+ # Optional: Retry configuration (ADR-002, implemented in pal_found_cli.common.retry)
40
+ # FOUNDRY_AGENTIC_CLI_RETRY_MAX_ATTEMPTS=4
41
+ # FOUNDRY_AGENTIC_CLI_RETRY_INITIAL_DELAY_MS=500
42
+ # FOUNDRY_AGENTIC_CLI_RETRY_MAX_DELAY_MS=30000
43
+ # FOUNDRY_AGENTIC_CLI_RETRY_MULTIPLIER=2.0
44
+ # FOUNDRY_AGENTIC_CLI_RETRY_JITTER=true
45
+
46
+ # Optional: Pagination defaults
47
+ # FOUNDRY_AGENTIC_CLI_DEFAULT_PAGE_SIZE=100
48
+ # FOUNDRY_AGENTIC_CLI_MAX_BATCH_PAGES=40
49
+
50
+ # Optional: Binary download and session storage (DEV-STORY-004)
51
+ # FOUNDRY_AGENTIC_CLI_MAX_DOWNLOAD_BYTES=1572864
52
+ # FOUNDRY_AGENTIC_CLI_DOWNLOAD_PATH=.foundry-data/downloads
53
+ # FOUNDRY_AGENTIC_CLI_SESSION_PATH=.foundry-data/sessions
54
+
55
+ # Optional: Error envelope tracebacks (set false in production to reduce path leakage)
56
+ # FOUNDRY_INCLUDE_TRACEBACK=false
@@ -0,0 +1,140 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ name: Lint (Ruff)
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
22
+ with:
23
+ python-version: "3.11"
24
+
25
+ - name: Install dependencies
26
+ run: |
27
+ python -m pip install --upgrade pip setuptools wheel
28
+ pip install -e ".[dev]"
29
+
30
+ - name: Run ruff linter
31
+ run: ruff check src/ tests/
32
+
33
+ type-check:
34
+ name: Type Check (mypy)
35
+ runs-on: ubuntu-latest
36
+ needs: lint
37
+ steps:
38
+ - name: Checkout
39
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
40
+
41
+ - name: Set up Python
42
+ uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
43
+ with:
44
+ python-version: "3.11"
45
+
46
+ - name: Install dependencies
47
+ run: |
48
+ python -m pip install --upgrade pip setuptools wheel
49
+ pip install -e ".[dev]"
50
+
51
+ - name: Run mypy
52
+ run: mypy src/
53
+
54
+ test:
55
+ name: Test (Python ${{ matrix.python-version }} on ${{ matrix.os }})
56
+ runs-on: ${{ matrix.os }}
57
+ needs: type-check
58
+ strategy:
59
+ fail-fast: false
60
+ matrix:
61
+ os: [ubuntu-latest, windows-latest]
62
+ python-version: ["3.11", "3.12"]
63
+ steps:
64
+ - name: Checkout
65
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
66
+
67
+ - name: Set up Python ${{ matrix.python-version }}
68
+ uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
69
+ with:
70
+ python-version: ${{ matrix.python-version }}
71
+
72
+ - name: Install dependencies
73
+ run: |
74
+ python -m pip install --upgrade pip setuptools wheel
75
+ pip install -e ".[dev]"
76
+
77
+ - name: Run pytest with coverage
78
+ run: |
79
+ pytest tests/ --cov=pal_found_cli --cov-report=term-missing --cov-report=xml -v
80
+
81
+ - name: Upload coverage to codecov
82
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11'
83
+ uses: codecov/codecov-action@c23a129e932ebdcb56ca1565c68c6abdbf173769 # v5.0.0
84
+ with:
85
+ files: coverage.xml
86
+ fail_ci_if_error: false
87
+ verbose: true
88
+
89
+ security-scan:
90
+ name: Security Scan
91
+ runs-on: ubuntu-latest
92
+ needs: test
93
+ steps:
94
+ - name: Checkout
95
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
96
+
97
+ - name: Set up Python
98
+ uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
99
+ with:
100
+ python-version: "3.11"
101
+
102
+ - name: Install dependencies
103
+ run: |
104
+ python -m pip install --upgrade pip setuptools wheel
105
+ pip install -e ".[dev]"
106
+ pip install bandit safety
107
+
108
+ - name: Run bandit SAST (fail on HIGH severity)
109
+ # --severity-level high: report issues with HIGH severity or higher
110
+ # Removed `|| true` so HIGH severity findings break the build per
111
+ # DevOps standard (OWASP DevSecOps: fail on HIGH+ severity findings).
112
+ # LOW/MEDIUM findings are reported but non-blocking.
113
+ run: bandit -r src/ --severity-level high
114
+
115
+ - name: Run safety dependency scan
116
+ run: safety check --full-report
117
+
118
+ build:
119
+ name: Build Package
120
+ runs-on: ubuntu-latest
121
+ needs: security-scan
122
+ steps:
123
+ - name: Checkout
124
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
125
+
126
+ - name: Set up Python
127
+ uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
128
+ with:
129
+ python-version: "3.11"
130
+
131
+ - name: Install build tools
132
+ run: python -m pip install --upgrade pip setuptools wheel build
133
+
134
+ - name: Build package
135
+ run: python -m build
136
+
137
+ - name: Check package metadata
138
+ run: |
139
+ python -m pip install --upgrade twine
140
+ twine check dist/*
@@ -0,0 +1,116 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write
11
+
12
+ jobs:
13
+ release:
14
+ name: Build, stage, verify, and publish
15
+ runs-on: ubuntu-latest
16
+ environment: release
17
+ steps:
18
+ - name: Checkout
19
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
20
+ with:
21
+ # Full history + tags so setuptools-scm resolves the release tag at
22
+ # HEAD (v0.1.2 -> 0.1.2). Without this the default shallow checkout
23
+ # misses the tag and guess-next-dev derives 0.1.3.dev0, which breaks
24
+ # the "Verify staged release" step that installs pal_found_cli==0.1.2.
25
+ fetch-depth: 0
26
+
27
+ - name: Set up Python
28
+ uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
29
+ with:
30
+ python-version: "3.11"
31
+
32
+ - name: Install build tools
33
+ run: python -m pip install --upgrade build twine
34
+
35
+ - name: Build package
36
+ run: python -m build
37
+
38
+ - name: Check package metadata
39
+ run: twine check dist/*
40
+
41
+ - name: Publish to Test PyPI
42
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
43
+ with:
44
+ repository-url: https://test.pypi.org/legacy/
45
+ # The staging publish must NOT generate attestations. With the default
46
+ # (attestations: true) the action writes *.publish.attestation files into
47
+ # dist/, and the subsequent production publish step then fails with "already
48
+ # have publish attestations". Attestations bind to one index/OIDC exchange,
49
+ # so generate them only on the final production publish below.
50
+ attestations: false
51
+ # The same tag can legitimately be re-pushed (e.g. to re-run a failed
52
+ # production step); Test PyPI already holds the identical 0.1.2 filenames
53
+ # from the first staging, so a plain re-upload returns 400 "File already
54
+ # exists". Skip files that are already staged and let the verify step
55
+ # re-confirm them. The production step keeps skip-existing=false: a file
56
+ # that already exists on production must fail loudly, not be masked.
57
+ skip-existing: true
58
+
59
+ - name: Verify staged release in clean environment
60
+ env:
61
+ RELEASE_VERSION: ${{ github.ref_name }}
62
+ run: |
63
+ python -m venv .release-venv
64
+ . .release-venv/bin/activate
65
+ python -m pip install --upgrade pip
66
+ python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ "pal_found_cli==${RELEASE_VERSION#v}"
67
+ pal-found-datasets --help
68
+
69
+ - name: Publish verified release to PyPI
70
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
71
+
72
+ conda:
73
+ name: Build and optionally publish conda package
74
+ runs-on: ubuntu-latest
75
+ steps:
76
+ - name: Checkout
77
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
78
+ with:
79
+ fetch-depth: 0
80
+
81
+ - name: Set up Miniconda
82
+ uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3
83
+ with:
84
+ activate-environment: release
85
+ python-version: "3.11"
86
+ auto-activate-base: false
87
+
88
+ - name: Build conda package
89
+ shell: bash -el {0}
90
+ env:
91
+ GIT_TAG: ${{ github.ref_name }}
92
+ run: |
93
+ # setup-miniconda does not configure channels by default; without them
94
+ # conda-build fails with "NoChannelsConfiguredError" when resolving host
95
+ # dependencies (setuptools, pip, setuptools-scm, python, wheel).
96
+ conda config --add channels conda-forge
97
+ conda config --add channels defaults
98
+ conda install --yes conda-build
99
+ # Use the standalone conda-build binary instead of `conda build`.
100
+ # On some conda versions the `build` subcommand is not registered from
101
+ # the conda-build plugin in a non-base activated environment, which made
102
+ # `conda build` fail with "invalid choice: 'build'". The conda-build binary
103
+ # is always installed by the package and is version independent.
104
+ conda-build conda.recipe --output-folder conda-channel
105
+
106
+ - name: Publish conda package when channel permission exists
107
+ shell: bash -el {0}
108
+ env:
109
+ ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }}
110
+ run: |
111
+ if [[ -z "$ANACONDA_API_TOKEN" ]]; then
112
+ echo "ANACONDA_API_TOKEN is not configured; build evidence retained, upload skipped."
113
+ exit 0
114
+ fi
115
+ conda install --yes anaconda-client
116
+ anaconda -t "$ANACONDA_API_TOKEN" upload --user t-jet conda-channel/*/*.conda --force
@@ -0,0 +1,32 @@
1
+ # Python build and test artifacts
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ build/
6
+ dist/
7
+ .coverage
8
+ coverage.xml
9
+ htmlcov/
10
+ .pytest_cache/
11
+ .mypy_cache/
12
+ .ruff_cache/
13
+
14
+ # setuptools-scm generated version file (tracked file causes dirty-state
15
+ # version bumps; see setuptools-scm issue #468)
16
+ src/pal_found_cli/_version.py
17
+
18
+ # Local environments and secrets
19
+ .venv/
20
+ .env
21
+ .env.*
22
+ !.env.example
23
+ !.env.template
24
+ *.pem
25
+ *.key
26
+ *.p12
27
+ *.pfx
28
+
29
+ # Local tooling
30
+ .ept/
31
+ .vscode/
32
+ .idea/
@@ -0,0 +1,74 @@
1
+ Metadata-Version: 2.4
2
+ Name: pal_found_cli
3
+ Version: 0.1.2
4
+ Summary: Foundry CLI - 33 operations across 5 resource clients
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: foundry-platform-sdk>=1.0.0
8
+ Requires-Dist: python-dotenv>=1.0.0
9
+ Requires-Dist: requests>=2.31.0
10
+ Provides-Extra: dev
11
+ Requires-Dist: pytest>=8.0; extra == "dev"
12
+ Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
13
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
14
+ Requires-Dist: mypy>=1.0; extra == "dev"
15
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
16
+ Requires-Dist: bandit>=1.7.0; extra == "dev"
17
+
18
+ # Palantir Foundry CLI
19
+
20
+ Palantir Foundry CLI provides command-line access to Foundry resource operations with shared configuration, authentication, retry handling, access-control guards, and structured output helpers.
21
+
22
+ ## Package
23
+
24
+ - Python support: 3.11 and 3.12.
25
+ - Distribution: `pal_found_cli`.
26
+ - Public commands use the `pal-found-` prefix, for example `pal-found-datasets`.
27
+ - Runtime dependencies: `foundry-platform-sdk>=1.0.0` and `python-dotenv>=1.0.0`.
28
+ - PyPI long description source: this `README.md`.
29
+
30
+ ## Install and use
31
+
32
+ Install the latest verified release from PyPI:
33
+
34
+ ```bash
35
+ python -m pip install pal_found_cli
36
+ pal-found-datasets --help
37
+ ```
38
+
39
+ Upgrade an existing installation with `python -m pip install --upgrade pal_found_cli`.
40
+ Each release is built from a `vX.Y.Z` tag, staged on Test PyPI, installed into a
41
+ clean environment, and smoke-checked before PyPI publication.
42
+
43
+ The conda recipe uses the same tag-derived version. After a channel release,
44
+ install with `conda install -c t-jet pal_found_cli`.
45
+
46
+ This repository contains the installable CLI. The project is split into three
47
+ independently versioned repositories:
48
+
49
+ - [design and documentation](https://github.com/t-jet/pal_found_cli)
50
+ - [CLI tool](https://github.com/t-jet/pal_found_cli_tool)
51
+ - [skills](https://github.com/t-jet/pal_found_cli_skills)
52
+
53
+ Repository-split and rename design records live in the
54
+ [design repository](https://github.com/t-jet/pal_found_cli).
55
+
56
+ ## Development
57
+
58
+ Install the project with development dependencies:
59
+
60
+ ```bash
61
+ python -m pip install -e ".[dev]"
62
+ ```
63
+
64
+ Run the main validation commands:
65
+
66
+ ```bash
67
+ ruff check src tests
68
+ mypy src
69
+ pytest tests --cov=pal_found_cli --cov-report=term-missing --cov-report=xml
70
+ python -m build
71
+ twine check dist/*
72
+ ```
73
+
74
+ The repository coverage gate is 80% branch coverage.
@@ -0,0 +1,57 @@
1
+ # Palantir Foundry CLI
2
+
3
+ Palantir Foundry CLI provides command-line access to Foundry resource operations with shared configuration, authentication, retry handling, access-control guards, and structured output helpers.
4
+
5
+ ## Package
6
+
7
+ - Python support: 3.11 and 3.12.
8
+ - Distribution: `pal_found_cli`.
9
+ - Public commands use the `pal-found-` prefix, for example `pal-found-datasets`.
10
+ - Runtime dependencies: `foundry-platform-sdk>=1.0.0` and `python-dotenv>=1.0.0`.
11
+ - PyPI long description source: this `README.md`.
12
+
13
+ ## Install and use
14
+
15
+ Install the latest verified release from PyPI:
16
+
17
+ ```bash
18
+ python -m pip install pal_found_cli
19
+ pal-found-datasets --help
20
+ ```
21
+
22
+ Upgrade an existing installation with `python -m pip install --upgrade pal_found_cli`.
23
+ Each release is built from a `vX.Y.Z` tag, staged on Test PyPI, installed into a
24
+ clean environment, and smoke-checked before PyPI publication.
25
+
26
+ The conda recipe uses the same tag-derived version. After a channel release,
27
+ install with `conda install -c t-jet pal_found_cli`.
28
+
29
+ This repository contains the installable CLI. The project is split into three
30
+ independently versioned repositories:
31
+
32
+ - [design and documentation](https://github.com/t-jet/pal_found_cli)
33
+ - [CLI tool](https://github.com/t-jet/pal_found_cli_tool)
34
+ - [skills](https://github.com/t-jet/pal_found_cli_skills)
35
+
36
+ Repository-split and rename design records live in the
37
+ [design repository](https://github.com/t-jet/pal_found_cli).
38
+
39
+ ## Development
40
+
41
+ Install the project with development dependencies:
42
+
43
+ ```bash
44
+ python -m pip install -e ".[dev]"
45
+ ```
46
+
47
+ Run the main validation commands:
48
+
49
+ ```bash
50
+ ruff check src tests
51
+ mypy src
52
+ pytest tests --cov=pal_found_cli --cov-report=term-missing --cov-report=xml
53
+ python -m build
54
+ twine check dist/*
55
+ ```
56
+
57
+ The repository coverage gate is 80% branch coverage.
@@ -0,0 +1,50 @@
1
+ {% set version = environ.get('GIT_TAG', '0.1.0').lstrip('v') %}
2
+
3
+ package:
4
+ name: pal_found_cli
5
+ version: {{ version }}
6
+
7
+ source:
8
+ path: ..
9
+
10
+ build:
11
+ number: 0
12
+ noarch: python
13
+ entry_points:
14
+ - pal-found-datasets = pal_found_cli.datasets.scripts.pal_found_datasets_cli:main
15
+ - pal-found-filesystem = pal_found_cli.filesystem.scripts.pal_found_filesystem_cli:console_main
16
+ - pal-found-functions = pal_found_cli.functions.scripts.pal_found_functions_cli:console_main
17
+ - pal-found-ontologies = pal_found_cli.ontologies.scripts.pal_found_ontologies_cli:console_main
18
+ - pal-found-admin = pal_found_cli.admin.scripts.pal_found_admin_cli:console_main
19
+ - pal-found-audit = pal_found_cli.audit.scripts.pal_found_audit_cli:console_main
20
+ - pal-found-aip-agents = pal_found_cli.aip_agents.scripts.pal_found_aip_agents_cli:console_main
21
+ - pal-found-language-models = pal_found_cli.language_models.scripts.pal_found_language_models_cli:console_main
22
+ - pal-found-models = pal_found_cli.models.scripts.pal_found_models_cli:console_main
23
+ - pal-found-orchestration = pal_found_cli.orchestration.scripts.pal_found_orchestration_cli:console_main
24
+ - pal-found-sql-queries = pal_found_cli.sql_queries.scripts.pal_found_sql_queries_cli:console_main
25
+ - pal-found-streams = pal_found_cli.streams.scripts.pal_found_streams_cli:console_main
26
+ - pal-found-connectivity = pal_found_cli.connectivity.scripts.pal_found_connectivity_cli:console_main
27
+ - pal-found-media-sets = pal_found_cli.media_sets.scripts.pal_found_media_sets_cli:console_main
28
+ - pal-found-checkpoints = pal_found_cli.checkpoints.scripts.pal_found_checkpoints_cli:console_main
29
+ - pal-found-data-health = pal_found_cli.data_health.scripts.pal_found_data_health_cli:console_main
30
+ - pal-found-third-party-applications = pal_found_cli.third_party_applications.scripts.pal_found_third_party_applications_cli:console_main
31
+ - pal-found-widgets = pal_found_cli.widgets.scripts.pal_found_widgets_cli:console_main
32
+ script: {{ PYTHON }} -m pip install . --no-deps --no-build-isolation
33
+
34
+ requirements:
35
+ host:
36
+ - python >=3.11
37
+ - pip
38
+ - setuptools >=68
39
+ - setuptools-scm >=8
40
+ - wheel
41
+ run:
42
+ - python >=3.11
43
+ - foundry-platform-sdk >=1.0
44
+ - python-dotenv >=1.0
45
+ - requests >=2.31
46
+
47
+ about:
48
+ home: https://github.com/t-jet/pal_found_cli_tool
49
+ license: MIT
50
+ summary: Command-line access to Palantir Foundry resource operations
@@ -0,0 +1,136 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "setuptools-scm>=8.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "pal_found_cli"
7
+ dynamic = ["version"]
8
+ description = "Foundry CLI - 33 operations across 5 resource clients"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ dependencies = [
12
+ "foundry-platform-sdk>=1.0.0",
13
+ "python-dotenv>=1.0.0",
14
+ "requests>=2.31.0",
15
+ ]
16
+
17
+ [project.optional-dependencies]
18
+ dev = [
19
+ "pytest>=8.0",
20
+ "pytest-asyncio>=0.24",
21
+ "pytest-cov>=5.0",
22
+ "mypy>=1.0",
23
+ "ruff>=0.4.0",
24
+ "bandit>=1.7.0",
25
+ ]
26
+
27
+ [project.scripts]
28
+ # The pal-found-* names are the public interface.
29
+ pal-found-datasets = "pal_found_cli.datasets.scripts.pal_found_datasets_cli:main"
30
+ pal-found-filesystem = "pal_found_cli.filesystem.scripts.pal_found_filesystem_cli:console_main"
31
+ pal-found-functions = "pal_found_cli.functions.scripts.pal_found_functions_cli:console_main"
32
+ pal-found-ontologies = "pal_found_cli.ontologies.scripts.pal_found_ontologies_cli:console_main"
33
+ pal-found-admin = "pal_found_cli.admin.scripts.pal_found_admin_cli:console_main"
34
+ pal-found-audit = "pal_found_cli.audit.scripts.pal_found_audit_cli:console_main"
35
+ pal-found-aip-agents = "pal_found_cli.aip_agents.scripts.pal_found_aip_agents_cli:console_main"
36
+ pal-found-language-models = "pal_found_cli.language_models.scripts.pal_found_language_models_cli:console_main"
37
+ pal-found-models = "pal_found_cli.models.scripts.pal_found_models_cli:console_main"
38
+ pal-found-orchestration = "pal_found_cli.orchestration.scripts.pal_found_orchestration_cli:console_main"
39
+ pal-found-sql-queries = "pal_found_cli.sql_queries.scripts.pal_found_sql_queries_cli:console_main"
40
+ pal-found-streams = "pal_found_cli.streams.scripts.pal_found_streams_cli:console_main"
41
+ pal-found-connectivity = "pal_found_cli.connectivity.scripts.pal_found_connectivity_cli:console_main"
42
+ pal-found-media-sets = "pal_found_cli.media_sets.scripts.pal_found_media_sets_cli:console_main"
43
+ pal-found-checkpoints = "pal_found_cli.checkpoints.scripts.pal_found_checkpoints_cli:console_main"
44
+ pal-found-data-health = "pal_found_cli.data_health.scripts.pal_found_data_health_cli:console_main"
45
+ pal-found-third-party-applications = "pal_found_cli.third_party_applications.scripts.pal_found_third_party_applications_cli:console_main"
46
+ pal-found-widgets = "pal_found_cli.widgets.scripts.pal_found_widgets_cli:console_main"
47
+
48
+ [tool.setuptools.packages.find]
49
+ where = ["src"]
50
+ namespaces = false
51
+
52
+ [tool.setuptools_scm]
53
+ fallback_version = "0.1.0"
54
+ version_file = "src/pal_found_cli/_version.py"
55
+ # Releases are tagged vX.Y.Z (the publish workflow only fires on v* tags). Restrict
56
+ # setuptools-scm to v-prefixed tags so that co-located non-release tags (e.g. the
57
+ # qa-verify-20260929 tag sharing a commit with v0.1.2) cannot shadow the release
58
+ # version. Without this the build parsed that date tag as the version (20260929)
59
+ # instead of 0.1.2 and erroneously staged/published the date version.
60
+ tag.strict = true
61
+ tag.prefix = "v"
62
+
63
+ [tool.setuptools.package-data]
64
+ "pal_found_cli.common" = ["metadata-allow-list.md"]
65
+ "pal_found_cli.audit" = ["metadata-allow-list.md"]
66
+ "pal_found_cli.aip_agents" = ["metadata-allow-list.md"]
67
+ "pal_found_cli.language_models" = ["metadata-allow-list.md"]
68
+ "pal_found_cli.models" = ["metadata-allow-list.md"]
69
+ "pal_found_cli.orchestration" = ["metadata-allow-list.md"]
70
+ "pal_found_cli.sql_queries" = ["metadata-allow-list.md"]
71
+ "pal_found_cli.streams" = ["metadata-allow-list.md"]
72
+ "pal_found_cli.connectivity" = ["metadata-allow-list.md"]
73
+ "pal_found_cli.media_sets" = ["metadata-allow-list.md"]
74
+ "pal_found_cli.checkpoints" = ["metadata-allow-list.md"]
75
+ "pal_found_cli.data_health" = ["metadata-allow-list.md"]
76
+ "pal_found_cli.third_party_applications" = ["metadata-allow-list.md"]
77
+ "pal_found_cli.widgets" = ["metadata-allow-list.md"]
78
+
79
+ [tool.pytest.ini_options]
80
+ testpaths = ["tests"]
81
+ asyncio_mode = "auto"
82
+
83
+ [tool.mypy]
84
+ python_version = "3.11"
85
+ mypy_path = "src"
86
+ check_untyped_defs = true
87
+ warn_return_any = true
88
+ warn_unused_configs = true
89
+
90
+ [tool.ruff.lint]
91
+ select = ["E", "F"]
92
+ ignore = ["E501"]
93
+
94
+ [tool.ruff.lint.per-file-ignores]
95
+ "src/pal_found_cli/ontologies/scripts/*.py" = ["E402"]
96
+ "src/pal_found_cli/filesystem/scripts/*.py" = ["E402"]
97
+ "src/pal_found_cli/functions/scripts/*.py" = ["E402"]
98
+ "src/pal_found_cli/admin/scripts/*.py" = ["E402"]
99
+ "src/pal_found_cli/audit/scripts/*.py" = ["E402"]
100
+ "src/pal_found_cli/aip_agents/scripts/*.py" = ["E402"]
101
+ "src/pal_found_cli/language_models/scripts/*.py" = ["E402"]
102
+ "src/pal_found_cli/models/scripts/*.py" = ["E402"]
103
+ "src/pal_found_cli/orchestration/scripts/*.py" = ["E402"]
104
+ "src/pal_found_cli/sql_queries/scripts/*.py" = ["E402"]
105
+ "src/pal_found_cli/streams/scripts/*.py" = ["E402"]
106
+ "src/pal_found_cli/connectivity/scripts/*.py" = ["E402"]
107
+ "src/pal_found_cli/media_sets/scripts/*.py" = ["E402"]
108
+ "src/pal_found_cli/checkpoints/scripts/*.py" = ["E402"]
109
+ "src/pal_found_cli/data_health/scripts/*.py" = ["E402"]
110
+ "src/pal_found_cli/third_party_applications/scripts/*.py" = ["E402"]
111
+ "src/pal_found_cli/widgets/scripts/*.py" = ["E402"]
112
+ "tests/*.py" = ["E402", "E741", "F401", "F841"]
113
+
114
+ [tool.coverage.run]
115
+ source = ["pal_found_cli"]
116
+ branch = true
117
+ omit = [
118
+ "tests/*",
119
+ "**/__pycache__/*",
120
+ "src/pal_found_cli/datasets/scripts/pal_found_datasets_cli.py",
121
+ "src/pal_found_cli/filesystem/scripts/pal_found_filesystem_cli.py",
122
+ "src/pal_found_cli/ontologies/scripts/pal_found_ontologies_cli.py",
123
+ "src/pal_found_cli/audit/scripts/pal_found_audit_cli.py",
124
+ ]
125
+
126
+ [tool.coverage.report]
127
+ show_missing = true
128
+ fail_under = 80
129
+ exclude_lines = [
130
+ "pragma: no cover",
131
+ "if TYPE_CHECKING:",
132
+ "def __repr__",
133
+ ]
134
+
135
+ [tool.coverage.xml]
136
+ output = "coverage.xml"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1 @@
1
+ """Foundry CLI — Agentic toolset for Palantir Foundry API v2."""