datoon 1.7.0__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 (124) hide show
  1. datoon-1.7.0/.agents/plugins/marketplace.json +20 -0
  2. datoon-1.7.0/.claude-plugin/marketplace.json +17 -0
  3. datoon-1.7.0/.claude-plugin/plugin.json +19 -0
  4. datoon-1.7.0/.editorconfig +12 -0
  5. datoon-1.7.0/.gitattributes +1 -0
  6. datoon-1.7.0/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  7. datoon-1.7.0/.github/ISSUE_TEMPLATE/feature_request.md +18 -0
  8. datoon-1.7.0/.github/dependabot.yml +13 -0
  9. datoon-1.7.0/.github/workflows/package-installer-smoke.yml +51 -0
  10. datoon-1.7.0/.github/workflows/pages.yml +50 -0
  11. datoon-1.7.0/.github/workflows/pre-commit.yml +26 -0
  12. datoon-1.7.0/.github/workflows/publish-mcp.yml +70 -0
  13. datoon-1.7.0/.github/workflows/publish.yml +45 -0
  14. datoon-1.7.0/.github/workflows/release.yml +43 -0
  15. datoon-1.7.0/.github/workflows/tests.yml +43 -0
  16. datoon-1.7.0/.github/workflows/validate-artifacts.yml +32 -0
  17. datoon-1.7.0/.github/workflows/workflow-lint.yml +45 -0
  18. datoon-1.7.0/.gitignore +46 -0
  19. datoon-1.7.0/.pre-commit-config.yaml +22 -0
  20. datoon-1.7.0/.releaserc.yaml +19 -0
  21. datoon-1.7.0/CHANGELOG.md +97 -0
  22. datoon-1.7.0/CLAUDE.md +175 -0
  23. datoon-1.7.0/CONTRIBUTING.md +129 -0
  24. datoon-1.7.0/INSTALL.md +293 -0
  25. datoon-1.7.0/LICENSE +21 -0
  26. datoon-1.7.0/MARKETPLACES.md +89 -0
  27. datoon-1.7.0/PKG-INFO +544 -0
  28. datoon-1.7.0/README.md +484 -0
  29. datoon-1.7.0/SECURITY.md +21 -0
  30. datoon-1.7.0/SKILL.md +59 -0
  31. datoon-1.7.0/assets/datoon-banner.svg +186 -0
  32. datoon-1.7.0/benchmarks/agent_skill_eval/REPORT.md +79 -0
  33. datoon-1.7.0/benchmarks/agent_skill_eval/agent_results.json +452 -0
  34. datoon-1.7.0/benchmarks/agent_skill_eval/expected_answers.json +137 -0
  35. datoon-1.7.0/benchmarks/agent_skill_eval/generate_payloads.py +130 -0
  36. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/1_large.json +4057 -0
  37. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/1_medium.json +682 -0
  38. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/1_small.json +52 -0
  39. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/2_large.json +4057 -0
  40. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/2_medium.json +682 -0
  41. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/2_small.json +52 -0
  42. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/3_large.json +4057 -0
  43. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/3_medium.json +682 -0
  44. datoon-1.7.0/benchmarks/agent_skill_eval/payloads/3_small.json +52 -0
  45. datoon-1.7.0/benchmarks/agent_skill_eval/reports/1_large.report.json +14 -0
  46. datoon-1.7.0/benchmarks/agent_skill_eval/reports/1_medium.report.json +14 -0
  47. datoon-1.7.0/benchmarks/agent_skill_eval/reports/1_small.report.json +14 -0
  48. datoon-1.7.0/benchmarks/agent_skill_eval/reports/2_large.report.json +14 -0
  49. datoon-1.7.0/benchmarks/agent_skill_eval/reports/2_medium.report.json +14 -0
  50. datoon-1.7.0/benchmarks/agent_skill_eval/reports/2_small.report.json +14 -0
  51. datoon-1.7.0/benchmarks/agent_skill_eval/reports/3_large.report.json +14 -0
  52. datoon-1.7.0/benchmarks/agent_skill_eval/reports/3_medium.report.json +14 -0
  53. datoon-1.7.0/benchmarks/agent_skill_eval/reports/3_small.report.json +14 -0
  54. datoon-1.7.0/benchmarks/agent_skill_eval/scored_agent_results.json +488 -0
  55. datoon-1.7.0/benchmarks/agent_skill_eval/toon/1_large.toon +454 -0
  56. datoon-1.7.0/benchmarks/agent_skill_eval/toon/1_medium.toon +79 -0
  57. datoon-1.7.0/benchmarks/agent_skill_eval/toon/1_small.toon +9 -0
  58. datoon-1.7.0/benchmarks/agent_skill_eval/toon/2_large.toon +454 -0
  59. datoon-1.7.0/benchmarks/agent_skill_eval/toon/2_medium.toon +79 -0
  60. datoon-1.7.0/benchmarks/agent_skill_eval/toon/2_small.toon +9 -0
  61. datoon-1.7.0/benchmarks/agent_skill_eval/toon/3_large.toon +454 -0
  62. datoon-1.7.0/benchmarks/agent_skill_eval/toon/3_medium.toon +79 -0
  63. datoon-1.7.0/benchmarks/agent_skill_eval/toon/3_small.toon +9 -0
  64. datoon-1.7.0/benchmarks/payloads.json +218 -0
  65. datoon-1.7.0/benchmarks/results/.gitkeep +0 -0
  66. datoon-1.7.0/benchmarks/run.py +472 -0
  67. datoon-1.7.0/datoon/SKILL.md +59 -0
  68. datoon-1.7.0/datoon.skill +0 -0
  69. datoon-1.7.0/docs/.nojekyll +0 -0
  70. datoon-1.7.0/docs/app.js +50 -0
  71. datoon-1.7.0/docs/assets/datoon-banner.svg +161 -0
  72. datoon-1.7.0/docs/index.html +202 -0
  73. datoon-1.7.0/docs/styles.css +484 -0
  74. datoon-1.7.0/glama.json +6 -0
  75. datoon-1.7.0/install.sh +6 -0
  76. datoon-1.7.0/plugins/datoon/.codex-plugin/plugin.json +35 -0
  77. datoon-1.7.0/plugins/datoon/skills/datoon/SKILL.md +59 -0
  78. datoon-1.7.0/pyproject.toml +65 -0
  79. datoon-1.7.0/scripts/ab_skill_benchmark.py +672 -0
  80. datoon-1.7.0/scripts/install.py +439 -0
  81. datoon-1.7.0/scripts/summarize_agent_skill_eval.py +374 -0
  82. datoon-1.7.0/scripts/validate_plugin_metadata.py +225 -0
  83. datoon-1.7.0/scripts/validate_skill_sync.py +93 -0
  84. datoon-1.7.0/server.json +37 -0
  85. datoon-1.7.0/setup.cfg +4 -0
  86. datoon-1.7.0/setup.sh +118 -0
  87. datoon-1.7.0/skills/datoon/README.md +54 -0
  88. datoon-1.7.0/skills/datoon/SKILL.md +59 -0
  89. datoon-1.7.0/smithery.yaml +18 -0
  90. datoon-1.7.0/src/datoon/__init__.py +31 -0
  91. datoon-1.7.0/src/datoon/_version.py +24 -0
  92. datoon-1.7.0/src/datoon/analyzer.py +89 -0
  93. datoon-1.7.0/src/datoon/cli.py +197 -0
  94. datoon-1.7.0/src/datoon/converter.py +165 -0
  95. datoon-1.7.0/src/datoon/mcp_server.py +140 -0
  96. datoon-1.7.0/src/datoon/models.py +65 -0
  97. datoon-1.7.0/src/datoon/py.typed +0 -0
  98. datoon-1.7.0/src/datoon/readers/__init__.py +98 -0
  99. datoon-1.7.0/src/datoon/readers/columnar.py +42 -0
  100. datoon-1.7.0/src/datoon/readers/csv.py +35 -0
  101. datoon-1.7.0/src/datoon/readers/excel.py +31 -0
  102. datoon-1.7.0/src/datoon/readers/jsonl.py +27 -0
  103. datoon-1.7.0/src/datoon/readers/numbers.py +30 -0
  104. datoon-1.7.0/src/datoon/readers/xml.py +58 -0
  105. datoon-1.7.0/src/datoon/readers/yaml.py +30 -0
  106. datoon-1.7.0/src/datoon.egg-info/PKG-INFO +544 -0
  107. datoon-1.7.0/src/datoon.egg-info/SOURCES.txt +122 -0
  108. datoon-1.7.0/src/datoon.egg-info/dependency_links.txt +1 -0
  109. datoon-1.7.0/src/datoon.egg-info/entry_points.txt +3 -0
  110. datoon-1.7.0/src/datoon.egg-info/requires.txt +27 -0
  111. datoon-1.7.0/src/datoon.egg-info/scm_file_list.json +117 -0
  112. datoon-1.7.0/src/datoon.egg-info/scm_version.json +8 -0
  113. datoon-1.7.0/src/datoon.egg-info/top_level.txt +1 -0
  114. datoon-1.7.0/tests/fixtures/users.expected.toon +4 -0
  115. datoon-1.7.0/tests/fixtures/users.json +19 -0
  116. datoon-1.7.0/tests/integration/test_toon_cli_integration.py +68 -0
  117. datoon-1.7.0/tests/unit/test_analyzer.py +75 -0
  118. datoon-1.7.0/tests/unit/test_cli.py +282 -0
  119. datoon-1.7.0/tests/unit/test_converter_policy.py +184 -0
  120. datoon-1.7.0/tests/unit/test_installer.py +258 -0
  121. datoon-1.7.0/tests/unit/test_mcp_server.py +204 -0
  122. datoon-1.7.0/tests/unit/test_models.py +42 -0
  123. datoon-1.7.0/tests/unit/test_readers.py +269 -0
  124. datoon-1.7.0/uv.lock +1395 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "datoon-repo",
