opencode-agent
77143ac6da
test(project-status): skip exec_real when gh CLI unavailable
CI / bootstrap (push) Successful in 7s
CI / lint (push) Successful in 20s
CI / typecheck (push) Successful in 28s
CI / test (3.12) (push) Successful in 1m41s
CI / test (3.13) (push) Successful in 1m35s
CI / test (3.14) (push) Successful in 1m28s
CI / complexity (push) Successful in 29s
2026-08-06 14:45:18 +00:00
Sergey
9459e47567
feat(spec): mobile-first silent enforcement in STACK_REQUIRED + CI e2e ( #281 )
...
CI / bootstrap (push) Successful in 52s
CI / lint (push) Successful in 2m2s
CI / typecheck (push) Successful in 27s
CI / test (3.12) (push) Failing after 2m53s
CI / test (3.13) (push) Failing after 2m0s
CI / test (3.14) (push) Failing after 1m48s
CI / complexity (push) Successful in 23s
* feat(spec): mobile-first silent enforcement in STACK_REQUIRED + Template C
* feat(ci): frontend-e2e job with Playwright in fullstack cookiecutter
* docs(skills): mention mobile-first in audit, code-standards, project-status tool
* fix(ci): use npm install instead of npm ci + add e2e regression test
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-05 07:05:14 +03:00
Sergey
6bb115e706
feat(fullstack): mobile-first guarantee — cookiecutter + project-status ( #280 )
...
* feat(scripts): add MOBILE_FIRST_MARKERS + _check_mobile_first check
* feat(templates): fullstack mobile-first PWA manifest + mobile Playwright + axe
* test(scripts): cover mobile-first markers, check, cookiecutter structure
* fix(ci): reformat test_project_status.py string literals
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-05 06:46:20 +03:00
Sergey
43975cb593
refactor(scripts): project-status all-WARN non-blocking contract ( #277 )
...
* refactor(scripts): project-status all-WARN non-blocking contract
* refactor(skills): parse WARN instead of FAIL in audit and project-template
* test(scripts): update project-status asserts FAIL to WARN, exit code always 0
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-05 06:10:06 +03:00
Sergey
c9198a40a7
fix(scripts): project-status fullstack backend/ path + db/models + no_db removal ( #276 )
...
* refactor(contract): drop NO_DB_SUPPORTED set (issue #274 )
* fix(scripts): route backend checks via backend_root + auto-detect db/models from deps
* refactor(templates): drop no_db marker write from cookiecutter hooks
* test(scripts): cover db/models auto-detect + fullstack all-groups + use_db=no detect
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-05 05:44:42 +03:00
Sergey
ca2a04ce47
refactor(templates): drop README from cookiecutter templates ( #272 )
...
* refactor(templates): remove README.md from cookiecutter templates
* test(templates): drop README expectations, expect WARN instead
* docs(skills): note README is generated post-init via repo-readme
* docs(skills): repo-readme creates README from scratch post-init
* fix(templates): drop readme field from pyproject after README removal
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-05 04:15:43 +03:00
Sergey
70b8203704
feat(readme): switch support link to /contacts ( #270 )
...
* feat(tool): switch create-readme support link to /contacts
* feat(scripts): warn on deprecated support link in readme check
* feat(templates): switch cookiecutter readme support links to contacts
* docs(skill): drop removed validate mode from repo-readme docs
* test(status): cover contacts link warn/fail/ok cases
* fix(ci): shorten lines to satisfy ruff
* fix(ci): apply ruff format
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-05 03:54:59 +03:00
Sergey
c0e8ec816a
refactor(scripts): unify project contract + fix no_db polarity + frontend stack detection ( #267 )
...
* refactor(scripts): add project_contract.py single source of truth
* fix(spec-status): word-boundary regex for stack matching (uv!=uvicorn)
* feat(project-status): frontend stack detection + no_db support
* fix(template): cookiecutter use_db=no writes no_db=true marker
* fix(ci): ruff SIM300/PLC0415/W292/E501 in project_contract tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 23:20:11 +03:00
Sergey
7c3ded601f
feat(template): bake shadcn-svelte + Tailwind v4 + TS into fullstack cookiecutter ( #265 )
...
* feat(template): fullstack cookiecutter — Tailwind v4 + TS + shadcn-svelte scaffold
* feat(template): fullstack — shadcn-svelte ui components + dashboard layout
* refactor(template): fullstack — remove counter/Header demo files
* feat(spec): add tailwind/shadcn/ts to STACK_REQUIRED fullstack
* test(template): update fullstack cookiecutter assertions for shadcn-svelte
* fix(ci): ruff format test_cookiecutter_templates
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 22:08:58 +03:00
Sergey
e4f9313641
fix(templates): validate cookiecutter project_name as python identifier ( #263 )
...
* fix(templates): add pre_gen_project hook validating project_name identifier
* fix(templates): use valid identifier defaults in cookiecutter.json
* test(templates): add regression tests for project_name identifier validation
* fix(tests): resolve fullstack package name via backend ctx
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 14:36:33 +03:00
Sergey
06899b3c01
fix(infra): fullstack api dirs include package name ( #261 )
...
* fix(infra): fullstack _api_dirs_for includes package name in path
* test(infra): fullstack thin-routes check coverage for issue #259
* fix(ci): reformat assert in test_project_status for ruff
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 13:55:52 +03:00
Sergey
8e00969c3e
feat(skills): code-standards architecture + tests sections, scattered-models check ( #256 )
...
* feat(skills): code-standards architecture + tests sections
* feat(infra): scattered-models AST check in project-status
* test(infra): scattered-models check tests (10 cases)
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 13:31:15 +03:00
Sergey
feea1b58d9
feat(skills): feature-spec impact analysis + 8th SDD section ( #254 )
...
* feat(skills): feature-spec impact analysis + 8th SDD section
* feat(tools): validate 8th SDD section in create-issue
* test(tools): cover 8th SDD section in create-issue tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 13:05:37 +03:00
Sergey
baf6b30547
fix(infra): AST route imports + check_tests structure + check_readme full port ( #248 )
...
* feat(infra): AST route imports check in project-status
* feat(infra): check_tests structure + AST stub-detector
* feat(infra): check_readme full port from validateReadme
* refactor(infra): drop validate mode from create-readme tool
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 20:50:04 +03:00
Sergey
93911f2af6
refactor(infra): eliminate globals + split check_pyproject in project-status ( #247 )
...
* refactor(infra): introduce RepoCtx, eliminate globals in project-status
* refactor(infra): split check_pyproject into 13 sub-functions
* test(infra): add RepoCtx + 13 sub-function tests, migrate cookiecutter tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 20:34:04 +03:00
Sergey
10df459cee
fix(infra): enforce nested src/<package>/ layout in project-status + cookiecutter ( #246 )
...
* fix(infra): nested src/<package>/ layout in project-status oracle
* fix(templates): nested packages and drop src. prefix in cookiecutter
* test(infra): cover nested src/<package>/ layout contract #241
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 20:06:36 +03:00
Sergey
596aa9b18a
fix(pipeline-status): scan all rotated memory files in check_memory ( #245 )
...
* refactor(pipeline-status): split get_memory_file_path into _resolve_memory_base + get_memory_files
* test(pipeline-status): update check_memory tests for multi-file scan
* test(pipeline-status): add rotation/mtime/glob coverage
* fix(ci): move os/time imports to top-level in test_pipeline_status
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 19:10:18 +03:00
Sergey
1e9ee49a1d
feat(infra): check_pyproject and --repo flag in project-status ( #240 )
...
* feat(infra): add check_pyproject and --repo flag to project-status
* feat(infra): add repo flag to project-status ts wrapper
* test(infra): add check_pyproject and repo flag tests
* fix(infra): accept packages=["src"] as valid hatchling wheel config
* fix(ci): apply ruff format to project-status.py and tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 18:36:18 +03:00
Sergey
b3aac737eb
feat(spec): project template skill init and check flow ( #237 )
...
* feat(spec): add project-template skill init and check flow
* refactor(spec): remove repo-init migrate references to project-template
* test(spec): structural tests for project-template skill and command
* fix(test): wrap long lines and use non_templated var in project template tests
* fix(ci): reformat test_project_template_skill.py for ruff format
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 17:37:55 +03:00
Sergey
51a5300423
feat(spec): update stack required and jwt auth template ( #236 )
...
* feat(spec): update STACK_REQUIRED for svelte and quality tools
* fix(templates): align jwt auth with issue contracts
* docs(spec): update template c stack and migration note
* fix(ci): format tests/test_spec_status.py
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 17:21:43 +03:00
Sergey
35b6c6e542
feat(infra): cookiecutter templates backend fullstack cli ( #235 )
...
* feat(infra): backend cookiecutter template with fastapi tortoise
* feat(infra): cli cookiecutter template with typer entry point
* feat(infra): fullstack cookiecutter template with sveltekit frontend
* test(infra): cookiecutter template tests and render fixes
* style(infra): ruff cleanup for cookiecutter template tests
* style(infra): ruff format cookiecutter template tests
* fix(infra): handle use_db no use_auth no in cookiecutter
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 17:06:24 +03:00
Sergey
42c8e2d31e
feat(infra): project-status check oracle and ts wrapper ( #233 )
...
* feat(infra): project-status python oracle
* feat(infra): project-status ts wrapper
* feat(infra): project-status deny rules and config
* test(infra): project-status oracle and tool tests
* fix(ci): ruff format project-status.py and tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 15:31:42 +03:00
Sergey
cc2c896290
fix(spec): spec-status parser quotes crlf bom ( #232 )
...
* fix(spec): strip quotes crlf bom in spec-status parser
* test(spec): cover quotes crlf bom trailing newline cases
* fix(ci): format test_spec_status.py write_bytes call
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-03 15:08:50 +03:00
Sergey
7d1ef60f6f
fix(docker): install docker-cli and fix DOCKER_HOST hostname ( #223 )
...
* fix(docker): install docker-ce-cli and compose plugin in image
* fix(docker): point DOCKER_HOST to resolvable dind service alias
* test(docker): cover docker-ce-cli install and dind DOCKER_HOST fix
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-02 03:49:31 +03:00
Sergey
b7b1920385
fix(permissions): harden bash rules against repo destruction ( #218 )
...
* feat(permissions): deny gh api DELETE and repo transfer
* feat(permissions): ask on force push and tag delete
* test(permissions): cover hardened bash deny/ask rules
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 06:54:33 +03:00
Sergey
1dc2b0fa41
fix(cleanup): remove stale handoff refs in test_execute_aborts docstring ( #216 )
...
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 05:04:41 +03:00
Sergey
a1f18eaf24
fix(cleanup): remove stale docs references from test_pipeline_status_tool.py ( #215 )
...
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 04:56:41 +03:00
Sergey
37ebcd0e08
chore(cleanup): remove stale references to deprecated docs infrastructure ( #212 )
...
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 04:43:10 +03:00
Sergey
b2329210d5
chore(cleanup): delete docs-reviewer infrastructure ( #210 )
...
* chore(cleanup): remove docs-reviewer agent and post-docs-review tool
* chore(cleanup): remove scaffold-handoff, adr-refs check, CI and tests
* chore(cleanup): remove docs/project-map directory
* chore(cleanup): drop docs-reviewer entry and post_docs_review keys from opencode.json
* chore(cleanup): drop docs-reviewer refs from tests, skills and shared tools comment
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 04:15:41 +03:00
Sergey
9dd462b764
refactor(pipeline): remove DOCS phase from pipeline-status ( #208 )
...
* test(pipeline): remove adr and project-map test files
* refactor(pipeline): remove DOCS phase from pipeline-status
* test(pipeline): update tests for 6-phase pipeline
* docs(handoff): add handoff and ADR for remove-docs-phase
* docs(handoff): set PR number
* fix(pipeline): parse PR body via json.loads in check_implement
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 03:48:41 +03:00
Sergey
0c1e3e7d39
feat(create-pr): enforce Watch out and Pending headings in PR body ( #207 )
...
* feat(create-pr): enforce Watch out and Pending headings
* test(create-pr): cover Watch out and Pending headings
* docs(handoff): add handoff and ADR for PR #207
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 03:28:35 +03:00
Sergey
4258621def
fix(repo-readme): create mode does not overwrite existing local README ( #175 )
...
* fix(create-readme): resolve file_path against context.worktree
* test(loader): support fs imports and extended TS stripping
* test(create-readme): add regression tests for local overwrite
* docs(repo-readme): note file_path resolves against worktree
* docs(handoff): set PR number
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-31 21:10:29 +03:00
Sergey
c491b5fad1
fix(issue): align headings with create-issue validation and add SDD sections ( #169 )
...
* fix(issue): align headings with create-issue validation and add SDD sections
* docs(issue): add handoff, ADR, and fix CI for SDD validation
* docs(pr-169): fix handoff sections
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-31 19:42:14 +03:00
Sergey
0d16b028fa
fix(draw-image): optional badge/subtitle + self-healing docker entrypoint ( #144 )
...
* fix(draw-image): conditional slot bg + optional subtitle in buildSvg
* test(draw-image): optional badge/subtitle unit+integration+e2e
* feat(docker): self-healing entrypoint shim + .dockerignore
* test(draw-image): pytest assert --subtitle omitted when absent
* docs(handoff): optional badge/subtitle + docker entrypoint handoff+ADR
* docs(handoff): set PR number 144
* docs(project-map): fix PR refs 143 to 144
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-30 01:23:25 +03:00
Sergey
56b67d2d5c
feat(draw-image): SVG template renderer for on-brand covers ( #134 )
...
* feat(draw-image): add SVG template render engine
* feat(draw-image): add opencode plugin and tool tests
* test(draw-image): add vitest unit integration e2e suite
* chore(draw-image): wire CI dependabot docs and ADR
* docs(handoff): set PR number
* docs(handoff): fix PR number placeholder in frontmatter
* fix(ci): use tempfile and trailing newline in draw-image tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 23:42:50 +03:00
Sergey
e72d435b82
fix(docker): increase opencode limits and add tini reaper + healthcheck ( #132 )
...
* fix(docker): increase opencode memory and cpu limits
* fix(docker): add tini init for zombie reaping
* fix(docker): add healthcheck for hang auto-restart
* test(docker): assert opencode limits, init and healthcheck
* docs(handoff): add handoff and ADR for opencode limits fix
* docs(handoff): set PR number
* docs(project-map): update docker-compose and test descriptions for PR#132
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 21:19:01 +03:00
Sergey
7249f1fcb5
fix(memory): keyword search out-of-box + doctor gaps + tests ( #124 )
...
* fix(docker): add system ripgrep via apt for keyword search fallback
* fix(ci): install ripgrep and npm deps for keyword search in CI
* fix(memory-search): warn when ripgrep not resolvable instead of silent skip
* fix(memory-doctor): check rg status, arch mismatch, and require errors
* test(memory): add keyword search and doctor unit tests
* test(memory): unskip e2e keyword tests without RUN_LIVE
* docs(handoff): add handoff and ADR for keyword search fix
* test(memory): remove unused var in keyword search test
* docs(handoff): set PR number to 124
* docs(project-map): update after structural changes (PR#124)
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 17:20:59 +03:00
Sergey
d724e29f96
fix(pipeline-status): use statusCheckRollup instead of actions/runs CI filter ( #122 )
...
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 05:29:10 +03:00
Sergey
4e926a43a7
fix(readme): russian heading, simplified support, access_url, env username ( #118 )
...
* fix(readme): russian heading, simplified support, access_url, env username
* fix(ci): wrap long assert to satisfy ruff E501 in test_permissions.py
* docs(project-map): add PR#118 tags (create-readme, repo-readme, .env.example)
* fix(ci): format test_permissions.py for ruff format check
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 04:56:35 +03:00
Sergey
fc03889c6f
fix(tests): rename misleading test names after create_issue enablement ( #114 )
...
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 01:40:03 +03:00
Sergey
f1b8ff94bf
feat(agents): enable create_issue and behavioral rules ( #113 )
...
* feat(agents): enable create_issue for subagents
* docs(agents): add bug discovery protocol and linear execution rule
* docs(handoff): add handoff and ADR
* docs(handoff): set PR number
* docs(project-map): update after structural changes
* fix(agents): revert create_issue for read-only subagents
* fix(agents): re-enable create_issue and update tests
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 01:25:30 +03:00
Sergey
9d654a2201
chore(memory): remove plugin + setup-memory.sh + Rust artifacts ( #103 )
...
* chore(memory): remove plugin block from opencode.json
* chore(memory): remove setup-memory.sh and memory-setup.ts
* chore(memory): remove opencode-memory from Dockerfile
* docs(memory): update AGENTS.md and SKILL.md for new tools
* test(memory): drop tests for removed setup-memory.sh and memory-setup.ts
* docs(handoff): add handoff and ADR-045 for plugin/rust removal
* docs(handoff): set PR number
* docs(project-map): update after plugin/rust removal
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-27 01:47:26 +03:00
Sergey
9d1373a51b
test(memory): E2E coverage for 4 scenarios ( #102 )
...
* test(memory): E2E coverage for 4 scenarios
* docs(handoff): set PR number
* style(memory): ruff format e2e test
* docs(project-map): add test_memory_tools_e2e.py after PR#102
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-27 01:32:53 +03:00
Sergey
a6491df5a6
refactor(memory): lazy-init embedder + reindex logging ( #100 )
...
* refactor(memory): lazy-init embedder env reads
* feat(memory): reindex log to .rag/reindex.log
* refactor(memory): search handles None embedder
* test(memory): cover None embedder in search and index
* docs(handoff): add handoff and ADR for lazy-init embedder
* docs(handoff): set PR number
* docs(handoff): rename to pr-100 prefix for pipeline detection
* refactor(memory): split run_search to satisfy xenon rank A
* fix(memory): cast search result fields to satisfy mypy
* style(memory): ruff format search.py
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-27 00:30:16 +03:00
Sergey
25cf10baa6
feat(memory): incremental index with SHA256 + atomic + versioning + flock ( #83 )
...
* feat(memory): add SHA256 incremental index with atomic writes, versioning, flock
* feat(memory): parse Retry-After header and add batch progress logging
* test(memory): add incremental, atomic, versioning, retry, batch tests
* docs(memory): update .env.example with OpenRouter defaults
* docs(handoff): add handoff and ADR-036 for incremental index
* docs(handoff): set PR number
* docs(project-map): update index.py and embedder.py descriptions for PR#83
* fix(ci): skip index rewrite on no-op + versioning first-run
* fix(ci): ruff format index.py
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-26 19:19:55 +03:00
Sergey
7c1fa4985e
feat(memory): wire CLI into plugin via setup-memory.sh wrapper ( #77 )
...
* feat(memory): wire setup-memory.sh to Python CLI + JS wrapper
* test(memory): add wrapper generation, idempotency, backup tests
* docs(memory): update project map for setup-memory wrapper integration
* docs(handoff): add handoff and ADR-033 for plugin wiring
* docs(handoff): set PR number
* docs(handoff): fix Pending em-dash typo in PR#77 handoff
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-26 17:06:45 +03:00
Sergey
80a4be1d21
refactor(memory): rename to memory, OpenAI env, chunking, batching, dedup ( #75 )
...
* refactor(memory): rename package second-brain to memory
* refactor(memory): use OpenAI env naming and fix trailing slash
* feat(memory): add chunking with env-configurable size and overlap
* feat(memory): dedup search results by source in top-K
* test(memory): add chunking, batching, dedup, live tests
* docs(memory): update README and project map after rename
* docs(handoff): add handoff and ADR-032 for memory refactor
* docs(handoff): set PR number
* fix(ci): reduce index.py complexity to rank A
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-26 16:13:05 +03:00
Sergey
063044450f
feat(agents): increase step limit to 150 ( #69 )
...
* feat(agents): increase step limit to 150
* test(agents): update step limit assertions to 150
* docs(adr): add ADR-029 agent step limit 100 to 150
* docs(project-map): update tree with PR#68 changes
* docs(handoff): add PR 69 handoff for agent steps 150
* docs(project-map): fix PR tags to PR#69 (actual PR number)
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-26 01:19:17 +03:00
Sergey
f06d36140b
feat(pipeline): add check_project_map to DOCS phase ( #67 )
...
* feat(pipeline): add check_project_map to DOCS phase
* test(pipeline): add check_project_map unit tests + update check_docs tests
* docs(adr): add ADR-028 project map contract
* docs(project-map): mention check_project_map guard in Update Protocol
* docs(handoff): add PR handoff for check_project_map
* docs(handoff): set PR number 67
* docs(review): fix PR#66 to PR#67 typo in project map and handoff
* fix(ci): ruff lint errors in pipeline-status and project map test
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-26 00:07:13 +03:00
Sergey
15fc7d014d
refactor(tools): add repo parameter + shared module + tunnel tests ( #65 )
...
* refactor(tools): extract shared module for gh spawnSync logic
* feat(tools): add repo parameter to 5 GitHub tools
* test(tools): add tunnel tool tests
* test(tools): add repo parameter test cases for 5 tools
* docs(handoff): scaffold handoff and ADR for PR
* docs(handoff): set PR number
* docs(project-map): update after PR#65 structural changes
---------
Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-25 19:19:19 +03:00