gipity 1.0.355 → 1.0.365
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/dist/capture/sources/claude-code.js +76 -11
- package/dist/commands/add.js +44 -27
- package/dist/commands/generate.js +16 -13
- package/dist/commands/page-eval.js +42 -3
- package/dist/commands/page-inspect.js +32 -4
- package/dist/commands/page-screenshot.js +34 -23
- package/dist/commands/page-test.js +86 -0
- package/dist/commands/page.js +5 -3
- package/dist/commands/service.js +56 -0
- package/dist/commands/skill.js +2 -1
- package/dist/commands/text.js +148 -0
- package/dist/commands/workflow.js +10 -14
- package/dist/config.js +8 -1
- package/dist/help-skills.js +1 -0
- package/dist/helpers/output.js +7 -1
- package/dist/helpers/text-analysis.js +200 -0
- package/dist/hooks/capture-runner.js +32 -8
- package/dist/index.js +31 -2
- package/dist/knowledge.js +13 -3
- package/dist/relay/daemon.js +11 -1
- package/dist/relay/stream-json.js +45 -8
- package/dist/setup.js +18 -4
- package/dist/sync.js +14 -2
- package/package.json +8 -7
- package/dist/__tests__/adopt-cwd.test.d.ts +0 -1
- package/dist/__tests__/adopt-cwd.test.js +0 -176
- package/dist/__tests__/adopt-cwd.test.js.map +0 -1
- package/dist/__tests__/capture-transcript.test.d.ts +0 -1
- package/dist/__tests__/capture-transcript.test.js +0 -92
- package/dist/__tests__/capture-transcript.test.js.map +0 -1
- package/dist/__tests__/claude-noninteractive.test.d.ts +0 -1
- package/dist/__tests__/claude-noninteractive.test.js +0 -92
- package/dist/__tests__/claude-noninteractive.test.js.map +0 -1
- package/dist/__tests__/claude-trust.test.d.ts +0 -1
- package/dist/__tests__/claude-trust.test.js +0 -71
- package/dist/__tests__/claude-trust.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-add.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-add.test.js +0 -45
- package/dist/__tests__/cli-cmd-add.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-agent.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-agent.test.js +0 -76
- package/dist/__tests__/cli-cmd-agent.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-approval.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-approval.test.js +0 -47
- package/dist/__tests__/cli-cmd-approval.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-audit.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-audit.test.js +0 -33
- package/dist/__tests__/cli-cmd-audit.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-chat.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-chat.test.js +0 -94
- package/dist/__tests__/cli-cmd-chat.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-credits.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-credits.test.js +0 -66
- package/dist/__tests__/cli-cmd-credits.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-db.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-db.test.js +0 -95
- package/dist/__tests__/cli-cmd-db.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-deploy.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-deploy.test.js +0 -53
- package/dist/__tests__/cli-cmd-deploy.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-domain.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-domain.test.js +0 -73
- package/dist/__tests__/cli-cmd-domain.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-email.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-email.test.js +0 -31
- package/dist/__tests__/cli-cmd-email.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-file.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-file.test.js +0 -86
- package/dist/__tests__/cli-cmd-file.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-fn.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-fn.test.js +0 -50
- package/dist/__tests__/cli-cmd-fn.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-generate.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-generate.test.js +0 -46
- package/dist/__tests__/cli-cmd-generate.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-gmail.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-gmail.test.js +0 -49
- package/dist/__tests__/cli-cmd-gmail.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-info.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-info.test.js +0 -52
- package/dist/__tests__/cli-cmd-info.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-init.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-init.test.js +0 -76
- package/dist/__tests__/cli-cmd-init.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-job.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-job.test.js +0 -204
- package/dist/__tests__/cli-cmd-job.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-location.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-location.test.js +0 -58
- package/dist/__tests__/cli-cmd-location.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-login.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-login.test.js +0 -41
- package/dist/__tests__/cli-cmd-login.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-logout.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-logout.test.js +0 -20
- package/dist/__tests__/cli-cmd-logout.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-logs.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-logs.test.js +0 -40
- package/dist/__tests__/cli-cmd-logs.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-memory.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-memory.test.js +0 -58
- package/dist/__tests__/cli-cmd-memory.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-page-inspect.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-page-inspect.test.js +0 -47
- package/dist/__tests__/cli-cmd-page-inspect.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-page.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-page.test.js +0 -90
- package/dist/__tests__/cli-cmd-page.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-plan.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-plan.test.js +0 -81
- package/dist/__tests__/cli-cmd-plan.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-project.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-project.test.js +0 -61
- package/dist/__tests__/cli-cmd-project.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-rbac.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-rbac.test.js +0 -39
- package/dist/__tests__/cli-cmd-rbac.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-realtime.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-realtime.test.js +0 -51
- package/dist/__tests__/cli-cmd-realtime.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-records.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-records.test.js +0 -67
- package/dist/__tests__/cli-cmd-records.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-relay.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-relay.test.js +0 -100
- package/dist/__tests__/cli-cmd-relay.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-sandbox.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-sandbox.test.js +0 -46
- package/dist/__tests__/cli-cmd-sandbox.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-scaffold.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-scaffold.test.js +0 -30
- package/dist/__tests__/cli-cmd-scaffold.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-skill.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-skill.test.js +0 -40
- package/dist/__tests__/cli-cmd-skill.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-test.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-test.test.js +0 -58
- package/dist/__tests__/cli-cmd-test.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-workflow.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-workflow.test.js +0 -84
- package/dist/__tests__/cli-cmd-workflow.test.js.map +0 -1
- package/dist/__tests__/cli-e2e-live.test.d.ts +0 -1
- package/dist/__tests__/cli-e2e-live.test.js +0 -144
- package/dist/__tests__/cli-e2e-live.test.js.map +0 -1
- package/dist/__tests__/cli-smoke.test.d.ts +0 -1
- package/dist/__tests__/cli-smoke.test.js +0 -69
- package/dist/__tests__/cli-smoke.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -1
- package/dist/__tests__/config.test.js +0 -95
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/flag-aliases.test.d.ts +0 -1
- package/dist/__tests__/flag-aliases.test.js +0 -53
- package/dist/__tests__/flag-aliases.test.js.map +0 -1
- package/dist/__tests__/helpers/mock-server.d.ts +0 -52
- package/dist/__tests__/helpers/mock-server.js +0 -86
- package/dist/__tests__/helpers/mock-server.js.map +0 -1
- package/dist/__tests__/helpers/spawn-cli.d.ts +0 -30
- package/dist/__tests__/helpers/spawn-cli.js +0 -72
- package/dist/__tests__/helpers/spawn-cli.js.map +0 -1
- package/dist/__tests__/helpers/test-home.d.ts +0 -22
- package/dist/__tests__/helpers/test-home.js +0 -35
- package/dist/__tests__/helpers/test-home.js.map +0 -1
- package/dist/__tests__/hook-capture.test.d.ts +0 -1
- package/dist/__tests__/hook-capture.test.js +0 -65
- package/dist/__tests__/hook-capture.test.js.map +0 -1
- package/dist/__tests__/prompts.test.d.ts +0 -1
- package/dist/__tests__/prompts.test.js +0 -129
- package/dist/__tests__/prompts.test.js.map +0 -1
- package/dist/__tests__/push-cas.test.d.ts +0 -1
- package/dist/__tests__/push-cas.test.js +0 -133
- package/dist/__tests__/push-cas.test.js.map +0 -1
- package/dist/__tests__/relay-bridge-abort.test.d.ts +0 -1
- package/dist/__tests__/relay-bridge-abort.test.js +0 -65
- package/dist/__tests__/relay-bridge-abort.test.js.map +0 -1
- package/dist/__tests__/relay-daemon.test.d.ts +0 -1
- package/dist/__tests__/relay-daemon.test.js +0 -232
- package/dist/__tests__/relay-daemon.test.js.map +0 -1
- package/dist/__tests__/relay-ingest-contract.test.d.ts +0 -1
- package/dist/__tests__/relay-ingest-contract.test.js +0 -76
- package/dist/__tests__/relay-ingest-contract.test.js.map +0 -1
- package/dist/__tests__/relay-installers.test.d.ts +0 -1
- package/dist/__tests__/relay-installers.test.js +0 -95
- package/dist/__tests__/relay-installers.test.js.map +0 -1
- package/dist/__tests__/relay-machine-id.test.d.ts +0 -1
- package/dist/__tests__/relay-machine-id.test.js +0 -41
- package/dist/__tests__/relay-machine-id.test.js.map +0 -1
- package/dist/__tests__/relay-pair.test.d.ts +0 -1
- package/dist/__tests__/relay-pair.test.js.map +0 -1
- package/dist/__tests__/relay-redact.test.d.ts +0 -1
- package/dist/__tests__/relay-redact.test.js +0 -78
- package/dist/__tests__/relay-redact.test.js.map +0 -1
- package/dist/__tests__/relay-state.test.d.ts +0 -1
- package/dist/__tests__/relay-state.test.js +0 -85
- package/dist/__tests__/relay-state.test.js.map +0 -1
- package/dist/__tests__/setup-skills-block.test.d.ts +0 -1
- package/dist/__tests__/setup-skills-block.test.js +0 -65
- package/dist/__tests__/setup-skills-block.test.js.map +0 -1
- package/dist/__tests__/stream-json.test.d.ts +0 -1
- package/dist/__tests__/stream-json.test.js +0 -186
- package/dist/__tests__/stream-json.test.js.map +0 -1
- package/dist/__tests__/sync-apply.test.d.ts +0 -1
- package/dist/__tests__/sync-apply.test.js +0 -457
- package/dist/__tests__/sync-apply.test.js.map +0 -1
- package/dist/__tests__/sync-lock.test.d.ts +0 -1
- package/dist/__tests__/sync-lock.test.js +0 -105
- package/dist/__tests__/sync-lock.test.js.map +0 -1
- package/dist/__tests__/sync.test.d.ts +0 -1
- package/dist/__tests__/sync.test.js +0 -160
- package/dist/__tests__/sync.test.js.map +0 -1
- package/dist/__tests__/template-vars.test.d.ts +0 -1
- package/dist/__tests__/template-vars.test.js +0 -119
- package/dist/__tests__/template-vars.test.js.map +0 -1
- package/dist/__tests__/updater.test.d.ts +0 -1
- package/dist/__tests__/updater.test.js +0 -95
- package/dist/__tests__/updater.test.js.map +0 -1
- package/dist/__tests__/upload.test.d.ts +0 -1
- package/dist/__tests__/upload.test.js +0 -92
- package/dist/__tests__/upload.test.js.map +0 -1
- package/dist/__tests__/utils.test.d.ts +0 -1
- package/dist/__tests__/utils.test.js +0 -69
- package/dist/__tests__/utils.test.js.map +0 -1
- package/dist/adopt-cwd.d.ts +0 -69
- package/dist/adopt-cwd.js.map +0 -1
- package/dist/api.d.ts +0 -41
- package/dist/api.js.map +0 -1
- package/dist/auth.d.ts +0 -17
- package/dist/auth.js.map +0 -1
- package/dist/banner.d.ts +0 -6
- package/dist/banner.js.map +0 -1
- package/dist/capture/sources/claude-code.d.ts +0 -78
- package/dist/capture/sources/claude-code.js.map +0 -1
- package/dist/coding-guidelines.d.ts +0 -9
- package/dist/coding-guidelines.js.map +0 -1
- package/dist/colors.d.ts +0 -22
- package/dist/colors.js.map +0 -1
- package/dist/commands/add.d.ts +0 -2
- package/dist/commands/add.js.map +0 -1
- package/dist/commands/agent.d.ts +0 -2
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/api.d.ts +0 -1
- package/dist/commands/api.js.map +0 -1
- package/dist/commands/approval.d.ts +0 -2
- package/dist/commands/approval.js.map +0 -1
- package/dist/commands/audit.d.ts +0 -2
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/browser.d.ts +0 -2
- package/dist/commands/browser.js.map +0 -1
- package/dist/commands/chat.d.ts +0 -2
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/checkpoint.d.ts +0 -2
- package/dist/commands/checkpoint.js.map +0 -1
- package/dist/commands/claude.d.ts +0 -16
- package/dist/commands/claude.js.map +0 -1
- package/dist/commands/credits.d.ts +0 -2
- package/dist/commands/credits.js.map +0 -1
- package/dist/commands/db.d.ts +0 -2
- package/dist/commands/db.js.map +0 -1
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/domain.d.ts +0 -2
- package/dist/commands/domain.js.map +0 -1
- package/dist/commands/email.d.ts +0 -2
- package/dist/commands/email.js.map +0 -1
- package/dist/commands/file.d.ts +0 -2
- package/dist/commands/file.js.map +0 -1
- package/dist/commands/fn.d.ts +0 -2
- package/dist/commands/fn.js.map +0 -1
- package/dist/commands/generate.d.ts +0 -2
- package/dist/commands/generate.js.map +0 -1
- package/dist/commands/gmail.d.ts +0 -2
- package/dist/commands/gmail.js.map +0 -1
- package/dist/commands/hook-capture.d.ts +0 -15
- package/dist/commands/hook-capture.js.map +0 -1
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/job.d.ts +0 -2
- package/dist/commands/job.js.map +0 -1
- package/dist/commands/location.d.ts +0 -9
- package/dist/commands/location.js.map +0 -1
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -2
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/page-eval.d.ts +0 -2
- package/dist/commands/page-eval.js.map +0 -1
- package/dist/commands/page-inspect.d.ts +0 -2
- package/dist/commands/page-inspect.js.map +0 -1
- package/dist/commands/page-screenshot.d.ts +0 -2
- package/dist/commands/page-screenshot.js.map +0 -1
- package/dist/commands/page.d.ts +0 -2
- package/dist/commands/page.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -2
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/project.d.ts +0 -2
- package/dist/commands/project.js.map +0 -1
- package/dist/commands/push.d.ts +0 -2
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/rbac.d.ts +0 -2
- package/dist/commands/rbac.js.map +0 -1
- package/dist/commands/realtime.d.ts +0 -2
- package/dist/commands/realtime.js.map +0 -1
- package/dist/commands/records.d.ts +0 -2
- package/dist/commands/records.js.map +0 -1
- package/dist/commands/relay-install.d.ts +0 -11
- package/dist/commands/relay-install.js.map +0 -1
- package/dist/commands/relay.d.ts +0 -9
- package/dist/commands/relay.js.map +0 -1
- package/dist/commands/sandbox.d.ts +0 -2
- package/dist/commands/sandbox.js.map +0 -1
- package/dist/commands/scaffold.d.ts +0 -2
- package/dist/commands/scaffold.js.map +0 -1
- package/dist/commands/skill.d.ts +0 -2
- package/dist/commands/skill.js.map +0 -1
- package/dist/commands/skills.d.ts +0 -2
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/start-cc.d.ts +0 -2
- package/dist/commands/start-cc.js.map +0 -1
- package/dist/commands/status.d.ts +0 -2
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -2
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/test.d.ts +0 -2
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -10
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.d.ts +0 -2
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/upload.d.ts +0 -2
- package/dist/commands/upload.js.map +0 -1
- package/dist/commands/workflow.d.ts +0 -2
- package/dist/commands/workflow.js.map +0 -1
- package/dist/config.d.ts +0 -39
- package/dist/config.js.map +0 -1
- package/dist/flag-aliases.d.ts +0 -17
- package/dist/flag-aliases.js.map +0 -1
- package/dist/gip3dw-guide.d.ts +0 -7
- package/dist/gip3dw-guide.js.map +0 -1
- package/dist/gipcc.d.ts +0 -2
- package/dist/gipcc.js.map +0 -1
- package/dist/gipccd.d.ts +0 -2
- package/dist/gipccd.js.map +0 -1
- package/dist/help-skills.d.ts +0 -7
- package/dist/help-skills.js.map +0 -1
- package/dist/helpers/command.d.ts +0 -12
- package/dist/helpers/command.js.map +0 -1
- package/dist/helpers/index.d.ts +0 -6
- package/dist/helpers/index.js.map +0 -1
- package/dist/helpers/output.d.ts +0 -22
- package/dist/helpers/output.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -13
- package/dist/helpers/sync.js.map +0 -1
- package/dist/hooks/capture-runner.d.ts +0 -24
- package/dist/hooks/capture-runner.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/knowledge.d.ts +0 -11
- package/dist/knowledge.js.map +0 -1
- package/dist/platform-overview.d.ts +0 -9
- package/dist/platform-overview.js.map +0 -1
- package/dist/project-setup.d.ts +0 -29
- package/dist/project-setup.js.map +0 -1
- package/dist/prompts.d.ts +0 -80
- package/dist/prompts.js.map +0 -1
- package/dist/provider-docs.d.ts +0 -27
- package/dist/provider-docs.js.map +0 -1
- package/dist/relay/daemon.d.ts +0 -47
- package/dist/relay/daemon.js.map +0 -1
- package/dist/relay/device-http.d.ts +0 -9
- package/dist/relay/device-http.js.map +0 -1
- package/dist/relay/installers.d.ts +0 -24
- package/dist/relay/installers.js.map +0 -1
- package/dist/relay/machine-id.d.ts +0 -2
- package/dist/relay/machine-id.js.map +0 -1
- package/dist/relay/onboarding.d.ts +0 -8
- package/dist/relay/onboarding.js.map +0 -1
- package/dist/relay/paths.d.ts +0 -5
- package/dist/relay/paths.js.map +0 -1
- package/dist/relay/redact.d.ts +0 -34
- package/dist/relay/redact.js.map +0 -1
- package/dist/relay/state.d.ts +0 -39
- package/dist/relay/state.js.map +0 -1
- package/dist/relay/stream-json.d.ts +0 -105
- package/dist/relay/stream-json.js.map +0 -1
- package/dist/relay/transcripts.d.ts +0 -60
- package/dist/relay/transcripts.js.map +0 -1
- package/dist/setup.d.ts +0 -101
- package/dist/setup.js.map +0 -1
- package/dist/sync.d.ts +0 -74
- package/dist/sync.js.map +0 -1
- package/dist/template-vars.d.ts +0 -32
- package/dist/template-vars.js.map +0 -1
- package/dist/updater/bootstrap.d.ts +0 -13
- package/dist/updater/bootstrap.js.map +0 -1
- package/dist/updater/check.d.ts +0 -12
- package/dist/updater/check.js.map +0 -1
- package/dist/updater/shim.d.ts +0 -2
- package/dist/updater/shim.js.map +0 -1
- package/dist/updater/state.d.ts +0 -24
- package/dist/updater/state.js.map +0 -1
- package/dist/upload.d.ts +0 -40
- package/dist/upload.js.map +0 -1
- package/dist/utils.d.ts +0 -39
- package/dist/utils.js.map +0 -1
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { spawnSync, spawn } from 'child_process';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import { dirname, resolve } from 'path';
|
|
4
|
-
import { mkdtempSync } from 'fs';
|
|
5
|
-
import { tmpdir } from 'os';
|
|
6
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
// __dirname is dist/__tests__/helpers - CLI entry is dist/index.js
|
|
8
|
-
export const CLI_ENTRY = resolve(__dirname, '..', '..', 'index.js');
|
|
9
|
-
/**
|
|
10
|
-
* Run the built gipity CLI with a deterministic, isolated environment.
|
|
11
|
-
* Returns combined stdout/stderr text plus exit status.
|
|
12
|
-
*/
|
|
13
|
-
export function runCli(args, opts = {}) {
|
|
14
|
-
const baseEnv = {
|
|
15
|
-
PATH: process.env['PATH'] ?? '',
|
|
16
|
-
HOME: opts.env?.['HOME'] ?? mkdtempSync(`${tmpdir()}/gipity-cli-test-`),
|
|
17
|
-
NO_COLOR: '1',
|
|
18
|
-
CI: '1',
|
|
19
|
-
};
|
|
20
|
-
if (!opts.enableUpdater)
|
|
21
|
-
baseEnv['DISABLE_AUTOUPDATER'] = '1';
|
|
22
|
-
const env = { ...baseEnv, ...opts.env };
|
|
23
|
-
const spawnOpts = {
|
|
24
|
-
encoding: 'utf-8',
|
|
25
|
-
cwd: opts.cwd ?? process.cwd(),
|
|
26
|
-
env,
|
|
27
|
-
timeout: opts.timeout ?? 15000,
|
|
28
|
-
};
|
|
29
|
-
const res = spawnSync(process.execPath, [CLI_ENTRY, ...args], spawnOpts);
|
|
30
|
-
return {
|
|
31
|
-
stdout: res.stdout ?? '',
|
|
32
|
-
stderr: res.stderr ?? '',
|
|
33
|
-
status: res.status ?? -1,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
export function makeTmpHome() {
|
|
37
|
-
return mkdtempSync(`${tmpdir()}/gipity-cli-test-`);
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Async version of runCli - uses `spawn` instead of `spawnSync` so the
|
|
41
|
-
* test's event loop keeps turning while the child runs. Required for any
|
|
42
|
-
* test that spins up an in-process HTTP server for the child to hit
|
|
43
|
-
* (spawnSync deadlocks because the server can't accept connections while
|
|
44
|
-
* the event loop is blocked).
|
|
45
|
-
*/
|
|
46
|
-
export async function runCliAsync(args, opts = {}) {
|
|
47
|
-
const baseEnv = {
|
|
48
|
-
PATH: process.env['PATH'] ?? '',
|
|
49
|
-
HOME: opts.env?.['HOME'] ?? mkdtempSync(`${tmpdir()}/gipity-cli-test-`),
|
|
50
|
-
NO_COLOR: '1',
|
|
51
|
-
CI: '1',
|
|
52
|
-
};
|
|
53
|
-
if (!opts.enableUpdater)
|
|
54
|
-
baseEnv['DISABLE_AUTOUPDATER'] = '1';
|
|
55
|
-
const env = { ...baseEnv, ...opts.env };
|
|
56
|
-
const child = spawn(process.execPath, [CLI_ENTRY, ...args], {
|
|
57
|
-
cwd: opts.cwd ?? process.cwd(),
|
|
58
|
-
env,
|
|
59
|
-
});
|
|
60
|
-
let stdout = '';
|
|
61
|
-
let stderr = '';
|
|
62
|
-
child.stdout.on('data', c => { stdout += c; });
|
|
63
|
-
child.stderr.on('data', c => { stderr += c; });
|
|
64
|
-
const timeoutMs = opts.timeout ?? 15000;
|
|
65
|
-
const timer = setTimeout(() => child.kill('SIGKILL'), timeoutMs);
|
|
66
|
-
const status = await new Promise(resolve => {
|
|
67
|
-
child.on('exit', code => { clearTimeout(timer); resolve(code ?? -1); });
|
|
68
|
-
child.on('error', () => { clearTimeout(timer); resolve(-1); });
|
|
69
|
-
});
|
|
70
|
-
return { stdout, stderr, status };
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=spawn-cli.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-cli.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/spawn-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface AuthedHomeOpts {
|
|
2
|
-
/** Override the email stored in auth.json. Default: ec-test@914-6.com (blocked from real SendGrid). */
|
|
3
|
-
email?: string;
|
|
4
|
-
/** Override the access token. Default: fake-jwt. */
|
|
5
|
-
accessToken?: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Create a temp HOME with a pre-populated `~/.gipity/auth.json` so commands
|
|
9
|
-
* that call `requireAuth()` succeed without going through magic-code flow.
|
|
10
|
-
* Returned path is meant to be passed as `env.HOME` to `runCliAsync`.
|
|
11
|
-
*/
|
|
12
|
-
export declare function makeAuthedHome(opts?: AuthedHomeOpts): string;
|
|
13
|
-
export interface ProjectDirOpts {
|
|
14
|
-
projectGuid?: string;
|
|
15
|
-
projectSlug?: string;
|
|
16
|
-
accountSlug?: string;
|
|
17
|
-
agentGuid?: string | null;
|
|
18
|
-
apiBase?: string;
|
|
19
|
-
}
|
|
20
|
-
/** Create a temp project directory with a `.gipity.json` so commands that
|
|
21
|
-
* rely on `requireConfig()` work. Returned path is meant to be passed as `cwd`. */
|
|
22
|
-
export declare function makeProjectDir(opts?: ProjectDirOpts): string;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync, mkdtempSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { tmpdir } from 'os';
|
|
4
|
-
/**
|
|
5
|
-
* Create a temp HOME with a pre-populated `~/.gipity/auth.json` so commands
|
|
6
|
-
* that call `requireAuth()` succeed without going through magic-code flow.
|
|
7
|
-
* Returned path is meant to be passed as `env.HOME` to `runCliAsync`.
|
|
8
|
-
*/
|
|
9
|
-
export function makeAuthedHome(opts = {}) {
|
|
10
|
-
const home = mkdtempSync(join(tmpdir(), 'gipity-cli-cmd-'));
|
|
11
|
-
mkdirSync(join(home, '.gipity'), { recursive: true });
|
|
12
|
-
writeFileSync(join(home, '.gipity', 'auth.json'), JSON.stringify({
|
|
13
|
-
accessToken: opts.accessToken ?? 'fake-jwt',
|
|
14
|
-
refreshToken: 'fake-refresh',
|
|
15
|
-
email: opts.email ?? 'ec-test@914-6.com',
|
|
16
|
-
expiresAt: new Date(Date.now() + 60 * 60_000).toISOString(),
|
|
17
|
-
}));
|
|
18
|
-
return home;
|
|
19
|
-
}
|
|
20
|
-
/** Create a temp project directory with a `.gipity.json` so commands that
|
|
21
|
-
* rely on `requireConfig()` work. Returned path is meant to be passed as `cwd`. */
|
|
22
|
-
export function makeProjectDir(opts = {}) {
|
|
23
|
-
const dir = mkdtempSync(join(tmpdir(), 'gipity-cli-proj-'));
|
|
24
|
-
writeFileSync(join(dir, '.gipity.json'), JSON.stringify({
|
|
25
|
-
projectGuid: opts.projectGuid ?? 'p_TestProj',
|
|
26
|
-
projectSlug: opts.projectSlug ?? 'test-project',
|
|
27
|
-
accountSlug: opts.accountSlug ?? 'test-account',
|
|
28
|
-
agentGuid: opts.agentGuid ?? 'a_TestAgnt',
|
|
29
|
-
conversationGuid: null,
|
|
30
|
-
apiBase: opts.apiBase ?? 'http://127.0.0.1:0',
|
|
31
|
-
ignore: [],
|
|
32
|
-
}));
|
|
33
|
-
return dir;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=test-home.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-home.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/test-home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAS5B;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE;IACtD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC5D,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;QAC/D,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,UAAU;QAC3C,YAAY,EAAE,cAAc;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,mBAAmB;QACxC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;KAC5D,CAAC,CAAC,CAAC;IACJ,OAAO,IAAI,CAAC;AACd,CAAC;AAUD;oFACoF;AACpF,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE;IACtD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC5D,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;QACtD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,YAAY;QAC7C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,cAAc;QAC/C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,cAAc;QAC/C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,YAAY;QACzC,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,oBAAoB;QAC7C,MAAM,EAAE,EAAE;KACX,CAAC,CAAC,CAAC;IACJ,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `gipity hook-capture <event>` — hidden subcommand wired into Claude Code
|
|
3
|
-
* hooks. Runs in every Claude Code turn (even in directories that aren't
|
|
4
|
-
* Gipity projects) and MUST never disrupt the session: silent no-op when
|
|
5
|
-
* there's no .gipity.json or no auth, exit 0 on bad input.
|
|
6
|
-
*
|
|
7
|
-
* We can't exercise the happy path here (needs a live backend). These
|
|
8
|
-
* smoke tests cover the "must never break Claude Code" contract.
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it } from 'node:test';
|
|
11
|
-
import assert from 'node:assert/strict';
|
|
12
|
-
import { spawnSync } from 'child_process';
|
|
13
|
-
import { mkdtempSync } from 'fs';
|
|
14
|
-
import { tmpdir } from 'os';
|
|
15
|
-
import { CLI_ENTRY } from './helpers/spawn-cli.js';
|
|
16
|
-
function runWithStdin(args, stdin, cwd) {
|
|
17
|
-
const home = mkdtempSync(`${tmpdir()}/gipity-hc-test-`);
|
|
18
|
-
const res = spawnSync(process.execPath, [CLI_ENTRY, ...args], {
|
|
19
|
-
encoding: 'utf-8',
|
|
20
|
-
cwd: cwd ?? home,
|
|
21
|
-
env: {
|
|
22
|
-
PATH: process.env['PATH'] ?? '',
|
|
23
|
-
HOME: home,
|
|
24
|
-
NO_COLOR: '1',
|
|
25
|
-
CI: '1',
|
|
26
|
-
DISABLE_AUTOUPDATER: '1',
|
|
27
|
-
},
|
|
28
|
-
input: stdin,
|
|
29
|
-
timeout: 10_000,
|
|
30
|
-
});
|
|
31
|
-
return { stdout: res.stdout ?? '', stderr: res.stderr ?? '', status: res.status ?? -1 };
|
|
32
|
-
}
|
|
33
|
-
describe('gipity hook-capture: silent-no-op contract', () => {
|
|
34
|
-
const validPayload = JSON.stringify({
|
|
35
|
-
session_id: 'sid_test_12345',
|
|
36
|
-
tool_name: 'Bash',
|
|
37
|
-
tool_input: { command: 'ls' },
|
|
38
|
-
tool_response: { stdout: 'a\nb', exit_code: 0 },
|
|
39
|
-
});
|
|
40
|
-
it('exits 0 silently when no .gipity.json and no auth (hottest path)', () => {
|
|
41
|
-
const r = runWithStdin(['hook-capture', 'tool'], validPayload);
|
|
42
|
-
assert.equal(r.status, 0, `expected exit 0, got ${r.status}. stderr: ${r.stderr}`);
|
|
43
|
-
assert.equal(r.stdout, '', `expected no stdout, got: ${r.stdout}`);
|
|
44
|
-
assert.equal(r.stderr, '', `expected no stderr, got: ${r.stderr}`);
|
|
45
|
-
});
|
|
46
|
-
it('exits 0 silently on malformed JSON stdin', () => {
|
|
47
|
-
const r = runWithStdin(['hook-capture', 'prompt'], 'not json {{{{');
|
|
48
|
-
assert.equal(r.status, 0);
|
|
49
|
-
assert.equal(r.stdout, '');
|
|
50
|
-
assert.equal(r.stderr, '');
|
|
51
|
-
});
|
|
52
|
-
it('exits 0 silently on an unknown event name', () => {
|
|
53
|
-
const r = runWithStdin(['hook-capture', 'totally-made-up'], validPayload);
|
|
54
|
-
assert.equal(r.status, 0);
|
|
55
|
-
assert.equal(r.stdout, '');
|
|
56
|
-
assert.equal(r.stderr, '');
|
|
57
|
-
});
|
|
58
|
-
it('exits 0 silently on empty stdin', () => {
|
|
59
|
-
const r = runWithStdin(['hook-capture', 'stop'], '');
|
|
60
|
-
assert.equal(r.status, 0);
|
|
61
|
-
assert.equal(r.stdout, '');
|
|
62
|
-
assert.equal(r.stderr, '');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=hook-capture.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-capture.test.js","sourceRoot":"","sources":["../../src/__tests__/hook-capture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wrap-format contract for relay-dispatched `gipity claude -p` messages.
|
|
3
|
-
*
|
|
4
|
-
* The user's actual message must sit between the `USER_MSG_OPEN` /
|
|
5
|
-
* `USER_MSG_CLOSE` tags with no trailing instructions, and the client-side
|
|
6
|
-
* `stripPreamble` in `platform/client/src/ts/commands/claude-display.ts`
|
|
7
|
-
* must use identical tag strings - otherwise the web CLI renders the full
|
|
8
|
-
* wrap as a `claude>` turn (the historical bug: duplicate user turns
|
|
9
|
-
* rendered as walls of preamble text).
|
|
10
|
-
*/
|
|
11
|
-
import { describe, it } from 'node:test';
|
|
12
|
-
import assert from 'node:assert/strict';
|
|
13
|
-
import { readFileSync } from 'fs';
|
|
14
|
-
import { fileURLToPath } from 'url';
|
|
15
|
-
import { dirname, resolve } from 'path';
|
|
16
|
-
import { USER_MSG_OPEN, USER_MSG_CLOSE, buildFreshWrap, buildResumeWrap, } from '../prompts.js';
|
|
17
|
-
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
// dist/__tests__/ → repo root depends on build layout. These tests also run
|
|
19
|
-
// against the source tree via tsx in CI - handle both by walking up until we
|
|
20
|
-
// find the platform/ sibling.
|
|
21
|
-
function repoRoot() {
|
|
22
|
-
let p = HERE;
|
|
23
|
-
for (let i = 0; i < 8; i++) {
|
|
24
|
-
try {
|
|
25
|
-
const probe = resolve(p, 'platform/client/src/ts/commands/claude-display.ts');
|
|
26
|
-
readFileSync(probe, 'utf-8');
|
|
27
|
-
return p;
|
|
28
|
-
}
|
|
29
|
-
catch { /* keep walking */ }
|
|
30
|
-
p = resolve(p, '..');
|
|
31
|
-
}
|
|
32
|
-
throw new Error('could not locate repo root from test file');
|
|
33
|
-
}
|
|
34
|
-
describe('buildFreshWrap', () => {
|
|
35
|
-
it('wraps the user message between USER_MSG_OPEN / USER_MSG_CLOSE', () => {
|
|
36
|
-
const out = buildFreshWrap('## Project context\nstuff here', 'hello world');
|
|
37
|
-
assert.ok(out.includes(USER_MSG_OPEN), 'missing open tag');
|
|
38
|
-
assert.ok(out.includes(USER_MSG_CLOSE), 'missing close tag');
|
|
39
|
-
const open = out.indexOf(USER_MSG_OPEN) + USER_MSG_OPEN.length;
|
|
40
|
-
const close = out.lastIndexOf(USER_MSG_CLOSE);
|
|
41
|
-
assert.equal(out.slice(open, close).trim(), 'hello world');
|
|
42
|
-
});
|
|
43
|
-
it('places the response directive before the user message, not after', () => {
|
|
44
|
-
const out = buildFreshWrap('ctx', 'do a thing');
|
|
45
|
-
const directiveIdx = out.indexOf(`Don't greet`);
|
|
46
|
-
const openIdx = out.indexOf(USER_MSG_OPEN);
|
|
47
|
-
assert.ok(directiveIdx !== -1, 'directive should be present');
|
|
48
|
-
assert.ok(directiveIdx < openIdx, 'directive must come before user-message tag');
|
|
49
|
-
});
|
|
50
|
-
it('has nothing after the closing tag', () => {
|
|
51
|
-
const out = buildFreshWrap('ctx', 'msg');
|
|
52
|
-
assert.ok(out.trimEnd().endsWith(USER_MSG_CLOSE), `wrap should end with close tag, got tail: ${out.slice(-120)}`);
|
|
53
|
-
});
|
|
54
|
-
it('does not emit the legacy "Answer directly" trailer', () => {
|
|
55
|
-
const out = buildFreshWrap('ctx', 'msg');
|
|
56
|
-
assert.equal(out.includes('Answer directly'), false, 'legacy trailer leaked into new wrap');
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
describe('buildResumeWrap', () => {
|
|
60
|
-
const opts = {
|
|
61
|
-
projectName: 'proj',
|
|
62
|
-
projectSlug: 'proj',
|
|
63
|
-
projectGuid: 'p_abc',
|
|
64
|
-
accountSlug: 'acct',
|
|
65
|
-
cwd: '/tmp',
|
|
66
|
-
};
|
|
67
|
-
it('wraps the user message between tags', () => {
|
|
68
|
-
const out = buildResumeWrap(opts, 'whats 2+2');
|
|
69
|
-
const open = out.indexOf(USER_MSG_OPEN) + USER_MSG_OPEN.length;
|
|
70
|
-
const close = out.lastIndexOf(USER_MSG_CLOSE);
|
|
71
|
-
assert.ok(open > USER_MSG_OPEN.length - 1, 'open tag missing');
|
|
72
|
-
assert.ok(close > open, 'close tag missing or before open');
|
|
73
|
-
assert.equal(out.slice(open, close).trim(), 'whats 2+2');
|
|
74
|
-
});
|
|
75
|
-
it('has nothing after the closing tag', () => {
|
|
76
|
-
const out = buildResumeWrap(opts, 'x');
|
|
77
|
-
assert.ok(out.trimEnd().endsWith(USER_MSG_CLOSE));
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe('tag constant drift guard', () => {
|
|
81
|
-
it('client-side claude-display.ts uses identical tag strings', () => {
|
|
82
|
-
const root = repoRoot();
|
|
83
|
-
const clientSrc = readFileSync(resolve(root, 'platform/client/src/ts/commands/claude-display.ts'), 'utf-8');
|
|
84
|
-
const openMatch = clientSrc.match(/USER_MSG_OPEN\s*=\s*'([^']+)'/);
|
|
85
|
-
const closeMatch = clientSrc.match(/USER_MSG_CLOSE\s*=\s*'([^']+)'/);
|
|
86
|
-
assert.ok(openMatch, 'claude-display.ts must define USER_MSG_OPEN as a single-quoted string literal');
|
|
87
|
-
assert.ok(closeMatch, 'claude-display.ts must define USER_MSG_CLOSE as a single-quoted string literal');
|
|
88
|
-
assert.equal(openMatch[1], USER_MSG_OPEN, 'open tag drift');
|
|
89
|
-
assert.equal(closeMatch[1], USER_MSG_CLOSE, 'close tag drift');
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
// Local replica of the client-side stripPreamble. The client file can't be
|
|
93
|
-
// imported directly (different package, no DOM shim in node:test), so this
|
|
94
|
-
// replica + the drift-guard above (identical tag strings) gives equivalent
|
|
95
|
-
// coverage. If the algorithm shape changes in claude-display.ts, update
|
|
96
|
-
// both here and there.
|
|
97
|
-
function stripPreambleReplica(s) {
|
|
98
|
-
if (!s)
|
|
99
|
-
return s;
|
|
100
|
-
const m1 = s.match(/The user's first message:\s*"([\s\S]+?)"(?:\s*\n|\s*$)/);
|
|
101
|
-
if (m1)
|
|
102
|
-
return m1[1];
|
|
103
|
-
const open = s.indexOf(USER_MSG_OPEN);
|
|
104
|
-
const close = s.lastIndexOf(USER_MSG_CLOSE);
|
|
105
|
-
if (open !== -1 && close !== -1 && close > open) {
|
|
106
|
-
return s.slice(open + USER_MSG_OPEN.length, close).trim();
|
|
107
|
-
}
|
|
108
|
-
return s;
|
|
109
|
-
}
|
|
110
|
-
describe('stripPreamble round-trip', () => {
|
|
111
|
-
it('recovers the exact user message from buildFreshWrap output', () => {
|
|
112
|
-
const msg = 'hello world - whats 2+2 and also a newline\nplease';
|
|
113
|
-
const out = buildFreshWrap('## ctx\n- Name: foo\n- Files: empty', msg);
|
|
114
|
-
assert.equal(stripPreambleReplica(out), msg);
|
|
115
|
-
});
|
|
116
|
-
it('recovers the exact user message from buildResumeWrap output', () => {
|
|
117
|
-
const msg = 'resume test message';
|
|
118
|
-
const out = buildResumeWrap({ projectName: 'p', projectSlug: 'p', projectGuid: 'p_abc', accountSlug: 'a', cwd: '/' }, msg);
|
|
119
|
-
assert.equal(stripPreambleReplica(out), msg);
|
|
120
|
-
});
|
|
121
|
-
it('still handles the legacy first-message bootstrap form', () => {
|
|
122
|
-
const s = `Some context\n\nThe user's first message: "build a pacman game"\n\nGet started.`;
|
|
123
|
-
assert.equal(stripPreambleReplica(s), 'build a pacman game');
|
|
124
|
-
});
|
|
125
|
-
it('returns the input unchanged when no tags are present', () => {
|
|
126
|
-
assert.equal(stripPreambleReplica('plain message'), 'plain message');
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
//# sourceMappingURL=prompts.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../src/__tests__/prompts.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `gipity push` (pushFile) CAS behavior: when the local baseline is stale,
|
|
3
|
-
* the server returns 409 and we surface a clear error that tells the user
|
|
4
|
-
* to run `gipity sync`.
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, before, after } from 'node:test';
|
|
7
|
-
import assert from 'node:assert/strict';
|
|
8
|
-
import { writeFileSync, mkdirSync, mkdtempSync, rmSync } from 'fs';
|
|
9
|
-
import { join } from 'path';
|
|
10
|
-
import { tmpdir } from 'os';
|
|
11
|
-
// Set HOME BEFORE importing the CLI so ~/.gipity/auth.json resolves to our tempdir.
|
|
12
|
-
let home;
|
|
13
|
-
let projectDir;
|
|
14
|
-
let origHome;
|
|
15
|
-
let origCwd;
|
|
16
|
-
let origFetch;
|
|
17
|
-
before(() => {
|
|
18
|
-
origHome = process.env.HOME;
|
|
19
|
-
origCwd = process.cwd();
|
|
20
|
-
origFetch = globalThis.fetch;
|
|
21
|
-
home = mkdtempSync(join(tmpdir(), 'gipity-pushcas-home-'));
|
|
22
|
-
process.env.HOME = home;
|
|
23
|
-
mkdirSync(join(home, '.gipity'), { recursive: true });
|
|
24
|
-
writeFileSync(join(home, '.gipity', 'auth.json'), JSON.stringify({
|
|
25
|
-
accessToken: 'fake-jwt',
|
|
26
|
-
refreshToken: 'fake-refresh',
|
|
27
|
-
email: 'ec-test@914-6.com',
|
|
28
|
-
expiresAt: new Date(Date.now() + 10 * 60_000).toISOString(),
|
|
29
|
-
}));
|
|
30
|
-
projectDir = mkdtempSync(join(tmpdir(), 'gipity-pushcas-proj-'));
|
|
31
|
-
writeFileSync(join(projectDir, '.gipity.json'), JSON.stringify({
|
|
32
|
-
projectGuid: 'proj_test',
|
|
33
|
-
projectSlug: 'p',
|
|
34
|
-
accountSlug: 'a',
|
|
35
|
-
agentGuid: 'agt_t',
|
|
36
|
-
conversationGuid: null,
|
|
37
|
-
apiBase: 'https://test.invalid',
|
|
38
|
-
ignore: [],
|
|
39
|
-
}));
|
|
40
|
-
mkdirSync(join(projectDir, '.gipity'), { recursive: true });
|
|
41
|
-
process.chdir(projectDir);
|
|
42
|
-
});
|
|
43
|
-
after(() => {
|
|
44
|
-
process.chdir(origCwd);
|
|
45
|
-
globalThis.fetch = origFetch;
|
|
46
|
-
if (origHome === undefined)
|
|
47
|
-
delete process.env.HOME;
|
|
48
|
-
else
|
|
49
|
-
process.env.HOME = origHome;
|
|
50
|
-
rmSync(home, { recursive: true, force: true });
|
|
51
|
-
rmSync(projectDir, { recursive: true, force: true });
|
|
52
|
-
});
|
|
53
|
-
function stubFetch(handler) {
|
|
54
|
-
globalThis.fetch = handler;
|
|
55
|
-
}
|
|
56
|
-
describe('pushFile CAS', () => {
|
|
57
|
-
it('surfaces a clear error when the remote has a newer version', async () => {
|
|
58
|
-
// Baseline says we last synced at serverVersion=5.
|
|
59
|
-
writeFileSync(join(projectDir, '.gipity', 'sync-state.json'), JSON.stringify({
|
|
60
|
-
projectGuid: 'proj_test',
|
|
61
|
-
files: {
|
|
62
|
-
'hello.txt': {
|
|
63
|
-
size: 5, mtime: '2024-01-01T00:00:00.000Z',
|
|
64
|
-
sha256: 'fakesha-old',
|
|
65
|
-
serverVersion: 5,
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
lastFullSync: '2024-01-01T00:00:00.000Z',
|
|
69
|
-
}));
|
|
70
|
-
writeFileSync(join(projectDir, 'hello.txt'), 'world');
|
|
71
|
-
// Server returns 409: it's at version 7 now, client expected 5.
|
|
72
|
-
stubFetch(async (url) => {
|
|
73
|
-
if (url.includes('/files/upload-init')) {
|
|
74
|
-
return new Response(JSON.stringify({
|
|
75
|
-
error: { code: 'CONFLICT', message: 'Version mismatch' },
|
|
76
|
-
data: { current_server_version: 7 },
|
|
77
|
-
}), { status: 409, headers: { 'content-type': 'application/json' } });
|
|
78
|
-
}
|
|
79
|
-
throw new Error(`unexpected fetch to ${url}`);
|
|
80
|
-
});
|
|
81
|
-
// Force-evict the module cache so our stubbed fetch is picked up cleanly.
|
|
82
|
-
const { clearConfigCache } = await import('../config.js');
|
|
83
|
-
clearConfigCache();
|
|
84
|
-
const { pushFile } = await import('../sync.js');
|
|
85
|
-
await assert.rejects(() => pushFile(join(projectDir, 'hello.txt')), /newer version.*serverVersion=7.*gipity sync/is);
|
|
86
|
-
});
|
|
87
|
-
it('succeeds when baseline matches - pushFile updates serverVersion in baseline', async () => {
|
|
88
|
-
writeFileSync(join(projectDir, '.gipity', 'sync-state.json'), JSON.stringify({
|
|
89
|
-
projectGuid: 'proj_test',
|
|
90
|
-
files: {
|
|
91
|
-
'greet.txt': {
|
|
92
|
-
size: 5, mtime: '2024-01-01T00:00:00.000Z',
|
|
93
|
-
sha256: 'fakesha-old',
|
|
94
|
-
serverVersion: 3,
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
lastFullSync: '2024-01-01T00:00:00.000Z',
|
|
98
|
-
}));
|
|
99
|
-
writeFileSync(join(projectDir, 'greet.txt'), 'hi-v4');
|
|
100
|
-
// Server: upload-init → presigned URL. PUT to presigned URL → etag.
|
|
101
|
-
// upload-complete → 200 with server_version=4.
|
|
102
|
-
stubFetch(async (url, init) => {
|
|
103
|
-
if (url.includes('/files/upload-init')) {
|
|
104
|
-
return new Response(JSON.stringify({
|
|
105
|
-
data: {
|
|
106
|
-
upload_guid: 'fl_abc',
|
|
107
|
-
method: 'PUT',
|
|
108
|
-
url: 'https://s3.example/stage',
|
|
109
|
-
expires_in: 3600,
|
|
110
|
-
},
|
|
111
|
-
}), { status: 200, headers: { 'content-type': 'application/json' } });
|
|
112
|
-
}
|
|
113
|
-
if (url.startsWith('https://s3.example')) {
|
|
114
|
-
// Presigned PUT - return an etag.
|
|
115
|
-
return new Response('', { status: 200, headers: { etag: '"fake-etag"' } });
|
|
116
|
-
}
|
|
117
|
-
if (url.includes('/files/upload-complete')) {
|
|
118
|
-
return new Response(JSON.stringify({
|
|
119
|
-
data: { size: 5, guid: 'fl_new', version: 1, server_version: 4 },
|
|
120
|
-
}), { status: 200, headers: { 'content-type': 'application/json' } });
|
|
121
|
-
}
|
|
122
|
-
throw new Error(`unexpected fetch to ${url}`);
|
|
123
|
-
});
|
|
124
|
-
const { clearConfigCache } = await import('../config.js');
|
|
125
|
-
clearConfigCache();
|
|
126
|
-
const { pushFile, readBaseline } = await import('../sync.js');
|
|
127
|
-
await pushFile(join(projectDir, 'greet.txt'));
|
|
128
|
-
const bl = readBaseline('proj_test');
|
|
129
|
-
assert.ok(bl.files['greet.txt'], 'greet.txt should be in baseline');
|
|
130
|
-
assert.equal(bl.files['greet.txt'].serverVersion, 4, 'baseline should reflect bumped server version');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
//# sourceMappingURL=push-cas.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"push-cas.test.js","sourceRoot":"","sources":["../../src/__tests__/push-cas.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { bridgeAbort } from '../relay/daemon.js';
|
|
4
|
-
function listenerCount(signal) {
|
|
5
|
-
const anyOf = signal;
|
|
6
|
-
// Node's EventTarget uses an internal symbol; fall back to dispatching a
|
|
7
|
-
// probe event and counting via a public API if internals aren't exposed.
|
|
8
|
-
// Simpler: rely on MaxListenersExceededWarning being gated at 10. Instead
|
|
9
|
-
// assert behaviourally: after N add/detach cycles the outer signal still
|
|
10
|
-
// reports zero active listeners by firing abort and asserting only the
|
|
11
|
-
// most recent bridge ran.
|
|
12
|
-
void anyOf;
|
|
13
|
-
return -1;
|
|
14
|
-
}
|
|
15
|
-
describe('bridgeAbort', () => {
|
|
16
|
-
it('forwards outer abort to inner controller', () => {
|
|
17
|
-
const outer = new AbortController();
|
|
18
|
-
const inner = new AbortController();
|
|
19
|
-
bridgeAbort(outer.signal, inner);
|
|
20
|
-
outer.abort('shutdown');
|
|
21
|
-
assert.equal(inner.signal.aborted, true);
|
|
22
|
-
assert.equal(inner.signal.reason, 'shutdown');
|
|
23
|
-
});
|
|
24
|
-
it('aborts immediately when outer is already aborted', () => {
|
|
25
|
-
const outer = new AbortController();
|
|
26
|
-
outer.abort('pre');
|
|
27
|
-
const inner = new AbortController();
|
|
28
|
-
bridgeAbort(outer.signal, inner);
|
|
29
|
-
assert.equal(inner.signal.aborted, true);
|
|
30
|
-
assert.equal(inner.signal.reason, 'pre');
|
|
31
|
-
});
|
|
32
|
-
it('detaches cleanly - does not leak listeners across many calls', () => {
|
|
33
|
-
const outer = new AbortController();
|
|
34
|
-
// Sanity: listenerCount via public API isn't part of EventTarget, so we
|
|
35
|
-
// verify no leak by running many cycles and confirming the process does
|
|
36
|
-
// not emit MaxListenersExceededWarning and that only inners whose detach
|
|
37
|
-
// was NOT called receive the abort.
|
|
38
|
-
const warnings = [];
|
|
39
|
-
const onWarn = (w) => { warnings.push(w.name + ':' + w.message); };
|
|
40
|
-
process.on('warning', onWarn);
|
|
41
|
-
try {
|
|
42
|
-
for (let i = 0; i < 100; i++) {
|
|
43
|
-
const inner = new AbortController();
|
|
44
|
-
const detach = bridgeAbort(outer.signal, inner);
|
|
45
|
-
detach();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
finally {
|
|
49
|
-
process.off('warning', onWarn);
|
|
50
|
-
}
|
|
51
|
-
const leakWarn = warnings.find(w => w.includes('MaxListenersExceeded'));
|
|
52
|
-
assert.equal(leakWarn, undefined, `leaked listeners: ${leakWarn}`);
|
|
53
|
-
// After all detaches, firing outer.abort must not affect any prior
|
|
54
|
-
// inners (they're out of scope / already detached). Create one more
|
|
55
|
-
// inner WITHOUT detaching and confirm it receives the abort - proves
|
|
56
|
-
// the bridge still works after many attach/detach cycles.
|
|
57
|
-
const liveInner = new AbortController();
|
|
58
|
-
bridgeAbort(outer.signal, liveInner);
|
|
59
|
-
outer.abort('final');
|
|
60
|
-
assert.equal(liveInner.signal.aborted, true);
|
|
61
|
-
assert.equal(liveInner.signal.reason, 'final');
|
|
62
|
-
void listenerCount;
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=relay-bridge-abort.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-bridge-abort.test.js","sourceRoot":"","sources":["../../src/__tests__/relay-bridge-abort.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|