3
+ "interface": {
4
+ "displayName": "Datoon Repo"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "datoon",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./plugins/datoon"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_INSTALL"
16
+ },
17
+ "category": "Productivity"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
+ "name": "datoon",
4
+ "description": "Smart JSON-to-TOON conversion with pragmatic auto-gating for LLM prompts.",
5
+ "owner": {
6
+ "name": "Andrii Suruhov",
7
+ "url": "https://github.com/andrii-su"
8
+ },
9
+ "plugins": [
10
+ {
11
+ "name": "datoon",
12
+ "description": "Auto-convert structured JSON to TOON only when token savings are meaningful.",
13
+ "source": "./",
14
+ "category": "productivity"
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "datoon",
3
+ "version": "1.4.1",
4
+ "description": "Smart JSON-to-TOON conversion with pragmatic auto-gating for LLM prompts.",
5
+ "author": {
6
+ "name": "Andrii Suruhov",
7
+ "url": "https://github.com/andrii-su"
8
+ },
9
+ "homepage": "https://github.com/andrii-su/datoon",
10
+ "repository": "https://github.com/andrii-su/datoon",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "llm",
14
+ "prompt-engineering",
15
+ "json",
16
+ "toon",
17
+ "data"
18
+ ]
19
+ }
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = space
8
+ indent_size = 4
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
@@ -0,0 +1 @@
1
+ *.skill binary
@@ -0,0 +1,27 @@
1
+ ______________________________________________________________________
2
+
3
+ ## name: Bug report about: Datoon behavior is incorrect or broken labels: bug
4
+
5
+ **What happened**
6
+
7
+ <!-- What datoon did wrong -->
8
+
9
+ **Expected**
10
+
11
+ <!-- What datoon should do -->
12
+
13
+ **Before/after example**
14
+
15
+ ```
16
+ Input: [your data/prompt]
17
+ Got: [current behavior]
18
+ Want: [expected behavior]
19
+ ```
20
+
21
+ **Platform**
22
+
23
+ - [ ] Claude Code
24
+ - [ ] Codex
25
+ - [ ] Other: \_\_\_
26
+
27
+ **Version / install method**
@@ -0,0 +1,18 @@
1
+ ______________________________________________________________________
2
+
3
+ ## name: Feature request about: Suggest an improvement for datoon labels: enhancement
4
+
5
+ **What you want**
6
+
7
+ <!-- New behavior, new rule, or integration -->
8
+
9
+ **Before/after example**
10
+
11
+ ```
12
+ Before: [current behavior]
13
+ After: [desired behavior]
14
+ ```
15
+
16
+ **Why this is useful**
17
+
18
+ <!-- Why this helps users -->
@@ -0,0 +1,13 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "uv"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 10
8
+
9
+ - package-ecosystem: "github-actions"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
13
+ open-pull-requests-limit: 10
@@ -0,0 +1,51 @@
1
+ name: Package and Installer Smoke
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ concurrency:
10
+ group: package-installer-smoke-${{ github.event.pull_request.number || github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ package-installer-smoke:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v6
19
+
20
+ - name: Setup Python
21
+ uses: actions/setup-python@v6
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Setup uv
26
+ uses: astral-sh/setup-uv@v7
27
+
28
+ - name: Build package
29
+ run: uv build
30
+
31
+ - name: Install wheel and smoke CLI
32
+ run: |
33
+ python -m venv .smoke-venv
34
+ . .smoke-venv/bin/activate
35
+ python -m pip install --upgrade pip
36
+ python -m pip install dist/*.whl
37
+ datoon --help
38
+
39
+ - name: Smoke installer list and dry-run
40
+ run: |
41
+ python scripts/install.py \
42
+ --list \
43
+ --mcp-config "$RUNNER_TEMP/datoon-mcp.json" \
44
+ --codex-marketplace "$RUNNER_TEMP/codex-marketplace.json"
45
+ python scripts/install.py \
46
+ --dry-run \
47
+ --mcp-config "$RUNNER_TEMP/datoon-mcp.json" \
48
+ --codex-marketplace "$RUNNER_TEMP/codex-marketplace.json"
49
+
50
+ - name: Run installer unit tests
51
+ run: uv run --with ".[dev]" pytest tests/unit/test_installer.py
@@ -0,0 +1,50 @@
1
+ name: Docs
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches:
7
+ - main
8
+ paths:
9
+ - docs/**
10
+ - .github/workflows/pages.yml
11
+
12
+ permissions:
13
+ contents: read
14
+ pages: write
15
+ id-token: write
16
+
17
+ concurrency:
18
+ group: pages
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ deploy:
23
+ environment:
24
+ name: github-pages
25
+ url: ${{ steps.deployment.outputs.page_url || '' }}
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - name: Checkout
29
+ uses: actions/checkout@v6
30
+
31
+ - name: Setup Pages
32
+ id: setup_pages
33
+ uses: actions/configure-pages@v6
34
+ continue-on-error: true
35
+
36
+ - name: Skip when Pages is not enabled
37
+ if: steps.setup_pages.outcome != 'success'
38
+ run: |
39
+ echo "::notice title=Pages disabled::GitHub Pages is not enabled for this repository yet. Skipping docs deployment."
40
+
41
+ - name: Upload docs artifact
42
+ if: steps.setup_pages.outcome == 'success'
43
+ uses: actions/upload-pages-artifact@v5
44
+ with:
45
+ path: docs
46
+
47
+ - name: Deploy to GitHub Pages
48
+ if: steps.setup_pages.outcome == 'success'
49
+ id: deployment
50
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,26 @@
1
+ name: Pre-commit
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ concurrency:
10
+ group: pre-commit-${{ github.event.pull_request.number || github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ lint:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v6
19
+
20
+ - name: Setup uv
21
+ uses: astral-sh/setup-uv@v7
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Run pre-commit
26
+ run: uvx pre-commit run --all-files
@@ -0,0 +1,70 @@
1
+ name: Publish to MCP Registry
2
+
3
+ # Publishes server.json to the official MCP Registry after a GitHub Release.
4
+ # Ownership is proven via GitHub OIDC (namespace io.github.andrii-su/*) and the
5
+ # `mcp-name: io.github.andrii-su/datoon` token in the PyPI package README.
6
+ #
7
+ # Runs after publish.yml has pushed the tagged version to PyPI, so the registry
8
+ # can validate the package + ownership token for the released version.
9
+
10
+ on:
11
+ release:
12
+ types: [published]
13
+ workflow_dispatch:
14
+
15
+ permissions:
16
+ contents: read
17
+ id-token: write
18
+
19
+ jobs:
20
+ publish:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v6
24
+
25
+ - name: Resolve release version
26
+ id: version
27
+ run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
28
+
29
+ - name: Sync server.json version to release tag
30
+ if: github.event_name == 'release'
31
+ run: |
32
+ version="${{ steps.version.outputs.version }}"
33
+ tmp="$(mktemp)"
34
+ jq --arg v "$version" \
35
+ '.version = $v | .packages[0].version = $v' \
36
+ server.json > "$tmp"
37
+ mv "$tmp" server.json
38
+ cat server.json
39
+
40
+ - name: Install mcp-publisher
41
+ run: |
42
+ curl -sSL "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" \
43
+ | tar -xz mcp-publisher
44
+ sudo mv mcp-publisher /usr/local/bin/
45
+
46
+ - name: Validate server.json
47
+ run: mcp-publisher validate
48
+
49
+ - name: Wait for the released version to appear on PyPI
50
+ if: github.event_name == 'release'
51
+ run: |
52
+ version="${{ steps.version.outputs.version }}"
53
+ url="https://pypi.org/pypi/datoon/${version}/json"
54
+ for attempt in $(seq 1 30); do
55
+ code="$(curl -s -o /dev/null -w '%{http_code}' "$url")"
56
+ if [ "$code" = "200" ]; then
57
+ echo "datoon ${version} is live on PyPI."
58
+ exit 0
59
+ fi
60
+ echo "Attempt ${attempt}: PyPI returned ${code} for ${version}; retrying in 20s..."
61
+ sleep 20
62
+ done
63
+ echo "::error::datoon ${version} did not appear on PyPI in time." >&2
64
+ exit 1
65
+
66
+ - name: Login via GitHub OIDC
67
+ run: mcp-publisher login github-oidc
68
+
69
+ - name: Publish to MCP Registry
70
+ run: mcp-publisher publish
@@ -0,0 +1,45 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+ id-token: write
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v6
16
+ with:
17
+ fetch-depth: 0
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v7
21
+
22
+ - name: Build distributions
23
+ run: uv build
24
+
25
+ - name: Upload distributions
26
+ uses: actions/upload-artifact@v7
27
+ with:
28
+ name: dist
29
+ path: dist/
30
+
31
+ publish:
32
+ needs: build
33
+ runs-on: ubuntu-latest
34
+ environment:
35
+ name: pypi
36
+ url: https://pypi.org/project/datoon/
37
+ steps:
38
+ - name: Download distributions
39
+ uses: actions/download-artifact@v8
40
+ with:
41
+ name: dist
42
+ path: dist/
43
+
44
+ - name: Publish to PyPI
45
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,43 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ permissions:
9
+ contents: write
10
+ issues: write
11
+ pull-requests: write
12
+
13
+ jobs:
14
+ release:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v6
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Setup Node.js
23
+ uses: actions/setup-node@v6
24
+ with:
25
+ node-version: "22"
26
+
27
+ - name: Setup Python
28
+ uses: actions/setup-python@v6
29
+ with:
30
+ python-version: "3.12"
31
+
32
+ - name: Run semantic-release
33
+ env:
34
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35
+ run: |
36
+ npx --yes \
37
+ -p semantic-release \
38
+ -p @semantic-release/changelog \
39
+ -p @semantic-release/commit-analyzer \
40
+ -p @semantic-release/release-notes-generator \
41
+ -p @semantic-release/github \
42
+ -p @semantic-release/git \
43
+ semantic-release
@@ -0,0 +1,43 @@
1
+ name: Tests
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ concurrency:
10
+ group: tests-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ unit-tests:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v6
19
+
20
+ - name: Setup uv
21
+ uses: astral-sh/setup-uv@v7
22
+
23
+ - name: Run unit tests
24
+ run: uv run --with ".[dev]" pytest -m "not integration"
25
+
26
+ integration-tests:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - name: Checkout
30
+ uses: actions/checkout@v6
31
+
32
+ - name: Setup uv
33
+ uses: astral-sh/setup-uv@v7
34
+ with:
35
+ python-version: "3.12"
36
+
37
+ - name: Setup Node
38
+ uses: actions/setup-node@v6
39
+ with:
40
+ node-version: "22"
41
+
42
+ - name: Run integration tests
43
+ run: uv run --with ".[dev]" pytest -m integration
@@ -0,0 +1,32 @@
1
+ name: Validate Artifacts
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ concurrency:
10
+ group: validate-artifacts-${{ github.event.pull_request.number || github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ validate:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v6
22
+
23
+ - name: Setup Python
24
+ uses: actions/setup-python@v6
25
+ with:
26
+ python-version: "3.12"
27
+
28
+ - name: Validate skill sync
29
+ run: python scripts/validate_skill_sync.py
30
+
31
+ - name: Validate plugin metadata
32
+ run: python scripts/validate_plugin_metadata.py
@@ -0,0 +1,45 @@
1
+ name: Workflow lint
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - .github/workflows/**
7
+ push:
8
+ branches:
9
+ - main
10
+ paths:
11
+ - .github/workflows/**
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: workflow-lint-${{ github.event.pull_request.number || github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ jobs:
21
+ actionlint:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
26
+ with:
27
+ persist-credentials: false
28
+
29
+ - name: Run actionlint
30
+ run: |
31
+ go install github.com/rhysd/actionlint/cmd/actionlint@v1.7.7
32
+ "$(go env GOPATH)/bin/actionlint"
33
+
34
+ zizmor:
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - name: Checkout
38
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
39
+ with:
40
+ persist-credentials: false
41
+
42
+ - name: Audit workflows
43
+ run: |
44
+ python3 -m pip install --user zizmor==1.25.2
45
+ "$HOME/.local/bin/zizmor" --format=github --no-exit-codes .github/workflows
@@ -0,0 +1,46 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.pyo
5
+ *.pyd
6
+ .python-version
7
+ .venv/
8
+ venv/
9
+ env/
10
+
11
+ # Packaging
12
+ build/
13
+ dist/
14
+ *.egg-info/
15
+ .eggs/
16
+
17
+ # Tooling
18
+ .mypy_cache/
19
+ .pytest_cache/
20
+ .ruff_cache/
21
+ .coverage
22
+ coverage.xml
23
+
24
+ # IDE/OS
25
+ .DS_Store
26
+ .idea/
27
+ .vscode/
28
+
29
+ # Node (optional local caching/tooling)
30
+ node_modules/
31
+
32
+ # Logs
33
+ *.log
34
+
35
+ # Benchmark artifacts
36
+ benchmarks/results/*.json
37
+ benchmarks/results/**/*.json
38
+ !benchmarks/results/.gitkeep
39
+
40
+ # Local Codex/Claude artifacts
41
+ .agents/skills/
42
+ .claude/
43
+ skills-lock.json
44
+
45
+ # Generated by setuptools-scm during local builds/tests
46
+ src/datoon/_version.py
@@ -0,0 +1,22 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v5.0.0
4
+ hooks:
5
+ - id: check-json
6
+ - id: check-yaml
7
+ - id: end-of-file-fixer
8
+ - id: trailing-whitespace
9
+ - id: check-merge-conflict
10
+
11
+ - repo: https://github.com/astral-sh/ruff-pre-commit
12
+ rev: v0.13.2
13
+ hooks:
14
+ - id: ruff
15
+ args: [--fix]
16
+ - id: ruff-format
17
+
18
+ - repo: https://github.com/executablebooks/mdformat
19
+ rev: 0.7.22
20
+ hooks:
21
+ - id: mdformat
22
+ exclude: (^|/)(CHANGELOG\.md|SKILL\.md)$
@@ -0,0 +1,19 @@
1
+ branches:
2
+ - main
3
+ tagFormat: v${version}
4
+ plugins:
5
+ - "@semantic-release/commit-analyzer"
6
+ - "@semantic-release/release-notes-generator"
7
+ - - "@semantic-release/changelog"
8
+ - changelogFile: CHANGELOG.md
9
+ - - "@semantic-release/github"
10
+ - assets:
11
+ - path: datoon.skill
12
+ label: datoon.skill
13
+ - - "@semantic-release/git"
14
+ - assets:
15
+ - CHANGELOG.md
16
+ message: |-
17
+ chore(release): ${nextRelease.version} [skip ci]
18
+
19
+ ${nextRelease.notes}