gsd-pi 2.10.12 → 2.12.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/dist/bundled-extension-paths.d.ts +2 -0
- package/dist/bundled-extension-paths.js +10 -0
- package/dist/loader.js +45 -28
- package/dist/onboarding.js +100 -0
- package/dist/resource-loader.js +12 -3
- package/dist/resources/GSD-WORKFLOW.md +661 -0
- package/dist/resources/agents/researcher.md +29 -0
- package/dist/resources/agents/scout.md +56 -0
- package/dist/resources/agents/worker.md +31 -0
- package/dist/resources/extensions/ask-user-questions.ts +289 -0
- package/dist/resources/extensions/async-jobs/async-bash-tool.ts +211 -0
- package/dist/resources/extensions/async-jobs/await-tool.ts +101 -0
- package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +34 -0
- package/dist/resources/extensions/async-jobs/index.ts +133 -0
- package/dist/resources/extensions/async-jobs/job-manager.ts +211 -0
- package/dist/resources/extensions/bg-shell/index.ts +3179 -0
- package/dist/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
- package/dist/resources/extensions/browser-tools/capture.ts +165 -0
- package/dist/resources/extensions/browser-tools/core.d.ts +205 -0
- package/dist/resources/extensions/browser-tools/core.js +1057 -0
- package/dist/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
- package/dist/resources/extensions/browser-tools/index.ts +51 -0
- package/dist/resources/extensions/browser-tools/lifecycle.ts +270 -0
- package/dist/resources/extensions/browser-tools/package.json +24 -0
- package/dist/resources/extensions/browser-tools/refs.ts +264 -0
- package/dist/resources/extensions/browser-tools/settle.ts +197 -0
- package/dist/resources/extensions/browser-tools/state.ts +408 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +652 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +614 -0
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +342 -0
- package/dist/resources/extensions/browser-tools/tools/forms.ts +801 -0
- package/dist/resources/extensions/browser-tools/tools/inspection.ts +492 -0
- package/dist/resources/extensions/browser-tools/tools/intent.ts +614 -0
- package/dist/resources/extensions/browser-tools/tools/interaction.ts +865 -0
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +232 -0
- package/dist/resources/extensions/browser-tools/tools/pages.ts +303 -0
- package/dist/resources/extensions/browser-tools/tools/refs.ts +541 -0
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +83 -0
- package/dist/resources/extensions/browser-tools/tools/session.ts +400 -0
- package/dist/resources/extensions/browser-tools/tools/wait.ts +247 -0
- package/dist/resources/extensions/browser-tools/utils.ts +660 -0
- package/dist/resources/extensions/context7/index.ts +428 -0
- package/dist/resources/extensions/context7/package.json +11 -0
- package/dist/resources/extensions/get-secrets-from-user.ts +625 -0
- package/dist/resources/extensions/google-search/index.ts +336 -0
- package/dist/resources/extensions/google-search/package.json +9 -0
- package/dist/resources/extensions/gsd/activity-log.ts +116 -0
- package/dist/resources/extensions/gsd/auto.ts +3732 -0
- package/dist/resources/extensions/gsd/commands.ts +544 -0
- package/dist/resources/extensions/gsd/crash-recovery.ts +105 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +564 -0
- package/dist/resources/extensions/gsd/dispatch-guard.ts +78 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +278 -0
- package/dist/resources/extensions/gsd/doctor.ts +766 -0
- package/dist/resources/extensions/gsd/exit-command.ts +18 -0
- package/dist/resources/extensions/gsd/files.ts +857 -0
- package/dist/resources/extensions/gsd/git-service.ts +904 -0
- package/dist/resources/extensions/gsd/gitignore.ts +200 -0
- package/dist/resources/extensions/gsd/guided-flow.ts +1054 -0
- package/dist/resources/extensions/gsd/index.ts +735 -0
- package/dist/resources/extensions/gsd/metrics.ts +374 -0
- package/dist/resources/extensions/gsd/migrate/command.ts +218 -0
- package/dist/resources/extensions/gsd/migrate/index.ts +42 -0
- package/dist/resources/extensions/gsd/migrate/parser.ts +323 -0
- package/dist/resources/extensions/gsd/migrate/parsers.ts +624 -0
- package/dist/resources/extensions/gsd/migrate/preview.ts +48 -0
- package/dist/resources/extensions/gsd/migrate/transformer.ts +346 -0
- package/dist/resources/extensions/gsd/migrate/types.ts +370 -0
- package/dist/resources/extensions/gsd/migrate/validator.ts +55 -0
- package/dist/resources/extensions/gsd/migrate/writer.ts +539 -0
- package/dist/resources/extensions/gsd/native-git-bridge.ts +181 -0
- package/dist/resources/extensions/gsd/native-parser-bridge.ts +135 -0
- package/dist/resources/extensions/gsd/observability-validator.ts +408 -0
- package/dist/resources/extensions/gsd/package.json +11 -0
- package/dist/resources/extensions/gsd/paths.ts +339 -0
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +449 -0
- package/dist/resources/extensions/gsd/preferences.ts +988 -0
- package/dist/resources/extensions/gsd/prompt-loader.ts +92 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +27 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +237 -0
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +63 -0
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +61 -0
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +3 -0
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +29 -0
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -0
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +13 -0
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +78 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +55 -0
- package/dist/resources/extensions/gsd/prompts/queue.md +100 -0
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
- package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
- package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
- package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
- package/dist/resources/extensions/gsd/prompts/system.md +190 -0
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
- package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
- package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
- package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
- package/dist/resources/extensions/gsd/state.ts +569 -0
- package/dist/resources/extensions/gsd/templates/context.md +76 -0
- package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
- package/dist/resources/extensions/gsd/templates/plan.md +131 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
- package/dist/resources/extensions/gsd/templates/project.md +31 -0
- package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
- package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
- package/dist/resources/extensions/gsd/templates/research.md +46 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
- package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
- package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
- package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
- package/dist/resources/extensions/gsd/templates/state.md +19 -0
- package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
- package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
- package/dist/resources/extensions/gsd/templates/uat.md +54 -0
- package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
- package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
- package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
- package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
- package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
- package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
- package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
- package/dist/resources/extensions/gsd/tests/doctor.test.ts +594 -0
- package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
- package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
- package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
- package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
- package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
- package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
- package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
- package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
- package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
- package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
- package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
- package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
- package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
- package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
- package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
- package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
- package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
- package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
- package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
- package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
- package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +281 -0
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
- package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
- package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
- package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
- package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
- package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
- package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
- package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
- package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
- package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
- package/dist/resources/extensions/gsd/types.ts +296 -0
- package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
- package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
- package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
- package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
- package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
- package/dist/resources/extensions/mac-tools/index.ts +852 -0
- package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
- package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
- package/dist/resources/extensions/mcporter/index.ts +429 -0
- package/dist/resources/extensions/remote-questions/config.ts +81 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
- package/dist/resources/extensions/remote-questions/format.ts +163 -0
- package/dist/resources/extensions/remote-questions/manager.ts +192 -0
- package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
- package/dist/resources/extensions/remote-questions/status.ts +31 -0
- package/dist/resources/extensions/remote-questions/store.ts +77 -0
- package/dist/resources/extensions/remote-questions/types.ts +75 -0
- package/dist/resources/extensions/search-the-web/cache.ts +78 -0
- package/dist/resources/extensions/search-the-web/command-search-provider.ts +99 -0
- package/dist/resources/extensions/search-the-web/format.ts +258 -0
- package/dist/resources/extensions/search-the-web/http.ts +238 -0
- package/dist/resources/extensions/search-the-web/index.ts +65 -0
- package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
- package/dist/resources/extensions/search-the-web/provider.ts +136 -0
- package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
- package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +581 -0
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +620 -0
- package/dist/resources/extensions/search-the-web/tool-search.ts +635 -0
- package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
- package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
- package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
- package/dist/resources/extensions/shared/interview-ui.ts +613 -0
- package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
- package/dist/resources/extensions/shared/progress-widget.ts +282 -0
- package/dist/resources/extensions/shared/terminal.ts +23 -0
- package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
- package/dist/resources/extensions/shared/ui.ts +400 -0
- package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
- package/dist/resources/extensions/slash-commands/audit.ts +88 -0
- package/dist/resources/extensions/slash-commands/clear.ts +10 -0
- package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
- package/dist/resources/extensions/slash-commands/index.ts +12 -0
- package/dist/resources/extensions/subagent/agents.ts +126 -0
- package/dist/resources/extensions/subagent/index.ts +1072 -0
- package/dist/resources/extensions/subagent/isolation.ts +498 -0
- package/dist/resources/extensions/ttsr/index.ts +163 -0
- package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
- package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
- package/dist/resources/extensions/universal-config/discovery.ts +78 -0
- package/dist/resources/extensions/universal-config/format.ts +160 -0
- package/dist/resources/extensions/universal-config/index.ts +118 -0
- package/dist/resources/extensions/universal-config/package.json +11 -0
- package/dist/resources/extensions/universal-config/scanners.ts +579 -0
- package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
- package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
- package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
- package/dist/resources/extensions/universal-config/tools.ts +60 -0
- package/dist/resources/extensions/universal-config/types.ts +116 -0
- package/dist/resources/extensions/voice/index.ts +271 -0
- package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
- package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
- package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
- package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
- package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
- package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
- package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
- package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
- package/dist/resources/skills/frontend-design/SKILL.md +45 -0
- package/dist/resources/skills/github-workflows/SKILL.md +92 -0
- package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
- package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
- package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
- package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
- package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
- package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
- package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
- package/dist/resources/skills/swiftui/SKILL.md +208 -0
- package/dist/resources/skills/swiftui/references/animations.md +921 -0
- package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
- package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
- package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
- package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
- package/dist/resources/skills/swiftui/references/performance.md +1706 -0
- package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
- package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
- package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
- package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
- package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
- package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
- package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
- package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
- package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
- package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
- package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
- package/dist/wizard.js +1 -0
- package/package.json +8 -6
- package/packages/native/dist/fd/index.d.ts +1 -0
- package/packages/native/dist/fd/index.js +1 -0
- package/packages/native/dist/grep/index.d.ts +2 -1
- package/packages/native/dist/grep/index.js +1 -0
- package/packages/native/src/__tests__/fd.test.mjs +35 -0
- package/packages/native/src/__tests__/grep.test.mjs +26 -9
- package/packages/native/src/fd/index.ts +1 -0
- package/packages/native/src/grep/index.ts +3 -2
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +169 -55
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +13 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +16 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +91 -1
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +273 -63
- package/packages/pi-agent-core/src/agent.ts +24 -0
- package/packages/pi-agent-core/src/types.ts +98 -0
- package/packages/pi-ai/dist/env-api-keys.js +2 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +314 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +236 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +2 -0
- package/packages/pi-ai/src/models.generated.ts +236 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
- package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
- package/packages/pi-ai/src/types.ts +2 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +1 -0
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +26 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +137 -22
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +1 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +167 -22
- package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
- package/packages/pi-coding-agent/src/core/index.ts +1 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
- package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
- package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
- package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +3 -4
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +7 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +57 -50
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/src/autocomplete.ts +3 -5
- package/packages/pi-tui/src/components/editor.ts +70 -49
- package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
- package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/pkg/dist/core/export-html/index.d.ts +37 -0
- package/pkg/dist/core/export-html/index.d.ts.map +1 -0
- package/pkg/dist/core/export-html/index.js +223 -0
- package/pkg/dist/core/export-html/index.js.map +1 -0
- package/pkg/dist/core/export-html/template.css +971 -0
- package/pkg/dist/core/export-html/template.html +54 -0
- package/pkg/dist/core/export-html/template.js +1583 -0
- package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
- package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/pkg/dist/core/export-html/tool-renderer.js +70 -0
- package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
- package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
- package/scripts/postinstall.js +30 -17
- package/src/resources/extensions/bg-shell/index.ts +51 -7
- package/src/resources/extensions/gsd/activity-log.ts +61 -14
- package/src/resources/extensions/gsd/auto.ts +288 -19
- package/src/resources/extensions/gsd/commands.ts +9 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
- package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
- package/src/resources/extensions/gsd/doctor.ts +60 -3
- package/src/resources/extensions/gsd/files.ts +45 -1
- package/src/resources/extensions/gsd/git-service.ts +46 -41
- package/src/resources/extensions/gsd/guided-flow.ts +81 -9
- package/src/resources/extensions/gsd/index.ts +62 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
- package/src/resources/extensions/gsd/paths.ts +35 -4
- package/src/resources/extensions/gsd/post-unit-hooks.ts +449 -0
- package/src/resources/extensions/gsd/preferences.ts +232 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +45 -3
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +10 -8
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +9 -12
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -3
- package/src/resources/extensions/gsd/prompts/queue.md +3 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/state.ts +130 -18
- package/src/resources/extensions/gsd/templates/context.md +1 -1
- package/src/resources/extensions/gsd/templates/state.md +3 -3
- package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/doctor.test.ts +115 -1
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
- package/src/resources/extensions/gsd/types.ts +109 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
- package/src/resources/extensions/gsd/worktree.ts +5 -4
- package/src/resources/extensions/search-the-web/command-search-provider.ts +8 -4
- package/src/resources/extensions/search-the-web/native-search.ts +32 -23
- package/src/resources/extensions/search-the-web/provider.ts +19 -2
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +62 -0
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +62 -3
- package/src/resources/extensions/search-the-web/tool-search.ts +62 -3
- package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
- package/src/resources/extensions/subagent/index.ts +2 -1
- package/src/resources/skills/github-workflows/SKILL.md +5 -0
- package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
- package/dist/resources/extensions/gsd/git-service.js +0 -756
- package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
- package/dist/resources/extensions/gsd/preferences.js +0 -616
- package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
- package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
- package/dist/resources/extensions/remote-questions/config.js +0 -68
- package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
- package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
- package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
- package/dist/resources/extensions/remote-questions/format.js +0 -119
- package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
- package/dist/resources/extensions/remote-questions/manager.js +0 -161
- package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
- package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
- package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
- package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
- package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
- package/dist/resources/extensions/remote-questions/status.js +0 -25
- package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
- package/dist/resources/extensions/remote-questions/store.js +0 -66
- package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
- package/dist/resources/extensions/remote-questions/types.js +0 -4
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
<required_reading>
|
|
2
|
+
**Read these reference files NOW before starting:**
|
|
3
|
+
1. `../macos-apps/references/cli-workflow.md` - Test commands from CLI
|
|
4
|
+
2. `../macos-apps/references/testing-tdd.md` - TDD patterns, avoiding @main hangs
|
|
5
|
+
3. `references/testing-debugging.md` - SwiftUI-specific testing and debugging
|
|
6
|
+
</required_reading>
|
|
7
|
+
|
|
8
|
+
<process>
|
|
9
|
+
## Step 1: Identify Testing Scope
|
|
10
|
+
|
|
11
|
+
**Test business logic in view models, not views:**
|
|
12
|
+
```swift
|
|
13
|
+
// Testable view model
|
|
14
|
+
@Observable
|
|
15
|
+
final class LoginViewModel {
|
|
16
|
+
var email = ""
|
|
17
|
+
var password = ""
|
|
18
|
+
var isLoading = false
|
|
19
|
+
|
|
20
|
+
var isValidInput: Bool {
|
|
21
|
+
!email.isEmpty && password.count >= 8
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// View is just presentation
|
|
26
|
+
struct LoginView: View {
|
|
27
|
+
let viewModel: LoginViewModel
|
|
28
|
+
var body: some View {
|
|
29
|
+
Form {
|
|
30
|
+
TextField("Email", text: $viewModel.email)
|
|
31
|
+
Button("Login") { }
|
|
32
|
+
.disabled(!viewModel.isValidInput)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Step 2: Write Unit Tests
|
|
39
|
+
|
|
40
|
+
**Using Swift Testing (@Test):**
|
|
41
|
+
```swift
|
|
42
|
+
import Testing
|
|
43
|
+
@testable import MyApp
|
|
44
|
+
|
|
45
|
+
@Test("Email validation")
|
|
46
|
+
func emailValidation() {
|
|
47
|
+
let viewModel = LoginViewModel()
|
|
48
|
+
|
|
49
|
+
viewModel.email = ""
|
|
50
|
+
viewModel.password = "password123"
|
|
51
|
+
#expect(!viewModel.isValidInput)
|
|
52
|
+
|
|
53
|
+
viewModel.email = "user@example.com"
|
|
54
|
+
#expect(viewModel.isValidInput)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@Test("Async loading")
|
|
58
|
+
func asyncLoading() async {
|
|
59
|
+
let mockService = MockService()
|
|
60
|
+
let viewModel = TaskViewModel(service: mockService)
|
|
61
|
+
|
|
62
|
+
await viewModel.load()
|
|
63
|
+
|
|
64
|
+
#expect(!viewModel.tasks.isEmpty)
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Step 3: Add Accessibility Identifiers
|
|
69
|
+
|
|
70
|
+
```swift
|
|
71
|
+
TextField("Email", text: $email)
|
|
72
|
+
.accessibilityIdentifier("emailField")
|
|
73
|
+
|
|
74
|
+
SecureField("Password", text: $password)
|
|
75
|
+
.accessibilityIdentifier("passwordField")
|
|
76
|
+
|
|
77
|
+
Button("Login") { }
|
|
78
|
+
.accessibilityIdentifier("loginButton")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Step 4: Write UI Tests
|
|
82
|
+
|
|
83
|
+
```swift
|
|
84
|
+
import XCTest
|
|
85
|
+
|
|
86
|
+
final class LoginUITests: XCTestCase {
|
|
87
|
+
var app: XCUIApplication!
|
|
88
|
+
|
|
89
|
+
override func setUp() {
|
|
90
|
+
continueAfterFailure = false
|
|
91
|
+
app = XCUIApplication()
|
|
92
|
+
app.launch()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func testLoginFlow() {
|
|
96
|
+
let emailField = app.textFields["emailField"]
|
|
97
|
+
let passwordField = app.secureTextFields["passwordField"]
|
|
98
|
+
let loginButton = app.buttons["loginButton"]
|
|
99
|
+
|
|
100
|
+
XCTAssertTrue(emailField.waitForExistence(timeout: 5))
|
|
101
|
+
|
|
102
|
+
emailField.tap()
|
|
103
|
+
emailField.typeText("user@example.com")
|
|
104
|
+
|
|
105
|
+
passwordField.tap()
|
|
106
|
+
passwordField.typeText("password123")
|
|
107
|
+
|
|
108
|
+
XCTAssertTrue(loginButton.isEnabled)
|
|
109
|
+
loginButton.tap()
|
|
110
|
+
|
|
111
|
+
let welcomeText = app.staticTexts["welcomeMessage"]
|
|
112
|
+
XCTAssertTrue(welcomeText.waitForExistence(timeout: 5))
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Step 5: Create Previews for Visual Testing
|
|
118
|
+
|
|
119
|
+
```swift
|
|
120
|
+
#Preview("Empty") { LoginView(viewModel: LoginViewModel()) }
|
|
121
|
+
|
|
122
|
+
#Preview("Filled") {
|
|
123
|
+
let viewModel = LoginViewModel()
|
|
124
|
+
viewModel.email = "user@example.com"
|
|
125
|
+
viewModel.password = "password123"
|
|
126
|
+
return LoginView(viewModel: viewModel)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#Preview("Error") {
|
|
130
|
+
let viewModel = LoginViewModel()
|
|
131
|
+
viewModel.errorMessage = "Invalid credentials"
|
|
132
|
+
return LoginView(viewModel: viewModel)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
#Preview("Dark Mode") {
|
|
136
|
+
LoginView(viewModel: LoginViewModel())
|
|
137
|
+
.preferredColorScheme(.dark)
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Step 6: Run Tests from CLI
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Run all tests with parsed output
|
|
145
|
+
xcodebuild test -scheme AppName -destination 'platform=iOS Simulator,name=iPhone 15 Pro' 2>&1 | xcsift
|
|
146
|
+
|
|
147
|
+
# Run only unit tests
|
|
148
|
+
xcodebuild test -scheme AppName -only-testing:AppNameTests 2>&1 | xcsift
|
|
149
|
+
|
|
150
|
+
# Run only UI tests
|
|
151
|
+
xcodebuild test -scheme AppName -only-testing:AppNameUITests 2>&1 | xcsift
|
|
152
|
+
|
|
153
|
+
# Run specific test class
|
|
154
|
+
xcodebuild test -scheme AppName -only-testing:AppNameTests/LoginViewModelTests 2>&1 | xcsift
|
|
155
|
+
|
|
156
|
+
# Run specific test method
|
|
157
|
+
xcodebuild test -scheme AppName -only-testing:AppNameTests/LoginViewModelTests/testEmailValidation 2>&1 | xcsift
|
|
158
|
+
|
|
159
|
+
# Generate test coverage
|
|
160
|
+
xcodebuild test -scheme AppName -enableCodeCoverage YES -resultBundlePath TestResults.xcresult 2>&1 | xcsift
|
|
161
|
+
xcrun xccov view --report TestResults.xcresult
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**If tests hang:** The test target likely depends on the app target with `@main`. Extract testable code to a Core framework target. See `../macos-apps/references/testing-tdd.md`.
|
|
165
|
+
|
|
166
|
+
Report to user:
|
|
167
|
+
- "Tests: X pass, Y fail"
|
|
168
|
+
- "Coverage: Z% of lines"
|
|
169
|
+
- If failures: "Failed tests: [list]. Investigating..."
|
|
170
|
+
</process>
|
|
171
|
+
|
|
172
|
+
<anti_patterns>
|
|
173
|
+
## Avoid These Mistakes
|
|
174
|
+
|
|
175
|
+
**Testing view bodies:**
|
|
176
|
+
```swift
|
|
177
|
+
// Wrong: can't test views directly
|
|
178
|
+
func testView() {
|
|
179
|
+
let view = LoginView()
|
|
180
|
+
// Can't inspect SwiftUI view
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Right: test view model
|
|
184
|
+
@Test func emailInput() {
|
|
185
|
+
let viewModel = LoginViewModel()
|
|
186
|
+
viewModel.email = "test@example.com"
|
|
187
|
+
#expect(viewModel.email == "test@example.com")
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Missing accessibility identifiers:**
|
|
192
|
+
```swift
|
|
193
|
+
// Wrong: using text
|
|
194
|
+
let button = app.buttons["Login"]
|
|
195
|
+
|
|
196
|
+
// Right: stable identifier
|
|
197
|
+
let button = app.buttons["loginButton"]
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**No dependency injection:**
|
|
201
|
+
```swift
|
|
202
|
+
// Wrong: can't mock
|
|
203
|
+
@Observable
|
|
204
|
+
class ViewModel {
|
|
205
|
+
private let service = RealService()
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Right: injectable
|
|
209
|
+
@Observable
|
|
210
|
+
class ViewModel {
|
|
211
|
+
private let service: ServiceProtocol
|
|
212
|
+
init(service: ServiceProtocol) {
|
|
213
|
+
self.service = service
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**No edge case testing:**
|
|
219
|
+
```swift
|
|
220
|
+
// Test empty, invalid, error states
|
|
221
|
+
@Test func emptyEmail() { }
|
|
222
|
+
@Test func shortPassword() { }
|
|
223
|
+
@Test func networkError() { }
|
|
224
|
+
```
|
|
225
|
+
</anti_patterns>
|
|
226
|
+
|
|
227
|
+
<success_criteria>
|
|
228
|
+
This workflow is complete when:
|
|
229
|
+
- [ ] Unit tests verify view model business logic
|
|
230
|
+
- [ ] UI tests verify user flows using accessibility identifiers
|
|
231
|
+
- [ ] All tests pass: `xcodebuild test -scheme YourApp`
|
|
232
|
+
- [ ] Edge cases and error states have coverage
|
|
233
|
+
- [ ] Dependencies use protocols for testability
|
|
234
|
+
- [ ] Previews exist for major UI states
|
|
235
|
+
</success_criteria>
|
package/dist/wizard.js
CHANGED
|
@@ -14,6 +14,7 @@ export function loadStoredEnvKeys(authStorage) {
|
|
|
14
14
|
['slack_bot', 'SLACK_BOT_TOKEN'],
|
|
15
15
|
['discord_bot', 'DISCORD_BOT_TOKEN'],
|
|
16
16
|
['groq', 'GROQ_API_KEY'],
|
|
17
|
+
['ollama-cloud', 'OLLAMA_API_KEY'],
|
|
17
18
|
];
|
|
18
19
|
for (const [provider, envVar] of providers) {
|
|
19
20
|
if (!process.env[envVar]) {
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-pi",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"description": "GSD — Get Shit Done coding agent",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "
|
|
8
|
+
"url": "https://github.com/gsd-build/gsd-2.git"
|
|
9
9
|
},
|
|
10
|
-
"homepage": "https://github.com/
|
|
10
|
+
"homepage": "https://github.com/gsd-build/gsd-2#readme",
|
|
11
11
|
"bugs": {
|
|
12
|
-
"url": "https://github.com/
|
|
12
|
+
"url": "https://github.com/gsd-build/gsd-2/issues"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
15
|
"workspaces": [
|
|
@@ -43,8 +43,10 @@
|
|
|
43
43
|
"build:pi-coding-agent": "npm run build -w @gsd/pi-coding-agent",
|
|
44
44
|
"build:native-pkg": "npm run build -w @gsd/native",
|
|
45
45
|
"build:pi": "npm run build:native-pkg && npm run build:pi-tui && npm run build:pi-ai && npm run build:pi-agent-core && npm run build:pi-coding-agent",
|
|
46
|
-
"build": "npm run build:pi && tsc && npm run copy-themes",
|
|
46
|
+
"build": "npm run build:pi && tsc && npm run copy-resources && npm run copy-themes && npm run copy-export-html",
|
|
47
|
+
"copy-resources": "node -e \"const{cpSync,rmSync}=require('fs');rmSync('dist/resources',{recursive:true,force:true});cpSync('src/resources','dist/resources',{recursive:true,force:true})\"",
|
|
47
48
|
"copy-themes": "node -e \"const{mkdirSync,cpSync}=require('fs');const{resolve}=require('path');const src=resolve(__dirname,'packages/pi-coding-agent/dist/modes/interactive/theme');mkdirSync('pkg/dist/modes/interactive/theme',{recursive:true});cpSync(src,'pkg/dist/modes/interactive/theme',{recursive:true})\"",
|
|
49
|
+
"copy-export-html": "node -e \"const{mkdirSync,cpSync}=require('fs');const{resolve}=require('path');const src=resolve(__dirname,'packages/pi-coding-agent/dist/core/export-html');mkdirSync('pkg/dist/core/export-html',{recursive:true});cpSync(src,'pkg/dist/core/export-html',{recursive:true})\"",
|
|
48
50
|
"test:unit": "node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/*.test.ts src/resources/extensions/gsd/tests/*.test.mjs src/tests/*.test.ts",
|
|
49
51
|
"test:integration": "node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/*integration*.test.ts src/tests/integration/*.test.ts",
|
|
50
52
|
"test": "npm run test:unit && npm run test:integration",
|
|
@@ -52,7 +54,7 @@
|
|
|
52
54
|
"test:native": "node --test packages/native/src/__tests__/grep.test.mjs",
|
|
53
55
|
"build:native": "node native/scripts/build.js",
|
|
54
56
|
"build:native:dev": "node native/scripts/build.js --dev",
|
|
55
|
-
"dev": "
|
|
57
|
+
"dev": "node scripts/dev.js",
|
|
56
58
|
"postinstall": "node scripts/link-workspace-packages.cjs && node scripts/postinstall.js",
|
|
57
59
|
"pi:install-global": "node scripts/install-pi-global.js",
|
|
58
60
|
"pi:uninstall-global": "node scripts/uninstall-pi-global.js",
|
|
@@ -11,6 +11,7 @@ export type { FuzzyFindMatch, FuzzyFindOptions, FuzzyFindResult };
|
|
|
11
11
|
*
|
|
12
12
|
* Searches for files and directories whose paths match the query string.
|
|
13
13
|
* Results are sorted by match quality (higher score = better match).
|
|
14
|
+
* Reuses the shared native filesystem scan cache used by glob discovery.
|
|
14
15
|
*
|
|
15
16
|
* Scoring tiers (highest to lowest):
|
|
16
17
|
* - 120: exact filename match
|
|
@@ -10,6 +10,7 @@ import { native } from "../native.js";
|
|
|
10
10
|
*
|
|
11
11
|
* Searches for files and directories whose paths match the query string.
|
|
12
12
|
* Results are sorted by match quality (higher score = better match).
|
|
13
|
+
* Reuses the shared native filesystem scan cache used by glob discovery.
|
|
13
14
|
*
|
|
14
15
|
* Scoring tiers (highest to lowest):
|
|
15
16
|
* - 120: exact filename match
|
|
@@ -16,5 +16,6 @@ export declare function searchContent(content: Buffer | Uint8Array, options: Sea
|
|
|
16
16
|
* Search files on disk for a regex pattern.
|
|
17
17
|
*
|
|
18
18
|
* Walks the directory tree respecting .gitignore and optional glob filters.
|
|
19
|
+
* Runs on the native blocking worker pool and resolves asynchronously.
|
|
19
20
|
*/
|
|
20
|
-
export declare function grep(options: GrepOptions): GrepResult
|
|
21
|
+
export declare function grep(options: GrepOptions): Promise<GrepResult>;
|
|
@@ -17,6 +17,7 @@ export function searchContent(content, options) {
|
|
|
17
17
|
* Search files on disk for a regex pattern.
|
|
18
18
|
*
|
|
19
19
|
* Walks the directory tree respecting .gitignore and optional glob filters.
|
|
20
|
+
* Runs on the native blocking worker pool and resolves asynchronously.
|
|
20
21
|
*/
|
|
21
22
|
export function grep(options) {
|
|
22
23
|
return native.grep(options);
|
|
@@ -139,6 +139,41 @@ describe("native fd: fuzzyFind()", () => {
|
|
|
139
139
|
);
|
|
140
140
|
});
|
|
141
141
|
|
|
142
|
+
test("reuses the shared fs scan cache until invalidated", (t) => {
|
|
143
|
+
const previousTtl = process.env.FS_SCAN_CACHE_TTL_MS;
|
|
144
|
+
process.env.FS_SCAN_CACHE_TTL_MS = "10000";
|
|
145
|
+
|
|
146
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-fd-test-"));
|
|
147
|
+
t.after(() => {
|
|
148
|
+
native.invalidateFsScanCache(tmpDir);
|
|
149
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
150
|
+
if (previousTtl === undefined) {
|
|
151
|
+
delete process.env.FS_SCAN_CACHE_TTL_MS;
|
|
152
|
+
} else {
|
|
153
|
+
process.env.FS_SCAN_CACHE_TTL_MS = previousTtl;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
fs.writeFileSync(path.join(tmpDir, "cached.txt"), "cached");
|
|
158
|
+
native.invalidateFsScanCache(tmpDir);
|
|
159
|
+
|
|
160
|
+
const warm = native.fuzzyFind({ query: "cached", path: tmpDir });
|
|
161
|
+
assert.ok(warm.matches.some((m) => m.path === "cached.txt"));
|
|
162
|
+
|
|
163
|
+
fs.unlinkSync(path.join(tmpDir, "cached.txt"));
|
|
164
|
+
|
|
165
|
+
const cached = native.fuzzyFind({ query: "cached", path: tmpDir });
|
|
166
|
+
assert.ok(
|
|
167
|
+
cached.matches.some((m) => m.path === "cached.txt"),
|
|
168
|
+
"should serve warm results from the shared fs scan cache",
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
native.invalidateFsScanCache(tmpDir);
|
|
172
|
+
|
|
173
|
+
const refreshed = native.fuzzyFind({ query: "cached", path: tmpDir });
|
|
174
|
+
assert.equal(refreshed.matches.length, 0);
|
|
175
|
+
});
|
|
176
|
+
|
|
142
177
|
test("results are sorted by score descending", (t) => {
|
|
143
178
|
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-fd-test-"));
|
|
144
179
|
t.after(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
@@ -93,7 +93,24 @@ describe("native grep: search()", () => {
|
|
|
93
93
|
describe("native grep: grep()", () => {
|
|
94
94
|
let tmpDir;
|
|
95
95
|
|
|
96
|
-
test("
|
|
96
|
+
test("returns a promise", async (t) => {
|
|
97
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-grep-test-"));
|
|
98
|
+
t.after(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
99
|
+
|
|
100
|
+
fs.writeFileSync(path.join(tmpDir, "file1.txt"), "hello world\n");
|
|
101
|
+
|
|
102
|
+
const pending = native.grep({
|
|
103
|
+
pattern: "hello",
|
|
104
|
+
path: tmpDir,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
assert.equal(typeof pending?.then, "function");
|
|
108
|
+
|
|
109
|
+
const result = await pending;
|
|
110
|
+
assert.equal(result.totalMatches, 1);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("searches files on disk", async (t) => {
|
|
97
114
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-grep-test-"));
|
|
98
115
|
t.after(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
99
116
|
|
|
@@ -101,7 +118,7 @@ describe("native grep: grep()", () => {
|
|
|
101
118
|
fs.writeFileSync(path.join(tmpDir, "file2.txt"), "hello rust\nbaz qux\n");
|
|
102
119
|
fs.writeFileSync(path.join(tmpDir, "file3.log"), "no match here\n");
|
|
103
120
|
|
|
104
|
-
const result = native.grep({
|
|
121
|
+
const result = await native.grep({
|
|
105
122
|
pattern: "hello",
|
|
106
123
|
path: tmpDir,
|
|
107
124
|
});
|
|
@@ -115,7 +132,7 @@ describe("native grep: grep()", () => {
|
|
|
115
132
|
assert.deepEqual(paths, [...paths].sort());
|
|
116
133
|
});
|
|
117
134
|
|
|
118
|
-
test("respects glob filter", (t) => {
|
|
135
|
+
test("respects glob filter", async (t) => {
|
|
119
136
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-grep-test-"));
|
|
120
137
|
t.after(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
121
138
|
|
|
@@ -123,7 +140,7 @@ describe("native grep: grep()", () => {
|
|
|
123
140
|
fs.writeFileSync(path.join(tmpDir, "code.js"), "hello javascript\n");
|
|
124
141
|
fs.writeFileSync(path.join(tmpDir, "readme.md"), "hello markdown\n");
|
|
125
142
|
|
|
126
|
-
const result = native.grep({
|
|
143
|
+
const result = await native.grep({
|
|
127
144
|
pattern: "hello",
|
|
128
145
|
path: tmpDir,
|
|
129
146
|
glob: "*.ts",
|
|
@@ -133,7 +150,7 @@ describe("native grep: grep()", () => {
|
|
|
133
150
|
assert.equal(result.matches[0].line, "hello typescript");
|
|
134
151
|
});
|
|
135
152
|
|
|
136
|
-
test("respects maxCount", (t) => {
|
|
153
|
+
test("respects maxCount", async (t) => {
|
|
137
154
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "gsd-grep-test-"));
|
|
138
155
|
t.after(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
139
156
|
|
|
@@ -141,7 +158,7 @@ describe("native grep: grep()", () => {
|
|
|
141
158
|
fs.writeFileSync(path.join(tmpDir, `file${i}.txt`), "match_me\n");
|
|
142
159
|
}
|
|
143
160
|
|
|
144
|
-
const result = native.grep({
|
|
161
|
+
const result = await native.grep({
|
|
145
162
|
pattern: "match_me",
|
|
146
163
|
path: tmpDir,
|
|
147
164
|
maxCount: 3,
|
|
@@ -151,9 +168,9 @@ describe("native grep: grep()", () => {
|
|
|
151
168
|
assert.equal(result.limitReached, true);
|
|
152
169
|
});
|
|
153
170
|
|
|
154
|
-
test("errors on non-existent path", () => {
|
|
155
|
-
assert.
|
|
156
|
-
native.grep({
|
|
171
|
+
test("errors on non-existent path", async () => {
|
|
172
|
+
await assert.rejects(() => {
|
|
173
|
+
return native.grep({
|
|
157
174
|
pattern: "test",
|
|
158
175
|
path: "/nonexistent/path/that/does/not/exist",
|
|
159
176
|
});
|
|
@@ -19,6 +19,7 @@ export type { FuzzyFindMatch, FuzzyFindOptions, FuzzyFindResult };
|
|
|
19
19
|
*
|
|
20
20
|
* Searches for files and directories whose paths match the query string.
|
|
21
21
|
* Results are sorted by match quality (higher score = better match).
|
|
22
|
+
* Reuses the shared native filesystem scan cache used by glob discovery.
|
|
22
23
|
*
|
|
23
24
|
* Scoring tiers (highest to lowest):
|
|
24
25
|
* - 120: exact filename match
|
|
@@ -42,7 +42,8 @@ export function searchContent(
|
|
|
42
42
|
* Search files on disk for a regex pattern.
|
|
43
43
|
*
|
|
44
44
|
* Walks the directory tree respecting .gitignore and optional glob filters.
|
|
45
|
+
* Runs on the native blocking worker pool and resolves asynchronously.
|
|
45
46
|
*/
|
|
46
|
-
export function grep(options: GrepOptions): GrepResult {
|
|
47
|
-
return native.grep(options) as GrepResult
|
|
47
|
+
export function grep(options: GrepOptions): Promise<GrepResult> {
|
|
48
|
+
return native.grep(options) as Promise<GrepResult>;
|
|
48
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGN,WAAW,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGN,WAAW,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EAIZ,QAAQ,EACR,MAAM,YAAY,CAAC;AA8BpB;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CA8BzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CA+BzC"}
|