stkit 17.2.4__tar.gz → 17.2.6__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.
- {stkit-17.2.4 → stkit-17.2.6}/CHANGELOG.md +12 -0
- {stkit-17.2.4 → stkit-17.2.6}/PKG-INFO +1 -1
- {stkit-17.2.4 → stkit-17.2.6}/pyproject.toml +1 -1
- {stkit-17.2.4 → stkit-17.2.6}/stk/__init__.py +1 -1
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/copy_rules.py +8 -3
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/smoke.py +12 -3
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_copy_rules.py +29 -1
- {stkit-17.2.4 → stkit-17.2.6}/.gitignore +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/LICENSE +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/README.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/SECURITY.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/.env-sample +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/.gitignore +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/README.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/app.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/migrations/364232ae77d5_add_note.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/note/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/note/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/note/templates/note/index.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/note/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/settings.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/minimal/templates/layout.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/pyproject.toml +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/tests/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/tests/test_app.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/examples/minimal/uv.lock +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/__main__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/agent_login.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/app.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/checks.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/agent.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/base.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/database.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/develop.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/doctor.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/main.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/reports.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/users.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/cli/watch.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/extensions.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/files/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/files/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/files/store.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/files/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/mcp/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/mcp/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/mcp/server.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/mcp/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/env.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/script.py.mako +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/versions/stk_0001_initial_schema.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/versions/stk_0002_jobs.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/versions/stk_0003_files.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/versions/stk_0004_notifications.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/versions/stk_0005_mcp_tokens.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/migrations/versions/stk_0006_stk_mcp_token.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/notification/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/notification/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/notification/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/portal/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/public/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/public/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/public/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/CLAUDE.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/Dockerfile +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/README.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/__app__/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/__app__/app.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/__app__/settings.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/claude/skills/stk-api/SKILL.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/claude/skills/stk-blueprint/SKILL.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/claude/skills/stk-deploy/SKILL.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/claude/skills/stk-lessons/SKILL.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/claude/skills/stk-migrate/SKILL.md +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/docker-compose.yml +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/dockerignore +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/env-sample +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/github/workflows/checks.yml +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/gitignore +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/nginx/nginx.conf +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/nginx/stk.conf +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/postgres/init-db.sh +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/pyproject.toml +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/tests/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/app/tests/test_app.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/generator.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/scaffold/templates.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/security.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/settings.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/shell.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/VERSIONS.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/css/app.css +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/css/layout.css +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/css/vuetify.min.css +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.animals.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.arrows-1.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.arrows-2.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.badges.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.brand-1.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.brand-2.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.buildings.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.charts.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.communication.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.computers.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.core.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.currencies.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.database.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.design-1.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.design-2.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.development.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.devices-1.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.devices-2.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.document.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.e-commerce.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.electrical.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.extensions.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.food.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.games.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.gender.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.gestures.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.health.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.laundry.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.letters.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.logic.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.map.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.math.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.media.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.mood.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.nature.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.numbers.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.photography.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.shapes.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.sport.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.symbols.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.system-1.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.system-2.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.system-3.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.text.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.vehicles.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.version-control.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.weather.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/fonts/tabler-icons.zodiac.woff2 +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/icons/tabler-icons.min.css +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/img/auth-bg.webp +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/img/favicon.ico +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/img/stk.svg +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/axios.min.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/NotificationDropdown.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/ThemeSwitcher.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/TransitionExpand.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/VerticalNavGroup.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/VerticalNavLink.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/VerticalNavSectionTitle.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/components/index.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/config.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/vue.min.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/js/vuetify.min.js +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/static/robots.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/tasks/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/tasks/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/401.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/404.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/500.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/_brand.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/auth_layout.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/cms/activities.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/cms/jobs.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/cms/roles.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/cms/users.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/dashboard.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/index.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/layout.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/login-layout.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/mcp/tokens.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/_macros.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/_messages.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/change_password.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/confirm_email.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/change_notice.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/change_notice.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/confirmation_instructions.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/confirmation_instructions.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/login_instructions.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/login_instructions.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/reset_instructions.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/reset_instructions.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/reset_notice.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/reset_notice.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/welcome.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/email/welcome.txt +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/forgot_password.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/login_user.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/mf_recovery.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/mf_recovery_codes.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/register_user.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/reset_password.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/send_confirmation.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/send_login.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/two_factor_select.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/two_factor_setup.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/two_factor_verify_code.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/wan_register.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/wan_signin.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/templates/security/wan_verify.html +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/user/__init__.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/user/forms.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/user/models.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/user/views.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/utils/email.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/utils/netguard.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/utils/ratelimit.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/stk/websocket.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_agent_operability.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_app_index.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_branding.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_builder_ux.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_cli.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_composition.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_csrf_exempt.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_error_handler.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_files.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_jobs.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_mcp.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_mcp_migration.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_migration_drift.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_netguard.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_notifications.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_production_security.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_revision_imports.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_route_collisions.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_scaffolder.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_security_compatibility.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_shell.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_smoke_pages.py +0 -0
- {stkit-17.2.4 → stkit-17.2.6}/tests/test_static_versioning.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v17.2.6 (2026-10-31)
|
|
4
|
+
|
|
5
|
+
No migration required.
|
|
6
|
+
|
|
7
|
+
- `stk smoke`'s `hex-id` rule no longer flags mixed-case names such as `Ed25519`. Ids are printed in one case, so `1fbaac41` and `1FBAAC41` still fail (Build Loop).
|
|
8
|
+
|
|
9
|
+
## v17.2.5 (2026-10-31)
|
|
10
|
+
|
|
11
|
+
No migration required.
|
|
12
|
+
|
|
13
|
+
- `stk smoke` crashed on any page with three or more like SVG shapes side by side, such as a chart's paths or an icon's circles: the repeated-row rule read `innerText`, which SVG elements lack. The rule now looks at HTML elements only. A page smoke cannot read now fails that page with the reason, instead of stopping the whole run (Build Loop).
|
|
14
|
+
|
|
3
15
|
## v17.2.4 (2026-10-31)
|
|
4
16
|
|
|
5
17
|
No migration required.
|
|
@@ -15,8 +15,10 @@ VISIBLE_TEXT_JS = """() => {
|
|
|
15
15
|
}"""
|
|
16
16
|
|
|
17
17
|
# Visible texts of sibling elements that share a tag and classes: rows of a list.
|
|
18
|
+
# Only HTML elements: SVG shapes (a chart's paths, an icon's circles) repeat by
|
|
19
|
+
# design and have no innerText.
|
|
18
20
|
ROWS_JS = """() => {
|
|
19
|
-
const shown = el => el.getClientRects().length > 0;
|
|
21
|
+
const shown = el => el instanceof HTMLElement && el.getClientRects().length > 0;
|
|
20
22
|
const sig = k => k.tagName + '.' + [...k.classList]
|
|
21
23
|
.filter(c => !/active|selected|hover|focus|open|current/.test(c)).sort().join('.');
|
|
22
24
|
const out = [];
|
|
@@ -81,14 +83,17 @@ def uuid(text):
|
|
|
81
83
|
|
|
82
84
|
|
|
83
85
|
def hex_id(text):
|
|
84
|
-
"""6+ hex characters with at least two digits and a letter, alone
|
|
85
|
-
word: 'Request 1fbaac41'. Uuids are their own rule.
|
|
86
|
+
"""6+ hex characters in one case with at least two digits and a letter, alone
|
|
87
|
+
or glued to a word: 'Request 1fbaac41'. Uuids are their own rule. Mixed case
|
|
88
|
+
is a name, not an id: 'Ed25519'."""
|
|
86
89
|
text = UUID.sub(" ", text)
|
|
87
90
|
out = []
|
|
88
91
|
for m in HEX.finditer(text):
|
|
89
92
|
token = m.group()
|
|
90
93
|
if sum(c.isdigit() for c in token) < 2 or token.isdigit():
|
|
91
94
|
continue
|
|
95
|
+
if token not in (token.lower(), token.upper()):
|
|
96
|
+
continue
|
|
92
97
|
if HASH_LABEL.search(text[max(0, m.start() - 20) : m.start()]):
|
|
93
98
|
continue
|
|
94
99
|
out.append(_around(text, m))
|
|
@@ -303,9 +303,18 @@ async def _visit_smoke_page(context, base_url, name, path, screenshot_path=None)
|
|
|
303
303
|
page.on("pageerror", _record_page_error)
|
|
304
304
|
page.on("requestfailed", _record_failed_request)
|
|
305
305
|
response = await page.goto(f"{base_url}{path}", wait_until="networkidle")
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
306
|
+
from playwright.async_api import Error as PlaywrightError
|
|
307
|
+
|
|
308
|
+
try:
|
|
309
|
+
low_contrast = await page.evaluate(CONTRAST_JS)
|
|
310
|
+
text = await page.evaluate(VISIBLE_TEXT_JS)
|
|
311
|
+
rows = await page.evaluate(ROWS_JS)
|
|
312
|
+
except PlaywrightError as exc:
|
|
313
|
+
# One page smoke cannot read fails that page, not the whole run.
|
|
314
|
+
console_entries.append(
|
|
315
|
+
{"type": "pageerror", "text": f"smoke could not read the page: {exc}"}
|
|
316
|
+
)
|
|
317
|
+
low_contrast, text, rows = [], "", []
|
|
309
318
|
if screenshot_path is not None:
|
|
310
319
|
screenshot_path.parent.mkdir(parents=True, exist_ok=True)
|
|
311
320
|
await page.screenshot(path=str(screenshot_path), full_page=True)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import unittest
|
|
2
2
|
|
|
3
3
|
from stk.cli.copy_rules import (
|
|
4
|
+
ROWS_JS,
|
|
4
5
|
broken_value,
|
|
5
6
|
copy_findings,
|
|
6
7
|
hex_id,
|
|
@@ -30,9 +31,11 @@ class CopyRuleTests(unittest.TestCase):
|
|
|
30
31
|
def test_hex_id(self):
|
|
31
32
|
self.assertRule(
|
|
32
33
|
hex_id,
|
|
33
|
-
["Request 1fbaac41 failed", "texteb148f8f"],
|
|
34
|
+
["Request 1fbaac41 failed", "texteb148f8f", "Build 1FBAAC41"],
|
|
34
35
|
[
|
|
35
36
|
"SHA-256: 9f86d081884c7d65",
|
|
37
|
+
"Every run gets a fresh Ed25519 key",
|
|
38
|
+
"a facade from a decade ago",
|
|
36
39
|
"Total 1234567",
|
|
37
40
|
"Accepted",
|
|
38
41
|
"Owner 3f2b8c1e-9a4d-4e2f-8b1c-0d9e7f6a5b4c",
|
|
@@ -110,3 +113,28 @@ class SmokeCopyReportTests(unittest.TestCase):
|
|
|
110
113
|
|
|
111
114
|
if __name__ == "__main__":
|
|
112
115
|
unittest.main()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class RowsInBrowserTest(unittest.IsolatedAsyncioTestCase):
|
|
119
|
+
"""ROWS_JS runs in a real page: SVG shapes have no innerText."""
|
|
120
|
+
|
|
121
|
+
async def test_repeated_svg_shapes_are_skipped_and_html_rows_kept(self):
|
|
122
|
+
try:
|
|
123
|
+
from playwright.async_api import async_playwright
|
|
124
|
+
|
|
125
|
+
playwright = await async_playwright().start()
|
|
126
|
+
browser = await playwright.chromium.launch()
|
|
127
|
+
except Exception as exc: # no Playwright or no browser installed
|
|
128
|
+
self.skipTest(f"chromium unavailable: {exc}")
|
|
129
|
+
try:
|
|
130
|
+
page = await browser.new_page()
|
|
131
|
+
await page.set_content(
|
|
132
|
+
"<svg width='90' height='30'><circle cx='10' cy='10' r='5'/>"
|
|
133
|
+
"<circle cx='30' cy='10' r='5'/><circle cx='50' cy='10' r='5'/></svg>"
|
|
134
|
+
"<ul><li>Alpha</li><li>Beta</li><li>Gamma</li></ul>"
|
|
135
|
+
)
|
|
136
|
+
rows = await page.evaluate(ROWS_JS)
|
|
137
|
+
finally:
|
|
138
|
+
await browser.close()
|
|
139
|
+
await playwright.stop()
|
|
140
|
+
self.assertEqual(rows, [["Alpha", "Beta", "Gamma"]])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|