noeta 1.0.0rc1__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.
- noeta-1.0.0rc1/.editorconfig +25 -0
- noeta-1.0.0rc1/.env.example +23 -0
- noeta-1.0.0rc1/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
- noeta-1.0.0rc1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- noeta-1.0.0rc1/.github/ISSUE_TEMPLATE/feature_request.md +30 -0
- noeta-1.0.0rc1/.github/PULL_REQUEST_TEMPLATE.md +32 -0
- noeta-1.0.0rc1/.github/workflows/ci.yml +102 -0
- noeta-1.0.0rc1/.github/workflows/docs.yml +85 -0
- noeta-1.0.0rc1/.github/workflows/release.yml +73 -0
- noeta-1.0.0rc1/.gitignore +73 -0
- noeta-1.0.0rc1/.python-version +1 -0
- noeta-1.0.0rc1/AGENTS.md +81 -0
- noeta-1.0.0rc1/CHANGELOG.md +1728 -0
- noeta-1.0.0rc1/CODE_OF_CONDUCT.md +132 -0
- noeta-1.0.0rc1/CONTEXT.md +216 -0
- noeta-1.0.0rc1/CONTRIBUTING.md +90 -0
- noeta-1.0.0rc1/LICENSE +201 -0
- noeta-1.0.0rc1/Makefile +141 -0
- noeta-1.0.0rc1/PKG-INFO +215 -0
- noeta-1.0.0rc1/README.md +168 -0
- noeta-1.0.0rc1/SECURITY.md +93 -0
- noeta-1.0.0rc1/bench/README.md +633 -0
- noeta-1.0.0rc1/bench/compare.py +974 -0
- noeta-1.0.0rc1/bench/harbor_adapter.py +457 -0
- noeta-1.0.0rc1/bench/merge_sample40.py +122 -0
- noeta-1.0.0rc1/bench/quick6_table.py +91 -0
- noeta-1.0.0rc1/bench/run_benchmark.sh +353 -0
- noeta-1.0.0rc1/bench/run_quick6_compare.sh +29 -0
- noeta-1.0.0rc1/bench/summarize.py +112 -0
- noeta-1.0.0rc1/desktop/e2e/app.spec.ts +133 -0
- noeta-1.0.0rc1/desktop/e2e/noeta +5 -0
- noeta-1.0.0rc1/desktop/electron-builder.yml +18 -0
- noeta-1.0.0rc1/desktop/package-lock.json +5230 -0
- noeta-1.0.0rc1/desktop/package.json +26 -0
- noeta-1.0.0rc1/desktop/playwright.config.ts +11 -0
- noeta-1.0.0rc1/desktop/screenshots/01-new-session.png +0 -0
- noeta-1.0.0rc1/desktop/screenshots/02-reply.png +0 -0
- noeta-1.0.0rc1/desktop/screenshots/03-missing-noeta.png +0 -0
- noeta-1.0.0rc1/desktop/screenshots/04-server-stopped.png +0 -0
- noeta-1.0.0rc1/desktop/screenshots/README.md +31 -0
- noeta-1.0.0rc1/desktop/src/main.ts +264 -0
- noeta-1.0.0rc1/desktop/src/preload.ts +21 -0
- noeta-1.0.0rc1/desktop/src/server.ts +176 -0
- noeta-1.0.0rc1/desktop/src/settings.ts +91 -0
- noeta-1.0.0rc1/desktop/src/shell.ts +119 -0
- noeta-1.0.0rc1/desktop/test/preload.test.ts +55 -0
- noeta-1.0.0rc1/desktop/test/server.test.ts +190 -0
- noeta-1.0.0rc1/desktop/test/shell.test.ts +131 -0
- noeta-1.0.0rc1/desktop/tsconfig.build.json +5 -0
- noeta-1.0.0rc1/desktop/tsconfig.json +17 -0
- noeta-1.0.0rc1/desktop/vitest.config.ts +3 -0
- noeta-1.0.0rc1/docs/.npmrc +3 -0
- noeta-1.0.0rc1/docs/.vitepress/config.ts +127 -0
- noeta-1.0.0rc1/docs/.vitepress/theme/Diagram.vue +42 -0
- noeta-1.0.0rc1/docs/.vitepress/theme/custom.css +241 -0
- noeta-1.0.0rc1/docs/.vitepress/theme/diagrams.generated.css +33 -0
- noeta-1.0.0rc1/docs/.vitepress/theme/index.ts +14 -0
- noeta-1.0.0rc1/docs/adr/001-task-is-an-event-log-with-one-writer.md +48 -0
- noeta-1.0.0rc1/docs/adr/002-one-extension-interface-and-entry-points.md +45 -0
- noeta-1.0.0rc1/docs/adr/003-claude-code-is-the-model-visible-contract.md +43 -0
- noeta-1.0.0rc1/docs/adr/004-noeta-reads-only-its-own-config-places.md +39 -0
- noeta-1.0.0rc1/docs/adr/005-holds-with-epochs-and-hold-lost.md +43 -0
- noeta-1.0.0rc1/docs/adr/006-fold-snapshots.md +39 -0
- noeta-1.0.0rc1/docs/adr/007-tenants.md +44 -0
- noeta-1.0.0rc1/docs/adr/008-sandbox-protected-path-placeholders.md +46 -0
- noeta-1.0.0rc1/docs/adr/009-serve-requires-a-token.md +38 -0
- noeta-1.0.0rc1/docs/adr/010-nothing-uploaded-by-default.md +33 -0
- noeta-1.0.0rc1/docs/adr/011-one-holding-worker-per-tree.md +42 -0
- noeta-1.0.0rc1/docs/adr/012-snapshots-follow-state-size.md +36 -0
- noeta-1.0.0rc1/docs/adr/013-server-token-kept-as-a-digest.md +42 -0
- noeta-1.0.0rc1/docs/adr/014-tenants-separated-at-the-api-tools-need-an-os-boundary.md +65 -0
- noeta-1.0.0rc1/docs/adr/015-a-held-tree-runs-only-on-its-holder.md +40 -0
- noeta-1.0.0rc1/docs/adr/016-deferred-tool-loading-stays-in-the-kernel-for-now.md +49 -0
- noeta-1.0.0rc1/docs/adr/017-deferred-tool-loading-is-a-plugin.md +57 -0
- noeta-1.0.0rc1/docs/adr/018-each-tenant-has-its-own-places-on-disk.md +55 -0
- noeta-1.0.0rc1/docs/adr/019-tenant-limits-are-enforced-by-the-kernel.md +56 -0
- noeta-1.0.0rc1/docs/adr/020-claude-code-wording-is-allowed-where-it-serves-parity.md +43 -0
- noeta-1.0.0rc1/docs/adr/021-a-tenant-reads-all-but-a-protected-set-and-writes-only-its-own-places.md +50 -0
- noeta-1.0.0rc1/docs/adr/022-the-model-catalog-is-kernel-data.md +31 -0
- noeta-1.0.0rc1/docs/adr/023-snapshots-per-fold-version-and-newer-logs-left-to-newer-workers.md +56 -0
- noeta-1.0.0rc1/docs/adr/024-a-hold-takes-back-lapsed-claims-and-a-held-tree-stays-on-its-holders-queues.md +59 -0
- noeta-1.0.0rc1/docs/adr/025-every-model-call-checks-the-budget-before-it-is-made.md +45 -0
- noeta-1.0.0rc1/docs/adr/026-a-blocked-prompt-is-erased-by-a-core-record.md +60 -0
- noeta-1.0.0rc1/docs/adr/027-the-store-refuses-a-child-off-its-held-trees-queues-and-a-reclaim-counts-toward-the-limit.md +56 -0
- noeta-1.0.0rc1/docs/adr/028-no-tenants-in-noeta.md +58 -0
- noeta-1.0.0rc1/docs/adr/029-a-task-keeps-its-own-claim-while-it-owns-process-bound-work.md +61 -0
- noeta-1.0.0rc1/docs/adr/030-the-log-is-the-only-full-transcript.md +41 -0
- noeta-1.0.0rc1/docs/adr/031-background-plugin-work-returns-through-the-inbox.md +52 -0
- noeta-1.0.0rc1/docs/adr/index.md +66 -0
- noeta-1.0.0rc1/docs/assets/logo/noeta-icon.svg +9 -0
- noeta-1.0.0rc1/docs/assets/logo/noeta-logo-dark.svg +12 -0
- noeta-1.0.0rc1/docs/assets/logo/noeta-logo-light.svg +12 -0
- noeta-1.0.0rc1/docs/benchmarks.md +186 -0
- noeta-1.0.0rc1/docs/diagrams/core-architecture.en.svg +82 -0
- noeta-1.0.0rc1/docs/diagrams/core-architecture.zh.svg +82 -0
- noeta-1.0.0rc1/docs/diagrams/core-claim-epochs.en.svg +69 -0
- noeta-1.0.0rc1/docs/diagrams/core-claim-epochs.zh.svg +69 -0
- noeta-1.0.0rc1/docs/diagrams/core-event-log.en.svg +79 -0
- noeta-1.0.0rc1/docs/diagrams/core-event-log.zh.svg +79 -0
- noeta-1.0.0rc1/docs/diagrams/core-inbox.en.svg +67 -0
- noeta-1.0.0rc1/docs/diagrams/core-inbox.zh.svg +67 -0
- noeta-1.0.0rc1/docs/diagrams/core-kept-claim.en.svg +51 -0
- noeta-1.0.0rc1/docs/diagrams/core-kept-claim.zh.svg +51 -0
- noeta-1.0.0rc1/docs/diagrams/core-kernel-plugins.en.svg +75 -0
- noeta-1.0.0rc1/docs/diagrams/core-kernel-plugins.zh.svg +75 -0
- noeta-1.0.0rc1/docs/diagrams/core-layers.en.svg +40 -0
- noeta-1.0.0rc1/docs/diagrams/core-layers.zh.svg +40 -0
- noeta-1.0.0rc1/docs/diagrams/core-log-vs-fold.en.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/core-log-vs-fold.zh.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/core-park-wake.en.svg +39 -0
- noeta-1.0.0rc1/docs/diagrams/core-park-wake.zh.svg +39 -0
- noeta-1.0.0rc1/docs/diagrams/core-snapshot.en.svg +79 -0
- noeta-1.0.0rc1/docs/diagrams/core-snapshot.zh.svg +78 -0
- noeta-1.0.0rc1/docs/diagrams/core-step.en.svg +79 -0
- noeta-1.0.0rc1/docs/diagrams/core-step.zh.svg +79 -0
- noeta-1.0.0rc1/docs/diagrams/core-task-states.en.svg +42 -0
- noeta-1.0.0rc1/docs/diagrams/core-task-states.zh.svg +42 -0
- noeta-1.0.0rc1/docs/diagrams/core-tool-gates.en.svg +66 -0
- noeta-1.0.0rc1/docs/diagrams/core-tool-gates.zh.svg +66 -0
- noeta-1.0.0rc1/docs/diagrams/core-tool-recovery.en.svg +41 -0
- noeta-1.0.0rc1/docs/diagrams/core-tool-recovery.zh.svg +41 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-cache-breakpoints.en.svg +32 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-cache-breakpoints.zh.svg +32 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-compaction.en.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-compaction.zh.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-large-output.en.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-large-output.zh.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-log-fold.en.svg +46 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-log-fold.zh.svg +46 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-precompute.en.svg +46 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-precompute.zh.svg +46 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-request-layout.en.svg +43 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-request-layout.zh.svg +43 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-window.en.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/ctx-window.zh.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/guide-gates.en.svg +60 -0
- noeta-1.0.0rc1/docs/diagrams/guide-gates.zh.svg +60 -0
- noeta-1.0.0rc1/docs/diagrams/guide-instructions-sources.en.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/guide-instructions-sources.zh.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/guide-permission-decision.en.svg +61 -0
- noeta-1.0.0rc1/docs/diagrams/guide-permission-decision.zh.svg +61 -0
- noeta-1.0.0rc1/docs/diagrams/guide-skills-lookup.en.svg +49 -0
- noeta-1.0.0rc1/docs/diagrams/guide-skills-lookup.zh.svg +49 -0
- noeta-1.0.0rc1/docs/diagrams/guide-stream-json.en.svg +48 -0
- noeta-1.0.0rc1/docs/diagrams/guide-stream-json.zh.svg +48 -0
- noeta-1.0.0rc1/docs/diagrams/guide-ways-in.en.svg +66 -0
- noeta-1.0.0rc1/docs/diagrams/guide-ways-in.zh.svg +66 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-child-wait.en.svg +53 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-child-wait.zh.svg +53 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-execenvs.en.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-execenvs.zh.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-mcp.en.svg +62 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-mcp.zh.svg +62 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-plugin-install.en.svg +41 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-plugin-install.zh.svg +41 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-plugin-shapes.en.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-plugin-shapes.zh.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-sandbox.en.svg +40 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-sandbox.zh.svg +40 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-server-deploy.en.svg +59 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-server-deploy.zh.svg +59 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-task-tree.en.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/guide2-task-tree.zh.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/home-overview.en.svg +87 -0
- noeta-1.0.0rc1/docs/diagrams/home-overview.zh.svg +87 -0
- noeta-1.0.0rc1/docs/diagrams/model-retry.en.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/model-retry.zh.svg +45 -0
- noeta-1.0.0rc1/docs/diagrams/model-routing.en.svg +51 -0
- noeta-1.0.0rc1/docs/diagrams/model-routing.zh.svg +49 -0
- noeta-1.0.0rc1/docs/diagrams/multi-deploy.en.svg +55 -0
- noeta-1.0.0rc1/docs/diagrams/multi-deploy.zh.svg +54 -0
- noeta-1.0.0rc1/docs/diagrams/multi-live-output.en.svg +40 -0
- noeta-1.0.0rc1/docs/diagrams/multi-live-output.zh.svg +40 -0
- noeta-1.0.0rc1/docs/diagrams/ops-plugin-missing.en.svg +42 -0
- noeta-1.0.0rc1/docs/diagrams/ops-plugin-missing.zh.svg +42 -0
- noeta-1.0.0rc1/docs/diagrams/parity-replay.en.svg +52 -0
- noeta-1.0.0rc1/docs/diagrams/parity-replay.zh.svg +52 -0
- noeta-1.0.0rc1/docs/diagrams/plug-hooks.en.svg +61 -0
- noeta-1.0.0rc1/docs/diagrams/plug-hooks.zh.svg +61 -0
- noeta-1.0.0rc1/docs/diagrams/plug-registry.en.svg +47 -0
- noeta-1.0.0rc1/docs/diagrams/plug-registry.zh.svg +47 -0
- noeta-1.0.0rc1/docs/diagrams/plug-state.en.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/plug-state.zh.svg +34 -0
- noeta-1.0.0rc1/docs/diagrams/ref-http-stream.en.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/ref-http-stream.zh.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/ref-request-guard.en.svg +43 -0
- noeta-1.0.0rc1/docs/diagrams/ref-request-guard.zh.svg +43 -0
- noeta-1.0.0rc1/docs/diagrams/ref-ways-in.en.svg +51 -0
- noeta-1.0.0rc1/docs/diagrams/ref-ways-in.zh.svg +51 -0
- noeta-1.0.0rc1/docs/diagrams/start-config-places.en.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/start-config-places.zh.svg +44 -0
- noeta-1.0.0rc1/docs/diagrams/start-embedding.en.svg +53 -0
- noeta-1.0.0rc1/docs/diagrams/start-embedding.zh.svg +53 -0
- noeta-1.0.0rc1/docs/diagrams/theme.mjs +58 -0
- noeta-1.0.0rc1/docs/gc.md +48 -0
- noeta-1.0.0rc1/docs/guides/front-ends.md +173 -0
- noeta-1.0.0rc1/docs/guides/mcp.md +277 -0
- noeta-1.0.0rc1/docs/guides/memory-and-instructions.md +181 -0
- noeta-1.0.0rc1/docs/guides/models.md +218 -0
- noeta-1.0.0rc1/docs/guides/permissions.md +277 -0
- noeta-1.0.0rc1/docs/guides/plugins.md +477 -0
- noeta-1.0.0rc1/docs/guides/sandbox.md +252 -0
- noeta-1.0.0rc1/docs/guides/server.md +273 -0
- noeta-1.0.0rc1/docs/guides/skills-and-agents.md +251 -0
- noeta-1.0.0rc1/docs/guides/subagents.md +287 -0
- noeta-1.0.0rc1/docs/guides/terminal.md +337 -0
- noeta-1.0.0rc1/docs/how-it-works/context.md +388 -0
- noeta-1.0.0rc1/docs/how-it-works/event-log.md +259 -0
- noeta-1.0.0rc1/docs/how-it-works/index.md +129 -0
- noeta-1.0.0rc1/docs/how-it-works/many-machines.md +150 -0
- noeta-1.0.0rc1/docs/how-it-works/models.md +189 -0
- noeta-1.0.0rc1/docs/how-it-works/one-step.md +232 -0
- noeta-1.0.0rc1/docs/how-it-works/parity.md +150 -0
- noeta-1.0.0rc1/docs/how-it-works/plugins.md +239 -0
- noeta-1.0.0rc1/docs/how-it-works/recovery.md +217 -0
- noeta-1.0.0rc1/docs/how-it-works/waiting.md +213 -0
- noeta-1.0.0rc1/docs/index.md +111 -0
- noeta-1.0.0rc1/docs/operations/comparison.md +163 -0
- noeta-1.0.0rc1/docs/operations/limitations.md +152 -0
- noeta-1.0.0rc1/docs/operations/troubleshooting.md +228 -0
- noeta-1.0.0rc1/docs/package-lock.json +2700 -0
- noeta-1.0.0rc1/docs/package.json +15 -0
- noeta-1.0.0rc1/docs/public/logo.svg +9 -0
- noeta-1.0.0rc1/docs/public/og.png +0 -0
- noeta-1.0.0rc1/docs/reference/cli.md +301 -0
- noeta-1.0.0rc1/docs/reference/config.md +227 -0
- noeta-1.0.0rc1/docs/reference/events.md +191 -0
- noeta-1.0.0rc1/docs/reference/extension.md +262 -0
- noeta-1.0.0rc1/docs/reference/http-api.md +246 -0
- noeta-1.0.0rc1/docs/reference/plugins.md +565 -0
- noeta-1.0.0rc1/docs/reference/python-api.md +227 -0
- noeta-1.0.0rc1/docs/reference/tools.md +455 -0
- noeta-1.0.0rc1/docs/releasing.md +21 -0
- noeta-1.0.0rc1/docs/reviewing.md +48 -0
- noeta-1.0.0rc1/docs/scripts/diagrams.mjs +66 -0
- noeta-1.0.0rc1/docs/specs/2026-10-26-noeta-1-0-redesign.md +420 -0
- noeta-1.0.0rc1/docs/specs/2026-10-26-prompt-regression-eval.md +159 -0
- noeta-1.0.0rc1/docs/specs/2026-10-29-open-source-follow-ups.md +129 -0
- noeta-1.0.0rc1/docs/specs/TEMPLATE.md +29 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-27-extension-surface.md +86 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-27-layout-split.md +155 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-27-noeta-1-0-layout.md +145 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-27-tree-hold-and-plugin-files.md +118 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-28-claude-code-parity.md +651 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-28-open-source-release.md +727 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-29-best-of-three.md +337 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-29-drop-tenants.md +65 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-30-bench-findings-capture.json +273 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-30-bench-findings.md +144 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-10-30-commands-inherit-the-environment.md +140 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-01-empty-turn.md +213 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-02-context-audit-closure.md +273 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-02-context-final-closure.md +157 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-02-context-reaudit-closure.md +558 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-02-task-tools.md +180 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-03-multi-provider.md +153 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-03-plugin-splits.md +133 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-03-shell-deny-paths.md +76 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-04-front-end-alignment-gaps.md +128 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-04-v1-finish.md +276 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-05-history-out-of-snapshots.md +85 -0
- noeta-1.0.0rc1/docs/specs/archive/2026-11-05-long-context-handling.md +151 -0
- noeta-1.0.0rc1/docs/start/configuration.md +246 -0
- noeta-1.0.0rc1/docs/start/embedding.md +265 -0
- noeta-1.0.0rc1/docs/start/quickstart.md +189 -0
- noeta-1.0.0rc1/docs/why-noeta.md +102 -0
- noeta-1.0.0rc1/docs/zh/benchmarks.md +164 -0
- noeta-1.0.0rc1/docs/zh/guides/front-ends.md +111 -0
- noeta-1.0.0rc1/docs/zh/guides/mcp.md +180 -0
- noeta-1.0.0rc1/docs/zh/guides/memory-and-instructions.md +125 -0
- noeta-1.0.0rc1/docs/zh/guides/models.md +167 -0
- noeta-1.0.0rc1/docs/zh/guides/permissions.md +187 -0
- noeta-1.0.0rc1/docs/zh/guides/plugins.md +337 -0
- noeta-1.0.0rc1/docs/zh/guides/sandbox.md +156 -0
- noeta-1.0.0rc1/docs/zh/guides/server.md +151 -0
- noeta-1.0.0rc1/docs/zh/guides/skills-and-agents.md +193 -0
- noeta-1.0.0rc1/docs/zh/guides/subagents.md +174 -0
- noeta-1.0.0rc1/docs/zh/guides/terminal.md +256 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/context.md +198 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/event-log.md +154 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/index.md +85 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/many-machines.md +86 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/models.md +113 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/one-step.md +143 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/parity.md +79 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/plugins.md +140 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/recovery.md +126 -0
- noeta-1.0.0rc1/docs/zh/how-it-works/waiting.md +108 -0
- noeta-1.0.0rc1/docs/zh/index.md +105 -0
- noeta-1.0.0rc1/docs/zh/operations/comparison.md +144 -0
- noeta-1.0.0rc1/docs/zh/operations/limitations.md +110 -0
- noeta-1.0.0rc1/docs/zh/operations/troubleshooting.md +202 -0
- noeta-1.0.0rc1/docs/zh/reference/cli.md +282 -0
- noeta-1.0.0rc1/docs/zh/reference/config.md +216 -0
- noeta-1.0.0rc1/docs/zh/reference/events.md +170 -0
- noeta-1.0.0rc1/docs/zh/reference/extension.md +247 -0
- noeta-1.0.0rc1/docs/zh/reference/http-api.md +224 -0
- noeta-1.0.0rc1/docs/zh/reference/plugins.md +440 -0
- noeta-1.0.0rc1/docs/zh/reference/python-api.md +219 -0
- noeta-1.0.0rc1/docs/zh/reference/tools.md +384 -0
- noeta-1.0.0rc1/docs/zh/start/configuration.md +223 -0
- noeta-1.0.0rc1/docs/zh/start/embedding.md +243 -0
- noeta-1.0.0rc1/docs/zh/start/quickstart.md +175 -0
- noeta-1.0.0rc1/docs/zh/why-noeta.md +86 -0
- noeta-1.0.0rc1/evals/__init__.py +5 -0
- noeta-1.0.0rc1/evals/__main__.py +266 -0
- noeta-1.0.0rc1/evals/baseline.json +536 -0
- noeta-1.0.0rc1/evals/core.py +296 -0
- noeta-1.0.0rc1/evals/engine.py +440 -0
- noeta-1.0.0rc1/evals/fixtures.py +821 -0
- noeta-1.0.0rc1/evals/live_env.py +46 -0
- noeta-1.0.0rc1/evals/scenarios.py +1158 -0
- noeta-1.0.0rc1/examples/chat-approvals/README.md +25 -0
- noeta-1.0.0rc1/examples/chat-approvals/chat_approvals.py +93 -0
- noeta-1.0.0rc1/examples/chat-approvals/tests/test_chat_approvals.py +115 -0
- noeta-1.0.0rc1/examples/chat-bridge/README.md +31 -0
- noeta-1.0.0rc1/examples/chat-bridge/chat_bridge.py +93 -0
- noeta-1.0.0rc1/examples/chat-bridge/tests/test_chat_bridge.py +146 -0
- noeta-1.0.0rc1/examples/hello-plugin/README.md +38 -0
- noeta-1.0.0rc1/examples/hello-plugin/pyproject.toml +18 -0
- noeta-1.0.0rc1/examples/hello-plugin/src/noeta_hello/__init__.py +106 -0
- noeta-1.0.0rc1/examples/hello-plugin/tests/test_hello.py +97 -0
- noeta-1.0.0rc1/examples/house-style/README.md +18 -0
- noeta-1.0.0rc1/examples/house-style/house_style.py +52 -0
- noeta-1.0.0rc1/examples/house-style/tests/test_house_style.py +72 -0
- noeta-1.0.0rc1/examples/run-tests/README.md +16 -0
- noeta-1.0.0rc1/examples/run-tests/run_tests.py +71 -0
- noeta-1.0.0rc1/examples/run-tests/tests/test_run_tests.py +86 -0
- noeta-1.0.0rc1/noeta/__init__.py +140 -0
- noeta-1.0.0rc1/noeta/agents/__init__.py +89 -0
- noeta-1.0.0rc1/noeta/agents/agent_files.py +521 -0
- noeta-1.0.0rc1/noeta/agents/files/explore.md +61 -0
- noeta-1.0.0rc1/noeta/agents/files/general-purpose.md +47 -0
- noeta-1.0.0rc1/noeta/agents/files/main.md +63 -0
- noeta-1.0.0rc1/noeta/agents/files/plan.md +56 -0
- noeta-1.0.0rc1/noeta/backends/__init__.py +0 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/__init__.py +0 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/container.py +376 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/container_provision.py +247 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/local.py +470 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/sandbox.py +309 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/sandbox_bridge.py +216 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/sandbox_plan.py +490 -0
- noeta-1.0.0rc1/noeta/backends/execenvs/sandbox_proxy.py +370 -0
- noeta-1.0.0rc1/noeta/backends/providers/__init__.py +79 -0
- noeta-1.0.0rc1/noeta/backends/providers/_anthropic_stream.py +393 -0
- noeta-1.0.0rc1/noeta/backends/providers/_anthropic_user_id.py +26 -0
- noeta-1.0.0rc1/noeta/backends/providers/_anthropic_wire.py +471 -0
- noeta-1.0.0rc1/noeta/backends/providers/_common.py +559 -0
- noeta-1.0.0rc1/noeta/backends/providers/_openai_compat_stream.py +278 -0
- noeta-1.0.0rc1/noeta/backends/providers/_openai_responses_stream.py +311 -0
- noeta-1.0.0rc1/noeta/backends/providers/_sse.py +49 -0
- noeta-1.0.0rc1/noeta/backends/providers/anthropic.py +460 -0
- noeta-1.0.0rc1/noeta/backends/providers/listing.py +139 -0
- noeta-1.0.0rc1/noeta/backends/providers/openai_compat.py +389 -0
- noeta-1.0.0rc1/noeta/backends/providers/openai_responses.py +386 -0
- noeta-1.0.0rc1/noeta/backends/providers/routing.py +469 -0
- noeta-1.0.0rc1/noeta/backends/stores/__init__.py +1 -0
- noeta-1.0.0rc1/noeta/backends/stores/_rows.py +38 -0
- noeta-1.0.0rc1/noeta/backends/stores/postgres.py +538 -0
- noeta-1.0.0rc1/noeta/backends/stores/postgres_conn.py +131 -0
- noeta-1.0.0rc1/noeta/backends/stores/postgres_feed.py +236 -0
- noeta-1.0.0rc1/noeta/backends/stores/postgres_snapshots.py +57 -0
- noeta-1.0.0rc1/noeta/backends/stores/sqlite.py +574 -0
- noeta-1.0.0rc1/noeta/cli/__init__.py +3 -0
- noeta-1.0.0rc1/noeta/cli/claude_plugins.py +460 -0
- noeta-1.0.0rc1/noeta/cli/config.py +913 -0
- noeta-1.0.0rc1/noeta/cli/headless.py +395 -0
- noeta-1.0.0rc1/noeta/cli/home_dir.py +71 -0
- noeta-1.0.0rc1/noeta/cli/main.py +515 -0
- noeta-1.0.0rc1/noeta/cli/mcp_command.py +380 -0
- noeta-1.0.0rc1/noeta/cli/plugin_command.py +349 -0
- noeta-1.0.0rc1/noeta/cli/plugin_options.py +301 -0
- noeta-1.0.0rc1/noeta/cli/plugin_policy.py +38 -0
- noeta-1.0.0rc1/noeta/cli/server_token.py +90 -0
- noeta-1.0.0rc1/noeta/cli/settings_files.py +315 -0
- noeta-1.0.0rc1/noeta/cli/trust.py +67 -0
- noeta-1.0.0rc1/noeta/core/__init__.py +0 -0
- noeta-1.0.0rc1/noeta/core/agent.py +62 -0
- noeta-1.0.0rc1/noeta/core/channel.py +146 -0
- noeta-1.0.0rc1/noeta/core/client.py +224 -0
- noeta-1.0.0rc1/noeta/core/commands.py +116 -0
- noeta-1.0.0rc1/noeta/core/errors.py +121 -0
- noeta-1.0.0rc1/noeta/core/events.py +201 -0
- noeta-1.0.0rc1/noeta/core/execenv.py +112 -0
- noeta-1.0.0rc1/noeta/core/extension.py +629 -0
- noeta-1.0.0rc1/noeta/core/images.py +276 -0
- noeta-1.0.0rc1/noeta/core/large_output.py +266 -0
- noeta-1.0.0rc1/noeta/core/loop/__init__.py +0 -0
- noeta-1.0.0rc1/noeta/core/loop/decide.py +133 -0
- noeta-1.0.0rc1/noeta/core/loop/request.py +105 -0
- noeta-1.0.0rc1/noeta/core/loop/state.py +661 -0
- noeta-1.0.0rc1/noeta/core/mcp_names.py +191 -0
- noeta-1.0.0rc1/noeta/core/models.py +629 -0
- noeta-1.0.0rc1/noeta/core/prompts.py +106 -0
- noeta-1.0.0rc1/noeta/core/provider.py +34 -0
- noeta-1.0.0rc1/noeta/core/questions.py +159 -0
- noeta-1.0.0rc1/noeta/core/records.py +407 -0
- noeta-1.0.0rc1/noeta/core/registry.py +360 -0
- noeta-1.0.0rc1/noeta/core/retry.py +193 -0
- noeta-1.0.0rc1/noeta/core/runner/__init__.py +19 -0
- noeta-1.0.0rc1/noeta/core/runner/calls.py +445 -0
- noeta-1.0.0rc1/noeta/core/runner/closing.py +163 -0
- noeta-1.0.0rc1/noeta/core/runner/model.py +259 -0
- noeta-1.0.0rc1/noeta/core/runner/runtime.py +327 -0
- noeta-1.0.0rc1/noeta/core/runner/snapshotting.py +126 -0
- noeta-1.0.0rc1/noeta/core/runner/task.py +921 -0
- noeta-1.0.0rc1/noeta/core/runner/texts.py +87 -0
- noeta-1.0.0rc1/noeta/core/runner/timers.py +38 -0
- noeta-1.0.0rc1/noeta/core/snapshots.py +227 -0
- noeta-1.0.0rc1/noeta/core/store.py +296 -0
- noeta-1.0.0rc1/noeta/core/tool.py +303 -0
- noeta-1.0.0rc1/noeta/core/tool_input.py +164 -0
- noeta-1.0.0rc1/noeta/core/types.py +272 -0
- noeta-1.0.0rc1/noeta/host/__init__.py +5 -0
- noeta-1.0.0rc1/noeta/host/_acp_updates.py +358 -0
- noeta-1.0.0rc1/noeta/host/_errors.py +24 -0
- noeta-1.0.0rc1/noeta/host/_http_guard.py +304 -0
- noeta-1.0.0rc1/noeta/host/_http_openapi.py +98 -0
- noeta-1.0.0rc1/noeta/host/_http_routes.py +253 -0
- noeta-1.0.0rc1/noeta/host/_http_stream.py +173 -0
- noeta-1.0.0rc1/noeta/host/_stream_json_control.py +284 -0
- noeta-1.0.0rc1/noeta/host/_stream_json_wire.py +104 -0
- noeta-1.0.0rc1/noeta/host/acp.py +599 -0
- noeta-1.0.0rc1/noeta/host/app.py +162 -0
- noeta-1.0.0rc1/noeta/host/channels.py +42 -0
- noeta-1.0.0rc1/noeta/host/feed.py +25 -0
- noeta-1.0.0rc1/noeta/host/files.py +47 -0
- noeta-1.0.0rc1/noeta/host/http.py +264 -0
- noeta-1.0.0rc1/noeta/host/local.py +322 -0
- noeta-1.0.0rc1/noeta/host/pending.py +261 -0
- noeta-1.0.0rc1/noeta/host/questions.py +91 -0
- noeta-1.0.0rc1/noeta/host/remote.py +238 -0
- noeta-1.0.0rc1/noeta/host/rewind.py +207 -0
- noeta-1.0.0rc1/noeta/host/spill_sweep.py +102 -0
- noeta-1.0.0rc1/noeta/host/stream_json.py +619 -0
- noeta-1.0.0rc1/noeta/host/summaries.py +110 -0
- noeta-1.0.0rc1/noeta/host/usage.py +182 -0
- noeta-1.0.0rc1/noeta/plugins/__init__.py +0 -0
- noeta-1.0.0rc1/noeta/plugins/ask_user/__init__.py +399 -0
- noeta-1.0.0rc1/noeta/plugins/ask_user/descriptions/AskUserQuestion.md +13 -0
- noeta-1.0.0rc1/noeta/plugins/budget.py +168 -0
- noeta-1.0.0rc1/noeta/plugins/checkpoints.py +220 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/__init__.py +8 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/clearing.py +82 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/estimate.py +74 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/extension.py +1047 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/prompts/summarize.md +89 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/restore.py +168 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/summary.py +336 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/transcript.py +39 -0
- noeta-1.0.0rc1/noeta/plugins/compaction/window.py +101 -0
- noeta-1.0.0rc1/noeta/plugins/empty_reply.py +45 -0
- noeta-1.0.0rc1/noeta/plugins/environment/__init__.py +152 -0
- noeta-1.0.0rc1/noeta/plugins/environment/extension.py +432 -0
- noeta-1.0.0rc1/noeta/plugins/environment/facts.py +181 -0
- noeta-1.0.0rc1/noeta/plugins/environment/git.py +176 -0
- noeta-1.0.0rc1/noeta/plugins/environment/notes.py +243 -0
- noeta-1.0.0rc1/noeta/plugins/findings.py +147 -0
- noeta-1.0.0rc1/noeta/plugins/fs/__init__.py +244 -0
- noeta-1.0.0rc1/noeta/plugins/fs/_encoding.py +117 -0
- noeta-1.0.0rc1/noeta/plugins/fs/_missing.py +52 -0
- noeta-1.0.0rc1/noeta/plugins/fs/_mutate.py +262 -0
- noeta-1.0.0rc1/noeta/plugins/fs/_read_formats.py +373 -0
- noeta-1.0.0rc1/noeta/plugins/fs/changes.py +123 -0
- noeta-1.0.0rc1/noeta/plugins/fs/descriptions/edit.md +6 -0
- noeta-1.0.0rc1/noeta/plugins/fs/descriptions/notebook_edit.md +6 -0
- noeta-1.0.0rc1/noeta/plugins/fs/descriptions/read.md +10 -0
- noeta-1.0.0rc1/noeta/plugins/fs/descriptions/write.md +5 -0
- noeta-1.0.0rc1/noeta/plugins/fs/edit.py +316 -0
- noeta-1.0.0rc1/noeta/plugins/fs/mentions.py +325 -0
- noeta-1.0.0rc1/noeta/plugins/fs/notebook.py +210 -0
- noeta-1.0.0rc1/noeta/plugins/fs/pasted.py +184 -0
- noeta-1.0.0rc1/noeta/plugins/fs/read.py +671 -0
- noeta-1.0.0rc1/noeta/plugins/fs/shell_reads.py +129 -0
- noeta-1.0.0rc1/noeta/plugins/fs/shell_writes.py +90 -0
- noeta-1.0.0rc1/noeta/plugins/fs/state.py +253 -0
- noeta-1.0.0rc1/noeta/plugins/fs/write.py +137 -0
- noeta-1.0.0rc1/noeta/plugins/hooks/__init__.py +116 -0
- noeta-1.0.0rc1/noeta/plugins/hooks/config.py +294 -0
- noeta-1.0.0rc1/noeta/plugins/hooks/dispatch.py +669 -0
- noeta-1.0.0rc1/noeta/plugins/hooks/extension.py +793 -0
- noeta-1.0.0rc1/noeta/plugins/hooks/gates.py +128 -0
- noeta-1.0.0rc1/noeta/plugins/hooks/runners.py +453 -0
- noeta-1.0.0rc1/noeta/plugins/instructions/__init__.py +14 -0
- noeta-1.0.0rc1/noeta/plugins/instructions/extension.py +658 -0
- noeta-1.0.0rc1/noeta/plugins/instructions/files.py +425 -0
- noeta-1.0.0rc1/noeta/plugins/markdown_commands.py +170 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/__init__.py +42 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/admin.py +116 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/client.py +396 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/config.py +293 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/descriptions/authenticate.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/descriptions/complete_authentication.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/elicitation.py +154 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/extension.py +857 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/http_client.py +284 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/instructions.py +84 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/oauth.py +499 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/oauth_discovery.py +156 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/pool.py +292 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/prompts.py +213 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/results.py +216 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/settings.py +188 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/sign_ins.py +126 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/sse_client.py +191 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/stdio.py +151 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/tools.py +356 -0
- noeta-1.0.0rc1/noeta/plugins/mcp/ws_client.py +201 -0
- noeta-1.0.0rc1/noeta/plugins/memory/__init__.py +12 -0
- noeta-1.0.0rc1/noeta/plugins/memory/extension.py +501 -0
- noeta-1.0.0rc1/noeta/plugins/memory/prompts/recall.md +3 -0
- noeta-1.0.0rc1/noeta/plugins/memory/prompts/section.md +22 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/__init__.py +48 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/auto.py +340 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/classifier.py +405 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/decision.py +60 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/deny_paths.py +116 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/extension.py +576 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/guards.py +127 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/modes.py +85 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/policy.py +265 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/read_only_programs.py +451 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/rule_check.py +400 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/rule_specs.py +59 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/scope.py +468 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/shell_check.py +300 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/shell_paths.py +448 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/state.py +173 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/texts/auto_mode_classifier.md +369 -0
- noeta-1.0.0rc1/noeta/plugins/permissions/wording.py +128 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/__init__.py +14 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/enter_plan_mode.md +63 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/exit_plan_mode.md +19 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode.md +31 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode_reentry.md +11 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode_sparse.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode_subagent.md +7 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/extension.py +242 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/notes.py +165 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/plan.py +341 -0
- noeta-1.0.0rc1/noeta/plugins/plan_mode/state.py +129 -0
- noeta-1.0.0rc1/noeta/plugins/quiet_nudge.py +82 -0
- noeta-1.0.0rc1/noeta/plugins/repetition_guard.py +104 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/__init__.py +360 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/cron.py +188 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/cron_create.md +36 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/cron_delete.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/cron_list.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/schedule_wakeup.md +27 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/loop.md +50 -0
- noeta-1.0.0rc1/noeta/plugins/schedule/texts.py +90 -0
- noeta-1.0.0rc1/noeta/plugins/shell/__init__.py +299 -0
- noeta-1.0.0rc1/noeta/plugins/shell/bash.py +310 -0
- noeta-1.0.0rc1/noeta/plugins/shell/cwd.py +54 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/enter_worktree.md +9 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/exit_worktree.md +10 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/monitor.md +41 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_run.md +16 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_sandbox.md +6 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_sandbox_escape.md +6 -0
- noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_sandbox_no_escape.md +3 -0
- noeta-1.0.0rc1/noeta/plugins/shell/git_prelude.py +127 -0
- noeta-1.0.0rc1/noeta/plugins/shell/hardening.py +137 -0
- noeta-1.0.0rc1/noeta/plugins/shell/job_logs.py +118 -0
- noeta-1.0.0rc1/noeta/plugins/shell/jobs.py +904 -0
- noeta-1.0.0rc1/noeta/plugins/shell/notices.py +363 -0
- noeta-1.0.0rc1/noeta/plugins/shell/output.py +114 -0
- noeta-1.0.0rc1/noeta/plugins/shell/sandbox.py +82 -0
- noeta-1.0.0rc1/noeta/plugins/shell/state.py +77 -0
- noeta-1.0.0rc1/noeta/plugins/shell/tools.py +639 -0
- noeta-1.0.0rc1/noeta/plugins/shell/websocket.py +200 -0
- noeta-1.0.0rc1/noeta/plugins/shell/worktree.py +243 -0
- noeta-1.0.0rc1/noeta/plugins/skills/__init__.py +21 -0
- noeta-1.0.0rc1/noeta/plugins/skills/_frontmatter.py +326 -0
- noeta-1.0.0rc1/noeta/plugins/skills/descriptions/run_skill_script.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/skills/descriptions/skill.md +12 -0
- noeta-1.0.0rc1/noeta/plugins/skills/extension.py +1496 -0
- noeta-1.0.0rc1/noeta/plugins/skills/gates.py +64 -0
- noeta-1.0.0rc1/noeta/plugins/skills/listing.py +208 -0
- noeta-1.0.0rc1/noeta/plugins/skills/registry.py +675 -0
- noeta-1.0.0rc1/noeta/plugins/skills/script.py +210 -0
- noeta-1.0.0rc1/noeta/plugins/skills/tool.py +181 -0
- noeta-1.0.0rc1/noeta/plugins/skills/usage.py +120 -0
- noeta-1.0.0rc1/noeta/plugins/structured_output.py +229 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/__init__.py +26 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/agent.md +21 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/list_agents.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/send_message.md +7 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/subagent_handback.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/extension.py +696 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/idle.py +166 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/mentions.py +57 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/roster.py +166 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/texts.py +324 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/tool.py +567 -0
- noeta-1.0.0rc1/noeta/plugins/subtasks/worktree.py +109 -0
- noeta-1.0.0rc1/noeta/plugins/title.md +17 -0
- noeta-1.0.0rc1/noeta/plugins/title.py +116 -0
- noeta-1.0.0rc1/noeta/plugins/todos/__init__.py +197 -0
- noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_create.md +30 -0
- noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_get.md +16 -0
- noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_list.md +16 -0
- noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_update.md +65 -0
- noeta-1.0.0rc1/noeta/plugins/todos/state.py +102 -0
- noeta-1.0.0rc1/noeta/plugins/todos/tools.py +381 -0
- noeta-1.0.0rc1/noeta/plugins/tool_search/__init__.py +97 -0
- noeta-1.0.0rc1/noeta/plugins/tool_search/search.py +229 -0
- noeta-1.0.0rc1/noeta/plugins/web/__init__.py +124 -0
- noeta-1.0.0rc1/noeta/plugins/web/descriptions/web_search.md +6 -0
- noeta-1.0.0rc1/noeta/plugins/web/descriptions/webfetch.md +8 -0
- noeta-1.0.0rc1/noeta/plugins/web/descriptions/webfetch_digest.md +6 -0
- noeta-1.0.0rc1/noeta/plugins/web/descriptions/webfetch_digest_docs.md +1 -0
- noeta-1.0.0rc1/noeta/plugins/web/fetch.py +551 -0
- noeta-1.0.0rc1/noeta/plugins/web/render.py +152 -0
- noeta-1.0.0rc1/noeta/plugins/web/search.py +208 -0
- noeta-1.0.0rc1/noeta/plugins/workflow/__init__.py +401 -0
- noeta-1.0.0rc1/noeta/plugins/workflow/descriptions/workflow.md +42 -0
- noeta-1.0.0rc1/noeta/plugins/workflow/engine.py +204 -0
- noeta-1.0.0rc1/noeta/plugins/workflow/harness.js +299 -0
- noeta-1.0.0rc1/noeta/plugins/workflow/opt_in.py +86 -0
- noeta-1.0.0rc1/noeta/plugins/workflow/tool.py +212 -0
- noeta-1.0.0rc1/noeta/py.typed +0 -0
- noeta-1.0.0rc1/noeta/testing/__init__.py +52 -0
- noeta-1.0.0rc1/noeta/testing/store_contract.py +473 -0
- noeta-1.0.0rc1/noeta/toolkit/__init__.py +4 -0
- noeta-1.0.0rc1/noeta/toolkit/allowed_tools.py +77 -0
- noeta-1.0.0rc1/noeta/toolkit/arguments.py +87 -0
- noeta-1.0.0rc1/noeta/toolkit/background_tasks.py +60 -0
- noeta-1.0.0rc1/noeta/toolkit/commands.py +31 -0
- noeta-1.0.0rc1/noeta/toolkit/context.py +102 -0
- noeta-1.0.0rc1/noeta/toolkit/deltas.py +28 -0
- noeta-1.0.0rc1/noeta/toolkit/empty_reply.py +14 -0
- noeta-1.0.0rc1/noeta/toolkit/function_tool.py +217 -0
- noeta-1.0.0rc1/noeta/toolkit/guidance_lines.py +33 -0
- noeta-1.0.0rc1/noeta/toolkit/hook_callbacks.py +118 -0
- noeta-1.0.0rc1/noeta/toolkit/hook_env.py +19 -0
- noeta-1.0.0rc1/noeta/toolkit/inline_commands.py +182 -0
- noeta-1.0.0rc1/noeta/toolkit/interactive.py +82 -0
- noeta-1.0.0rc1/noeta/toolkit/json_schema.py +257 -0
- noeta-1.0.0rc1/noeta/toolkit/local_env.py +130 -0
- noeta-1.0.0rc1/noeta/toolkit/mcp_sources.py +50 -0
- noeta-1.0.0rc1/noeta/toolkit/memory_index.py +61 -0
- noeta-1.0.0rc1/noeta/toolkit/notices.py +60 -0
- noeta-1.0.0rc1/noeta/toolkit/paths.py +102 -0
- noeta-1.0.0rc1/noeta/toolkit/permission_modes.py +97 -0
- noeta-1.0.0rc1/noeta/toolkit/permission_rules.py +465 -0
- noeta-1.0.0rc1/noeta/toolkit/plugin_records.py +248 -0
- noeta-1.0.0rc1/noeta/toolkit/protected_paths.py +36 -0
- noeta-1.0.0rc1/noeta/toolkit/sandbox.py +452 -0
- noeta-1.0.0rc1/noeta/toolkit/shell.py +420 -0
- noeta-1.0.0rc1/noeta/toolkit/shell_syntax.py +475 -0
- noeta-1.0.0rc1/noeta/toolkit/side_requests.py +45 -0
- noeta-1.0.0rc1/noeta/toolkit/signals.py +22 -0
- noeta-1.0.0rc1/noeta/toolkit/structured_output.py +49 -0
- noeta-1.0.0rc1/noeta/toolkit/tokens.py +85 -0
- noeta-1.0.0rc1/noeta/toolkit/tools.py +160 -0
- noeta-1.0.0rc1/noeta/toolkit/ultrathink.py +65 -0
- noeta-1.0.0rc1/noeta/toolkit/usd_budget.py +127 -0
- noeta-1.0.0rc1/noeta/toolkit/worktrees.py +162 -0
- noeta-1.0.0rc1/parity/2.1.312/m1.json +12608 -0
- noeta-1.0.0rc1/parity/2.1.312/m2.json +1615 -0
- noeta-1.0.0rc1/parity/2.1.312/m3.json +3866 -0
- noeta-1.0.0rc1/parity/2.1.312/m4.json +154 -0
- noeta-1.0.0rc1/parity/2.1.312/m5.json +2874 -0
- noeta-1.0.0rc1/parity/2.1.312/script/m1.json +1190 -0
- noeta-1.0.0rc1/parity/2.1.312/script/m2.json +238 -0
- noeta-1.0.0rc1/parity/2.1.312/script/m3.json +459 -0
- noeta-1.0.0rc1/parity/2.1.312/script/m4.json +27 -0
- noeta-1.0.0rc1/parity/2.1.312/script/m5.json +315 -0
- noeta-1.0.0rc1/parity/2.1.312/texts.json +361 -0
- noeta-1.0.0rc1/parity/2.1.312/tools.json +6585 -0
- noeta-1.0.0rc1/parity/deviations.md +200 -0
- noeta-1.0.0rc1/parity/own-words-allowed.txt +36 -0
- noeta-1.0.0rc1/parity/rules/README.md +81 -0
- noeta-1.0.0rc1/parity/rules/auto-mode-classifier.md +236 -0
- noeta-1.0.0rc1/parity/rules/compaction.md +122 -0
- noeta-1.0.0rc1/parity/rules/main-prompt.md +175 -0
- noeta-1.0.0rc1/parity/rules/reminders.md +339 -0
- noeta-1.0.0rc1/parity/rules/side-requests.md +118 -0
- noeta-1.0.0rc1/parity/rules/source_hash.py +50 -0
- noeta-1.0.0rc1/parity/rules/subagent.md +146 -0
- noeta-1.0.0rc1/parity/rules/tools/Agent.md +73 -0
- noeta-1.0.0rc1/parity/rules/tools/AskUserQuestion.md +63 -0
- noeta-1.0.0rc1/parity/rules/tools/Bash.md +113 -0
- noeta-1.0.0rc1/parity/rules/tools/DeferredToolPlaceholder.md +38 -0
- noeta-1.0.0rc1/parity/rules/tools/Edit.md +62 -0
- noeta-1.0.0rc1/parity/rules/tools/EnterPlanMode.md +46 -0
- noeta-1.0.0rc1/parity/rules/tools/ExitPlanMode.md +50 -0
- noeta-1.0.0rc1/parity/rules/tools/ListAgents.md +42 -0
- noeta-1.0.0rc1/parity/rules/tools/ListMcpResourcesTool.md +44 -0
- noeta-1.0.0rc1/parity/rules/tools/Monitor.md +57 -0
- noeta-1.0.0rc1/parity/rules/tools/Read.md +72 -0
- noeta-1.0.0rc1/parity/rules/tools/ReadMcpResourceTool.md +46 -0
- noeta-1.0.0rc1/parity/rules/tools/ReportFindings.md +50 -0
- noeta-1.0.0rc1/parity/rules/tools/ScheduleWakeup.md +66 -0
- noeta-1.0.0rc1/parity/rules/tools/Skill.md +55 -0
- noeta-1.0.0rc1/parity/rules/tools/SubagentHandback.md +47 -0
- noeta-1.0.0rc1/parity/rules/tools/TaskStop.md +41 -0
- noeta-1.0.0rc1/parity/rules/tools/ToolSearch.md +53 -0
- noeta-1.0.0rc1/parity/rules/tools/WebFetch.md +63 -0
- noeta-1.0.0rc1/parity/rules/tools/Workflow.md +54 -0
- noeta-1.0.0rc1/parity/rules/tools/Write.md +49 -0
- noeta-1.0.0rc1/parity/rules/tools/common.md +18 -0
- noeta-1.0.0rc1/parity/rules/tools/mcp-server-tools.md +41 -0
- noeta-1.0.0rc1/pyproject.toml +223 -0
- noeta-1.0.0rc1/scripts/check-docs.sh +148 -0
- noeta-1.0.0rc1/scripts/lint-layout.py +109 -0
- noeta-1.0.0rc1/scripts/lint-naming.py +256 -0
- noeta-1.0.0rc1/scripts/parity/README.md +119 -0
- noeta-1.0.0rc1/scripts/parity/__init__.py +0 -0
- noeta-1.0.0rc1/scripts/parity/compare.py +668 -0
- noeta-1.0.0rc1/scripts/parity/distill.py +266 -0
- noeta-1.0.0rc1/scripts/parity/drive.py +354 -0
- noeta-1.0.0rc1/scripts/parity/facts.py +340 -0
- noeta-1.0.0rc1/scripts/parity/names.json +95 -0
- noeta-1.0.0rc1/scripts/parity/own_words.py +242 -0
- noeta-1.0.0rc1/scripts/parity/project.py +150 -0
- noeta-1.0.0rc1/scripts/parity/record.py +194 -0
- noeta-1.0.0rc1/scripts/parity/replay.py +689 -0
- noeta-1.0.0rc1/scripts/parity/scenarios.json +68 -0
- noeta-1.0.0rc1/scripts/parity/wire.py +194 -0
- noeta-1.0.0rc1/tests/__init__.py +0 -0
- noeta-1.0.0rc1/tests/agents/__init__.py +0 -0
- noeta-1.0.0rc1/tests/agents/golden/requests.json +3789 -0
- noeta-1.0.0rc1/tests/agents/test_agent_files.py +302 -0
- noeta-1.0.0rc1/tests/agents/test_bash_mode_line.py +118 -0
- noeta-1.0.0rc1/tests/agents/test_plugin_secrets.py +66 -0
- noeta-1.0.0rc1/tests/agents/test_request_golden.py +155 -0
- noeta-1.0.0rc1/tests/agents/test_subagents.py +134 -0
- noeta-1.0.0rc1/tests/backends/__init__.py +0 -0
- noeta-1.0.0rc1/tests/backends/execenvs/__init__.py +0 -0
- noeta-1.0.0rc1/tests/backends/execenvs/test_container.py +302 -0
- noeta-1.0.0rc1/tests/backends/execenvs/test_container_env_values.py +74 -0
- noeta-1.0.0rc1/tests/backends/execenvs/test_container_sandbox.py +140 -0
- noeta-1.0.0rc1/tests/backends/execenvs/test_local.py +432 -0
- noeta-1.0.0rc1/tests/backends/execenvs/test_sandbox.py +892 -0
- noeta-1.0.0rc1/tests/backends/providers/__init__.py +0 -0
- noeta-1.0.0rc1/tests/backends/providers/_anthropic_helpers.py +133 -0
- noeta-1.0.0rc1/tests/backends/providers/_responses_helpers.py +163 -0
- noeta-1.0.0rc1/tests/backends/providers/sse.py +199 -0
- noeta-1.0.0rc1/tests/backends/providers/test_anthropic.py +787 -0
- noeta-1.0.0rc1/tests/backends/providers/test_anthropic_streaming.py +789 -0
- noeta-1.0.0rc1/tests/backends/providers/test_anthropic_wire.py +811 -0
- noeta-1.0.0rc1/tests/backends/providers/test_common.py +276 -0
- noeta-1.0.0rc1/tests/backends/providers/test_cross_adapter.py +247 -0
- noeta-1.0.0rc1/tests/backends/providers/test_live.py +152 -0
- noeta-1.0.0rc1/tests/backends/providers/test_models.py +575 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_compat.py +530 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_compat_body.py +604 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_compat_streaming.py +468 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_images.py +215 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_request.py +616 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_response.py +554 -0
- noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_streaming.py +388 -0
- noeta-1.0.0rc1/tests/backends/providers/test_retry.py +427 -0
- noeta-1.0.0rc1/tests/backends/providers/test_retry_after.py +49 -0
- noeta-1.0.0rc1/tests/backends/providers/test_routing.py +376 -0
- noeta-1.0.0rc1/tests/backends/stores/__init__.py +0 -0
- noeta-1.0.0rc1/tests/backends/stores/test_postgres.py +257 -0
- noeta-1.0.0rc1/tests/backends/stores/test_sqlite_errors.py +108 -0
- noeta-1.0.0rc1/tests/backends/stores/test_sqlite_file_mode.py +46 -0
- noeta-1.0.0rc1/tests/backends/stores/test_store_contract.py +24 -0
- noeta-1.0.0rc1/tests/cli/.gitignore +1 -0
- noeta-1.0.0rc1/tests/cli/__init__.py +0 -0
- noeta-1.0.0rc1/tests/cli/test_claude_plugins.py +156 -0
- noeta-1.0.0rc1/tests/cli/test_commands.py +190 -0
- noeta-1.0.0rc1/tests/cli/test_config.py +532 -0
- noeta-1.0.0rc1/tests/cli/test_device_id.py +17 -0
- noeta-1.0.0rc1/tests/cli/test_frontends_rereview.py +175 -0
- noeta-1.0.0rc1/tests/cli/test_frontends_review.py +189 -0
- noeta-1.0.0rc1/tests/cli/test_headless_flags.py +189 -0
- noeta-1.0.0rc1/tests/cli/test_home_mode.py +49 -0
- noeta-1.0.0rc1/tests/cli/test_mcp_command.py +195 -0
- noeta-1.0.0rc1/tests/cli/test_misconfiguration.py +90 -0
- noeta-1.0.0rc1/tests/cli/test_missing_extras.py +98 -0
- noeta-1.0.0rc1/tests/cli/test_multi_provider.py +254 -0
- noeta-1.0.0rc1/tests/cli/test_plugin_command.py +175 -0
- noeta-1.0.0rc1/tests/cli/test_plugin_files.py +365 -0
- noeta-1.0.0rc1/tests/cli/test_plugin_options.py +340 -0
- noeta-1.0.0rc1/tests/cli/test_plugin_questions.py +156 -0
- noeta-1.0.0rc1/tests/cli/test_serve_defaults.py +53 -0
- noeta-1.0.0rc1/tests/cli/test_server_attach.py +104 -0
- noeta-1.0.0rc1/tests/cli/test_server_token.py +107 -0
- noeta-1.0.0rc1/tests/cli/test_skill_usage_rank.py +35 -0
- noeta-1.0.0rc1/tests/cli/test_tui_start.py +75 -0
- noeta-1.0.0rc1/tests/cli/test_worker_command.py +124 -0
- noeta-1.0.0rc1/tests/cli/test_workspace_trust.py +97 -0
- noeta-1.0.0rc1/tests/cluster/__init__.py +0 -0
- noeta-1.0.0rc1/tests/cluster/conftest.py +94 -0
- noeta-1.0.0rc1/tests/cluster/harness.py +585 -0
- noeta-1.0.0rc1/tests/cluster/invariants.py +249 -0
- noeta-1.0.0rc1/tests/cluster/scripted/pyproject.toml +27 -0
- noeta-1.0.0rc1/tests/cluster/scripted/src/noeta_cluster_scripted/__init__.py +386 -0
- noeta-1.0.0rc1/tests/cluster/test_cluster.py +444 -0
- noeta-1.0.0rc1/tests/conftest.py +137 -0
- noeta-1.0.0rc1/tests/core/__init__.py +0 -0
- noeta-1.0.0rc1/tests/core/procs/worker.py +89 -0
- noeta-1.0.0rc1/tests/core/test_approval_note.py +278 -0
- noeta-1.0.0rc1/tests/core/test_config_signal.py +111 -0
- noeta-1.0.0rc1/tests/core/test_connect.py +45 -0
- noeta-1.0.0rc1/tests/core/test_continuation.py +265 -0
- noeta-1.0.0rc1/tests/core/test_core_record_kinds.py +108 -0
- noeta-1.0.0rc1/tests/core/test_crash_and_race.py +529 -0
- noeta-1.0.0rc1/tests/core/test_erased.py +96 -0
- noeta-1.0.0rc1/tests/core/test_event_redelivery.py +86 -0
- noeta-1.0.0rc1/tests/core/test_fs_end_to_end.py +44 -0
- noeta-1.0.0rc1/tests/core/test_gate_resolution.py +144 -0
- noeta-1.0.0rc1/tests/core/test_images.py +126 -0
- noeta-1.0.0rc1/tests/core/test_kept_claims.py +234 -0
- noeta-1.0.0rc1/tests/core/test_kill9.py +101 -0
- noeta-1.0.0rc1/tests/core/test_loop_behaviors.py +266 -0
- noeta-1.0.0rc1/tests/core/test_mcp_names.py +149 -0
- noeta-1.0.0rc1/tests/core/test_ordered_approvals.py +210 -0
- noeta-1.0.0rc1/tests/core/test_output_ceiling.py +43 -0
- noeta-1.0.0rc1/tests/core/test_park_and_children.py +278 -0
- noeta-1.0.0rc1/tests/core/test_plugin_pins.py +130 -0
- noeta-1.0.0rc1/tests/core/test_prompts.py +117 -0
- noeta-1.0.0rc1/tests/core/test_recovery.py +132 -0
- noeta-1.0.0rc1/tests/core/test_registry.py +32 -0
- noeta-1.0.0rc1/tests/core/test_reminders.py +125 -0
- noeta-1.0.0rc1/tests/core/test_request_stale.py +92 -0
- noeta-1.0.0rc1/tests/core/test_rereview_core.py +181 -0
- noeta-1.0.0rc1/tests/core/test_result_limits.py +129 -0
- noeta-1.0.0rc1/tests/core/test_runner.py +286 -0
- noeta-1.0.0rc1/tests/core/test_runner_review.py +821 -0
- noeta-1.0.0rc1/tests/core/test_snapshots.py +334 -0
- noeta-1.0.0rc1/tests/core/test_task_provider.py +36 -0
- noeta-1.0.0rc1/tests/core/test_timers.py +308 -0
- noeta-1.0.0rc1/tests/core/test_tool_changes.py +229 -0
- noeta-1.0.0rc1/tests/core/test_tool_input.py +63 -0
- noeta-1.0.0rc1/tests/core/test_tool_post_dedupe.py +64 -0
- noeta-1.0.0rc1/tests/core/test_tool_progress.py +60 -0
- noeta-1.0.0rc1/tests/core/test_view_folded.py +27 -0
- noeta-1.0.0rc1/tests/host/__init__.py +0 -0
- noeta-1.0.0rc1/tests/host/procs/delta_worker.py +40 -0
- noeta-1.0.0rc1/tests/host/test_acp.py +170 -0
- noeta-1.0.0rc1/tests/host/test_acp_config.py +130 -0
- noeta-1.0.0rc1/tests/host/test_acp_edits.py +123 -0
- noeta-1.0.0rc1/tests/host/test_acp_live.py +74 -0
- noeta-1.0.0rc1/tests/host/test_acp_plan.py +91 -0
- noeta-1.0.0rc1/tests/host/test_acp_remote.py +168 -0
- noeta-1.0.0rc1/tests/host/test_acp_review.py +314 -0
- noeta-1.0.0rc1/tests/host/test_agent_aliases.py +40 -0
- noeta-1.0.0rc1/tests/host/test_change_config.py +25 -0
- noeta-1.0.0rc1/tests/host/test_channels.py +246 -0
- noeta-1.0.0rc1/tests/host/test_error_text.py +64 -0
- noeta-1.0.0rc1/tests/host/test_find_latest_task.py +27 -0
- noeta-1.0.0rc1/tests/host/test_http.py +158 -0
- noeta-1.0.0rc1/tests/host/test_http_more.py +430 -0
- noeta-1.0.0rc1/tests/host/test_http_web.py +226 -0
- noeta-1.0.0rc1/tests/host/test_initial_prompt.py +44 -0
- noeta-1.0.0rc1/tests/host/test_live_output_across_processes.py +113 -0
- noeta-1.0.0rc1/tests/host/test_live_output_versions.py +58 -0
- noeta-1.0.0rc1/tests/host/test_local_app_options.py +21 -0
- noeta-1.0.0rc1/tests/host/test_prompt_images.py +120 -0
- noeta-1.0.0rc1/tests/host/test_provider_switch.py +133 -0
- noeta-1.0.0rc1/tests/host/test_reported_version.py +40 -0
- noeta-1.0.0rc1/tests/host/test_rewind.py +233 -0
- noeta-1.0.0rc1/tests/host/test_spill.py +149 -0
- noeta-1.0.0rc1/tests/host/test_stream_json.py +559 -0
- noeta-1.0.0rc1/tests/host/test_stream_json_hooks.py +140 -0
- noeta-1.0.0rc1/tests/host/test_summaries.py +142 -0
- noeta-1.0.0rc1/tests/host/test_usage.py +80 -0
- noeta-1.0.0rc1/tests/images.py +18 -0
- noeta-1.0.0rc1/tests/plugins/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/ask_user/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/ask_user/test_ask_user.py +268 -0
- noeta-1.0.0rc1/tests/plugins/ask_user/test_typed_answers.py +90 -0
- noeta-1.0.0rc1/tests/plugins/compaction/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/compaction/_harness.py +178 -0
- noeta-1.0.0rc1/tests/plugins/compaction/test_compaction_layout.py +176 -0
- noeta-1.0.0rc1/tests/plugins/compaction/test_compaction_pure.py +410 -0
- noeta-1.0.0rc1/tests/plugins/compaction/test_compaction_runtime.py +614 -0
- noeta-1.0.0rc1/tests/plugins/compaction/test_long_context.py +705 -0
- noeta-1.0.0rc1/tests/plugins/compaction/test_residents_and_todo.py +133 -0
- noeta-1.0.0rc1/tests/plugins/compaction/test_task_status.py +72 -0
- noeta-1.0.0rc1/tests/plugins/conftest.py +90 -0
- noeta-1.0.0rc1/tests/plugins/context/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/context/conftest.py +71 -0
- noeta-1.0.0rc1/tests/plugins/context/test_coerced_input.py +49 -0
- noeta-1.0.0rc1/tests/plugins/context/test_date_change.py +160 -0
- noeta-1.0.0rc1/tests/plugins/context/test_environment.py +833 -0
- noeta-1.0.0rc1/tests/plugins/context/test_instructions.py +767 -0
- noeta-1.0.0rc1/tests/plugins/context/test_memory.py +600 -0
- noeta-1.0.0rc1/tests/plugins/context/test_skill_arguments.py +47 -0
- noeta-1.0.0rc1/tests/plugins/context/test_skill_discovery.py +713 -0
- noeta-1.0.0rc1/tests/plugins/context/test_skills.py +1130 -0
- noeta-1.0.0rc1/tests/plugins/fs/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_changed_reminder.py +386 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_edit.py +539 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_encodings.py +116 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_fs_state.py +197 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_mentions.py +361 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_notebook_edit.py +115 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_output_limit.py +163 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_pasted_images.py +163 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_read.py +527 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_read_formats.py +309 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_shell_reads.py +255 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_shell_writes.py +72 -0
- noeta-1.0.0rc1/tests/plugins/fs/test_write.py +359 -0
- noeta-1.0.0rc1/tests/plugins/mcp/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/mcp/fake_server.py +154 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_clients.py +454 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_extension.py +659 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_oauth.py +427 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_prompts.py +88 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_results.py +207 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_server_requests.py +320 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_settings.py +221 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_sign_ins.py +74 -0
- noeta-1.0.0rc1/tests/plugins/mcp/test_transports.py +358 -0
- noeta-1.0.0rc1/tests/plugins/permissions/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/permissions/helpers.py +62 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_auto_mode.py +772 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_mode_notes.py +155 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_permissions.py +1228 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_rule_specs.py +56 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_rules.py +209 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_sandbox.py +96 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_scope.py +140 -0
- noeta-1.0.0rc1/tests/plugins/permissions/test_shell_paths.py +110 -0
- noeta-1.0.0rc1/tests/plugins/plan_mode/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/plan_mode/test_alone.py +264 -0
- noeta-1.0.0rc1/tests/plugins/plan_mode/test_plan_mode.py +516 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_background_runtime.py +373 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_background_tools.py +585 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_bash.py +786 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_hardening.py +130 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_monitor_ws.py +189 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_sandbox.py +230 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_workers_and_logs.py +648 -0
- noeta-1.0.0rc1/tests/plugins/shell/test_worktree.py +199 -0
- noeta-1.0.0rc1/tests/plugins/subtasks/__init__.py +0 -0
- noeta-1.0.0rc1/tests/plugins/subtasks/conftest.py +64 -0
- noeta-1.0.0rc1/tests/plugins/subtasks/test_agent_tool.py +998 -0
- noeta-1.0.0rc1/tests/plugins/subtasks/test_idle_notice.py +213 -0
- noeta-1.0.0rc1/tests/plugins/subtasks/test_notice.py +306 -0
- noeta-1.0.0rc1/tests/plugins/test_budget.py +98 -0
- noeta-1.0.0rc1/tests/plugins/test_empty_reply.py +310 -0
- noeta-1.0.0rc1/tests/plugins/test_findings.py +61 -0
- noeta-1.0.0rc1/tests/plugins/test_hooks.py +423 -0
- noeta-1.0.0rc1/tests/plugins/test_hooks_client.py +238 -0
- noeta-1.0.0rc1/tests/plugins/test_hooks_config.py +470 -0
- noeta-1.0.0rc1/tests/plugins/test_hooks_events.py +1173 -0
- noeta-1.0.0rc1/tests/plugins/test_hooks_instructions_loaded.py +71 -0
- noeta-1.0.0rc1/tests/plugins/test_markdown_commands.py +142 -0
- noeta-1.0.0rc1/tests/plugins/test_prompt_keywords.py +179 -0
- noeta-1.0.0rc1/tests/plugins/test_quiet_nudge.py +87 -0
- noeta-1.0.0rc1/tests/plugins/test_repetition_guard.py +98 -0
- noeta-1.0.0rc1/tests/plugins/test_schedule.py +359 -0
- noeta-1.0.0rc1/tests/plugins/test_structured_output.py +245 -0
- noeta-1.0.0rc1/tests/plugins/test_title.py +83 -0
- noeta-1.0.0rc1/tests/plugins/test_todos.py +257 -0
- noeta-1.0.0rc1/tests/plugins/test_tool_result_limits.py +19 -0
- noeta-1.0.0rc1/tests/plugins/test_workflow.py +570 -0
- noeta-1.0.0rc1/tests/plugins/tool_search/test_tool_search.py +315 -0
- noeta-1.0.0rc1/tests/plugins/web/test_web_extension.py +624 -0
- noeta-1.0.0rc1/tests/snapshot_check.py +45 -0
- noeta-1.0.0rc1/tests/test_bench_compare.py +333 -0
- noeta-1.0.0rc1/tests/test_eval_usage.py +58 -0
- noeta-1.0.0rc1/tests/test_lint_layout.py +53 -0
- noeta-1.0.0rc1/tests/test_own_words.py +80 -0
- noeta-1.0.0rc1/tests/test_parity_tools.py +418 -0
- noeta-1.0.0rc1/tests/toolkit/__init__.py +0 -0
- noeta-1.0.0rc1/tests/toolkit/test_function_tool.py +152 -0
- noeta-1.0.0rc1/tests/toolkit/test_guidance_lines.py +39 -0
- noeta-1.0.0rc1/tests/toolkit/test_json_schema.py +89 -0
- noeta-1.0.0rc1/tests/toolkit/test_plugin_records.py +119 -0
- noeta-1.0.0rc1/tests/toolkit/test_sandbox.py +158 -0
- noeta-1.0.0rc1/tests/toolkit/test_shell_rules.py +129 -0
- noeta-1.0.0rc1/tests/toolkit/test_side_requests.py +40 -0
- noeta-1.0.0rc1/tests/toolkit/test_usd_budget.py +70 -0
- noeta-1.0.0rc1/tests/toolkit/test_worktrees.py +122 -0
- noeta-1.0.0rc1/tui/README.md +27 -0
- noeta-1.0.0rc1/tui/pyproject.toml +35 -0
- noeta-1.0.0rc1/tui/screenshots/README.md +20 -0
- noeta-1.0.0rc1/tui/screenshots/approval.svg +207 -0
- noeta-1.0.0rc1/tui/screenshots/context.svg +203 -0
- noeta-1.0.0rc1/tui/screenshots/slash-menu.svg +204 -0
- noeta-1.0.0rc1/tui/screenshots/transcript.svg +203 -0
- noeta-1.0.0rc1/tui/screenshots/trust.svg +196 -0
- noeta-1.0.0rc1/tui/screenshots/welcome.svg +198 -0
- noeta-1.0.0rc1/tui/screenshots/working.svg +203 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/__init__.py +24 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/app.py +751 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/bash_mode.py +61 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/files.py +52 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/history.py +77 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/mentions.py +46 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/render.py +363 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/slash.py +473 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/style.tcss +52 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/transcript.py +508 -0
- noeta-1.0.0rc1/tui/src/noeta_tui/widgets.py +521 -0
- noeta-1.0.0rc1/tui/tests/support.py +134 -0
- noeta-1.0.0rc1/tui/tests/test_alignment.py +223 -0
- noeta-1.0.0rc1/tui/tests/test_claude_code_shape.py +248 -0
- noeta-1.0.0rc1/tui/tests/test_render.py +104 -0
- noeta-1.0.0rc1/tui/tests/test_review_fixes.py +225 -0
- noeta-1.0.0rc1/tui/tests/test_review_regressions.py +434 -0
- noeta-1.0.0rc1/tui/tests/test_screenshots.py +129 -0
- noeta-1.0.0rc1/tui/tests/test_tui.py +297 -0
- noeta-1.0.0rc1/tui/tests/test_tui_commands.py +222 -0
- noeta-1.0.0rc1/uv.lock +1947 -0
- noeta-1.0.0rc1/web/e2e/app.spec.ts +272 -0
- noeta-1.0.0rc1/web/e2e/provider/pyproject.toml +20 -0
- noeta-1.0.0rc1/web/e2e/provider/src/noeta_web_e2e/__init__.py +163 -0
- noeta-1.0.0rc1/web/index.html +12 -0
- noeta-1.0.0rc1/web/package-lock.json +4721 -0
- noeta-1.0.0rc1/web/package.json +35 -0
- noeta-1.0.0rc1/web/playwright.config.ts +44 -0
- noeta-1.0.0rc1/web/screenshots/01-new-session.png +0 -0
- noeta-1.0.0rc1/web/screenshots/02-streamed-reply.png +0 -0
- noeta-1.0.0rc1/web/screenshots/03-approval-card.png +0 -0
- noeta-1.0.0rc1/web/screenshots/04-bash-card.png +0 -0
- noeta-1.0.0rc1/web/screenshots/05-write-diff.png +0 -0
- noeta-1.0.0rc1/web/screenshots/06-streaming.png +0 -0
- noeta-1.0.0rc1/web/screenshots/07-interrupted.png +0 -0
- noeta-1.0.0rc1/web/screenshots/08-plan-review.png +0 -0
- noeta-1.0.0rc1/web/screenshots/09-todos.png +0 -0
- noeta-1.0.0rc1/web/screenshots/10-subagent.png +0 -0
- noeta-1.0.0rc1/web/screenshots/11-slash-menu.png +0 -0
- noeta-1.0.0rc1/web/screenshots/12-rewind.png +0 -0
- noeta-1.0.0rc1/web/screenshots/13-theme.png +0 -0
- noeta-1.0.0rc1/web/screenshots/14-phone.png +0 -0
- noeta-1.0.0rc1/web/screenshots/15-phone-sessions.png +0 -0
- noeta-1.0.0rc1/web/screenshots/16-search-archive.png +0 -0
- noeta-1.0.0rc1/web/screenshots/README.md +52 -0
- noeta-1.0.0rc1/web/src/App.tsx +463 -0
- noeta-1.0.0rc1/web/src/api/client.test.ts +114 -0
- noeta-1.0.0rc1/web/src/api/client.ts +275 -0
- noeta-1.0.0rc1/web/src/api/types.ts +158 -0
- noeta-1.0.0rc1/web/src/components/Composer.tsx +232 -0
- noeta-1.0.0rc1/web/src/components/Controls.tsx +142 -0
- noeta-1.0.0rc1/web/src/components/DiffView.tsx +40 -0
- noeta-1.0.0rc1/web/src/components/Markdown.tsx +36 -0
- noeta-1.0.0rc1/web/src/components/PendingCard.tsx +219 -0
- noeta-1.0.0rc1/web/src/components/Sidebar.tsx +136 -0
- noeta-1.0.0rc1/web/src/components/TodoPanel.tsx +24 -0
- noeta-1.0.0rc1/web/src/components/ToolCard.tsx +134 -0
- noeta-1.0.0rc1/web/src/components/Transcript.tsx +88 -0
- noeta-1.0.0rc1/web/src/components/components.test.tsx +442 -0
- noeta-1.0.0rc1/web/src/desktop.test.tsx +137 -0
- noeta-1.0.0rc1/web/src/desktop.ts +50 -0
- noeta-1.0.0rc1/web/src/main.tsx +10 -0
- noeta-1.0.0rc1/web/src/state/transcript.test.ts +219 -0
- noeta-1.0.0rc1/web/src/state/transcript.ts +389 -0
- noeta-1.0.0rc1/web/src/state/useTask.ts +65 -0
- noeta-1.0.0rc1/web/src/styles.css +1102 -0
- noeta-1.0.0rc1/web/src/test-setup.ts +1 -0
- noeta-1.0.0rc1/web/tsconfig.json +18 -0
- noeta-1.0.0rc1/web/vite.config.ts +33 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# EditorConfig — https://editorconfig.org
|
|
2
|
+
root = true
|
|
3
|
+
|
|
4
|
+
[*]
|
|
5
|
+
charset = utf-8
|
|
6
|
+
end_of_line = lf
|
|
7
|
+
insert_final_newline = true
|
|
8
|
+
trim_trailing_whitespace = true
|
|
9
|
+
indent_style = space
|
|
10
|
+
|
|
11
|
+
# Python
|
|
12
|
+
[*.py]
|
|
13
|
+
indent_size = 4
|
|
14
|
+
|
|
15
|
+
# Web sources, config, and data
|
|
16
|
+
[*.{js,jsx,ts,tsx,css,html,json,yml,yaml,toml}]
|
|
17
|
+
indent_size = 2
|
|
18
|
+
|
|
19
|
+
# Markdown — keep trailing whitespace (two-space line breaks are significant)
|
|
20
|
+
[*.md]
|
|
21
|
+
trim_trailing_whitespace = false
|
|
22
|
+
|
|
23
|
+
# Makefiles require real tabs
|
|
24
|
+
[Makefile]
|
|
25
|
+
indent_style = tab
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Live model configuration for `make e2e` and `make eval`.
|
|
2
|
+
#
|
|
3
|
+
# Copy this file to `.env` (git-ignored) and fill in the values below:
|
|
4
|
+
#
|
|
5
|
+
# cp .env.example .env
|
|
6
|
+
# make e2e
|
|
7
|
+
#
|
|
8
|
+
# One gateway, one key, one base (the host, without /v1); the live tests reach
|
|
9
|
+
# three endpoints under it:
|
|
10
|
+
# <base>/v1/messages (anthropic)
|
|
11
|
+
# <base>/v1/responses (openai_responses)
|
|
12
|
+
# <base>/v1/chat/completions (openai_compat)
|
|
13
|
+
#
|
|
14
|
+
# Missing any of base/key/model auto-skips every live test (CI never runs them).
|
|
15
|
+
# An already-set environment variable overrides the file, so you can also do:
|
|
16
|
+
# NOETA_LIVE_MODEL=other-model uv run pytest -m live
|
|
17
|
+
|
|
18
|
+
NOETA_LIVE_BASE_URL=https://your-gateway.example.com
|
|
19
|
+
NOETA_LIVE_API_KEY=your-rotated-key
|
|
20
|
+
NOETA_LIVE_MODEL=your-model-id
|
|
21
|
+
|
|
22
|
+
# Optional:
|
|
23
|
+
# NOETA_LIVE_MAX_TOKENS=1024
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report something that behaves incorrectly in noeta
|
|
4
|
+
title: "[bug] "
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What happened
|
|
10
|
+
|
|
11
|
+
A clear, concise description of the incorrect behavior.
|
|
12
|
+
|
|
13
|
+
## Steps to reproduce
|
|
14
|
+
|
|
15
|
+
1. …
|
|
16
|
+
2. …
|
|
17
|
+
3. …
|
|
18
|
+
|
|
19
|
+
Include the smallest command, program or config that triggers it. If it concerns what the
|
|
20
|
+
model was sent or did, the output of `noeta -p --output-format stream-json --verbose` helps.
|
|
21
|
+
|
|
22
|
+
## Expected behavior
|
|
23
|
+
|
|
24
|
+
What you expected instead. If Claude Code behaves differently, say how: a difference in what
|
|
25
|
+
the model sees is a bug.
|
|
26
|
+
|
|
27
|
+
## Environment
|
|
28
|
+
|
|
29
|
+
- OS:
|
|
30
|
+
- Python version:
|
|
31
|
+
- noeta version / commit: <!-- e.g. 1.0.0.dev0 @ <sha> -->
|
|
32
|
+
- Install: <!-- uv tool install from the repository / a checkout / pip -->
|
|
33
|
+
- Provider and model: <!-- anthropic | openai_compat | openai_responses, model id -->
|
|
34
|
+
- Store: <!-- sqlite (default) | postgres -->
|
|
35
|
+
|
|
36
|
+
## Logs
|
|
37
|
+
|
|
38
|
+
Relevant output or tracebacks. Redact API keys, tokens and sensitive task content.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
<paste logs here>
|
|
42
|
+
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Propose a change or addition to noeta
|
|
4
|
+
title: "[feat] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Problem / motivation
|
|
10
|
+
|
|
11
|
+
What are you trying to do, and where does noeta get in the way? Describe the need, not only
|
|
12
|
+
the solution.
|
|
13
|
+
|
|
14
|
+
## Proposed solution
|
|
15
|
+
|
|
16
|
+
What you would like noeta to do. If Claude Code already does it, say how. If it could be a
|
|
17
|
+
plugin (`docs/guides/plugins.md`), say why it should be built in.
|
|
18
|
+
|
|
19
|
+
## Alternatives considered
|
|
20
|
+
|
|
21
|
+
Other approaches you weighed and why they fall short. If a decision in `docs/adr/` stands in
|
|
22
|
+
the way, name it.
|
|
23
|
+
|
|
24
|
+
## Area
|
|
25
|
+
|
|
26
|
+
- [ ] kernel (`noeta/core`)
|
|
27
|
+
- [ ] a plugin (`noeta/plugins/...`)
|
|
28
|
+
- [ ] backends (providers, exec envs, stores)
|
|
29
|
+
- [ ] ways in (HTTP, ACP, stream-json) or the `noeta` command
|
|
30
|
+
- [ ] docs / other
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
What this change does and why. Lead with the conclusion.
|
|
4
|
+
|
|
5
|
+
## Kind
|
|
6
|
+
|
|
7
|
+
- [ ] behavior (with a test that fails before it)
|
|
8
|
+
- [ ] structure only (no behavior change)
|
|
9
|
+
- [ ] docs
|
|
10
|
+
|
|
11
|
+
Structure and behavior never share a pull request (see [CONTRIBUTING.md](../CONTRIBUTING.md)).
|
|
12
|
+
|
|
13
|
+
## Spec / decision
|
|
14
|
+
|
|
15
|
+
Link the spec in `docs/specs/` this implements, or "none — no open decision". If a decision in
|
|
16
|
+
`docs/adr/` changes, link the new ADR that refines or supersedes it.
|
|
17
|
+
|
|
18
|
+
## How verified
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
make check # lint, mypy, layering, tests with coverage, examples, doc hygiene
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Paste the result. For model-facing text or provider wire changes, also `make eval` /
|
|
25
|
+
`make parity` and the relevant `make e2e` tests. Say what could not be verified and why.
|
|
26
|
+
|
|
27
|
+
## Checklist
|
|
28
|
+
|
|
29
|
+
- [ ] `make check` passes.
|
|
30
|
+
- [ ] Docs the change makes wrong are fixed in it (`CONTEXT.md`, `docs/`, `CHANGELOG.md` Unreleased).
|
|
31
|
+
- [ ] If this implements a spec: its status, Plan checkboxes and Progress log are up to date.
|
|
32
|
+
- [ ] A human owner has read this change and can answer review questions about it.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
# One run per ref; a newer push to a PR cancels the stale run. Runs on main
|
|
13
|
+
# are never cancelled so every merged commit gets a verdict.
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ci-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
test:
|
|
20
|
+
name: make check (Python ${{ matrix.python-version }})
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 30
|
|
23
|
+
strategy:
|
|
24
|
+
fail-fast: false
|
|
25
|
+
matrix:
|
|
26
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
27
|
+
services:
|
|
28
|
+
# The store contract tests run their Postgres parameter when
|
|
29
|
+
# NOETA_TEST_POSTGRES_DSN is set (skipped otherwise).
|
|
30
|
+
postgres:
|
|
31
|
+
image: postgres:16
|
|
32
|
+
env:
|
|
33
|
+
POSTGRES_PASSWORD: postgres
|
|
34
|
+
ports:
|
|
35
|
+
- 5432:5432
|
|
36
|
+
options: >-
|
|
37
|
+
--health-cmd pg_isready
|
|
38
|
+
--health-interval 5s
|
|
39
|
+
--health-timeout 5s
|
|
40
|
+
--health-retries 10
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v4
|
|
43
|
+
|
|
44
|
+
- name: Install uv
|
|
45
|
+
uses: astral-sh/setup-uv@v6
|
|
46
|
+
with:
|
|
47
|
+
python-version: ${{ matrix.python-version }}
|
|
48
|
+
enable-cache: true
|
|
49
|
+
|
|
50
|
+
- name: Install ripgrep
|
|
51
|
+
# No tool shells out to `rg` any more (search runs through Bash, and the suite does not
|
|
52
|
+
# need it); installed so a `Bash` search in a test finds what a developer machine has.
|
|
53
|
+
run: sudo apt-get update -qq && sudo apt-get install -y -qq ripgrep
|
|
54
|
+
|
|
55
|
+
- name: make check
|
|
56
|
+
env:
|
|
57
|
+
NOETA_TEST_POSTGRES_DSN: postgresql://postgres:postgres@localhost:5432/postgres
|
|
58
|
+
run: make check
|
|
59
|
+
|
|
60
|
+
cluster:
|
|
61
|
+
name: make cluster (workers on Postgres under faults)
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
timeout-minutes: 25
|
|
64
|
+
services:
|
|
65
|
+
postgres:
|
|
66
|
+
image: postgres:16
|
|
67
|
+
env:
|
|
68
|
+
POSTGRES_PASSWORD: postgres
|
|
69
|
+
ports:
|
|
70
|
+
- 5432:5432
|
|
71
|
+
options: >-
|
|
72
|
+
--health-cmd pg_isready
|
|
73
|
+
--health-interval 5s
|
|
74
|
+
--health-timeout 5s
|
|
75
|
+
--health-retries 10
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/checkout@v4
|
|
78
|
+
|
|
79
|
+
- name: Install uv
|
|
80
|
+
uses: astral-sh/setup-uv@v6
|
|
81
|
+
with:
|
|
82
|
+
python-version: "3.12"
|
|
83
|
+
enable-cache: true
|
|
84
|
+
|
|
85
|
+
- name: Raise max_connections
|
|
86
|
+
# Every worker process keeps its own pool; the default 100 runs out
|
|
87
|
+
# (the harness's own container starts with 400). A service container
|
|
88
|
+
# takes no server flags, so set it and restart.
|
|
89
|
+
run: |
|
|
90
|
+
pg=${{ job.services.postgres.id }}
|
|
91
|
+
docker exec "$pg" psql -U postgres -c "ALTER SYSTEM SET max_connections = 400"
|
|
92
|
+
docker restart "$pg"
|
|
93
|
+
for _ in $(seq 60); do
|
|
94
|
+
docker exec "$pg" pg_isready -U postgres -h 127.0.0.1 && break
|
|
95
|
+
sleep 1
|
|
96
|
+
done
|
|
97
|
+
docker exec "$pg" psql -U postgres -tAc "SHOW max_connections"
|
|
98
|
+
|
|
99
|
+
- name: make cluster
|
|
100
|
+
env:
|
|
101
|
+
NOETA_TEST_POSTGRES_DSN: postgresql://postgres:postgres@localhost:5432/postgres
|
|
102
|
+
run: make cluster
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Build the VitePress documentation site and deploy to GitHub Pages.
|
|
2
|
+
#
|
|
3
|
+
# Push to main (docs changes) or manual dispatch: build + deploy.
|
|
4
|
+
# Pull request touching the docs: build only, so a broken page fails the PR
|
|
5
|
+
# instead of the deploy after merge. Nothing is uploaded or deployed.
|
|
6
|
+
# Uses actions/deploy-pages — Pages source must be set to "GitHub Actions"
|
|
7
|
+
# in the repository settings (Settings → Pages → Build and deployment → Source).
|
|
8
|
+
|
|
9
|
+
name: docs
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
push:
|
|
13
|
+
branches: [main]
|
|
14
|
+
paths:
|
|
15
|
+
- "docs/**"
|
|
16
|
+
- "!docs/specs/**"
|
|
17
|
+
- ".github/workflows/docs.yml"
|
|
18
|
+
pull_request:
|
|
19
|
+
branches: [main]
|
|
20
|
+
paths:
|
|
21
|
+
- "docs/**"
|
|
22
|
+
- "!docs/specs/**"
|
|
23
|
+
- ".github/workflows/docs.yml"
|
|
24
|
+
workflow_dispatch: {}
|
|
25
|
+
|
|
26
|
+
permissions:
|
|
27
|
+
contents: read
|
|
28
|
+
|
|
29
|
+
# Deploys share one queue and are never cancelled mid-flight; PR builds get
|
|
30
|
+
# their own group per ref and a newer push cancels the stale one.
|
|
31
|
+
concurrency:
|
|
32
|
+
group: ${{ github.event_name == 'pull_request' && format('docs-pr-{0}', github.ref) || 'pages' }}
|
|
33
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
34
|
+
|
|
35
|
+
jobs:
|
|
36
|
+
build:
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
timeout-minutes: 15
|
|
39
|
+
permissions:
|
|
40
|
+
contents: read
|
|
41
|
+
pages: write # configure-pages reads the site's Pages settings
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v4
|
|
44
|
+
|
|
45
|
+
- name: Setup Node.js
|
|
46
|
+
uses: actions/setup-node@v4
|
|
47
|
+
with:
|
|
48
|
+
node-version: 20
|
|
49
|
+
cache: npm
|
|
50
|
+
cache-dependency-path: docs/package-lock.json
|
|
51
|
+
|
|
52
|
+
- name: Install dependencies
|
|
53
|
+
run: npm ci
|
|
54
|
+
working-directory: docs
|
|
55
|
+
|
|
56
|
+
- name: Configure Pages
|
|
57
|
+
if: github.event_name != 'pull_request'
|
|
58
|
+
id: pages
|
|
59
|
+
uses: actions/configure-pages@v5
|
|
60
|
+
|
|
61
|
+
- name: Build VitePress site
|
|
62
|
+
run: npm run build
|
|
63
|
+
working-directory: docs
|
|
64
|
+
|
|
65
|
+
- name: Upload artifact
|
|
66
|
+
if: github.event_name != 'pull_request'
|
|
67
|
+
uses: actions/upload-pages-artifact@v3
|
|
68
|
+
with:
|
|
69
|
+
path: docs/.vitepress/dist
|
|
70
|
+
|
|
71
|
+
deploy:
|
|
72
|
+
if: github.event_name != 'pull_request'
|
|
73
|
+
needs: build
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
timeout-minutes: 10
|
|
76
|
+
permissions:
|
|
77
|
+
pages: write
|
|
78
|
+
id-token: write
|
|
79
|
+
environment:
|
|
80
|
+
name: github-pages
|
|
81
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
82
|
+
steps:
|
|
83
|
+
- name: Deploy to GitHub Pages
|
|
84
|
+
id: deployment
|
|
85
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Publish `noeta` to PyPI when a `v*` tag is pushed. Procedure: docs/releasing.md.
|
|
2
|
+
# Auth is PyPI Trusted Publishing (OIDC); no token is stored anywhere.
|
|
3
|
+
|
|
4
|
+
name: Release
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
workflow_dispatch: {}
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: release-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
# The suite on the exact commit being published: a tag can point anywhere.
|
|
20
|
+
test:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 30
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
- uses: astral-sh/setup-uv@v6
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
- name: Install ripgrep
|
|
29
|
+
run: sudo apt-get update -qq && sudo apt-get install -y -qq ripgrep
|
|
30
|
+
- run: make check
|
|
31
|
+
|
|
32
|
+
build:
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
timeout-minutes: 10
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
- name: Changelog gate — the tagged version must have a dated section
|
|
38
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
39
|
+
run: |
|
|
40
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
41
|
+
if ! grep -Eq "^## \[${VERSION}\] - [0-9]{4}-[0-9]{2}-[0-9]{2}$" CHANGELOG.md; then
|
|
42
|
+
echo "::error::CHANGELOG.md has no dated '## [${VERSION}] - YYYY-MM-DD' section; see docs/releasing.md"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
- uses: astral-sh/setup-uv@v6
|
|
46
|
+
with:
|
|
47
|
+
python-version: "3.12"
|
|
48
|
+
- name: Build
|
|
49
|
+
run: |
|
|
50
|
+
uv build
|
|
51
|
+
ls -l dist/
|
|
52
|
+
- name: The wheel's version is the tag's
|
|
53
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
54
|
+
run: |
|
|
55
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
56
|
+
ls dist/noeta-"${VERSION}"-*.whl
|
|
57
|
+
- uses: actions/upload-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: dist
|
|
60
|
+
path: dist/
|
|
61
|
+
|
|
62
|
+
publish:
|
|
63
|
+
needs: [test, build]
|
|
64
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
timeout-minutes: 10
|
|
67
|
+
permissions:
|
|
68
|
+
id-token: write # mint the short-lived PyPI OIDC token
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/download-artifact@v4
|
|
71
|
+
with: { name: dist, path: dist/ }
|
|
72
|
+
- uses: astral-sh/setup-uv@v6
|
|
73
|
+
- run: uv publish --trusted-publishing always dist/*
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Claude Code local config of contributors (not part of noeta)
|
|
2
|
+
.claude/
|
|
3
|
+
|
|
4
|
+
# Live-test secrets (never committed)
|
|
5
|
+
.env
|
|
6
|
+
|
|
7
|
+
# Python
|
|
8
|
+
__pycache__/
|
|
9
|
+
*.py[cod]
|
|
10
|
+
*$py.class
|
|
11
|
+
*.so
|
|
12
|
+
*.egg-info/
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
env/
|
|
16
|
+
.pytest_cache/
|
|
17
|
+
.mypy_cache/
|
|
18
|
+
.ruff_cache/
|
|
19
|
+
.import_linter_cache/
|
|
20
|
+
.tox/
|
|
21
|
+
htmlcov/
|
|
22
|
+
.coverage
|
|
23
|
+
.coverage.*
|
|
24
|
+
dist/
|
|
25
|
+
build/
|
|
26
|
+
site/
|
|
27
|
+
*.egg
|
|
28
|
+
node_modules/
|
|
29
|
+
|
|
30
|
+
# web/ test output
|
|
31
|
+
web/test-results/
|
|
32
|
+
web/playwright-report/
|
|
33
|
+
|
|
34
|
+
# desktop/ build and test output
|
|
35
|
+
desktop/build/
|
|
36
|
+
desktop/release/
|
|
37
|
+
desktop/test-results/
|
|
38
|
+
desktop/playwright-report/
|
|
39
|
+
|
|
40
|
+
# IDE / Editor
|
|
41
|
+
.idea/
|
|
42
|
+
.vscode/
|
|
43
|
+
*.swp
|
|
44
|
+
*.swo
|
|
45
|
+
*~
|
|
46
|
+
|
|
47
|
+
# OS
|
|
48
|
+
.DS_Store
|
|
49
|
+
Thumbs.db
|
|
50
|
+
|
|
51
|
+
# Local demo / scratch artifacts
|
|
52
|
+
*.sqlite
|
|
53
|
+
*.sqlite-shm
|
|
54
|
+
*.sqlite-wal
|
|
55
|
+
*.tmp.xml
|
|
56
|
+
*.tmp
|
|
57
|
+
|
|
58
|
+
# Local host config that may hold an api_key — ignored so a local copy can
|
|
59
|
+
# never be committed.
|
|
60
|
+
/noeta.config.json
|
|
61
|
+
|
|
62
|
+
# prompt-regression eval run outputs
|
|
63
|
+
evals/results/
|
|
64
|
+
bench/jobs/
|
|
65
|
+
bench/datasets/
|
|
66
|
+
bench/logs/
|
|
67
|
+
|
|
68
|
+
# make parity output (the replay capture and the report it writes)
|
|
69
|
+
parity/out/
|
|
70
|
+
parity/report.md
|
|
71
|
+
|
|
72
|
+
# Claude Code's wording, even hashed, stays out of the repository
|
|
73
|
+
parity/*/cc-windows.bin
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
noeta-1.0.0rc1/AGENTS.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
## Communication
|
|
2
|
+
|
|
3
|
+
- Keep answers concise and direct; lead with the conclusion and the next step.
|
|
4
|
+
- Don't add unrelated explanation; when unsure, state your assumptions and the risks.
|
|
5
|
+
- Don't narrate what you're about to do or recap what you just did; report only what changes what the reader does next.
|
|
6
|
+
- Conversation may happen in whatever language the other side uses; everything committed to the repo (see Language) is English.
|
|
7
|
+
|
|
8
|
+
## Language
|
|
9
|
+
|
|
10
|
+
- All repository artifacts are written in English: docs (`CONTEXT.md`, `docs/adr/`, `docs/specs/`), code comments, and identifiers. The one exception is the docs site: every page in `docs/` that the site serves (`docs/.vitepress/config.ts` lists them) has a Chinese page at the same path under `docs/zh/`, written as Chinese rather than translated, and a change to one updates both.
|
|
11
|
+
- Keep technical terms in their canonical English form and spell them consistently throughout: code identifiers (function / class / file / variable names), API / library / tool / command names, file paths, and fixed architecture terms (module, interface, seam, adapter, deep module, etc.). Don't invent alternate names or switch between synonyms.
|
|
12
|
+
- Write clear, idiomatic English prose — not word-for-word translation from another language.
|
|
13
|
+
- Pick one spelling per term and use it everywhere; don't mix variants.
|
|
14
|
+
- Naming is enforced by `scripts/lint-naming.py` (in `make check`); the banned names and the canonical `Task` / `root_task_id` are in `CONTEXT.md`'s `Naming:` entries.
|
|
15
|
+
|
|
16
|
+
## Context / ADR
|
|
17
|
+
|
|
18
|
+
- Read `CONTEXT.md` first whenever you touch domain concepts, system boundaries, or stable conventions. A package with its own `AGENTS.md` keeps its module-only concepts there.
|
|
19
|
+
- Read `docs/adr/` (start at `docs/adr/index.md`) first whenever a long-term architecture trade-off is involved; never rely on an ADR marked `superseded`, and read the ADRs listed under its `Refined by`.
|
|
20
|
+
- Code is the single source of truth for "what is." When docs and code disagree, trust the code and fix the docs.
|
|
21
|
+
- One fact, one home: never state the same fact in two docs — link instead. The docs site is the home of explanations for users; `CONTEXT.md` and ADRs are for contributors and the site links to them. A change that invalidates a `CONTEXT.md` entry or ADR updates it in the same task.
|
|
22
|
+
- Write docs lean: a `CONTEXT.md` or `AGENTS.md` line exists only if code can't tell an agent the same thing quickly; point at code by repo path instead of restating it. An ADR only for a shipped decision that is costly to reverse; changing one is a new ADR that refines or supersedes it, never an amendment in place. `scripts/check-docs.sh` holds the budgets and formats — trim, don't raise them. When unsure, don't write it.
|
|
23
|
+
- Code comments carry only constraints the code can't show — never a `docs/specs/` reference (one-shot artifacts). Code needn't cite ADRs; where a comment names one it is plain prose, not a contract.
|
|
24
|
+
- Archived specs (`docs/specs/archive/`) are construction history — never read them as a description of the current system.
|
|
25
|
+
|
|
26
|
+
## Task flow
|
|
27
|
+
|
|
28
|
+
- Before starting, run `make check`. Red that isn't yours → report it before anything else.
|
|
29
|
+
- When the idea isn't clear yet, shape before code: ask one question at a time, each with a recommended answer and its reasoning; look up what code and docs can answer instead of asking. Converged = no open decision that would change the implementation path, boundary, or acceptance criteria. ("Just recommend" → answer straight, flagging the assumptions.)
|
|
30
|
+
- Shaping red lines: no implementation code and no spec before the design converges; a finished spec doesn't slide into implementation — starting is a separate decision.
|
|
31
|
+
- Record decisions in the spec's `Decisions` as they settle — not yet in `CONTEXT.md` or `docs/adr/`; those are distilled at review wrap-up from what survived. One-off details are not persisted.
|
|
32
|
+
- Write the spec per `docs/specs/TEMPLATE.md` at `docs/specs/<YYYY-MM-DD>-<slug>.md`: `active` if implementation starts now, `proposed` if queued. A terminal status (`done` / `superseded` / `dropped`) and the move into `docs/specs/archive/` are one action.
|
|
33
|
+
- A change with no open decision (a bug fix with clear expected behavior, a small change inside one module) needs no spec: implement directly and put the why in the commit message.
|
|
34
|
+
- Implement against the spec: flip it `active` (set `owner` when others may work in parallel); tick Plan tasks as they complete; log progress, decision changes, and friction in its Progress log. For large tasks with clean boundaries, split work across subagents while the main agent integrates and verifies.
|
|
35
|
+
- For architecture improvements, refactoring direction, and module design, start from the existing decisions (`docs/adr/`) and the engineering constraints below.
|
|
36
|
+
- done = every acceptance criterion met + all automated gates green. Both required.
|
|
37
|
+
- Before merge, review per `docs/reviewing.md`; merging archives the spec and distills long-term knowledge.
|
|
38
|
+
- Resume across sessions from the spec alone; write no separate handoff doc. A spec-less change that spans sessions leaves its state in the branch's commit messages.
|
|
39
|
+
|
|
40
|
+
## Verbs
|
|
41
|
+
|
|
42
|
+
- install: `make install` (uv sync with every extra; first time)
|
|
43
|
+
- test: `make test`
|
|
44
|
+
- lint: `make lint`
|
|
45
|
+
- build: `make build` (wheel and sdist into `dist/`)
|
|
46
|
+
- e2e: `make e2e` — `-m live` tests against a real model (providers, ACP); needs credentials, never part of `check`
|
|
47
|
+
- eval: `make eval` — prompt-regression scenarios against a real model, compared to `evals/baseline.json`; `make eval-baseline` re-records it; needs credentials, never part of `check`
|
|
48
|
+
- parity: `make parity` — noeta replayed offline through Claude Code's recorded scenarios, every request difference in `parity/report.md` (`scripts/parity/README.md`); never part of `check`
|
|
49
|
+
- cluster: `make cluster` — worker processes on one Postgres (a throwaway `postgres:16` container, or `NOETA_TEST_POSTGRES_DSN`) under random SIGKILL / SIGSTOP with a scripted provider (`tests/cluster`); a known gap is an `xfail(strict=True)` there; `NOETA_CLUSTER_SEED` replays a run; never part of `check`
|
|
50
|
+
- check: `make check` — ruff, mypy --strict, `scripts/lint-naming.py`, `scripts/lint-layout.py` (placement), `lint-imports` (layering), pytest with coverage ≥ 85, `make example` (the example plugins), `scripts/check-docs.sh`
|
|
51
|
+
- docs: `make docs` — the docs site (VitePress in `docs/`, diagrams in `docs/diagrams/`, `npm run diagrams` restyles them); needs node, never part of `check`; `make docs-dev` previews it
|
|
52
|
+
- frontends: `make frontends` — each front end's own checks (`web/`: npm typecheck, vitest, Playwright against a real `noeta serve` on a scripted provider); needs node and a browser, never part of `check`
|
|
53
|
+
- release: tag push per `docs/releasing.md` — approval gate
|
|
54
|
+
|
|
55
|
+
## Gates
|
|
56
|
+
|
|
57
|
+
- Automated gates (required for done): `make check`. CI's test job runs the same target; CI-only on top: the Postgres parameters of the store contract tests (`NOETA_TEST_POSTGRES_DSN`), the Python 3.11 / 3.12 / 3.13 matrix, and the `cluster` job (`make cluster` against a Postgres service container).
|
|
58
|
+
- `make check` can't judge model-facing prompt text or provider wire behavior. A change there also runs `make eval` (no scenario may regress; re-record the baseline when a scenario changes) and the relevant `make e2e` tests.
|
|
59
|
+
- Approval gates (the maintainer signs off before running): release, data migration or deletion on a host's store.
|
|
60
|
+
|
|
61
|
+
## Engineering constraints
|
|
62
|
+
|
|
63
|
+
- Feature work changes behavior; maintenance work changes structure. Never mix them in one diff.
|
|
64
|
+
- Prefer existing patterns in the repo, keep changes focused, and avoid unrelated refactors.
|
|
65
|
+
- Architecturally, prefer deep modules: a small interface hiding a substantial implementation.
|
|
66
|
+
- The interface is the test surface; don't introduce a seam without a real need to substitute the implementation.
|
|
67
|
+
- Put new code where `CONTEXT.md`: Where code goes says, and respect the layering (`CONTEXT.md`: Layers): the kernel carries no capability; a plugin imports only `noeta.core` and `noeta.toolkit`. `lint-imports` and `scripts/lint-layout.py` enforce it.
|
|
68
|
+
- Name things for what they do, never a metaphor — in code, doc terms, and file slugs alike.
|
|
69
|
+
- Run verification matched to the risk; if you can't verify, say why.
|
|
70
|
+
|
|
71
|
+
## Release
|
|
72
|
+
|
|
73
|
+
- A merged behavior change to `noeta/` should be followed by a release; the published package must not lag `main`.
|
|
74
|
+
- Bumps are patch by default — minor/major is the maintainer's explicit call.
|
|
75
|
+
- Follow `docs/releasing.md`. Human sign-off = pushing the `vX.Y.Z` tag.
|
|
76
|
+
|
|
77
|
+
## Maintenance
|
|
78
|
+
|
|
79
|
+
- After a large feature merges, run a scoped gc over the changed area; periodically run a global gc — both per `docs/gc.md`.
|
|
80
|
+
- When `make check` prints `gc due`, finish the task first, then tell the user and offer a scoped gc.
|
|
81
|
+
- Every gc change leaves behavior unchanged; never mix gc into a feature diff.
|