taskuary 0.3.2.2__tar.gz → 0.3.2.3__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.
- {taskuary-0.3.2.2/taskuary.egg-info → taskuary-0.3.2.3}/PKG-INFO +24 -2
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/README.md +23 -1
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/pyproject.toml +1 -1
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/artifacts.py +64 -1
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/cli.py +12 -0
- taskuary-0.3.2.3/taskuary/demo.py +480 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/ingest.py +9 -6
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/llm.py +10 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/server.py +20 -1
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/store.py +23 -24
- taskuary-0.3.2.2/taskuary/web/assets/GeneralWorkspace-Bt02JQzu.js → taskuary-0.3.2.3/taskuary/web/assets/GeneralWorkspace-HLQ4Jry6.js +1 -1
- taskuary-0.3.2.2/taskuary/web/assets/index-DGVnbkfG.js → taskuary-0.3.2.3/taskuary/web/assets/index-BjUFr2Di.js +580 -101
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/index.html +1 -1
- {taskuary-0.3.2.2 → taskuary-0.3.2.3/taskuary.egg-info}/PKG-INFO +24 -2
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/SOURCES.txt +4 -2
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_core.py +13 -0
- taskuary-0.3.2.3/tests/test_demo.py +148 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_triage_dataset.py +10 -3
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_verdict_paths.py +27 -25
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/LICENSE +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/setup.cfg +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/__init__.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/agents.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/aisetup.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/assistant.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/aws.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/azure.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/blackboard.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/browserview.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/calendar.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/categories.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/channels.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/ci.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/climodels.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/clis.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/coder.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/compose.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/config.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/context.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/counsel.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/db.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/desktop.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/devtools.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/digest.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/docsync.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/evalset.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/general.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/github.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/handraise.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/histgen.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/hooks.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/imapmail.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/imessage.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/intacct.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/interview.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/knowledge.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/learn.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/learnedgraph.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/logs.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/mcp.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/messengers.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/msauth.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/mssql.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/outbound.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/phone.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/pm.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/policy.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/problems.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/promptmap.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/proof.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/proposals.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/rank.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/reports.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/research.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/reshape.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/responder.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/routing.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/scopes.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/semantic.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/senders.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/setup.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/sharepoint.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/sheets.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/coder.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/counsel.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/digest.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/learned.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/soul.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/style.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/triage.md +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/terminal.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/testing.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/toil.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/triage.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/verdicts.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/voice.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/wabridge.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/waitroom.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/assets/GeneralWorkspace-D46ydeAJ.css +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/assets/index-6GBZ9nXN.css +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/favicon.ico +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/favicon.png +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/webguard.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/whatsapp/bridge.mjs +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/whatsapp/package.json +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/whoami.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/witness.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/dependency_links.txt +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/entry_points.txt +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/requires.txt +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/top_level.txt +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_agent_environment.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_agent_source.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_agent_wall.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_aisetup.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_answers.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_api.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_assistant.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_async_triage.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_audit_chain.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_aws_region.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_blackboard.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_browser_session.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_browserview.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_calendar.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_calendar_today.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_categories.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cc_triage.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_chat_queue.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_climodels.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_clis.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cloud.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cloud_sources.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_compose.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_compose_sources.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_config.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_context.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_counsel.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cwlogs_paging.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_desktop.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_devtools.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_diff_review.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_digest_brief.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_docs_and_llm.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_docs_flow.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_duplicate_connectors.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_factory.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_feed_working.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_general.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_github_auto.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_handraise.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_harvest.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_histgen.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_imapmail.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_imessage.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_intacct.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_kind_dispatch.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_knowledge.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_learnedgraph.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_local_file.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mail_folders.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mark_read.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mcp.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_messengers.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_msauth.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mssql.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_noop_ending.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_not_coding.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_note_retrieval.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_outbound_reports.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_pm.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_poll_overlap.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_poll_sources.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_pr_comments.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_problems.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_promptmap_and_catalog.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_proof_ci_proposals.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_pypi_downloads.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_rank.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_reply_channels.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_reply_voice.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_report_alerts.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_report_triage.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_research.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_reviews.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_scopes.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_seeded_reports.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_semantic.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_send_targets.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_setup.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_sheets_sharepoint.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_someone_else_replied.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_soul_interview.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_store_app_cli.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_store_hotpaths.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_sync_clock.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_task_identity.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_terminal.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_toil.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_urgent_and_handoff.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_verdict_sticks.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_vision.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_voice.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_wabridge.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_waitroom.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_watermark.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_web_entrypoint.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_webguard.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_whatsapp_images.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_whoami.py +0 -0
- {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_witness.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: taskuary
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.3
|
|
4
4
|
Summary: Automate your job - the local-first operating system for your work: AI triage in, coding agents out.
|
|
5
5
|
License: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/ldbumble/taskuary
|
|
@@ -64,10 +64,19 @@ and replies wait for your approval. Nothing sends or ships without you.
|
|
|
64
64
|
|
|
65
65
|

|
|
66
66
|
|
|
67
|
-
Taskuary is early—currently **v0.3.2.
|
|
67
|
+
Taskuary is early—currently **v0.3.2.3**—and moving fast. The funnel, review queue,
|
|
68
68
|
agent sessions, and reports pipeline are in daily use; breaking changes are still possible
|
|
69
69
|
before 1.0.
|
|
70
70
|
|
|
71
|
+
<p align="center">
|
|
72
|
+
<a href="https://taskuary.com/demo/"><img
|
|
73
|
+
src="https://img.shields.io/badge/%E2%96%B6%20Try%20it%20now-no%20install%2C%20in%20your%20browser-2f4858?style=for-the-badge&labelColor=1f2a22"
|
|
74
|
+
alt="Try Taskuary now, in your browser"></a>
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
<p align="center"><sub>The real app over invented work — timeline, triage, a coding session mid-run,
|
|
78
|
+
reports with charts. Nothing to install and nothing connects to anything.</sub></p>
|
|
79
|
+
|
|
71
80
|
## One timeline for incoming work
|
|
72
81
|
|
|
73
82
|
Outlook, Gmail, Teams, Slack, Telegram, WhatsApp, GitHub, Jira, alerts, and reports all
|
|
@@ -141,6 +150,19 @@ On first run, connect an AI provider or local Ollama model, add at least one inb
|
|
|
141
150
|
channel, then choose the coding CLI that should receive tasks. The setup wizards test each
|
|
142
151
|
connection before it goes live.
|
|
143
152
|
|
|
153
|
+
## Try it without installing anything
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
taskuary --demo # or: docker compose --profile demo up
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
A full Taskuary over invented work — a morning's mail and chats already triaged with the
|
|
160
|
+
reasons attached, drafts waiting in Review, agents on the board with their transcripts
|
|
161
|
+
playing, the wall they leave each other notes on. The AI answers from a script and every door
|
|
162
|
+
to the outside world is shut at the API layer (`taskuary/demo.py`): nothing sends, no
|
|
163
|
+
connection can be made or edited, no tool runs, and no CLI starts. Nobody's real data is in
|
|
164
|
+
it — Dana Whitfield and Northwind Facilities are invented.
|
|
165
|
+
|
|
144
166
|
## Installs
|
|
145
167
|
|
|
146
168
|

|
|
@@ -13,10 +13,19 @@ and replies wait for your approval. Nothing sends or ships without you.
|
|
|
13
13
|
|
|
14
14
|

|
|
15
15
|
|
|
16
|
-
Taskuary is early—currently **v0.3.2.
|
|
16
|
+
Taskuary is early—currently **v0.3.2.3**—and moving fast. The funnel, review queue,
|
|
17
17
|
agent sessions, and reports pipeline are in daily use; breaking changes are still possible
|
|
18
18
|
before 1.0.
|
|
19
19
|
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="https://taskuary.com/demo/"><img
|
|
22
|
+
src="https://img.shields.io/badge/%E2%96%B6%20Try%20it%20now-no%20install%2C%20in%20your%20browser-2f4858?style=for-the-badge&labelColor=1f2a22"
|
|
23
|
+
alt="Try Taskuary now, in your browser"></a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<p align="center"><sub>The real app over invented work — timeline, triage, a coding session mid-run,
|
|
27
|
+
reports with charts. Nothing to install and nothing connects to anything.</sub></p>
|
|
28
|
+
|
|
20
29
|
## One timeline for incoming work
|
|
21
30
|
|
|
22
31
|
Outlook, Gmail, Teams, Slack, Telegram, WhatsApp, GitHub, Jira, alerts, and reports all
|
|
@@ -90,6 +99,19 @@ On first run, connect an AI provider or local Ollama model, add at least one inb
|
|
|
90
99
|
channel, then choose the coding CLI that should receive tasks. The setup wizards test each
|
|
91
100
|
connection before it goes live.
|
|
92
101
|
|
|
102
|
+
## Try it without installing anything
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
taskuary --demo # or: docker compose --profile demo up
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
A full Taskuary over invented work — a morning's mail and chats already triaged with the
|
|
109
|
+
reasons attached, drafts waiting in Review, agents on the board with their transcripts
|
|
110
|
+
playing, the wall they leave each other notes on. The AI answers from a script and every door
|
|
111
|
+
to the outside world is shut at the API layer (`taskuary/demo.py`): nothing sends, no
|
|
112
|
+
connection can be made or edited, no tool runs, and no CLI starts. Nobody's real data is in
|
|
113
|
+
it — Dana Whitfield and Northwind Facilities are invented.
|
|
114
|
+
|
|
93
115
|
## Installs
|
|
94
116
|
|
|
95
117
|

|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "taskuary"
|
|
7
|
-
version = "0.3.2.
|
|
7
|
+
version = "0.3.2.3"
|
|
8
8
|
description = "Automate your job - the local-first operating system for your work: AI triage in, coding agents out."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -9,7 +9,7 @@ Both writers are hand-rolled on the standard library on purpose: xlsx is a zip o
|
|
|
9
9
|
XML parts, and a bar chart is a few dozen rects. Neither is worth a dependency that has to be
|
|
10
10
|
frozen into the one-file exe.
|
|
11
11
|
"""
|
|
12
|
-
import json, re, zipfile
|
|
12
|
+
import json, math, re, zipfile
|
|
13
13
|
from datetime import datetime
|
|
14
14
|
from xml.sax.saxutils import escape
|
|
15
15
|
|
|
@@ -145,6 +145,65 @@ def chart_columns(rows: list) -> tuple:
|
|
|
145
145
|
return ((labels[0] if labels else None), (vals[0] if vals else None))
|
|
146
146
|
|
|
147
147
|
|
|
148
|
+
INK, GRID, MUTED, LINE = '#1f2430', '#e7e3da', '#8a94a6', '#4f46e5'
|
|
149
|
+
|
|
150
|
+
_DATE = re.compile(r'^\s*(\d{4}-\d{2}-\d{2}|\d{1,2}/\d{1,2}(/\d{2,4})?|\d{4}-\d{2}|[A-Z][a-z]{2} \d{1,2})')
|
|
151
|
+
|
|
152
|
+
def _dated(labels: list) -> bool:
|
|
153
|
+
"""Is the label column a run of dates? A report over time is the one shape horizontal bars
|
|
154
|
+
get wrong - fourteen days of tickets became fourteen stacked bars, which reads as fourteen
|
|
155
|
+
unrelated things rather than one line going up."""
|
|
156
|
+
return len(labels) >= 5 and all(_DATE.match(str(l or '')) for l in labels)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _ticks(top: float, n: int = 4) -> list:
|
|
160
|
+
"""Round gridline values at or above the data, so the axis reads 0/50/100 and never 0/47/94."""
|
|
161
|
+
if top <= 0: return [0.0, 1.0]
|
|
162
|
+
step = 10.0 ** math.floor(math.log10(top / n))
|
|
163
|
+
for mult in (1, 2, 2.5, 5, 10):
|
|
164
|
+
if step * mult * n >= top: step *= mult; break
|
|
165
|
+
return [step * i for i in range(int(math.ceil(top / step)) + 1)]
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _line_svg(pts: list, title: str, val: str, lab: str) -> str:
|
|
169
|
+
"""One measure over time: a 2px line, a light band under it, gridlines behind, and the last
|
|
170
|
+
value labelled where the eye already is. One series, so no legend - the title names it."""
|
|
171
|
+
W, H, L, R, T, B = 760, 260, 56, 74, 34, 34
|
|
172
|
+
ticks = _ticks(max(v for _l, v in pts))
|
|
173
|
+
top = ticks[-1] or 1.0
|
|
174
|
+
px = lambda i: L + (W - L - R) * (i / max(1, len(pts) - 1))
|
|
175
|
+
py = lambda v: H - B - (H - T - B) * (v / top)
|
|
176
|
+
pl = ' '.join(f'{px(i):.1f},{py(v):.1f}' for i, (_l, v) in enumerate(pts))
|
|
177
|
+
out = [f'<svg xmlns="http://www.w3.org/2000/svg" width="{W}" height="{H}" viewBox="0 0 {W} {H}" '
|
|
178
|
+
f'font-family="Segoe UI, Helvetica, Arial, sans-serif">',
|
|
179
|
+
f'<rect width="{W}" height="{H}" fill="#ffffff"/>',
|
|
180
|
+
f'<text x="{L - 40}" y="20" font-size="13" font-weight="700" fill="{INK}">{escape(title or val)}</text>',
|
|
181
|
+
f'<text x="{W - 12}" y="20" font-size="10" fill="{MUTED}" text-anchor="end">'
|
|
182
|
+
f'{escape(val)} by {escape(lab or "row")} · {len(pts)} points</text>']
|
|
183
|
+
for t in ticks:
|
|
184
|
+
y = py(t)
|
|
185
|
+
out += [f'<line x1="{L}" y1="{y:.1f}" x2="{W - R}" y2="{y:.1f}" stroke="{GRID}" stroke-width="1"/>',
|
|
186
|
+
f'<text x="{L - 8}" y="{y + 3.5:.1f}" font-size="10" fill="{MUTED}" text-anchor="end">'
|
|
187
|
+
f'{escape(f"{t:,.10g}")}</text>']
|
|
188
|
+
out.append(f'<polygon points="{L},{H - B} {pl} {W - R},{H - B}" fill="{LINE}" fill-opacity="0.08"/>')
|
|
189
|
+
out.append(f'<polyline points="{pl}" fill="none" stroke="{LINE}" stroke-width="2" '
|
|
190
|
+
f'stroke-linejoin="round" stroke-linecap="round"/>')
|
|
191
|
+
# every point is a target, but only the ends are named - a number on all fourteen is noise
|
|
192
|
+
for i, (_l, v) in enumerate(pts):
|
|
193
|
+
out.append(f'<circle cx="{px(i):.1f}" cy="{py(v):.1f}" r="{4 if i in (0, len(pts) - 1) else 2.4}" '
|
|
194
|
+
f'fill="{LINE}" stroke="#ffffff" stroke-width="1.5"/>')
|
|
195
|
+
lv = pts[-1][1]
|
|
196
|
+
out.append(f'<text x="{W - R + 8}" y="{py(lv) + 4:.1f}" font-size="11.5" font-weight="700" fill="{INK}">'
|
|
197
|
+
f'{escape(f"{lv:,.2f}".rstrip("0").rstrip("."))}</text>')
|
|
198
|
+
every = max(1, len(pts) // 7)
|
|
199
|
+
for i, (l, _v) in enumerate(pts):
|
|
200
|
+
if i % every and i != len(pts) - 1: continue
|
|
201
|
+
out.append(f'<text x="{px(i):.1f}" y="{H - B + 16}" font-size="10" fill="{MUTED}" '
|
|
202
|
+
f'text-anchor="middle">{escape(str(l)[-5:])}</text>')
|
|
203
|
+
out.append('</svg>')
|
|
204
|
+
return ''.join(out)
|
|
205
|
+
|
|
206
|
+
|
|
148
207
|
# Taskuary's own indigo, and a chart that reads in both the panel and a screenshot of it.
|
|
149
208
|
def to_svg_chart(rows: list, path, title: str = '', want_val: str = None, want_lab: str = None) -> str:
|
|
150
209
|
"""Horizontal bars: label, bar, value. Horizontal because report labels are names and dates,
|
|
@@ -159,6 +218,10 @@ def to_svg_chart(rows: list, path, title: str = '', want_val: str = None, want_l
|
|
|
159
218
|
pts = [(str(r.get(lab, ''))[:42] if lab else f'#{i + 1}', _num(r.get(val)) or 0.0)
|
|
160
219
|
for i, r in enumerate(rows)][:MAX_BARS]
|
|
161
220
|
if not pts: return ''
|
|
221
|
+
if _dated([l for l, _v in pts]):
|
|
222
|
+
svg = _line_svg(pts, title or val, val, lab or 'row')
|
|
223
|
+
if path is not None: path.write_text(svg, encoding='utf-8')
|
|
224
|
+
return svg if path is None else f'{val} by {lab or "row"}'
|
|
162
225
|
top = max(abs(v) for _l, v in pts) or 1.0
|
|
163
226
|
W, LW, RH, PAD = 760, 210, 22, 18
|
|
164
227
|
H = PAD * 2 + 26 + RH * len(pts)
|
|
@@ -46,6 +46,11 @@ def main():
|
|
|
46
46
|
# THE WALL (blackboard.py). An agent working in a terminal has a shell and no API token, so
|
|
47
47
|
# this is how it talks to the next agent: two flags, no arguments it has to be told - the
|
|
48
48
|
# session puts its own name, task and checkout in the environment.
|
|
49
|
+
# try-it-out in one command: a throwaway home, a world of invented work, and every door
|
|
50
|
+
# to the outside nailed shut (demo.py). This is what /demo on the website runs.
|
|
51
|
+
ap.add_argument('--demo', action='store_true',
|
|
52
|
+
help='run a DEMO instance: invented data, a scripted AI, replayed coding '
|
|
53
|
+
'sessions, and nothing that can reach a real system')
|
|
49
54
|
ap.add_argument('--board', action='store_true',
|
|
50
55
|
help='print the agent wall for this checkout - what the agents before you left here')
|
|
51
56
|
ap.add_argument('--all', action='store_true',
|
|
@@ -56,6 +61,13 @@ def main():
|
|
|
56
61
|
help='working | note | blocked | ready | done - "ready" is how the next agent '
|
|
57
62
|
'learns the tree is safe to build on')
|
|
58
63
|
args = ap.parse_args()
|
|
64
|
+
if args.demo:
|
|
65
|
+
import os, tempfile
|
|
66
|
+
from . import demo
|
|
67
|
+
os.environ[demo.FLAG] = '1'
|
|
68
|
+
# a throwaway home, so a demo can never be pointed at somebody's real database by accident
|
|
69
|
+
os.environ.setdefault('TASKUARY_HOME', tempfile.mkdtemp(prefix='taskuary-demo-'))
|
|
70
|
+
print(f'demo mode: invented data in {os.environ["TASKUARY_HOME"]}, nothing can reach a real system')
|
|
59
71
|
if args.board or args.note:
|
|
60
72
|
import os, sys
|
|
61
73
|
from . import blackboard as bb
|