@stravica-ai/digital-operator-pa 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +170 -0
- package/bin/desk +9 -0
- package/bin/distill +2 -0
- package/bin/estate-sync +2 -0
- package/bin/launch +2 -0
- package/bin/memory-sync +2 -0
- package/bin/migrate-inspect +2 -0
- package/bin/pa +2 -0
- package/bin/pa-coordinator-hook +2 -0
- package/bin/pa-init +2 -0
- package/bin/research +2 -0
- package/bin/scheduler +2 -0
- package/bin/secrets +2 -0
- package/bin/slice +2 -0
- package/bin/smoke +9 -0
- package/bin/sync +2 -0
- package/dist/engineering-pa-cli/README.md +205 -0
- package/dist/engineering-pa-cli/bin/estate-sync +2 -0
- package/dist/engineering-pa-cli/bin/launch +2 -0
- package/dist/engineering-pa-cli/bin/pa +2 -0
- package/dist/engineering-pa-cli/bin/pa-coordinator-hook +12 -0
- package/dist/engineering-pa-cli/bin/research +2 -0
- package/dist/engineering-pa-cli/bin/scheduler +2 -0
- package/dist/engineering-pa-cli/bin/secrets +2 -0
- package/dist/engineering-pa-cli/bin/smoke +9 -0
- package/dist/engineering-pa-cli/bin/sync +2 -0
- package/dist/engineering-pa-cli/config/coordinator-allowlist.json +118 -0
- package/dist/engineering-pa-cli/docs/coordinator-hook.md +211 -0
- package/dist/engineering-pa-cli/docs/estate-sync.md +412 -0
- package/dist/engineering-pa-cli/docs/gsc.md +175 -0
- package/dist/engineering-pa-cli/docs/lint-linkedin.md +139 -0
- package/dist/engineering-pa-cli/docs/secrets.md +221 -0
- package/dist/engineering-pa-cli/docs/smoke.md +113 -0
- package/dist/engineering-pa-cli/docs/staging-alias.md +114 -0
- package/dist/engineering-pa-cli/index.mjs +17 -0
- package/dist/engineering-pa-cli/package.json +37 -0
- package/dist/engineering-pa-cli/src/autonomy/cli.mjs +329 -0
- package/dist/engineering-pa-cli/src/autonomy/envelope.mjs +301 -0
- package/dist/engineering-pa-cli/src/coordinator-hook/cli.mjs +140 -0
- package/dist/engineering-pa-cli/src/coordinator-hook/config.mjs +134 -0
- package/dist/engineering-pa-cli/src/coordinator-hook/message.mjs +47 -0
- package/dist/engineering-pa-cli/src/coordinator-hook/policy.mjs +211 -0
- package/dist/engineering-pa-cli/src/coordinator-hook/repo-root.mjs +44 -0
- package/dist/engineering-pa-cli/src/coordinator-hook/self.mjs +30 -0
- package/dist/engineering-pa-cli/src/environment/cli.mjs +287 -0
- package/dist/engineering-pa-cli/src/environment/probes.mjs +302 -0
- package/dist/engineering-pa-cli/src/gsc/auth.mjs +148 -0
- package/dist/engineering-pa-cli/src/gsc/cli.mjs +93 -0
- package/dist/engineering-pa-cli/src/gsc/cloudflare.mjs +318 -0
- package/dist/engineering-pa-cli/src/gsc/commands/add-property.mjs +70 -0
- package/dist/engineering-pa-cli/src/gsc/commands/list-properties.mjs +33 -0
- package/dist/engineering-pa-cli/src/gsc/commands/pull-analytics.mjs +130 -0
- package/dist/engineering-pa-cli/src/gsc/commands/submit-sitemap.mjs +41 -0
- package/dist/engineering-pa-cli/src/gsc/commands/verify-via-cf-dns.mjs +189 -0
- package/dist/engineering-pa-cli/src/knowledge/call-log.mjs +59 -0
- package/dist/engineering-pa-cli/src/knowledge/cli.mjs +242 -0
- package/dist/engineering-pa-cli/src/knowledge/eval.mjs +446 -0
- package/dist/engineering-pa-cli/src/knowledge/formatters.mjs +331 -0
- package/dist/engineering-pa-cli/src/knowledge/graph.mjs +710 -0
- package/dist/engineering-pa-cli/src/launch/README.md +214 -0
- package/dist/engineering-pa-cli/src/launch/cli.mjs +51 -0
- package/dist/engineering-pa-cli/src/launch/commands/launch.mjs +106 -0
- package/dist/engineering-pa-cli/src/launch/identity.mjs +43 -0
- package/dist/engineering-pa-cli/src/launch/planner.mjs +44 -0
- package/dist/engineering-pa-cli/src/launch/repo-root.mjs +53 -0
- package/dist/engineering-pa-cli/src/launch/runner.mjs +147 -0
- package/dist/engineering-pa-cli/src/launch/task-loader.mjs +85 -0
- package/dist/engineering-pa-cli/src/lint/cli.mjs +61 -0
- package/dist/engineering-pa-cli/src/lint/commands/linkedin.mjs +133 -0
- package/dist/engineering-pa-cli/src/lint/detectors.mjs +90 -0
- package/dist/engineering-pa-cli/src/lint/linter.mjs +69 -0
- package/dist/engineering-pa-cli/src/lint/reporter.mjs +32 -0
- package/dist/engineering-pa-cli/src/lint/rules.mjs +132 -0
- package/dist/engineering-pa-cli/src/pa/cli.mjs +369 -0
- package/dist/engineering-pa-cli/src/pa/doc-groups.mjs +164 -0
- package/dist/engineering-pa-cli/src/pa/io.mjs +80 -0
- package/dist/engineering-pa-cli/src/pa/project-cli.mjs +385 -0
- package/dist/engineering-pa-cli/src/pa/projects.mjs +352 -0
- package/dist/engineering-pa-cli/src/pa/repo-root.mjs +64 -0
- package/dist/engineering-pa-cli/src/pa/session.mjs +254 -0
- package/dist/engineering-pa-cli/src/pa/work-cli.mjs +164 -0
- package/dist/engineering-pa-cli/src/pa/work.mjs +196 -0
- package/dist/engineering-pa-cli/src/pa/workstreams.mjs +201 -0
- package/dist/engineering-pa-cli/src/research/README.md +360 -0
- package/dist/engineering-pa-cli/src/research/briefs/extractor.md +103 -0
- package/dist/engineering-pa-cli/src/research/briefs/searcher.md +113 -0
- package/dist/engineering-pa-cli/src/research/briefs/synthesizer.md +124 -0
- package/dist/engineering-pa-cli/src/research/briefs/verifier.md +86 -0
- package/dist/engineering-pa-cli/src/research/cli.mjs +141 -0
- package/dist/engineering-pa-cli/src/research/commands/gates.mjs +176 -0
- package/dist/engineering-pa-cli/src/research/commands/list.mjs +56 -0
- package/dist/engineering-pa-cli/src/research/commands/mark.mjs +97 -0
- package/dist/engineering-pa-cli/src/research/commands/paths.mjs +69 -0
- package/dist/engineering-pa-cli/src/research/commands/prune.mjs +86 -0
- package/dist/engineering-pa-cli/src/research/commands/run.mjs +94 -0
- package/dist/engineering-pa-cli/src/research/commands/show.mjs +43 -0
- package/dist/engineering-pa-cli/src/research/docs/operator-present-flow.md +120 -0
- package/dist/engineering-pa-cli/src/research/format.mjs +59 -0
- package/dist/engineering-pa-cli/src/research/promote.mjs +260 -0
- package/dist/engineering-pa-cli/src/research/schema/finding.schema.json +55 -0
- package/dist/engineering-pa-cli/src/research/schema/gates.schema.json +34 -0
- package/dist/engineering-pa-cli/src/research/schema/manifest.schema.json +59 -0
- package/dist/engineering-pa-cli/src/research/schema/plan.schema.json +41 -0
- package/dist/engineering-pa-cli/src/research/schema/sources.schema.json +31 -0
- package/dist/engineering-pa-cli/src/research/store/findings.mjs +61 -0
- package/dist/engineering-pa-cli/src/research/store/gates.mjs +73 -0
- package/dist/engineering-pa-cli/src/research/store/index.mjs +312 -0
- package/dist/engineering-pa-cli/src/research/store/manifest.mjs +56 -0
- package/dist/engineering-pa-cli/src/research/store/plan.mjs +59 -0
- package/dist/engineering-pa-cli/src/research/store/sources.mjs +44 -0
- package/dist/engineering-pa-cli/src/research/store/validate.mjs +92 -0
- package/dist/engineering-pa-cli/src/research/workflows/research-normal.js +573 -0
- package/dist/engineering-pa-cli/src/scheduler/cli.mjs +197 -0
- package/dist/engineering-pa-cli/src/secrets/cli.mjs +254 -0
- package/dist/engineering-pa-cli/src/secrets/commands/backup-template.mjs +67 -0
- package/dist/engineering-pa-cli/src/secrets/commands/backup.mjs +85 -0
- package/dist/engineering-pa-cli/src/secrets/commands/delete.mjs +58 -0
- package/dist/engineering-pa-cli/src/secrets/commands/find.mjs +36 -0
- package/dist/engineering-pa-cli/src/secrets/commands/get.mjs +49 -0
- package/dist/engineering-pa-cli/src/secrets/commands/init.mjs +69 -0
- package/dist/engineering-pa-cli/src/secrets/commands/list.mjs +37 -0
- package/dist/engineering-pa-cli/src/secrets/commands/rotate.mjs +46 -0
- package/dist/engineering-pa-cli/src/secrets/commands/set.mjs +123 -0
- package/dist/engineering-pa-cli/src/secrets/commands/status.mjs +146 -0
- package/dist/engineering-pa-cli/src/secrets/commands/vaults.mjs +57 -0
- package/dist/engineering-pa-cli/src/secrets/commands/verify.mjs +143 -0
- package/dist/engineering-pa-cli/src/secrets/vault.mjs +766 -0
- package/dist/engineering-pa-cli/src/smoke/checks.mjs +199 -0
- package/dist/engineering-pa-cli/src/smoke/cli.mjs +108 -0
- package/dist/engineering-pa-cli/src/smoke/commands/run.mjs +237 -0
- package/dist/engineering-pa-cli/src/smoke/runner.mjs +191 -0
- package/dist/engineering-pa-cli/src/staging-alias/cli.mjs +91 -0
- package/dist/engineering-pa-cli/src/staging-alias/cloudflare.mjs +380 -0
- package/dist/engineering-pa-cli/src/staging-alias/commands/list.mjs +36 -0
- package/dist/engineering-pa-cli/src/staging-alias/commands/set.mjs +188 -0
- package/dist/engineering-pa-cli/src/staging-alias/commands/status.mjs +113 -0
- package/dist/engineering-pa-cli/src/staging-alias/commands/unset.mjs +95 -0
- package/dist/engineering-pa-cli/src/staging-alias/sites.mjs +105 -0
- package/dist/engineering-pa-cli/src/sync/cli.mjs +151 -0
- package/dist/engineering-pa-cli/src/sync/git.mjs +149 -0
- package/dist/engineering-pa-cli/src/sync/lock.mjs +30 -0
- package/dist/engineering-pa-cli/src/sync/regenerated-artifacts.mjs +114 -0
- package/dist/engineering-pa-cli/src/sync/registry-scope.mjs +260 -0
- package/dist/engineering-pa-cli/src/sync/run.mjs +531 -0
- package/dist/engineering-pa-cli/src/sync/runner.mjs +62 -0
- package/dist/engineering-pa-cli/src/sync/runs-digest.mjs +138 -0
- package/dist/engineering-pa-core/README.md +60 -0
- package/dist/engineering-pa-core/bin/desk +9 -0
- package/dist/engineering-pa-core/bin/distill +2 -0
- package/dist/engineering-pa-core/bin/memory-sync +2 -0
- package/dist/engineering-pa-core/bin/slice +2 -0
- package/dist/engineering-pa-core/docs/autonomy-envelope-tracker.md +111 -0
- package/dist/engineering-pa-core/docs/blueprints/README.md +45 -0
- package/dist/engineering-pa-core/docs/blueprints/docker-services/blueprint.md +168 -0
- package/dist/engineering-pa-core/docs/blueprints/git-identity/blueprint.md +116 -0
- package/dist/engineering-pa-core/docs/blueprints/ideas/custom-workspace-views.md +9 -0
- package/dist/engineering-pa-core/docs/blueprints/ideas/knowledge-domain-patterns.md +15 -0
- package/dist/engineering-pa-core/docs/blueprints/ideas/office-integration.md +11 -0
- package/dist/engineering-pa-core/docs/blueprints/ideas/team-scaling.md +9 -0
- package/dist/engineering-pa-core/docs/blueprints/ideas/work-personal-separation.md +9 -0
- package/dist/engineering-pa-core/docs/blueprints/scheduled-distillation/blueprint.md +129 -0
- package/dist/engineering-pa-core/docs/blueprints/tool-integration/blueprint.md +110 -0
- package/dist/engineering-pa-core/docs/commands/init.md +159 -0
- package/dist/engineering-pa-core/docs/commands/schedule.md +98 -0
- package/dist/engineering-pa-core/docs/commands/upgrade.md +67 -0
- package/dist/engineering-pa-core/docs/entity-location-map.md +93 -0
- package/dist/engineering-pa-core/docs/knowledge-scaffold.md +121 -0
- package/dist/engineering-pa-core/docs/lock.md +155 -0
- package/dist/engineering-pa-core/docs/memory-sync.md +28 -0
- package/dist/engineering-pa-core/docs/pa-operating-model.md +457 -0
- package/dist/engineering-pa-core/docs/scheduling.md +35 -0
- package/dist/engineering-pa-core/docs/standards/README.md +24 -0
- package/dist/engineering-pa-core/docs/standards/briefing-contract.md +161 -0
- package/dist/engineering-pa-core/docs/standards/tooling.md +240 -0
- package/dist/engineering-pa-core/docs/tools/distill.md +230 -0
- package/dist/engineering-pa-core/docs/tools/memory-sync.md +98 -0
- package/dist/engineering-pa-core/docs/tools/scheduler.md +243 -0
- package/dist/engineering-pa-core/docs/tools/slice.md +150 -0
- package/dist/engineering-pa-core/docs/upstream-issue-filing.md +88 -0
- package/dist/engineering-pa-core/docs/working-directory.md +29 -0
- package/dist/engineering-pa-core/docs/workspace-operations.md +46 -0
- package/dist/engineering-pa-core/index.mjs +21 -0
- package/dist/engineering-pa-core/knowledge/README.md +53 -0
- package/dist/engineering-pa-core/knowledge/canonical/.gitkeep +0 -0
- package/dist/engineering-pa-core/knowledge/content-voice/README.md +64 -0
- package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-baseline.md +133 -0
- package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-shape.md +58 -0
- package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-taxonomy.md +33 -0
- package/dist/engineering-pa-core/knowledge/content-voice/content-pipeline-routing.md +58 -0
- package/dist/engineering-pa-core/knowledge/content-voice/new-tell-capture-procedure.md +40 -0
- package/dist/engineering-pa-core/knowledge/content-voice/voice-guide-shape.md +43 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/README.md +34 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/briefing-contract.md +77 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/delegation-modes.md +84 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/dispatch-envelope.md +238 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/task-groups-and-orchestrators.md +62 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/team-improvement-loop.md +48 -0
- package/dist/engineering-pa-core/knowledge/delegation-dispatch/tool-development-policy.md +48 -0
- package/dist/engineering-pa-core/knowledge/engineering-discipline/README.md +33 -0
- package/dist/engineering-pa-core/knowledge/engineering-discipline/blast-radius-and-safety.md +50 -0
- package/dist/engineering-pa-core/knowledge/engineering-discipline/investigate-root-causes.md +48 -0
- package/dist/engineering-pa-core/knowledge/engineering-discipline/role-ladder.md +57 -0
- package/dist/engineering-pa-core/knowledge/engineering-discipline/verify-runtime-behaviour.md +53 -0
- package/dist/engineering-pa-core/knowledge/engineering-discipline/worktree-isolation.md +50 -0
- package/dist/engineering-pa-core/knowledge/knowledge-memory/README.md +33 -0
- package/dist/engineering-pa-core/knowledge/knowledge-memory/claude-md-hygiene.md +47 -0
- package/dist/engineering-pa-core/knowledge/knowledge-memory/journal-and-self-improvement.md +53 -0
- package/dist/engineering-pa-core/knowledge/knowledge-memory/knowledge-retrieval-discipline.md +62 -0
- package/dist/engineering-pa-core/knowledge/knowledge-memory/librarian-synthesis-mandate.md +56 -0
- package/dist/engineering-pa-core/knowledge/knowledge-memory/staging-and-observations.md +58 -0
- package/dist/engineering-pa-core/knowledge/operator-interface/README.md +32 -0
- package/dist/engineering-pa-core/knowledge/operator-interface/communication-style.md +33 -0
- package/dist/engineering-pa-core/knowledge/operator-interface/escalation-and-correction.md +45 -0
- package/dist/engineering-pa-core/knowledge/operator-interface/push-back-discipline.md +42 -0
- package/dist/engineering-pa-core/knowledge/operator-interface/session-boot-and-end.md +56 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/README.md +37 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/desk-cli-reference.md +52 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/environment-awareness.md +91 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/mcp-servers-catalogue.md +52 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/pa-cli-reference.md +55 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/scheduling-and-launchd.md +56 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/tool-discovery-discipline.md +49 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/working-directory-vs-project-root.md +43 -0
- package/dist/engineering-pa-core/knowledge/platform-tooling/workspace-server.md +51 -0
- package/dist/engineering-pa-core/knowledge/raw/.gitkeep +0 -0
- package/dist/engineering-pa-core/knowledge/scaffold/domains.json +5 -0
- package/dist/engineering-pa-core/knowledge/schema/.gitkeep +0 -0
- package/dist/engineering-pa-core/knowledge/work-management/README.md +33 -0
- package/dist/engineering-pa-core/knowledge/work-management/desk-cli.md +84 -0
- package/dist/engineering-pa-core/knowledge/work-management/progress-md.md +48 -0
- package/dist/engineering-pa-core/knowledge/work-management/projects.md +64 -0
- package/dist/engineering-pa-core/knowledge/work-management/spawn-log.md +48 -0
- package/dist/engineering-pa-core/knowledge/work-management/work-items.md +67 -0
- package/dist/engineering-pa-core/package.json +26 -0
- package/dist/engineering-pa-core/roles/agent-ops/definition.md +79 -0
- package/dist/engineering-pa-core/roles/dispatch-briefer/definition.md +195 -0
- package/dist/engineering-pa-core/roles/librarian/definition.md +176 -0
- package/dist/engineering-pa-core/roles/pa/definition.md +93 -0
- package/dist/engineering-pa-core/roles/system-admin/definition.md +106 -0
- package/dist/engineering-pa-core/roles/tool-developer/definition.md +116 -0
- package/dist/engineering-pa-core/roles/writer/definition.md +130 -0
- package/dist/engineering-pa-core/schema/autonomy-envelope.schema.json +61 -0
- package/dist/engineering-pa-core/schema/project.json +114 -0
- package/dist/engineering-pa-core/schema/schedule.json +63 -0
- package/dist/engineering-pa-core/schema/work-item.json +92 -0
- package/dist/engineering-pa-core/src/config/pa-package-name.mjs +30 -0
- package/dist/engineering-pa-core/src/desk/cli.mjs +95 -0
- package/dist/engineering-pa-core/src/desk/commands.mjs +398 -0
- package/dist/engineering-pa-core/src/desk/format.mjs +84 -0
- package/dist/engineering-pa-core/src/desk/repo.mjs +172 -0
- package/dist/engineering-pa-core/src/desk/team-scope.mjs +142 -0
- package/dist/engineering-pa-core/src/distill/cli.mjs +112 -0
- package/dist/engineering-pa-core/src/distill/prereqs.mjs +171 -0
- package/dist/engineering-pa-core/src/distill/prompt.mjs +74 -0
- package/dist/engineering-pa-core/src/distill/run.mjs +230 -0
- package/dist/engineering-pa-core/src/distill/runner.mjs +86 -0
- package/dist/engineering-pa-core/src/distill/staging.mjs +59 -0
- package/dist/engineering-pa-core/src/knowledge/retrieval/backlink-indexer.mjs +154 -0
- package/dist/engineering-pa-core/src/knowledge/retrieval/graph-builder.mjs +186 -0
- package/dist/engineering-pa-core/src/knowledge/retrieval/index-builder.mjs +225 -0
- package/dist/engineering-pa-core/src/knowledge/retrieval/query.mjs +263 -0
- package/dist/engineering-pa-core/src/lock/lock.mjs +202 -0
- package/dist/engineering-pa-core/src/memory-sync/cli-support.mjs +12 -0
- package/dist/engineering-pa-core/src/memory-sync/cli.mjs +56 -0
- package/dist/engineering-pa-core/src/memory-sync/commands/pull.mjs +44 -0
- package/dist/engineering-pa-core/src/memory-sync/commands/push.mjs +46 -0
- package/dist/engineering-pa-core/src/memory-sync/mirror.mjs +114 -0
- package/dist/engineering-pa-core/src/memory-sync/repo.mjs +65 -0
- package/dist/engineering-pa-core/src/scheduler/detect.mjs +111 -0
- package/dist/engineering-pa-core/src/scheduler/host.mjs +38 -0
- package/dist/engineering-pa-core/src/scheduler/index.mjs +13 -0
- package/dist/engineering-pa-core/src/scheduler/install.mjs +854 -0
- package/dist/engineering-pa-core/src/scheduler/list.mjs +168 -0
- package/dist/engineering-pa-core/src/scheduler/remove.mjs +176 -0
- package/dist/engineering-pa-core/src/scheduler/verify.mjs +435 -0
- package/dist/engineering-pa-core/src/session-boot/autonomy-injection.mjs +84 -0
- package/dist/engineering-pa-core/src/slice/cli.mjs +139 -0
- package/dist/engineering-pa-core/src/slice/inputs.mjs +174 -0
- package/dist/engineering-pa-core/src/slice/prompt.mjs +94 -0
- package/dist/engineering-pa-core/src/slice/prompts/dave-boot.md +91 -0
- package/dist/engineering-pa-core/src/slice/run.mjs +334 -0
- package/dist/engineering-pa-core-extensions-atlassian/README.md +31 -0
- package/dist/engineering-pa-core-extensions-atlassian/index.mjs +9 -0
- package/dist/engineering-pa-core-extensions-atlassian/package.json +19 -0
- package/dist/engineering-pa-core-extensions-n8n/README.md +29 -0
- package/dist/engineering-pa-core-extensions-n8n/index.mjs +8 -0
- package/dist/engineering-pa-core-extensions-n8n/package.json +19 -0
- package/dist/engineering-pa-librarian/README.md +38 -0
- package/dist/engineering-pa-librarian/index.mjs +12 -0
- package/dist/engineering-pa-librarian/package.json +19 -0
- package/dist/engineering-pa-migrate-inspect/README.md +131 -0
- package/dist/engineering-pa-migrate-inspect/bin/migrate-inspect +2 -0
- package/dist/engineering-pa-migrate-inspect/package.json +21 -0
- package/dist/engineering-pa-migrate-inspect/src/age-key-migrate.mjs +83 -0
- package/dist/engineering-pa-migrate-inspect/src/cli.mjs +97 -0
- package/dist/engineering-pa-migrate-inspect/src/inspector.mjs +237 -0
- package/dist/engineering-pa-migrate-inspect/src/platforms/linux.mjs +87 -0
- package/dist/engineering-pa-migrate-inspect/src/platforms/macos.mjs +105 -0
- package/dist/engineering-pa-migrate-inspect/src/runner.mjs +87 -0
- package/dist/engineering-pa-runbook/README.md +103 -0
- package/dist/engineering-pa-runbook/package.json +18 -0
- package/dist/engineering-pa-runbook/reference/dex-template.runbook.json +66 -0
- package/dist/engineering-pa-runbook/reference/hq-dave.runbook.json +69 -0
- package/dist/engineering-pa-runbook/reference/smarthome01.runbook.json +92 -0
- package/dist/engineering-pa-runbook/schema/inspection.schema.json +113 -0
- package/dist/engineering-pa-runbook/schema/runbook.schema.json +67 -0
- package/dist/engineering-pa-runbook/src/validator.mjs +167 -0
- package/dist/engineering-pa-scaffold/README.md +164 -0
- package/dist/engineering-pa-scaffold/bin/pa-init +2 -0
- package/dist/engineering-pa-scaffold/index.mjs +42 -0
- package/dist/engineering-pa-scaffold/package.json +22 -0
- package/dist/engineering-pa-scaffold/src/cli.mjs +115 -0
- package/dist/engineering-pa-scaffold/src/commands/init.mjs +169 -0
- package/dist/engineering-pa-scaffold/src/generator.mjs +354 -0
- package/dist/engineering-pa-scaffold/src/prompts.mjs +125 -0
- package/dist/engineering-pa-scaffold/src/runner.mjs +142 -0
- package/dist/engineering-pa-scaffold/templates/CLAUDE.md.template +196 -0
- package/dist/engineering-pa-scaffold/templates/operator-README.md.template +44 -0
- package/dist/engineering-pa-types-engineering/README.md +35 -0
- package/dist/engineering-pa-types-engineering/docs/commands/product-build.md +120 -0
- package/dist/engineering-pa-types-engineering/index.mjs +9 -0
- package/dist/engineering-pa-types-engineering/package.json +19 -0
- package/dist/engineering-pa-types-engineering/roles/product-engineer/definition.md +650 -0
- package/dist/engineering-pa-types-engineering/roles/product-engineer/templates/build-spec.md +82 -0
- package/dist/engineering-pa-types-engineering/roles/product-engineer/templates/preflight-checklist.md +158 -0
- package/dist/engineering-pa-types-engineering/roles/product-engineer/templates/worker-brief.md +130 -0
- package/dist/engineering-pa-workspace/README.md +197 -0
- package/dist/engineering-pa-workspace/app/assets/md.js +187 -0
- package/dist/engineering-pa-workspace/app/assets/modal.js +120 -0
- package/dist/engineering-pa-workspace/app/assets/theme.css +132 -0
- package/dist/engineering-pa-workspace/app/assets/theme.js +159 -0
- package/dist/engineering-pa-workspace/app/banner.js +320 -0
- package/dist/engineering-pa-workspace/app/delegations.html +345 -0
- package/dist/engineering-pa-workspace/app/home.html +1060 -0
- package/dist/engineering-pa-workspace/app/index.html +361 -0
- package/dist/engineering-pa-workspace/app/knowledge-map.html +163 -0
- package/dist/engineering-pa-workspace/app/knowledge.html +304 -0
- package/dist/engineering-pa-workspace/app/nav.json +75 -0
- package/dist/engineering-pa-workspace/app/notes.html +199 -0
- package/dist/engineering-pa-workspace/app/onboarding.html +592 -0
- package/dist/engineering-pa-workspace/app/profile.html +243 -0
- package/dist/engineering-pa-workspace/app/project-detail.html +432 -0
- package/dist/engineering-pa-workspace/app/projects.html +297 -0
- package/dist/engineering-pa-workspace/app/repos.html +598 -0
- package/dist/engineering-pa-workspace/app/schedules.html +486 -0
- package/dist/engineering-pa-workspace/app/secrets.html +164 -0
- package/dist/engineering-pa-workspace/app/staging.html +319 -0
- package/dist/engineering-pa-workspace/app/tasks.html +465 -0
- package/dist/engineering-pa-workspace/app/vendor/chart.umd.min.js +21 -0
- package/dist/engineering-pa-workspace/app/viewer.html +116 -0
- package/dist/engineering-pa-workspace/docs/DAEMON.md +104 -0
- package/dist/engineering-pa-workspace/docs/page-blueprint.md +286 -0
- package/dist/engineering-pa-workspace/docs/status-mon.md +168 -0
- package/dist/engineering-pa-workspace/index.mjs +12 -0
- package/dist/engineering-pa-workspace/nav.json.example +8 -0
- package/dist/engineering-pa-workspace/package.json +27 -0
- package/dist/engineering-pa-workspace/src/api.mjs +2086 -0
- package/dist/engineering-pa-workspace/src/install-daemon.mjs +573 -0
- package/dist/engineering-pa-workspace/src/nav.mjs +190 -0
- package/dist/engineering-pa-workspace/src/secrets-api.mjs +175 -0
- package/dist/engineering-pa-workspace/src/server.mjs +516 -0
- package/dist/engineering-pa-workspace/src/status-mon/poll.mjs +220 -0
- package/dist/engineering-pa-workspace/src/status-mon/poller.mjs +113 -0
- package/dist/engineering-pa-workspace/src/status-mon/run.mjs +133 -0
- package/dist/engineering-pa-workspace/src/supervisor.mjs +264 -0
- package/dist/engineering-pa-workspace/src/ws.mjs +633 -0
- package/index.mjs +60 -0
- package/package.json +58 -0
- package/templates/banned-ai-tells.md +102 -0
- package/templates/purpose.md +105 -0
- package/templates/voice-guide.md +98 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# memory-sync
|
|
2
|
+
|
|
3
|
+
**Identity:** `ai.stravica.ops.memory-sync`
|
|
4
|
+
|
|
5
|
+
Bidirectional mirror between Claude Code's per-project memory cache and the repo-tracked `operator/memory/` store. Installed as SessionStart / SessionEnd hooks so every session boots with the latest memories and every session persists any newly-saved ones back to git.
|
|
6
|
+
|
|
7
|
+
## Status
|
|
8
|
+
|
|
9
|
+
Implemented:
|
|
10
|
+
|
|
11
|
+
- `pull` — mirror `<repo>/operator/memory/` into `~/.claude/projects/<sanitised>/memory/`
|
|
12
|
+
- `push` — mirror the local cache back into `<repo>/operator/memory/`
|
|
13
|
+
- Worktree detection — commands no-op when run from a worktree (primary checkout is the sync authority)
|
|
14
|
+
|
|
15
|
+
Deferred: dry-run mode, selective filters, conflict flagging.
|
|
16
|
+
|
|
17
|
+
## Install / invoke
|
|
18
|
+
|
|
19
|
+
Invoked via the `memory-sync` shim:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
node <repo>/core/tools/memory-sync/bin/memory-sync <verb>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Hooks in `.claude/settings.json` call this directly. No PATH install is required because the hook already knows the absolute path through `$CLAUDE_PROJECT_DIR`.
|
|
26
|
+
|
|
27
|
+
## Commands
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
memory-sync pull Mirror repo memory dir -> local Claude Code cache
|
|
31
|
+
memory-sync push Mirror local Claude Code cache -> repo memory dir
|
|
32
|
+
memory-sync -h, --help Show usage
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Both verbs walk up from the current working directory to find the git repo root (a directory containing `.git`). When invoked inside a git worktree (`.git` is a regular file, not a directory) the command logs a skip notice and exits `0` — the primary checkout is the source of truth for memory sync.
|
|
36
|
+
|
|
37
|
+
Mirroring is "source wins, full": every file in the source tree overwrites its counterpart in the destination, and every file in the destination that does not exist in the source is deleted. Empty directories left over after deletion are pruned.
|
|
38
|
+
|
|
39
|
+
## Exit codes
|
|
40
|
+
|
|
41
|
+
| Code | Meaning |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `0` | OK (including skipped-inside-worktree) |
|
|
44
|
+
| `1` | Usage error (bad verb, extra arguments, missing verb) |
|
|
45
|
+
| `2` | Source dir missing (not in a repo, repo memory dir missing on pull, cache missing on pull/push) |
|
|
46
|
+
| `3` | IO failure (copy / delete / mkdir failed) |
|
|
47
|
+
|
|
48
|
+
The ladder matches the tooling standard (see [`core/knowledge/standards/tooling.md`](../../knowledge/standards/tooling.md) §6) with `2` overloaded to cover the shell-era semantics "the thing you asked to sync is not where it should be" for wire compatibility with the previous `sync.sh` behaviour.
|
|
49
|
+
|
|
50
|
+
## Operational discipline rules
|
|
51
|
+
|
|
52
|
+
- **Run only from the primary checkout.** Worktrees are explicitly skipped. If a session inside a worktree silently synced, it could race with the primary checkout and overwrite fresh memories with stale ones.
|
|
53
|
+
- **Source wins, unconditionally.** There is no merge. Whichever direction you run, the source side is authoritative and the destination is made to match. Conflict resolution lives outside this tool (use git on the repo side).
|
|
54
|
+
- **The `mirror.mjs` module is the sole filesystem chokepoint.** Every byte written or deleted on behalf of the tool passes through it. Commands may not open their own copy loops.
|
|
55
|
+
|
|
56
|
+
## Project layout
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
core/tools/memory-sync/
|
|
60
|
+
bin/memory-sync # node shebang shim — one line
|
|
61
|
+
package.json # name, version, type: module, zero dependencies
|
|
62
|
+
README.md # this file
|
|
63
|
+
src/
|
|
64
|
+
cli.mjs # verb routing, exit-code translation
|
|
65
|
+
cli-support.mjs # ExitError + log() used by cli + commands
|
|
66
|
+
repo.mjs # findRepoRoot, cacheDirFor — pure helpers
|
|
67
|
+
mirror.mjs # THE chokepoint — all FS mutation lives here
|
|
68
|
+
commands/
|
|
69
|
+
pull.mjs # repo -> cache
|
|
70
|
+
push.mjs # cache -> repo
|
|
71
|
+
test/
|
|
72
|
+
cli.test.mjs # end-to-end over a temp repo tree
|
|
73
|
+
repo.test.mjs # repo discovery + cache path sanitisation
|
|
74
|
+
mirror.test.mjs # chokepoint behaviour against fixtures
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Tests
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
node --test core/tools/memory-sync/test/*.test.mjs
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
All tests use `mkdtemp()` under `os.tmpdir()` and clean up afterwards. No test touches the real cache, the real repo's `operator/memory/` tree, or the real `$HOME`. The CLI tests override `HOME` around the call so `os.homedir()` resolves to a fixture-scoped path.
|
|
84
|
+
|
|
85
|
+
## The tooling standard
|
|
86
|
+
|
|
87
|
+
This tool follows [`core/knowledge/standards/tooling.md`](../../knowledge/standards/tooling.md). In particular:
|
|
88
|
+
|
|
89
|
+
- §2 Node-only — no shell implementation remains.
|
|
90
|
+
- §3 Zero npm dependencies — only `node:*` imports.
|
|
91
|
+
- §4 Layout — bin / src / commands / test as described.
|
|
92
|
+
- §6 Exit codes — `0/1/2/3` ladder.
|
|
93
|
+
- §7 Chokepoint pattern — `mirror.mjs` is the single FS-mutation seam.
|
|
94
|
+
- §11 camelCase JSON — no JSON on the wire yet; the rule still holds when it appears.
|
|
95
|
+
|
|
96
|
+
## Changelog
|
|
97
|
+
|
|
98
|
+
- **1.0.0** — Rewritten from `sync.sh` to Node. Behaviour preserved (pull/push verbs, exit-code ladder, worktree skip, source-wins mirror semantics). Drops the rsync dependency.
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Task Scheduler
|
|
2
|
+
|
|
3
|
+
Cross-platform scheduling abstraction for Dave. Lets the PA manage recurring tasks (distillation sweeps, health checks, sync jobs) using OS-native facilities without knowing the backend details.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## How it works
|
|
7
|
+
|
|
8
|
+
1. **detect.mjs** identifies the OS and available scheduling backends
|
|
9
|
+
2. You write a schedule definition as JSON (see format below)
|
|
10
|
+
3. **install.mjs** translates cron syntax to the native format and installs it
|
|
11
|
+
4. **verify.mjs** spawns the schedule's command once under the installed env, as a smoke test
|
|
12
|
+
5. **list.mjs** shows all Dave-managed schedules for the active backend
|
|
13
|
+
6. **remove.mjs** cleans up a schedule from the backend
|
|
14
|
+
7. **index.mjs** re-exports all functions for programmatic use by other tools
|
|
15
|
+
|
|
16
|
+
All tools are Node.js ESM modules (`.mjs`). Each works as both a CLI tool (`node detect.mjs`) and as an importable module (`import { detect } from './detect.mjs'`). Zero external dependencies -- only `node:` built-in modules.
|
|
17
|
+
|
|
18
|
+
All schedule definitions use **cron syntax** as the universal format. The install script handles translation to launchd plists, systemd timers, or Windows schtasks.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## Supported backends
|
|
22
|
+
|
|
23
|
+
| Backend | OS | Prefix | Notes |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| launchd | macOS | `com.dave.{id}` | Recommended on macOS. Plist in `~/Library/LaunchAgents/` |
|
|
26
|
+
| cron | macOS, Linux | `dave-{id}` | Widely available fallback |
|
|
27
|
+
| systemd | Linux | `dave-{id}` | Recommended on Linux. User-level timer + service units |
|
|
28
|
+
| schtasks | Windows | `dave-{id}` | Windows Task Scheduler via `schtasks.exe` (native cmd/PowerShell) |
|
|
29
|
+
| docker | Any | — | Detected but not directly managed (use for container-based setups) |
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## Schedule definition format
|
|
33
|
+
|
|
34
|
+
Schedule files live in `schedules/` at the repo root. Each is a JSON file:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"id": "distillation-sweep",
|
|
39
|
+
"name": "Daily Distillation Sweep",
|
|
40
|
+
"schedule": "0 3 * * *",
|
|
41
|
+
"command": "bash core/tools/distill/run.sh",
|
|
42
|
+
"workingDirectory": "${DAVE_ROOT}",
|
|
43
|
+
"enabled": true,
|
|
44
|
+
"backend": null,
|
|
45
|
+
"description": "Run the librarian distillation sweep daily at 3am"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
| Field | Required | Description |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `id` | Yes | Unique identifier. Used in backend naming (`com.dave.{id}`, `dave-{id}`) |
|
|
52
|
+
| `name` | No | Human-readable name |
|
|
53
|
+
| `schedule` | Yes | Cron expression: `minute hour day-of-month month day-of-week` |
|
|
54
|
+
| `command` | Yes | Shell command to execute |
|
|
55
|
+
| `workingDirectory` | No | Working directory. Supports `${DAVE_ROOT}` variable. Defaults to repo root |
|
|
56
|
+
| `enabled` | No | Set to `false` to skip installation. Defaults to `true` |
|
|
57
|
+
| `backend` | No | Override backend for this schedule. `null` uses the deployment default |
|
|
58
|
+
| `host` | No | Device id or hostname this schedule is pinned to run on. Enforced at `install` and `launch` time — see "Host enforcement" below. Omitting it is a warning-only pass, never a refusal. |
|
|
59
|
+
| `description` | No | Human-readable description |
|
|
60
|
+
| `environment` | No | Map of env vars to set for the scheduled process. **Read the warning below before using.** |
|
|
61
|
+
|
|
62
|
+
The JSON schema is at `packages/core/schema/schedule.json`.
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
## Host enforcement
|
|
66
|
+
|
|
67
|
+
A schedule's `host` field is matched against the current machine's
|
|
68
|
+
hostname — exact match, then short-name-before-first-dot (so
|
|
69
|
+
`smarthome01` matches `smarthome01.local`). Two enforcement points:
|
|
70
|
+
|
|
71
|
+
- **`scheduler install`** refuses (exit 2) to install a schedule whose
|
|
72
|
+
`host` doesn't match the installing machine. `--force-host` overrides
|
|
73
|
+
the refusal (still prints a warning, and records it in the result's
|
|
74
|
+
`warnings` array) — for deliberate cross-provisioning.
|
|
75
|
+
- **`launch`** refuses (exit 2) to RUN a task whose schedule declares a
|
|
76
|
+
foreign host. Since `launch` is invoked non-interactively (by cron/
|
|
77
|
+
launchd/systemd, not by an operator typing a flag), the override is an
|
|
78
|
+
env var instead: `DAVE_FORCE_HOST=1`. `--dry-run` is exempt from the
|
|
79
|
+
hard refusal (it never executes anything) but still prints a warning on
|
|
80
|
+
a mismatch.
|
|
81
|
+
|
|
82
|
+
A schedule with no `host` field at all is a warning-only pass in both
|
|
83
|
+
places — host data backfill onto existing schedule files is estate-side,
|
|
84
|
+
not something either tool does automatically.
|
|
85
|
+
|
|
86
|
+
## Name-collision check
|
|
87
|
+
|
|
88
|
+
`scheduler install` refuses (exit 2) when another `.json` file in the
|
|
89
|
+
same schedules directory declares the same `id` as the one being
|
|
90
|
+
installed. Two different files sharing an id would otherwise silently
|
|
91
|
+
clobber each other's installed backend entry (same cron tag, same
|
|
92
|
+
launchd label) — whichever installs last wins, and the loser's
|
|
93
|
+
association vanishes with no error anywhere. Malformed sibling files are
|
|
94
|
+
skipped (not this check's job to validate every other file in the
|
|
95
|
+
directory), not treated as a collision or a fatal error.
|
|
96
|
+
|
|
97
|
+
## Common pitfalls
|
|
98
|
+
|
|
99
|
+
### Do not set `environment.PATH`, `environment.HOME`, or `environment.DAVE_ROOT` unless you know what you're doing
|
|
100
|
+
|
|
101
|
+
The launchd installer auto-injects these three variables (`withLaunchdDefaults`) precisely because launchd's default agent env is minimal (`/usr/bin:/bin:/usr/sbin:/sbin`, no `HOME`) and that minimal env silently breaks anything installed via Homebrew. If you set an explicit `environment.PATH` in your schedule, **your value wins** — and on Apple Silicon Macs that almost always means `/opt/homebrew/bin` is missing, and tools like `sops`, `gh`, `jq` become invisible to the scheduled job.
|
|
102
|
+
|
|
103
|
+
The failure mode is silent: launchd records exit code 78 (`EX_CONFIG`), the StandardErrorPath log is 0 bytes, and the job repeats the same failure every cycle without surfacing.
|
|
104
|
+
|
|
105
|
+
**Rule of thumb:** the `environment` block is for *operator-meaningful* variables (`API_KEY`, `LOG_LEVEL`, `MY_FEATURE_FLAG`). Leave `PATH`, `HOME`, and `DAVE_ROOT` to the installer. If you genuinely need a custom `PATH`, *extend* the installer's default rather than replacing it — start your value with `${PATH}:/your/extra/bin`.
|
|
106
|
+
|
|
107
|
+
### cron's real environment is minimal — nvm/pnpm/Homebrew are invisible unless the schedule sources them
|
|
108
|
+
|
|
109
|
+
Proven live (w-2026-07-15-003, verified with `env -i`): cron's crond process provides a small fixed environment (`SHELL`, a narrow system `PATH` — `/usr/bin:/bin` — `HOME`, `LOGNAME`/`USER`), NOT a login shell's env. A schedule whose `command` relies on `pnpm`/`node` being on PATH via nvm silently fails to spawn once actually installed, even if it "worked" when tested from an interactive terminal.
|
|
110
|
+
|
|
111
|
+
The generated cron line handles this for you automatically: `scheduler install` detects `$HOME/.nvm/nvm.sh` on the target AT INSTALL TIME and, if present, wraps the command in `bash -c ". $HOME/.nvm/nvm.sh && cd <workDir> && <command> >> /tmp/<agent>-<id>.log 2>&1"`. If no nvm install is found, the preamble is simply omitted — nothing to do for schedules that only need system binaries. `environment.*` values are emitted as `export VAR='val';` statements ahead of the command (not a bare `VAR='val' cd ...` prefix, which in POSIX shell only scopes to the `cd` builtin and never actually reaches the command after `&&` — a real, silent bug the old generator had).
|
|
112
|
+
|
|
113
|
+
`scheduler verify` now runs this EXACT generated line (not a bare `sched.command`), under cron's actual minimal environment — never the verifying shell's `process.env`. This is deliberate: the old verify path inherited the operator's full login-shell env, which reliably masked this whole bug class. If `verify` reports `ok` today, that's an honest signal the schedule will actually fire under real cron.
|
|
114
|
+
|
|
115
|
+
### Verify your schedule before walking away
|
|
116
|
+
|
|
117
|
+
After installing a schedule, run `verify.mjs` to confirm the command actually launches under the installed env. The verify deliberately uses the same env-derivation logic as the installer, so it catches the env-mismatch class of bugs (narrow PATH, missing HOME, etc.) before the job's first scheduled fire — instead of finding out two weeks later from a stale audit log.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
node core/tools/scheduler/verify.mjs schedules/my-task.json launchd
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
## Usage
|
|
125
|
+
|
|
126
|
+
### Detect available backends
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
node core/tools/scheduler/detect.mjs
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Output:
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"os": "darwin",
|
|
136
|
+
"available": [
|
|
137
|
+
{"backend": "launchd", "recommended": true, "notes": "Native macOS, survives reboots"},
|
|
138
|
+
{"backend": "cron", "recommended": false, "notes": "Available but launchd preferred on macOS"}
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Install a schedule
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
node core/tools/scheduler/install.mjs schedules/distillation-sweep.json launchd
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Verify a schedule
|
|
150
|
+
|
|
151
|
+
After installing, run the schedule's command once under the same environment the installer would use. This catches silent-failure bugs caused by env mismatches (e.g. a narrow `environment.PATH` that masks Homebrew binaries on Apple Silicon).
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
node core/tools/scheduler/verify.mjs schedules/my-task.json launchd
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
If the backend is omitted, verify auto-detects (the same way `detect.mjs` does). Default timeout is 30 seconds; override with `--timeout`:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
node core/tools/scheduler/verify.mjs schedules/long-job.json launchd --timeout 60
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Exit codes: `0` ok, `1` usage error, `2` command exited non-zero, `3` spawn failure (binary not found), `4` timeout.
|
|
164
|
+
|
|
165
|
+
### List installed schedules
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
node core/tools/scheduler/list.mjs launchd
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Pass no argument to auto-detect the backend:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
node core/tools/scheduler/list.mjs
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
#### Listing schedules across hosts
|
|
178
|
+
|
|
179
|
+
`list.mjs <backend>` only sees what the named backend has installed **on the current host**. It reads the running user's crontab, the local `~/Library/LaunchAgents/` directory, the local systemd user units, or the local `schtasks.exe` namespace — there is no remote query. Running `list.mjs cron` on a launchd-recommended macOS workstation returns `(none)` even when a cron job is actively firing on a Linux host elsewhere; that's expected, not a bug. To inspect schedules installed on another machine, run `list.mjs` there directly (`ssh <host> 'cd <repo> && node core/tools/scheduler/list.mjs <backend>'` is a fine pattern). The `/schedule` slash command and the schedules workspace page surface the *intent* (the JSON definitions in `schedules/`); for the *actual installed state*, you must query each host.
|
|
180
|
+
|
|
181
|
+
### Remove a schedule
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
node core/tools/scheduler/remove.mjs distillation-sweep launchd
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Add `--delete-file` to also remove the JSON definition:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
node core/tools/scheduler/remove.mjs distillation-sweep launchd --delete-file
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Programmatic usage
|
|
194
|
+
|
|
195
|
+
```js
|
|
196
|
+
import { detect, install, list, remove, verify } from './core/tools/scheduler/index.mjs';
|
|
197
|
+
|
|
198
|
+
const backends = detect();
|
|
199
|
+
console.log(backends);
|
|
200
|
+
|
|
201
|
+
install('schedules/my-task.json', 'launchd');
|
|
202
|
+
const v = await verify('schedules/my-task.json', { backend: 'launchd', timeoutMs: 30000 });
|
|
203
|
+
if (v.result !== 'ok') console.error('schedule does not start cleanly:', v);
|
|
204
|
+
|
|
205
|
+
console.log(list('launchd'));
|
|
206
|
+
remove('my-task', 'launchd', { deleteFile: true });
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
## Integration with /init
|
|
211
|
+
|
|
212
|
+
During environment discovery, the PA should run `detect.mjs` and store the result in `.dave/config.json` under the `scheduler` key:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"scheduler": {
|
|
217
|
+
"backend": "launchd",
|
|
218
|
+
"detectedAt": "2026-04-13T12:00:00Z",
|
|
219
|
+
"available": ["launchd", "cron"]
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
The `/schedule` slash command reads this config and uses the stored backend as the default.
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
## Security notes
|
|
228
|
+
|
|
229
|
+
- All tools are intentionally simple and auditable -- users should read them before granting scheduler access
|
|
230
|
+
- Scheduled tasks run as the current user with that user's permissions
|
|
231
|
+
- No elevated/root permissions are requested
|
|
232
|
+
- Log files are written to `/tmp/` by default (configurable per schedule)
|
|
233
|
+
- The tools never auto-install without explicit invocation
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
## Tests
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
node --test packages/core/test/scheduler/*.test.mjs
|
|
240
|
+
node --test packages/cli/test/scheduler/*.test.mjs packages/cli/test/launch/*.test.mjs
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
The install tests cover the pure plist/cron/systemd/schtasks builders, `withLaunchdDefaults`, the env-complete cron generator (`buildCronCommand`/`buildCronLine` — nvm preamble, log redirect, `export`-based env propagation), `validateWorkDir` (unresolved-variable / node_modules-trap / nonexistent-dir refusals), `evaluateHostGate`, and `checkNameCollision`. The verify tests cover the env-derivation logic (including cron's new minimal-env honesty), the spawn outcomes (success / non-zero / spawn-failure / timeout), the generated-cron-line execution path, and a regression case for issue #68 (an explicit narrow PATH masking a binary that's available at the parent shell's PATH). `host.test.mjs` covers hostname normalisation/matching in isolation. The CLI-level suites (`packages/cli/test/scheduler/cli-bin.test.mjs`, `packages/cli/test/launch/cli.test.mjs`) exercise host refusal, `--force-host`/`DAVE_FORCE_HOST=1` overrides, and name-collision refusal through the real bins.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# slice
|
|
2
|
+
|
|
3
|
+
`ai.stravica.ops.slice` — operator profile slice generator.
|
|
4
|
+
|
|
5
|
+
Produces a compact "boot slice" of the operator's profile -- a short markdown
|
|
6
|
+
document that loads into the PA's context at every session start, in place of
|
|
7
|
+
the full ~18 KB `operator/profile/profile.md`. The full profile remains the
|
|
8
|
+
source of truth; the slice is a fresh snapshot, regenerated periodically (a
|
|
9
|
+
daily cron is the intended cadence — wired separately by the scheduler).
|
|
10
|
+
|
|
11
|
+
Architecturally the slice replaces a chronic over-load on boot: the canonical
|
|
12
|
+
profile, accumulated rules, and per-domain context can amount to 80--120 KB
|
|
13
|
+
of context every session start, before the operator's first message. The
|
|
14
|
+
slice trades freshness (stale by up to 24h is fine) for cheapness (~1--2 KB
|
|
15
|
+
on boot).
|
|
16
|
+
|
|
17
|
+
## Status
|
|
18
|
+
|
|
19
|
+
Implemented: `generate`, `generate --dry-run`, `--help`.
|
|
20
|
+
|
|
21
|
+
Bundled templates:
|
|
22
|
+
|
|
23
|
+
- `dave-boot` — the original use case. Six-section operator-boot card aimed
|
|
24
|
+
at single-operator PA instances like Dave.
|
|
25
|
+
|
|
26
|
+
Custom templates are loaded with `--template <path>`.
|
|
27
|
+
|
|
28
|
+
## Install / invoke
|
|
29
|
+
|
|
30
|
+
Called via the bin shim:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
slice generate dave-boot \
|
|
34
|
+
--profile /path/to/operator/profile/profile.md \
|
|
35
|
+
--output /path/to/operator/profile/slices/dave-boot.md
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Optional inputs:
|
|
39
|
+
|
|
40
|
+
- `--learned-rules <path>` — `learned-rules.md` (~50 KB), drives the
|
|
41
|
+
"load-bearing rules" section.
|
|
42
|
+
- `--observations <dir>` — a directory of recent observation `.md` files;
|
|
43
|
+
the generator filters to mtime within the last 21 days (mtimes older than
|
|
44
|
+
that are dropped). Files prefixed `_` (e.g. `_archive.md`) are always
|
|
45
|
+
skipped.
|
|
46
|
+
|
|
47
|
+
## Commands
|
|
48
|
+
|
|
49
|
+
### `slice generate <name>`
|
|
50
|
+
|
|
51
|
+
1. Load inputs (`profile.md` is required; `learned-rules.md` and
|
|
52
|
+
observations dir are optional).
|
|
53
|
+
2. Load the bundled prompt template at
|
|
54
|
+
`src/slice/prompts/<name>.md` (or `--template <path>` if supplied) and
|
|
55
|
+
substitute the assembled inputs into the `{{INPUTS}}` placeholder.
|
|
56
|
+
3. Invoke `claude --print --permission-mode bypassPermissions
|
|
57
|
+
--no-session-persistence --name slice-<ts>` with the assembled prompt as
|
|
58
|
+
the positional argument. The prompt is handed via `child_process.spawn`
|
|
59
|
+
with `shell: false` — no shell interpolation, the inputs are safe even if
|
|
60
|
+
they contain shell metacharacters.
|
|
61
|
+
4. Validate the response against the required-headers contract (six
|
|
62
|
+
sections: Operator basics, Mission framing, Active projects, Active
|
|
63
|
+
relationships, Load-bearing rules right now, State of play). A response
|
|
64
|
+
missing any required header is treated as a generator failure (exit 2)
|
|
65
|
+
and no file is written.
|
|
66
|
+
5. Validate the size against the 2 KB soft budget. Over-budget responses
|
|
67
|
+
produce a stderr warning but are written anyway — better to ship a 3 KB
|
|
68
|
+
slice than skip a regeneration.
|
|
69
|
+
6. Write the response to the configured `--output` path. Parent directories
|
|
70
|
+
are created if missing.
|
|
71
|
+
|
|
72
|
+
#### Flags
|
|
73
|
+
|
|
74
|
+
- `--profile <path>` Path to `profile.md` (required).
|
|
75
|
+
- `--learned-rules <path>` Optional.
|
|
76
|
+
- `--observations <dir>` Optional.
|
|
77
|
+
- `--output <path>` Where to write the slice (required).
|
|
78
|
+
- `--template <path>` Override the bundled template path.
|
|
79
|
+
- `--runs-log <path>` Append one JSON audit line per invocation to
|
|
80
|
+
this file. Default-off. See **Audit log** below.
|
|
81
|
+
- `--dry-run` Build the prompt and report; skip the claude
|
|
82
|
+
call and the file write.
|
|
83
|
+
- `-h`, `--help` Show usage.
|
|
84
|
+
|
|
85
|
+
### Exit codes
|
|
86
|
+
|
|
87
|
+
- `0` ok — slice generated, validated, written.
|
|
88
|
+
- `1` usage error (missing/extra flags, missing slice name or template).
|
|
89
|
+
- `2` operational failure (missing input file, missing template,
|
|
90
|
+
validation failure on the generator's response).
|
|
91
|
+
- `3` claude transport failure (claude binary exited non-zero).
|
|
92
|
+
|
|
93
|
+
### Audit log (`--runs-log`)
|
|
94
|
+
|
|
95
|
+
When `--runs-log <path>` is passed, each invocation appends one JSON line to
|
|
96
|
+
the file in the canonical shape consumed by the `tasks` health monitor:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{"ts":"2026-05-21T03:00:01Z","status":"ok","exitCode":0,"durationSec":42,"dryRun":false,"outputBytes":1843}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Status vocabulary (closed):
|
|
103
|
+
|
|
104
|
+
- `ok` — slice generated, validated, written.
|
|
105
|
+
- `noop-dry-run` — `--dry-run` path; no claude call, no file write.
|
|
106
|
+
- `fail-claude` — claude exited non-zero (transport failure, exit 3).
|
|
107
|
+
- `fail-validation` — claude returned content missing required headers (exit 2).
|
|
108
|
+
- `fail-prereq` — input loading failed (missing profile / observations / template, exit 2).
|
|
109
|
+
- `fail-write` — writing the slice output file failed (permissions, ENOSPC, etc., exit 2).
|
|
110
|
+
- `fail-usage` — early arg-validation failed (missing required option, exit 1).
|
|
111
|
+
- `fail-unexpected` — any other thrown exception (defensive catch-all so
|
|
112
|
+
cron failures never disappear silently).
|
|
113
|
+
|
|
114
|
+
`reason` is omitted on `ok` / `noop-dry-run`. `outputBytes` is `null` on
|
|
115
|
+
paths that didn't produce a file. Every non-help invocation appends
|
|
116
|
+
exactly one audit line — including the throw paths above — so the
|
|
117
|
+
freshness monitor can distinguish "tool exploded" from "tool was never
|
|
118
|
+
invoked".
|
|
119
|
+
|
|
120
|
+
When `slice` runs on a schedule (e.g. `30 3 * * *` for nightly slice
|
|
121
|
+
regeneration), the `--runs-log` path becomes the freshness signal for the
|
|
122
|
+
task — point it at a per-task `runs.jsonl` (one task per file; the
|
|
123
|
+
monitor uses `tail -n 1`). The default is **off** so human hand-invocations
|
|
124
|
+
don't pollute the freshness signal of the scheduled run.
|
|
125
|
+
|
|
126
|
+
Audit writes are best-effort: a failed audit append (missing dir, ENOSPC,
|
|
127
|
+
etc.) is logged to stderr but does NOT change the process exit code. A
|
|
128
|
+
lost audit line is preferable to misclassifying a successful slice
|
|
129
|
+
regeneration as a transport failure.
|
|
130
|
+
|
|
131
|
+
## Output contract
|
|
132
|
+
|
|
133
|
+
A single markdown file at the `--output` path. Plain markdown, no
|
|
134
|
+
front-matter, no JSON envelope. The PA's boot rule reads it the same way it
|
|
135
|
+
reads the full profile.
|
|
136
|
+
|
|
137
|
+
Soft target: under 2 KB / ~30 lines. Hard requirement: the six section
|
|
138
|
+
headers must be present.
|
|
139
|
+
|
|
140
|
+
## Design notes
|
|
141
|
+
|
|
142
|
+
- The Claude invocation is funnelled through the same chokepoint runner
|
|
143
|
+
used by `distill` (`packages/core/src/distill/runner.mjs`). One place
|
|
144
|
+
in core/src spawns external processes.
|
|
145
|
+
- The prompt template is an `.md` file with a `{{INPUTS}}` placeholder, not
|
|
146
|
+
a hardcoded string, so an operator can drop in a custom slice template
|
|
147
|
+
(e.g. `--template ./my-slice.md`) without forking the package.
|
|
148
|
+
- No git, no commit, no push — `slice` is a pure file writer. The per-host
|
|
149
|
+
`sync` tool picks up any changes the slice produced on its next tick.
|
|
150
|
+
- Tests use a fake runner; no real claude calls in CI.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Upstream Issue Filing
|
|
2
|
+
|
|
3
|
+
In v2 the platform ships as the `@stravica-ai/digital-operator-pa` npm package and is developed in the `Stravica/engineering-pa-dev` repository. When you find a bug or gap in the platform, file a GitHub issue against `Stravica/engineering-pa-dev` so the fix lands in one place and reaches every operator via the next package release.
|
|
4
|
+
|
|
5
|
+
This document is the lookup-on-demand reference for that workflow. The CLAUDE.md core rule "Platform code is read-only; never edit `node_modules/`" establishes the discipline; this doc is the procedure.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## When to file an issue
|
|
9
|
+
|
|
10
|
+
- A bug in any platform-supplied module (wrong behaviour, broken invariant, regression).
|
|
11
|
+
- A platform enhancement request (new capability, better ergonomics, missing flag).
|
|
12
|
+
- Platform docs are wrong, unclear, or out of date.
|
|
13
|
+
- A platform tool violates the tooling standard at `@stravica-ai/engineering-pa-core/docs/standards/tooling.md`.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## When NOT to file
|
|
17
|
+
|
|
18
|
+
- Bugs in your operator content (`operator/`, `work/`, `projects/`, `agents/`) — those are local to your repo. Fix them directly.
|
|
19
|
+
- Operator-specific workflow questions — those do not generalise to other operators.
|
|
20
|
+
- Anything you can fix locally by adjusting your `operator/extensions/` without touching the package.
|
|
21
|
+
- Questions that are really requests for the operator's judgement.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
## How to file
|
|
25
|
+
|
|
26
|
+
Use `gh issue create` against `Stravica/engineering-pa-dev`. Compose the body in a structured way:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
gh issue create \
|
|
30
|
+
--repo Stravica/engineering-pa-dev \
|
|
31
|
+
--title "<short title, <=160 chars>" \
|
|
32
|
+
--body "$(cat <<'EOF'
|
|
33
|
+
## Type
|
|
34
|
+
bug | enhancement | docs | question
|
|
35
|
+
|
|
36
|
+
## Summary
|
|
37
|
+
What, and why.
|
|
38
|
+
|
|
39
|
+
## Reproducer
|
|
40
|
+
(Required for bug.)
|
|
41
|
+
Steps to reproduce against a clean operator instance.
|
|
42
|
+
|
|
43
|
+
## Environment
|
|
44
|
+
- Package version: <pnpm list @stravica-ai/digital-operator-pa --depth=0>
|
|
45
|
+
- Node version: <node --version>
|
|
46
|
+
- OS family: <linux | macos | windows>
|
|
47
|
+
|
|
48
|
+
## Proposed solution
|
|
49
|
+
(Optional.)
|
|
50
|
+
|
|
51
|
+
## Work-item ref
|
|
52
|
+
(Optional — local work-item ID for trace-back only; we don't read the file.)
|
|
53
|
+
EOF
|
|
54
|
+
)"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Check for duplicates first:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
gh issue list --repo Stravica/engineering-pa-dev --search "<keywords>"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
## Never include in an upstream issue
|
|
65
|
+
|
|
66
|
+
Upstream issues are public during dev and stay public after the repo flips to `Stravica/engineering-pa`. The following categories of content must not appear in any field you submit:
|
|
67
|
+
|
|
68
|
+
- Secrets of any kind (API keys, tokens, passwords).
|
|
69
|
+
- Anything read from `.vault/` or any `.env` file.
|
|
70
|
+
- Contents of `operator/profile/` — that is the operator's private profile.
|
|
71
|
+
- Contents of `operator/memory/` — that is your learned-memory store.
|
|
72
|
+
- Contents of `.session/environment.json` — hostname, paths, network posture.
|
|
73
|
+
- Machine hostnames. OS family (`linux` / `macos` / `windows`) is the right granularity.
|
|
74
|
+
- Work-item bodies from your `work/` directory. A `workItemRef` string is fine for trace-back; the body is not.
|
|
75
|
+
|
|
76
|
+
If your issue legitimately needs to reference a denied root, move the relevant data out of that root first.
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Authentication
|
|
80
|
+
|
|
81
|
+
`gh` must be authenticated with `repo:issue:write` on `Stravica/engineering-pa-dev`:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
gh auth login
|
|
85
|
+
gh auth status
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
If `gh` is missing or unauthenticated, surface that fact and stop.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Working Directory vs Operator Repo Root
|
|
2
|
+
|
|
3
|
+
Your shell `cwd` when launched is your agent run folder: `agents/<paName>/`. The **operator repo root** is two directory levels up from that cwd. These are different places and the distinction matters.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Never hard-code the operator repo root
|
|
7
|
+
|
|
8
|
+
The absolute path depends on where the operator's repo was cloned on the current machine — it differs per operator and per device. Always derive it dynamically:
|
|
9
|
+
|
|
10
|
+
- Env var (preferred): `$DAVE_ROOT` or `$PA_REPO_ROOT` is exported by the platform launcher for processes it runs.
|
|
11
|
+
- Session manifest: `machine.daveRoot` in `.session/environment.json` (populated by `pa-init` and the platform launcher).
|
|
12
|
+
- Shell derivation: `OP_ROOT="$(cd "$(pwd)/../.." && pwd)"` from the run folder.
|
|
13
|
+
|
|
14
|
+
Platform tools that need the operator repo root accept it via:
|
|
15
|
+
|
|
16
|
+
1. An explicit caller argument (always wins).
|
|
17
|
+
2. `DAVE_REPO_ROOT` or `PA_REPO_ROOT` environment variable.
|
|
18
|
+
3. A `.git`-walk upwards from `process.cwd()`.
|
|
19
|
+
|
|
20
|
+
That fallback chain is consistent across `desk`, `distill`, `memory-sync`, `sync`, and the workspace server.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- Work items (`work/`), projects (`projects/`), knowledge (`operator/knowledge/`), schedules (`schedules/`), and session data (`.session/`) all live at the **operator repo root**, not your cwd.
|
|
26
|
+
- Reference them either as absolute paths built from `$DAVE_ROOT`, or as `<repo-root>/...` in prose — never as `./tools/...` or `./.session/...`. A bare relative path will silently resolve inside `agents/<paName>/` and either fail or write to the wrong place.
|
|
27
|
+
- When running shell commands, use absolute paths built from `$DAVE_ROOT`. If you must `cd` to the repo root, do `cd "$DAVE_ROOT" && ...`.
|
|
28
|
+
- Do NOT create a `.session/` directory inside your agent run folder. The canonical session file is `<repo-root>/.session/environment.json`.
|
|
29
|
+
- Platform code lives in `node_modules/@stravica-ai/digital-operator-pa/` (and its internal packages). Don't try to address it by relative path — use the package's published CLI shims (`node_modules/.bin/<name>`) or import its modules by package path.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Workspace Operations
|
|
2
|
+
|
|
3
|
+
The workspace server provides a web interface for content that does not fit well in the CLI. Managed via `ws.mjs` — always use the CLI, never raw process commands.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## When to use the workspace
|
|
7
|
+
|
|
8
|
+
- Long-form content (reports, documentation, analysis)
|
|
9
|
+
- Structured data (tables, comparisons)
|
|
10
|
+
- Content that benefits from formatting (HTML, styled text)
|
|
11
|
+
- Dashboards and status overviews
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## Managing the workspace server
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
node core/tools/workspace/ws.mjs start [--port N] [--no-open] # Start as background daemon
|
|
18
|
+
node core/tools/workspace/ws.mjs stop # Stop the server
|
|
19
|
+
node core/tools/workspace/ws.mjs restart [--port N] [--no-open] # Stop then start
|
|
20
|
+
node core/tools/workspace/ws.mjs status # Show status (PID, port, uptime)
|
|
21
|
+
node core/tools/workspace/ws.mjs open # Open browser to server URL
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Port resolution order: default 4200 -> `operator/config/preferences.json` key `workspacePort` -> `--port` CLI flag.
|
|
25
|
+
|
|
26
|
+
Do NOT use `lsof`, `kill`, or raw process management to manage the workspace server. `ws.mjs` handles all of this cross-platform.
|
|
27
|
+
|
|
28
|
+
Content served by the workspace is read fresh on every request, so file edits are picked up on browser refresh (Cmd+R / Ctrl+R). Live-reload / SSE has been temporarily removed pending a workspace rebuild — refresh the browser manually to see changes. You only need to restart the server when `server.mjs` or `api.mjs` themselves are modified.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## Available pages
|
|
32
|
+
|
|
33
|
+
- `/home.html` — dashboard overview
|
|
34
|
+
- `/projects.html` — project cards with detail drill-down
|
|
35
|
+
- `/project-detail.html` — single project view with work items
|
|
36
|
+
- `/tasks.html` — work item management
|
|
37
|
+
- `/knowledge.html` — knowledge browser
|
|
38
|
+
- `/secrets.html` — secrets management UI
|
|
39
|
+
- `/schedules.html` — scheduled/recurring tasks
|
|
40
|
+
- `/viewer.html?file=path/to/file.md` — generic content viewer (renders markdown to HTML)
|
|
41
|
+
- `/onboarding.html` — first-run setup (normally used once)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
## Extending the workspace
|
|
45
|
+
|
|
46
|
+
Custom pages go in `operator/extensions/workspace/`. The server serves files from both `core/tools/workspace/app/` and the extensions directory.
|