tinymoon 0.0.1__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.
@@ -0,0 +1,33 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ # Per-SHA group: re-runs of the same commit dedupe, but a new commit never
11
+ # cancels an earlier commit's in-flight run (release CI conclusions stay intact).
12
+ concurrency:
13
+ group: ${{ github.workflow_ref }}-${{ github.sha }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ matrix:
21
+ # requires-python: >= 3.11
22
+ python-version: ["3.12", "3.13", "3.14"]
23
+ steps:
24
+ - uses: actions/checkout@v6
25
+ - uses: astral-sh/setup-uv@v7
26
+ - run: uv python install ${{ matrix.python-version }}
27
+ - run: uv sync --locked
28
+ - run: uv run python -c "import tinymoon"
29
+ - name: Install gitleaks
30
+ run: |
31
+ GITLEAKS_VERSION=8.24.3
32
+ curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" | tar xz -C /usr/local/bin gitleaks
33
+ - run: uv run pytest
@@ -0,0 +1,168 @@
1
+ name: Publish
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ concurrency:
7
+ group: ${{ github.workflow_ref }}-${{ github.ref }}
8
+ cancel-in-progress: false
9
+ permissions:
10
+ contents: read
11
+ id-token: write
12
+ jobs:
13
+ gate:
14
+ name: Gate on CI
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ checks: read
18
+ env:
19
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
20
+ GATE_TIMEOUT_MINUTES: '20'
21
+ GATE_GRACE_MINUTES: '5'
22
+ GATE_POLL_SECONDS: '15'
23
+ CI_CHECK_REGEX: ^(test)( \(.*\))?$
24
+ steps:
25
+ - name: Wait for CI to succeed on the release commit
26
+ run: |
27
+ set -euo pipefail
28
+
29
+ # Ref-based commit resolution: GITHUB_SHA is the tag's commit for both
30
+ # release-triggered runs and workflow_dispatch retries at the tag ref.
31
+ # Never read the release event payload -- dispatch retries have none.
32
+ sha="$GITHUB_SHA"
33
+ echo "Publish gate: waiting for CI on $GITHUB_REF_NAME (commit $sha)"
34
+ echo "Check-run name filter: $CI_CHECK_REGEX"
35
+ # Timeout, grace window, and poll interval come from the job env above;
36
+ # edit them there if this repository's CI needs different limits.
37
+
38
+ now() { date +%s; }
39
+ start="$(now)"
40
+ deadline=$(( start + GATE_TIMEOUT_MINUTES * 60 ))
41
+ grace_deadline=$(( start + GATE_GRACE_MINUTES * 60 ))
42
+
43
+ while :; do
44
+ if ! resp="$(gh api --paginate "repos/$GITHUB_REPOSITORY/commits/$sha/check-runs?per_page=100")"; then
45
+ echo "Checks API request failed; retrying in ${GATE_POLL_SECONDS}s..."
46
+ sleep "$GATE_POLL_SECONDS"
47
+ continue
48
+ fi
49
+ # Match this project's CI check runs by name; exclude check runs that
50
+ # belong to THIS workflow run (the gate itself and the queued publish
51
+ # jobs would otherwise deadlock the poll loop).
52
+ runs="$(jq -s --arg re "$CI_CHECK_REGEX" --arg run_id "$GITHUB_RUN_ID" '
53
+ [ .[].check_runs[]
54
+ | select(.name | test($re))
55
+ | select((.details_url // "") | contains("/actions/runs/" + $run_id + "/") | not)
56
+ | {name, status, conclusion} ]' <<< "$resp")"
57
+ total="$(jq 'length' <<< "$runs")"
58
+
59
+ if [ "$total" -eq 0 ]; then
60
+ if [ "$(now)" -ge "$grace_deadline" ]; then
61
+ echo "::error::Publish gate: no CI check runs matching $CI_CHECK_REGEX appeared on $sha within $GATE_GRACE_MINUTES minutes."
62
+ echo "A scaffolded repository always has a CI workflow, so the release commit must produce CI check runs."
63
+ echo "If CI jobs were renamed, update CI_CHECK_REGEX in this workflow's gate job to match the new names."
64
+ exit 1
65
+ fi
66
+ echo "No matching CI check runs yet; retrying in ${GATE_POLL_SECONDS}s..."
67
+ sleep "$GATE_POLL_SECONDS"
68
+ continue
69
+ fi
70
+
71
+ pending="$(jq '[ .[] | select(.status != "completed") ] | length' <<< "$runs")"
72
+ if [ "$pending" -gt 0 ]; then
73
+ if [ "$(now)" -ge "$deadline" ]; then
74
+ echo "::error::Publish gate: timed out after $GATE_TIMEOUT_MINUTES minutes waiting for CI to complete on $sha."
75
+ jq -r '.[] | " \(.name): status=\(.status) conclusion=\(.conclusion // "none")"' <<< "$runs"
76
+ exit 1
77
+ fi
78
+ echo "$pending of $total matching CI check runs still running; retrying in ${GATE_POLL_SECONDS}s..."
79
+ sleep "$GATE_POLL_SECONDS"
80
+ continue
81
+ fi
82
+
83
+ not_success="$(jq '[ .[] | select(.conclusion != "success") ]' <<< "$runs")"
84
+ if [ "$(jq 'length' <<< "$not_success")" -gt 0 ]; then
85
+ echo "::error::Publish gate: CI did not pass on $sha -- refusing to publish."
86
+ jq -r '.[] | " \(.name): \(.conclusion)"' <<< "$not_success"
87
+ while IFS= read -r conclusion; do
88
+ case "$conclusion" in
89
+ failure|timed_out)
90
+ echo "CI concluded '$conclusion' on the release commit. Fix the failure, re-run the CI workflow to green on this exact commit (gh run rerun <run-id>), then re-dispatch this publish workflow at the tag ref: gh workflow run <publish workflow> --ref $GITHUB_REF_NAME"
91
+ ;;
92
+ cancelled)
93
+ echo "A CI check run was CANCELLED. A cancelled run proves nothing about the commit, so the gate treats it as a hard failure instead of waiting for a conclusion that will never come. Re-run the cancelled CI workflow (gh run rerun <run-id>), then re-dispatch this publish workflow at the tag ref."
94
+ ;;
95
+ skipped)
96
+ echo "A CI check run matching the filter was SKIPPED. The gate cannot treat a skipped check as passing: this project's own CI must actually run on the release commit. Check paths filters and job conditions, re-run CI on this commit, then re-dispatch this publish workflow at the tag ref."
97
+ ;;
98
+ *)
99
+ echo "CI check concluded '$conclusion' (not success). The gate only proceeds when every matching check concluded success."
100
+ ;;
101
+ esac
102
+ done <<< "$(jq -r '.[].conclusion' <<< "$not_success" | sort -u)"
103
+ exit 1
104
+ fi
105
+
106
+ echo "Publish gate: all $total matching CI check runs succeeded."
107
+ jq -r '.[] | " \(.name): \(.conclusion)"' <<< "$runs"
108
+ exit 0
109
+ done
110
+ npm:
111
+ needs: gate
112
+ runs-on: ubuntu-latest
113
+ steps:
114
+ - uses: actions/checkout@v6
115
+ - uses: actions/setup-node@v6
116
+ with:
117
+ node-version: 24
118
+ registry-url: https://registry.npmjs.org
119
+ - name: Install gitleaks
120
+ run: |
121
+ GITLEAKS_VERSION=8.24.3
122
+ curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" | tar xz -C /usr/local/bin gitleaks
123
+ - name: Scan source for secrets
124
+ run: |
125
+ gitleaks dir .
126
+ - name: Check if already published
127
+ id: check-npm
128
+ run: |
129
+ PKG_NAME=$(node -p "require('./package.json').name")
130
+ PKG_VERSION=$(node -p "require('./package.json').version")
131
+ if npm view "${PKG_NAME}@${PKG_VERSION}" version 2>/dev/null; then
132
+ echo "skip=true" >> "$GITHUB_OUTPUT"
133
+ echo "Already published: ${PKG_NAME}@${PKG_VERSION}"
134
+ fi
135
+ - name: Determine dist-tag
136
+ id: dist-tag
137
+ run: |
138
+ PKG_VERSION=$(node -p "require('./package.json').version")
139
+ if echo "$PKG_VERSION" | grep -q '-'; then
140
+ PREID=$(echo "$PKG_VERSION" | sed 's/[^-]*-//' | sed 's/\.[^.]*$//')
141
+ echo "tag=--tag $PREID" >> "$GITHUB_OUTPUT"
142
+ else
143
+ echo "tag=" >> "$GITHUB_OUTPUT"
144
+ fi
145
+ # --access public is hardcoded on purpose: scoped packages are forbidden
146
+ # in this ecosystem, and unscoped public packages require --access public.
147
+ # --provenance is toggled by the pipeline's `provenance` config key.
148
+ - run: npm publish --access public ${{ steps.dist-tag.outputs.tag }}
149
+ if: steps.check-npm.outputs.skip != 'true'
150
+ env:
151
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
152
+ pypi:
153
+ needs: gate
154
+ runs-on: ubuntu-latest
155
+ steps:
156
+ - uses: actions/checkout@v6
157
+ - uses: astral-sh/setup-uv@v7
158
+ - name: Install gitleaks
159
+ run: |
160
+ GITLEAKS_VERSION=8.24.3
161
+ curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" | tar xz -C /usr/local/bin gitleaks
162
+ - run: uv build --out-dir dist
163
+ - name: Scan artifacts for secrets
164
+ run: |
165
+ gitleaks dir dist/
166
+ - uses: pypa/gh-action-pypi-publish@release/v1
167
+ with:
168
+ skip-existing: true
@@ -0,0 +1,21 @@
1
+ node_modules/
2
+ dist/
3
+ build/
4
+ *.egg-info/
5
+ __pycache__/
6
+ *.pyc
7
+ .venv/
8
+ .pytest_cache/
9
+
10
+ *.log
11
+ .DS_Store
12
+ coverage/
13
+ target/
14
+ .rlsbl-notes-*.tmp
15
+ .rlsbl/lock
16
+ .rlsbl-monorepo/lock
17
+ .credentials.json
18
+ .*-cache.json
19
+ .env
20
+ .env.local
21
+ *.local-only
@@ -0,0 +1,34 @@
1
+ # Development and CI
2
+ tests/
3
+ test/
4
+ __tests__/
5
+ .github/
6
+ scripts/
7
+ docs/
8
+ todo/
9
+ e2e/
10
+
11
+ # rlsbl metadata
12
+ .rlsbl/
13
+ .rlsbl-monorepo/
14
+
15
+ # Python artifacts (for multi-target projects)
16
+ __pycache__/
17
+ *.pyc
18
+ *.py
19
+ *.toml
20
+ .venv/
21
+
22
+ # Build/cache
23
+ coverage/
24
+ .nyc_output/
25
+
26
+ # Editor/OS
27
+ .DS_Store
28
+ *.log
29
+ .env
30
+ .env.local
31
+
32
+ # Selfdoc
33
+ .selfdoc/
34
+ selfdoc.json
@@ -0,0 +1,33 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ # Per-SHA group: re-runs of the same commit dedupe, but a new commit never
11
+ # cancels an earlier commit's in-flight run (release CI conclusions stay intact).
12
+ concurrency:
13
+ group: ${{ github.workflow_ref }}-${{ github.sha }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ matrix:
21
+ # requires-python: >= 3.11
22
+ python-version: ["3.12", "3.13", "3.14"]
23
+ steps:
24
+ - uses: actions/checkout@v6
25
+ - uses: astral-sh/setup-uv@v7
26
+ - run: uv python install ${{ matrix.python-version }}
27
+ - run: uv sync --locked
28
+ - run: uv run python -c "import tinymoon"
29
+ - name: Install gitleaks
30
+ run: |
31
+ GITLEAKS_VERSION=8.24.3
32
+ curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" | tar xz -C /usr/local/bin gitleaks
33
+ - run: uv run pytest
@@ -0,0 +1,168 @@
1
+ name: Publish
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ concurrency:
7
+ group: ${{ github.workflow_ref }}-${{ github.ref }}
8
+ cancel-in-progress: false
9
+ permissions:
10
+ contents: read
11
+ id-token: write
12
+ jobs:
13
+ gate:
14
+ name: Gate on CI
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ checks: read
18
+ env:
19
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
20
+ GATE_TIMEOUT_MINUTES: '20'
21
+ GATE_GRACE_MINUTES: '5'
22
+ GATE_POLL_SECONDS: '15'
23
+ CI_CHECK_REGEX: ^(test)( \(.*\))?$
24
+ steps:
25
+ - name: Wait for CI to succeed on the release commit
26
+ run: |
27
+ set -euo pipefail
28
+
29
+ # Ref-based commit resolution: GITHUB_SHA is the tag's commit for both
30
+ # release-triggered runs and workflow_dispatch retries at the tag ref.
31
+ # Never read the release event payload -- dispatch retries have none.
32
+ sha="$GITHUB_SHA"
33
+ echo "Publish gate: waiting for CI on $GITHUB_REF_NAME (commit $sha)"
34
+ echo "Check-run name filter: $CI_CHECK_REGEX"
35
+ # Timeout, grace window, and poll interval come from the job env above;
36
+ # edit them there if this repository's CI needs different limits.
37
+
38
+ now() { date +%s; }
39
+ start="$(now)"
40
+ deadline=$(( start + GATE_TIMEOUT_MINUTES * 60 ))
41
+ grace_deadline=$(( start + GATE_GRACE_MINUTES * 60 ))
42
+
43
+ while :; do
44
+ if ! resp="$(gh api --paginate "repos/$GITHUB_REPOSITORY/commits/$sha/check-runs?per_page=100")"; then
45
+ echo "Checks API request failed; retrying in ${GATE_POLL_SECONDS}s..."
46
+ sleep "$GATE_POLL_SECONDS"
47
+ continue
48
+ fi
49
+ # Match this project's CI check runs by name; exclude check runs that
50
+ # belong to THIS workflow run (the gate itself and the queued publish
51
+ # jobs would otherwise deadlock the poll loop).
52
+ runs="$(jq -s --arg re "$CI_CHECK_REGEX" --arg run_id "$GITHUB_RUN_ID" '
53
+ [ .[].check_runs[]
54
+ | select(.name | test($re))
55
+ | select((.details_url // "") | contains("/actions/runs/" + $run_id + "/") | not)
56
+ | {name, status, conclusion} ]' <<< "$resp")"
57
+ total="$(jq 'length' <<< "$runs")"
58
+
59
+ if [ "$total" -eq 0 ]; then
60
+ if [ "$(now)" -ge "$grace_deadline" ]; then
61
+ echo "::error::Publish gate: no CI check runs matching $CI_CHECK_REGEX appeared on $sha within $GATE_GRACE_MINUTES minutes."
62
+ echo "A scaffolded repository always has a CI workflow, so the release commit must produce CI check runs."
63
+ echo "If CI jobs were renamed, update CI_CHECK_REGEX in this workflow's gate job to match the new names."
64
+ exit 1
65
+ fi
66
+ echo "No matching CI check runs yet; retrying in ${GATE_POLL_SECONDS}s..."
67
+ sleep "$GATE_POLL_SECONDS"
68
+ continue
69
+ fi
70
+
71
+ pending="$(jq '[ .[] | select(.status != "completed") ] | length' <<< "$runs")"
72
+ if [ "$pending" -gt 0 ]; then
73
+ if [ "$(now)" -ge "$deadline" ]; then
74
+ echo "::error::Publish gate: timed out after $GATE_TIMEOUT_MINUTES minutes waiting for CI to complete on $sha."
75
+ jq -r '.[] | " \(.name): status=\(.status) conclusion=\(.conclusion // "none")"' <<< "$runs"
76
+ exit 1
77
+ fi
78
+ echo "$pending of $total matching CI check runs still running; retrying in ${GATE_POLL_SECONDS}s..."
79
+ sleep "$GATE_POLL_SECONDS"
80
+ continue
81
+ fi
82
+
83
+ not_success="$(jq '[ .[] | select(.conclusion != "success") ]' <<< "$runs")"
84
+ if [ "$(jq 'length' <<< "$not_success")" -gt 0 ]; then
85
+ echo "::error::Publish gate: CI did not pass on $sha -- refusing to publish."
86
+ jq -r '.[] | " \(.name): \(.conclusion)"' <<< "$not_success"
87
+ while IFS= read -r conclusion; do
88
+ case "$conclusion" in
89
+ failure|timed_out)
90
+ echo "CI concluded '$conclusion' on the release commit. Fix the failure, re-run the CI workflow to green on this exact commit (gh run rerun <run-id>), then re-dispatch this publish workflow at the tag ref: gh workflow run <publish workflow> --ref $GITHUB_REF_NAME"
91
+ ;;
92
+ cancelled)
93
+ echo "A CI check run was CANCELLED. A cancelled run proves nothing about the commit, so the gate treats it as a hard failure instead of waiting for a conclusion that will never come. Re-run the cancelled CI workflow (gh run rerun <run-id>), then re-dispatch this publish workflow at the tag ref."
94
+ ;;
95
+ skipped)
96
+ echo "A CI check run matching the filter was SKIPPED. The gate cannot treat a skipped check as passing: this project's own CI must actually run on the release commit. Check paths filters and job conditions, re-run CI on this commit, then re-dispatch this publish workflow at the tag ref."
97
+ ;;
98
+ *)
99
+ echo "CI check concluded '$conclusion' (not success). The gate only proceeds when every matching check concluded success."
100
+ ;;
101
+ esac
102
+ done <<< "$(jq -r '.[].conclusion' <<< "$not_success" | sort -u)"
103
+ exit 1
104
+ fi
105
+
106
+ echo "Publish gate: all $total matching CI check runs succeeded."
107
+ jq -r '.[] | " \(.name): \(.conclusion)"' <<< "$runs"
108
+ exit 0
109
+ done
110
+ npm:
111
+ needs: gate
112
+ runs-on: ubuntu-latest
113
+ steps:
114
+ - uses: actions/checkout@v6
115
+ - uses: actions/setup-node@v6
116
+ with:
117
+ node-version: 24
118
+ registry-url: https://registry.npmjs.org
119
+ - name: Install gitleaks
120
+ run: |
121
+ GITLEAKS_VERSION=8.24.3
122
+ curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" | tar xz -C /usr/local/bin gitleaks
123
+ - name: Scan source for secrets
124
+ run: |
125
+ gitleaks dir .
126
+ - name: Check if already published
127
+ id: check-npm
128
+ run: |
129
+ PKG_NAME=$(node -p "require('./package.json').name")
130
+ PKG_VERSION=$(node -p "require('./package.json').version")
131
+ if npm view "${PKG_NAME}@${PKG_VERSION}" version 2>/dev/null; then
132
+ echo "skip=true" >> "$GITHUB_OUTPUT"
133
+ echo "Already published: ${PKG_NAME}@${PKG_VERSION}"
134
+ fi
135
+ - name: Determine dist-tag
136
+ id: dist-tag
137
+ run: |
138
+ PKG_VERSION=$(node -p "require('./package.json').version")
139
+ if echo "$PKG_VERSION" | grep -q '-'; then
140
+ PREID=$(echo "$PKG_VERSION" | sed 's/[^-]*-//' | sed 's/\.[^.]*$//')
141
+ echo "tag=--tag $PREID" >> "$GITHUB_OUTPUT"
142
+ else
143
+ echo "tag=" >> "$GITHUB_OUTPUT"
144
+ fi
145
+ # --access public is hardcoded on purpose: scoped packages are forbidden
146
+ # in this ecosystem, and unscoped public packages require --access public.
147
+ # --provenance is toggled by the pipeline's `provenance` config key.
148
+ - run: npm publish --access public ${{ steps.dist-tag.outputs.tag }}
149
+ if: steps.check-npm.outputs.skip != 'true'
150
+ env:
151
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
152
+ pypi:
153
+ needs: gate
154
+ runs-on: ubuntu-latest
155
+ steps:
156
+ - uses: actions/checkout@v6
157
+ - uses: astral-sh/setup-uv@v7
158
+ - name: Install gitleaks
159
+ run: |
160
+ GITLEAKS_VERSION=8.24.3
161
+ curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" | tar xz -C /usr/local/bin gitleaks
162
+ - run: uv build --out-dir dist
163
+ - name: Scan artifacts for secrets
164
+ run: |
165
+ gitleaks dir dist/
166
+ - uses: pypa/gh-action-pypi-publish@release/v1
167
+ with:
168
+ skip-existing: true
@@ -0,0 +1,18 @@
1
+ node_modules/
2
+ __pycache__/
3
+ *.pyc
4
+ *.log
5
+ .DS_Store
6
+ coverage/
7
+ build/
8
+ dist/
9
+ target/
10
+ *.egg-info/
11
+ .rlsbl-notes-*.tmp
12
+ .rlsbl/lock
13
+ .rlsbl-monorepo/lock
14
+ .credentials.json
15
+ .*-cache.json
16
+ .env
17
+ .env.local
18
+ *.local-only
@@ -0,0 +1,34 @@
1
+ # Development and CI
2
+ tests/
3
+ test/
4
+ __tests__/
5
+ .github/
6
+ scripts/
7
+ docs/
8
+ todo/
9
+ e2e/
10
+
11
+ # rlsbl metadata
12
+ .rlsbl/
13
+ .rlsbl-monorepo/
14
+
15
+ # Python artifacts (for multi-target projects)
16
+ __pycache__/
17
+ *.pyc
18
+ *.py
19
+ *.toml
20
+ .venv/
21
+
22
+ # Build/cache
23
+ coverage/
24
+ .nyc_output/
25
+
26
+ # Editor/OS
27
+ .DS_Store
28
+ *.log
29
+ .env
30
+ .env.local
31
+
32
+ # Selfdoc
33
+ .selfdoc/
34
+ selfdoc.json
@@ -0,0 +1,19 @@
1
+ [forbidden-imports]
2
+ modules = [
3
+ "express",
4
+ "koa",
5
+ "hono",
6
+ "commander",
7
+ "yargs",
8
+ ]
9
+
10
+ [stdout]
11
+ enabled = true
12
+ ignore = []
13
+
14
+ [entry-point]
15
+ enabled = true
16
+ ignore = []
17
+
18
+ [files]
19
+ exclude = []
@@ -0,0 +1,25 @@
1
+ [forbidden-imports]
2
+ modules = [
3
+ "argparse",
4
+ "click",
5
+ "typer",
6
+ "flask",
7
+ "fastapi",
8
+ "django",
9
+ "uvicorn",
10
+ "granian",
11
+ "starlette",
12
+ "tornado",
13
+ "bottle",
14
+ ]
15
+
16
+ [stdout]
17
+ enabled = true
18
+ ignore = []
19
+
20
+ [entry-point]
21
+ enabled = true
22
+ ignore = []
23
+
24
+ [files]
25
+ exclude = []
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 0.0.1
4
+
5
+ - Initial release
@@ -0,0 +1 @@
1
+ {"id":"18c1cb742e4176b816d6c99cc0964eee9b933cf1494bf447","commits":["7d306cf166784bca8381efd396689a4b40d28df1"],"user_facing":true,"description":"Initial name-reservation placeholder release for npm and PyPI.","type":"feature"}
@@ -0,0 +1,7 @@
1
+ ## 0.0.1
2
+
3
+ Initial placeholder release reserving the tinymoon name on npm and PyPI.
4
+
5
+ ### Features
6
+
7
+ - Initial name-reservation placeholder release for npm and PyPI.
File without changes
@@ -0,0 +1,17 @@
1
+ {
2
+ "targets": [
3
+ "npm",
4
+ "pypi"
5
+ ],
6
+ "private": false,
7
+ "pipelines": {
8
+ "npm": {
9
+ "type": "npm",
10
+ "local": false
11
+ },
12
+ "pypi": {
13
+ "type": "pypi",
14
+ "local": false
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,19 @@
1
+ [forbidden-imports]
2
+ modules = [
3
+ "express",
4
+ "koa",
5
+ "hono",
6
+ "commander",
7
+ "yargs",
8
+ ]
9
+
10
+ [stdout]
11
+ enabled = true
12
+ ignore = []
13
+
14
+ [entry-point]
15
+ enabled = true
16
+ ignore = []
17
+
18
+ [files]
19
+ exclude = []
@@ -0,0 +1,25 @@
1
+ [forbidden-imports]
2
+ modules = [
3
+ "argparse",
4
+ "click",
5
+ "typer",
6
+ "flask",
7
+ "fastapi",
8
+ "django",
9
+ "uvicorn",
10
+ "granian",
11
+ "starlette",
12
+ "tornado",
13
+ "bottle",
14
+ ]
15
+
16
+ [stdout]
17
+ enabled = true
18
+ ignore = []
19
+
20
+ [entry-point]
21
+ enabled = true
22
+ ignore = []
23
+
24
+ [files]
25
+ exclude = []
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "files": {
4
+ ".github/workflows/ci-pypi.yml": "0bf3efb9f0e1ae3b75c2e1b18929bfcee7b69d7341e2093844bcda06a96dedb4",
5
+ ".npmignore": "7c0eea9785c0318aeb39bf8b670ce8384f4a5b812fde69ce23d7d018057325a3",
6
+ ".github/workflows/publish.yml": "7a6fd3cf2ce406e47e74147abd8ef00ed762fa659b9580a4ac1178878b11b17a",
7
+ "CHANGELOG.md": "937fe23a13fe5630f9c78deb1221a0469be62e3e753a9b168d4320e65c93b3f7",
8
+ ".gitignore": "80572c78bfc39d5b9de7b7a327b44934ee8c8205dcf7179ff3594d854bb377b6",
9
+ ".rlsbl/changes/unreleased.jsonl": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
10
+ ".rlsbl/lint/python.toml": "9cfbcef2e010d5fad243437bf2fd8df54a1fae70ee0762f9d11da70fe207501c",
11
+ ".rlsbl/lint/npm.toml": "baa36014e65923d8cc5c8b83c77fa651da79351627570476402da66840027645"
12
+ }
13
+ }
@@ -0,0 +1,12 @@
1
+ # Version bump type: patch, minor, major, hotfix, or prerelease
2
+ bump = "patch"
3
+ # Short description of this release (required)
4
+ description = "Initial placeholder release reserving the tinymoon name on npm and PyPI."
5
+ # Optional context explaining why these changes were made
6
+ context = ""
7
+ # Pre-release identifier: alpha, beta, rc, or stable
8
+ # preid = ""
9
+ # Set to true to generate a blog post for this release
10
+ # blog = false
11
+ include = ["npm", "pypi"]
12
+ exclude = []
@@ -0,0 +1 @@
1
+ 0.104.0
@@ -0,0 +1,11 @@
1
+ <!-- Generated by rlsbl from .rlsbl/changes/ — do not edit -->
2
+
3
+ # Changelog
4
+
5
+ ## 0.0.1
6
+
7
+ Initial placeholder release reserving the tinymoon name on npm and PyPI.
8
+
9
+ ### Features
10
+
11
+ - Initial name-reservation placeholder release for npm and PyPI.
tinymoon-0.0.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 smm-h
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,37 @@
1
+ Metadata-Version: 2.4
2
+ Name: tinymoon
3
+ Version: 0.0.1
4
+ Summary: Zero-dependency vanilla JS/CSS UI framework (placeholder release)
5
+ Project-URL: Homepage, https://github.com/smm-h/tinymoon
6
+ Project-URL: Repository, https://github.com/smm-h/tinymoon
7
+ Author-email: smm-h <smmh72@gmail.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: css,framework,rlsbl,ui,vanilla-js,zero-dependency
11
+ Classifier: Development Status :: 1 - Planning
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: Implementation :: CPython
18
+ Requires-Python: >=3.11
19
+ Description-Content-Type: text/markdown
20
+
21
+ # tinymoon
22
+
23
+ Zero-dependency vanilla JS/CSS UI framework. Currently a name-reservation placeholder — real content coming soon.
24
+
25
+ ## Install
26
+
27
+ npm:
28
+
29
+ ```
30
+ npm install tinymoon
31
+ ```
32
+
33
+ PyPI:
34
+
35
+ ```
36
+ pip install tinymoon
37
+ ```
@@ -0,0 +1,17 @@
1
+ # tinymoon
2
+
3
+ Zero-dependency vanilla JS/CSS UI framework. Currently a name-reservation placeholder — real content coming soon.
4
+
5
+ ## Install
6
+
7
+ npm:
8
+
9
+ ```
10
+ npm install tinymoon
11
+ ```
12
+
13
+ PyPI:
14
+
15
+ ```
16
+ pip install tinymoon
17
+ ```
@@ -0,0 +1,3 @@
1
+ // tinymoon — zero-dependency vanilla JS/CSS UI framework.
2
+ // Placeholder release: no public API yet. Real content coming soon.
3
+ module.exports = {};
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "tinymoon",
3
+ "version": "0.0.1",
4
+ "description": "Zero-dependency vanilla JS/CSS UI framework (placeholder release)",
5
+ "license": "MIT",
6
+ "main": "index.js",
7
+ "files": [
8
+ "index.js",
9
+ "README.md"
10
+ ],
11
+ "repository": "github:smm-h/tinymoon",
12
+ "author": "smm-h",
13
+ "keywords": [
14
+ "ui",
15
+ "framework",
16
+ "vanilla-js",
17
+ "css",
18
+ "zero-dependency",
19
+ "rlsbl"
20
+ ],
21
+ "scripts": {
22
+ "test": "echo \"no tests\" && exit 0"
23
+ }
24
+ }
@@ -0,0 +1,36 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "tinymoon"
7
+ version = "0.0.1"
8
+ description = "Zero-dependency vanilla JS/CSS UI framework (placeholder release)"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [
13
+ { name = "smm-h", email = "smmh72@gmail.com" },
14
+ ]
15
+ keywords = ["ui", "framework", "vanilla-js", "css", "zero-dependency", "rlsbl"]
16
+ classifiers = [
17
+ "Development Status :: 1 - Planning",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Programming Language :: Python :: Implementation :: CPython",
24
+ ]
25
+
26
+ [project.urls]
27
+ Homepage = "https://github.com/smm-h/tinymoon"
28
+ Repository = "https://github.com/smm-h/tinymoon"
29
+
30
+ [tool.hatch.build.targets.wheel]
31
+ packages = ["tinymoon"]
32
+
33
+ [dependency-groups]
34
+ dev = [
35
+ "pytest>=9.1.1",
36
+ ]
@@ -0,0 +1,5 @@
1
+ import tinymoon
2
+
3
+
4
+ def test_version():
5
+ assert tinymoon.__version__ == "0.0.1"
@@ -0,0 +1,6 @@
1
+ """tinymoon — zero-dependency vanilla JS/CSS UI framework.
2
+
3
+ Placeholder release: no public API yet. Real content coming soon.
4
+ """
5
+
6
+ __version__ = "0.0.1"
tinymoon-0.0.1/uv.lock ADDED
@@ -0,0 +1,79 @@
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.11"
4
+
5
+ [[package]]
6
+ name = "colorama"
7
+ version = "0.4.6"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "iniconfig"
16
+ version = "2.3.0"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
19
+ wheels = [
20
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
21
+ ]
22
+
23
+ [[package]]
24
+ name = "packaging"
25
+ version = "26.2"
26
+ source = { registry = "https://pypi.org/simple" }
27
+ sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
28
+ wheels = [
29
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
30
+ ]
31
+
32
+ [[package]]
33
+ name = "pluggy"
34
+ version = "1.6.0"
35
+ source = { registry = "https://pypi.org/simple" }
36
+ sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
37
+ wheels = [
38
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
39
+ ]
40
+
41
+ [[package]]
42
+ name = "pygments"
43
+ version = "2.20.0"
44
+ source = { registry = "https://pypi.org/simple" }
45
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
46
+ wheels = [
47
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
48
+ ]
49
+
50
+ [[package]]
51
+ name = "pytest"
52
+ version = "9.1.1"
53
+ source = { registry = "https://pypi.org/simple" }
54
+ dependencies = [
55
+ { name = "colorama", marker = "sys_platform == 'win32'" },
56
+ { name = "iniconfig" },
57
+ { name = "packaging" },
58
+ { name = "pluggy" },
59
+ { name = "pygments" },
60
+ ]
61
+ sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
62
+ wheels = [
63
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
64
+ ]
65
+
66
+ [[package]]
67
+ name = "tinymoon"
68
+ version = "0.0.1"
69
+ source = { editable = "." }
70
+
71
+ [package.dev-dependencies]
72
+ dev = [
73
+ { name = "pytest" },
74
+ ]
75
+
76
+ [package.metadata]
77
+
78
+ [package.metadata.requires-dev]
79
+ dev = [{ name = "pytest", specifier = ">=9.1.1" }]