@warpgogol/forge 4.2.4 → 5.1.1
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/AGENTS.md +14 -6
- package/CHANGELOG.md +72 -0
- package/README.md +8 -8
- package/README.uk.md +5 -5
- package/dist/os/adr/handlers/list-create.d.ts.map +1 -1
- package/dist/os/adr/handlers/list-create.js +4 -1
- package/dist/os/adr/handlers/list-create.js.map +1 -1
- package/dist/os/adr/handlers/validate.d.ts.map +1 -1
- package/dist/os/adr/handlers/validate.js +6 -1
- package/dist/os/adr/handlers/validate.js.map +1 -1
- package/dist/os/adr/types.d.ts.map +1 -1
- package/dist/os/adr/types.js +7 -3
- package/dist/os/adr/types.js.map +1 -1
- package/dist/os/compass/compass.module.d.ts.map +1 -1
- package/dist/os/compass/compass.module.js +76 -10
- package/dist/os/compass/compass.module.js.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.js +7 -3
- package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-change-summary-handler.d.ts +1 -9
- package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-change-summary-handler.js +44 -186
- package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-inventory-handler.d.ts +2 -0
- package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-inventory-handler.js +24 -12
- package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-inventory.d.ts +7 -5
- package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-inventory.js +84 -241
- package/dist/os/compass/handlers/compass-inventory.js.map +1 -1
- package/dist/os/compass/handlers/compass-migrate-handler.d.ts +4 -0
- package/dist/os/compass/handlers/compass-migrate-handler.d.ts.map +1 -0
- package/dist/os/compass/handlers/compass-migrate-handler.js +100 -0
- package/dist/os/compass/handlers/compass-migrate-handler.js.map +1 -0
- package/dist/os/compass/handlers/compass-migrate.d.ts +34 -0
- package/dist/os/compass/handlers/compass-migrate.d.ts.map +1 -0
- package/dist/os/compass/handlers/compass-migrate.js +273 -0
- package/dist/os/compass/handlers/compass-migrate.js.map +1 -0
- package/dist/os/compass/handlers/resolve-scan-root.d.ts.map +1 -1
- package/dist/os/compass/handlers/resolve-scan-root.js +15 -8
- package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
- package/dist/os/compass/handlers/summary-record.d.ts +46 -0
- package/dist/os/compass/handlers/summary-record.d.ts.map +1 -0
- package/dist/os/compass/handlers/summary-record.js +233 -0
- package/dist/os/compass/handlers/summary-record.js.map +1 -0
- package/dist/os/compass/index.d.ts +4 -1
- package/dist/os/compass/index.d.ts.map +1 -1
- package/dist/os/compass/index.js +9 -1
- package/dist/os/compass/index.js.map +1 -1
- package/dist/os/compass/policy.d.ts +65 -0
- package/dist/os/compass/policy.d.ts.map +1 -0
- package/dist/os/compass/policy.js +241 -0
- package/dist/os/compass/policy.js.map +1 -0
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +11 -23
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -1
- package/dist/os/core/handlers/forge-autonomy-validate.js +7 -1
- package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -1
- package/dist/os/core/handlers/package-health.d.ts.map +1 -1
- package/dist/os/core/handlers/package-health.js +6 -1
- package/dist/os/core/handlers/package-health.js.map +1 -1
- package/dist/os/core/handlers/pinned-check.d.ts.map +1 -1
- package/dist/os/core/handlers/pinned-check.js +6 -1
- package/dist/os/core/handlers/pinned-check.js.map +1 -1
- package/dist/os/core/handlers/pinned-validate.d.ts.map +1 -1
- package/dist/os/core/handlers/pinned-validate.js +6 -1
- package/dist/os/core/handlers/pinned-validate.js.map +1 -1
- package/dist/os/core/handlers/validate.d.ts.map +1 -1
- package/dist/os/core/handlers/validate.js +6 -1
- package/dist/os/core/handlers/validate.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts.map +1 -1
- package/dist/os/exploration/exploration.module.js +6 -4
- package/dist/os/exploration/exploration.module.js.map +1 -1
- package/dist/os/exploration/handlers/list.d.ts.map +1 -1
- package/dist/os/exploration/handlers/list.js +4 -1
- package/dist/os/exploration/handlers/list.js.map +1 -1
- package/dist/os/mission/handlers/archive.d.ts.map +1 -1
- package/dist/os/mission/handlers/archive.js +7 -3
- package/dist/os/mission/handlers/archive.js.map +1 -1
- package/dist/os/mission/index.d.ts.map +1 -1
- package/dist/os/mission/index.js +13 -0
- package/dist/os/mission/index.js.map +1 -1
- package/dist/os/notes/index.d.ts.map +1 -1
- package/dist/os/notes/index.js +7 -1
- package/dist/os/notes/index.js.map +1 -1
- package/dist/os/rfc/frontmatter-io.d.ts.map +1 -1
- package/dist/os/rfc/frontmatter-io.js +6 -1
- package/dist/os/rfc/frontmatter-io.js.map +1 -1
- package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
- package/dist/os/rfc/handlers/archive.js +6 -1
- package/dist/os/rfc/handlers/archive.js.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.js +7 -3
- package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
- package/dist/os/rfc/handlers/index-graph.d.ts.map +1 -1
- package/dist/os/rfc/handlers/index-graph.js +6 -1
- package/dist/os/rfc/handlers/index-graph.js.map +1 -1
- package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
- package/dist/os/rfc/handlers/lifecycle.js +6 -1
- package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
- package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
- package/dist/os/rfc/handlers/list-create.js +6 -1
- package/dist/os/rfc/handlers/list-create.js.map +1 -1
- package/dist/os/rfc/handlers/pipeline-status.d.ts.map +1 -1
- package/dist/os/rfc/handlers/pipeline-status.js +6 -1
- package/dist/os/rfc/handlers/pipeline-status.js.map +1 -1
- package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -1
- package/dist/os/rfc/handlers/supersede-propose.js +6 -1
- package/dist/os/rfc/handlers/supersede-propose.js.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.js +7 -3
- package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
- package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate.js +6 -1
- package/dist/os/rfc/handlers/validate.js.map +1 -1
- package/dist/os/rfc/index.d.ts.map +1 -1
- package/dist/os/rfc/index.js +6 -1
- package/dist/os/rfc/index.js.map +1 -1
- package/dist/os/rfc/rfc.module.d.ts.map +1 -1
- package/dist/os/rfc/rfc.module.js +6 -1
- package/dist/os/rfc/rfc.module.js.map +1 -1
- package/dist/os/rfc/types.d.ts +7 -4
- package/dist/os/rfc/types.d.ts.map +1 -1
- package/dist/os/rfc/types.js +7 -4
- package/dist/os/rfc/types.js.map +1 -1
- package/dist/os/session/handlers/save.d.ts.map +1 -1
- package/dist/os/session/handlers/save.js +6 -1
- package/dist/os/session/handlers/save.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +6 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
- package/dist/os/werkstatt/handlers/workspace-deps.js +3 -3
- package/dist/os/werkstatt/handlers/workspace-deps.js.map +1 -1
- package/dist/os/workflow/index.d.ts.map +1 -1
- package/dist/os/workflow/index.js +6 -1
- package/dist/os/workflow/index.js.map +1 -1
- package/dist/src/config/forge-config.d.ts +62 -4
- package/dist/src/config/forge-config.d.ts.map +1 -1
- package/dist/src/config/forge-config.js +35 -19
- package/dist/src/config/forge-config.js.map +1 -1
- package/dist/src/forge-module.d.ts.map +1 -1
- package/dist/src/forge-module.js +6 -1
- package/dist/src/forge-module.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +10 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/migration-adapters/git-utils.d.ts.map +1 -1
- package/dist/src/migration-adapters/git-utils.js +6 -2
- package/dist/src/migration-adapters/git-utils.js.map +1 -1
- package/dist/src/migration-adapters/ignored-files.d.ts.map +1 -1
- package/dist/src/migration-adapters/ignored-files.js +6 -1
- package/dist/src/migration-adapters/ignored-files.js.map +1 -1
- package/dist/src/migration-adapters/index.d.ts.map +1 -1
- package/dist/src/migration-adapters/index.js +4 -1
- package/dist/src/migration-adapters/index.js.map +1 -1
- package/dist/src/migration-adapters/types.d.ts.map +1 -1
- package/dist/src/migration-adapters/types.js +6 -2
- package/dist/src/migration-adapters/types.js.map +1 -1
- package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
- package/dist/src/onboarding/agents-generate.js +18 -14
- package/dist/src/onboarding/agents-generate.js.map +1 -1
- package/dist/src/onboarding/create.d.ts.map +1 -1
- package/dist/src/onboarding/create.js +7 -6
- package/dist/src/onboarding/create.js.map +1 -1
- package/dist/src/onboarding/doctor.d.ts.map +1 -1
- package/dist/src/onboarding/doctor.js +7 -13
- package/dist/src/onboarding/doctor.js.map +1 -1
- package/dist/src/onboarding/init.d.ts.map +1 -1
- package/dist/src/onboarding/init.js +7 -12
- package/dist/src/onboarding/init.js.map +1 -1
- package/dist/src/onboarding/invariant-engine.d.ts.map +1 -1
- package/dist/src/onboarding/invariant-engine.js +7 -2
- package/dist/src/onboarding/invariant-engine.js.map +1 -1
- package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
- package/dist/src/onboarding/nested-agents-generate.js +7 -2
- package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
- package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
- package/dist/src/onboarding/nested-agents-templates.js +11 -3
- package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
- package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
- package/dist/src/onboarding/scaffold-project.js +6 -1
- package/dist/src/onboarding/scaffold-project.js.map +1 -1
- package/dist/src/onboarding/upgrade.d.ts.map +1 -1
- package/dist/src/onboarding/upgrade.js +7 -3
- package/dist/src/onboarding/upgrade.js.map +1 -1
- package/dist/src/profiles/profile-schema.d.ts +54 -4
- package/dist/src/profiles/profile-schema.d.ts.map +1 -1
- package/dist/src/profiles/profile-schema.js +34 -14
- package/dist/src/profiles/profile-schema.js.map +1 -1
- package/dist/src/profiles/stack-profile.d.ts +24 -0
- package/dist/src/profiles/stack-profile.d.ts.map +1 -1
- package/dist/src/profiles/stack-profile.js +7 -3
- package/dist/src/profiles/stack-profile.js.map +1 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +7 -9
- package/dist/src/registry.js.map +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +6 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/fs-atomic.d.ts.map +1 -1
- package/dist/src/utils/fs-atomic.js +13 -1
- package/dist/src/utils/fs-atomic.js.map +1 -1
- package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
- package/dist/src/utils/fs-idempotent.js +13 -0
- package/dist/src/utils/fs-idempotent.js.map +1 -1
- package/dist/src/utils/fs-trash-sync.d.ts.map +1 -1
- package/dist/src/utils/fs-trash-sync.js +13 -1
- package/dist/src/utils/fs-trash-sync.js.map +1 -1
- package/dist/src/utils/fs-trash.d.ts.map +1 -1
- package/dist/src/utils/fs-trash.js +13 -1
- package/dist/src/utils/fs-trash.js.map +1 -1
- package/dist/src/utils/fs.d.ts.map +1 -1
- package/dist/src/utils/fs.js +14 -3
- package/dist/src/utils/fs.js.map +1 -1
- package/dist/src/utils/hash.d.ts.map +1 -1
- package/dist/src/utils/hash.js +12 -1
- package/dist/src/utils/hash.js.map +1 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +13 -2
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/string-utils.d.ts.map +1 -1
- package/dist/src/utils/string-utils.js +12 -1
- package/dist/src/utils/string-utils.js.map +1 -1
- package/dist/src/validators/port-validate.js +1 -1
- package/dist/src/validators/port-validate.js.map +1 -1
- package/dist/src/validators/skill-validate.d.ts.map +1 -1
- package/dist/src/validators/skill-validate.js +7 -8
- package/dist/src/validators/skill-validate.js.map +1 -1
- package/docs/getting-started.md +1 -1
- package/docs/reference/forge-yaml.md +38 -9
- package/docs/reference/profiles.md +8 -8
- package/os/adr/handlers/list-create.ts +4 -1
- package/os/adr/handlers/validate.ts +6 -1
- package/os/adr/types.ts +7 -3
- package/os/compass/compass.module.ts +79 -13
- package/os/compass/handlers/compass-audit-handler.ts +22 -3
- package/os/compass/handlers/compass-change-summary-handler.ts +55 -227
- package/os/compass/handlers/compass-inventory-handler.ts +30 -12
- package/os/compass/handlers/compass-inventory.ts +103 -240
- package/os/compass/handlers/compass-migrate-handler.ts +122 -0
- package/os/compass/handlers/compass-migrate.ts +361 -0
- package/os/compass/handlers/resolve-scan-root-package.test.ts +70 -0
- package/os/compass/handlers/resolve-scan-root.ts +15 -8
- package/os/compass/handlers/summary-record.ts +313 -0
- package/os/compass/handlers/tests/compass-migrate.test.ts +291 -0
- package/os/compass/handlers/tests/compass-policy.test.ts +249 -0
- package/os/compass/handlers/tests/compass-v2-contract.test.ts +9 -9
- package/os/compass/handlers/tests/summary-record.test.ts +224 -0
- package/os/compass/index.ts +23 -5
- package/os/compass/policy.ts +350 -0
- package/os/core/core.module.ts +11 -23
- package/os/core/handlers/forge-autonomy-validate.ts +7 -1
- package/os/core/handlers/package-health.ts +6 -1
- package/os/core/handlers/pinned-check.ts +6 -1
- package/os/core/handlers/pinned-validate.ts +6 -1
- package/os/core/handlers/validate.ts +6 -1
- package/os/exploration/exploration.module.ts +72 -71
- package/os/exploration/handlers/list.ts +4 -1
- package/os/mission/handlers/archive.ts +7 -3
- package/os/mission/index.ts +14 -0
- package/os/notes/index.ts +7 -1
- package/os/rfc/frontmatter-io.ts +6 -1
- package/os/rfc/handlers/archive.ts +6 -1
- package/os/rfc/handlers/implement-stamp.ts +7 -3
- package/os/rfc/handlers/index-graph.ts +6 -1
- package/os/rfc/handlers/lifecycle.ts +6 -1
- package/os/rfc/handlers/list-create.ts +6 -1
- package/os/rfc/handlers/pipeline-status.ts +6 -1
- package/os/rfc/handlers/supersede-propose.ts +6 -1
- package/os/rfc/handlers/validate-rules.ts +7 -3
- package/os/rfc/handlers/validate.ts +6 -1
- package/os/rfc/index.ts +6 -1
- package/os/rfc/rfc.module.ts +6 -1
- package/os/rfc/types.ts +7 -4
- package/os/session/handlers/save.ts +6 -1
- package/os/werkstatt/handlers/werkstatt-lock-recover.ts +6 -1
- package/os/werkstatt/handlers/workspace-deps.ts +3 -3
- package/os/workflow/index.ts +6 -1
- package/package.json +1 -1
- package/profiles/{godot-csharp.yaml → godot-game.yaml} +2 -2
- package/profiles/{knowledge-typescript-turborepo.yaml → knowledge.yaml} +1 -1
- package/profiles/{phaser-turborepo.yaml → phaser-game.yaml} +2 -2
- package/profiles/{typescript-turborepo.yaml → typescript.yaml} +2 -2
- package/skills/fo/fo-add-tests/SKILL.md +14 -0
- package/skills/fo/fo-architecture/SKILL.md +14 -0
- package/skills/fo/fo-compass-annotate/SKILL.md +14 -0
- package/skills/fo/fo-design-summit/SKILL.md +14 -0
- package/skills/fo/fo-doc-audit/SKILL.md +14 -0
- package/skills/fo/fo-explore/SKILL.md +14 -0
- package/skills/fo/fo-extract-dna/SKILL.md +14 -0
- package/skills/fo/fo-fix/SKILL.md +14 -0
- package/skills/fo/fo-handoff/SKILL.md +14 -0
- package/skills/fo/fo-harvest/SKILL.md +14 -0
- package/skills/fo/fo-idea/SKILL.md +14 -0
- package/skills/fo/fo-idea-audit/SKILL.md +14 -0
- package/skills/fo/fo-idea-create-adr/SKILL.md +14 -0
- package/skills/fo/fo-idea-create-rfc/SKILL.md +14 -0
- package/skills/fo/fo-idea-enhance/SKILL.md +14 -0
- package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +14 -0
- package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +14 -0
- package/skills/fo/fo-idea-implement/SKILL.md +14 -0
- package/skills/fo/fo-idea-plan/SKILL.md +14 -0
- package/skills/fo/fo-idea-status/SKILL.md +14 -0
- package/skills/fo/fo-knowledge-distill/SKILL.md +14 -0
- package/skills/fo/fo-memory-sync/SKILL.md +14 -0
- package/skills/fo/fo-qa/SKILL.md +14 -0
- package/skills/fo/fo-review/SKILL.md +14 -0
- package/skills/fo/fo-session-retro/SKILL.md +14 -0
- package/skills/fo/fo-session-save/SKILL.md +14 -0
- package/skills/fo/fo-spec-ingest/SKILL.md +14 -0
- package/skills/fo/fo-step-commit/SKILL.md +14 -0
- package/skills/fo/fo-triage/SKILL.md +14 -0
- package/skills/meta/forge-bootstrap/SKILL.md +14 -0
- package/skills/meta/port-to-forge/SKILL.md +14 -0
- package/skills/meta/skill-create/SKILL.md +14 -0
- package/skills/shared/grilling/SKILL.md +14 -0
- package/skills/shared/my-preferences/SKILL.md +14 -0
- package/skills/shared/windows-ai-tooling/SKILL.md +14 -0
- package/skills/shared/writing-great-skills/SKILL.md +14 -0
- package/src/config/forge-config.ts +40 -23
- package/src/forge-module.ts +6 -1
- package/src/index.ts +10 -2
- package/src/migration-adapters/git-utils.ts +6 -2
- package/src/migration-adapters/ignored-files.ts +6 -1
- package/src/migration-adapters/index.ts +4 -1
- package/src/migration-adapters/types.ts +6 -2
- package/src/onboarding/agents-generate.ts +23 -14
- package/src/onboarding/create.ts +7 -6
- package/src/onboarding/doctor.ts +7 -13
- package/src/onboarding/init.ts +7 -12
- package/src/onboarding/invariant-engine.ts +7 -2
- package/src/onboarding/nested-agents-generate.ts +7 -2
- package/src/onboarding/nested-agents-templates.ts +11 -3
- package/src/onboarding/scaffold-project.ts +6 -1
- package/src/onboarding/upgrade.ts +7 -3
- package/src/profiles/profile-schema.ts +42 -18
- package/src/profiles/stack-profile.ts +7 -3
- package/src/registry.ts +7 -9
- package/src/tests/agents-generate-domain.test.ts +3 -3
- package/src/tests/agents-generate.test.ts +2 -2
- package/src/tests/create.test.ts +4 -4
- package/src/tests/forge-autonomy-validate.test.ts +1 -1
- package/src/tests/package-files.test.ts +53 -1
- package/src/tests/profile-schema.test.ts +4 -4
- package/src/tests/scaffold-project.test.ts +3 -3
- package/src/tests/stack-profile.test.ts +12 -12
- package/src/types.ts +6 -1
- package/src/utils/fs-atomic.ts +13 -1
- package/src/utils/fs-idempotent.ts +13 -0
- package/src/utils/fs-trash-sync.ts +13 -1
- package/src/utils/fs-trash.ts +13 -1
- package/src/utils/fs.ts +14 -3
- package/src/utils/hash.ts +12 -1
- package/src/utils/index.ts +13 -2
- package/src/utils/string-utils.ts +12 -1
- package/src/validators/port-validate.ts +1 -1
- package/src/validators/skill-validate.ts +7 -8
- package/skills/shared/extension-e2e-mitm/SKILL.md +0 -53
- package/skills/shared/extension-e2e-mitm/fixture-proxy.ts +0 -113
- package/src/types/werkstatt-engine-shims.d.ts +0 -1416
- package/src/types/werkstatt-shared-shims.d.ts +0 -5686
|
@@ -27,7 +27,7 @@ interface PortValidateResult {
|
|
|
27
27
|
const FORBIDDEN_IMPORTS = [
|
|
28
28
|
"@warpgogol/werkstatt-engine/kernel",
|
|
29
29
|
"@warpgogol/werkstatt-site/ui",
|
|
30
|
-
"@warpgogol/werkstatt-shared/
|
|
30
|
+
"@warpgogol/werkstatt-shared/page",
|
|
31
31
|
];
|
|
32
32
|
|
|
33
33
|
export function runPortValidate(
|
|
@@ -6,17 +6,16 @@
|
|
|
6
6
|
</non-goals>
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
|
-
<item>RFC-0374: initial forge.skill.validate handler.</item>
|
|
10
|
-
<item>RFC-0393: added SKILL-11 — canonical skill bodies must not contain hardcoded project-specific literals.</item>
|
|
11
|
-
<item>RFC-0523: added SKILL-12 — concerns must be one of four-level enum. Updated SKILL-10 to cover read-only skills.</item>
|
|
12
|
-
<item>RFC-0524: added SKILL-13 — declared knowledge files must exist relative to SKILL.md directory.</item>
|
|
13
|
-
<item>RFC-0539: added SKILL-14 (pack skill name must start with pack prefix) and SKILL-15 (non-forge skill may not use fo- prefix). Extended SKILL-07 with asymmetric dependency direction (forge→pack forbidden). Added pack skill validation loop.</item>
|
|
14
|
-
<item>RFC-0548: added SKILL-16 — triggers field must be an array of 1-5 strings, each 5-100 characters, only allowed on fo-category skills.</item>
|
|
15
|
-
<item>RFC-0553: added SKILL-17 — skill files must not contain specific platform RFC/ADR ids (RFC-\\d{4}, ADR-\\d{4}) or platform names (Warpgogol, WarpGogol).</item>
|
|
16
9
|
<item>RFC-0642: added SKILL-18 — forge skill instruction lines must not reference software-specific binding keys (typecheck, scopedBuild, test); use semantic keys (validate, produce, verify) instead.</item>
|
|
17
10
|
<item>RFC-0660: added SKILL-19 (knowledge entry schema validity) and SKILL-20 (entry identifier uniqueness) for structured knowledge files.</item>
|
|
18
11
|
<item>RFC-0661: added SKILL-21 (knowledge layer token budget warnings), refactored warning handling — warnings go to separate `warnings` array, not `violations`.</item>
|
|
19
|
-
<item>
|
|
12
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
13
|
+
|
|
14
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
15
|
+
<item>RFC-1097: sweep — packages/forge + services clean
|
|
16
|
+
|
|
17
|
+
Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
|
|
18
|
+
<history>RFC-0374, RFC-0393, RFC-0523, RFC-0524, RFC-0539, RFC-0548, RFC-0553</history>
|
|
20
19
|
</CHANGE_SUMMARY>
|
|
21
20
|
*/
|
|
22
21
|
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: extension-e2e-mitm
|
|
3
|
-
description: Intercept Chrome-extension tab navigations in Playwright e2e via a local CONNECT MITM proxy — the only reliable seam when page.route cannot see chrome.tabs.create traffic.
|
|
4
|
-
invocation: user
|
|
5
|
-
category: shared
|
|
6
|
-
concerns: code-mutation
|
|
7
|
-
dependsOn: []
|
|
8
|
-
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# extension-e2e-mitm
|
|
12
|
-
|
|
13
|
-
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
14
|
-
|
|
15
|
-
Use this skill when a Playwright e2e suite must control what a Chrome MV3 extension's tabs load — and `context.route` / `page.route` cannot see the traffic.
|
|
16
|
-
|
|
17
|
-
## When this applies
|
|
18
|
-
|
|
19
|
-
- The extension's service worker opens tabs via `chrome.tabs.create` (or `windows.create`).
|
|
20
|
-
- Playwright route interception is installed but the fixture HTML never reaches the tab.
|
|
21
|
-
- Symptom: `context.on("page")` fires with the real URL already in flight — the navigation started before the page surfaced to Playwright, so no route handler ever runs.
|
|
22
|
-
|
|
23
|
-
This is a hard platform limitation, not a misconfiguration: extension-spawned navigations bypass the Playwright route layer entirely. Do not retry routing with different scopes (`context.route`, per-page `page.route`, `routeFromHAR`) — none of them see the request. Intercept at the network layer instead.
|
|
24
|
-
|
|
25
|
-
## The pattern
|
|
26
|
-
|
|
27
|
-
1. **Local CONNECT proxy** (`fixture-proxy.ts` in this skill's directory — copy it into the project's e2e folder). It listens on `127.0.0.1`, accepts CONNECT only for an allowlist of host suffixes, answers TLS with a per-run self-signed cert, and serves the currently-installed fixture HTML for every request. Non-allowlisted CONNECTs are refused — the proxy never tunnels real traffic.
|
|
28
|
-
2. **Browser flags** at `chromium.launchPersistentContext`:
|
|
29
|
-
- `--proxy-server=http://127.0.0.1:<port>` — all browser traffic through the proxy.
|
|
30
|
-
- `--proxy-bypass-list=127.0.0.1;localhost` — the local API/backend must NOT go through the proxy.
|
|
31
|
-
- `--ignore-certificate-errors-spki-list=<spki>` — whitelist ONLY the proxy cert's SPKI fingerprint (exposed as `proxy.spkiFingerprint`). Never use blanket `--ignore-certificate-errors` — it disables TLS verification for the whole browser.
|
|
32
|
-
3. **Fixture swap** — `proxy.setContent(html)` changes what every intercepted request returns. Install fixtures per spec, not per suite.
|
|
33
|
-
|
|
34
|
-
## Integration steps
|
|
35
|
-
|
|
36
|
-
1. Copy `fixture-proxy.ts` into the project's e2e directory.
|
|
37
|
-
2. Pass the site's host suffixes to `startFixtureProxy({ hosts: [...] })` — the cert CN/SAN and the CONNECT allowlist derive from them.
|
|
38
|
-
3. Launch the browser with the three flags above (proxy server, bypass list, spki-list).
|
|
39
|
-
4. In each spec, `proxy.setContent(fixtureHtml)` before triggering the extension flow; assert on backend state (D1/API), not on page DOM.
|
|
40
|
-
5. Close the proxy with the browser context (`context.on("close", () => proxy.close())`).
|
|
41
|
-
|
|
42
|
-
## Parameters and limits
|
|
43
|
-
|
|
44
|
-
- `hosts` — suffix list; `host === suffix || host.endsWith("." + suffix)` matches. Keep it tight: only the fixture-served sites.
|
|
45
|
-
- The cert is generated per run via `openssl req -x509` into a temp dir — openssl must be on PATH; no secrets touch the repo.
|
|
46
|
-
- The CONNECT parser reads the first TCP chunk — sufficient on loopback; do not reuse this proxy for real forwarding.
|
|
47
|
-
- Headed browser required for MV3 service workers — wrap CI in `xvfb-run`.
|
|
48
|
-
|
|
49
|
-
## Anti-patterns
|
|
50
|
-
|
|
51
|
-
- Do not add runtime hooks to the extension to make it "testable" — the proxy keeps production code untouched.
|
|
52
|
-
- Do not copy fixture HTML into the e2e folder — serve the canonical fixtures from their owning package.
|
|
53
|
-
- Do not broaden the allowlist to "just make it work" — a refused CONNECT is the signal that a new host needs an explicit decision.
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
@ai-invariant Fixture serving happens at the network layer — a local CONNECT proxy MITMs the allowlisted hosts.
|
|
3
|
-
<MODULE_CONTRACT>
|
|
4
|
-
<purpose>Starts a minimal CONNECT proxy on 127.0.0.1 that answers TLS for the allowlisted hosts with a per-run self-signed cert and serves the current fixture HTML for every request. Extension-spawned tab navigations bypass Playwright's route interception — the proxy intercepts them at the network layer instead.</purpose>
|
|
5
|
-
<non-goals>
|
|
6
|
-
<item>Does not tunnel or forward real traffic — non-allowlisted CONNECTs are refused; the backend bypasses the proxy via --proxy-bypass-list.</item>
|
|
7
|
-
</non-goals>
|
|
8
|
-
</MODULE_CONTRACT>
|
|
9
|
-
<CHANGE_SUMMARY>
|
|
10
|
-
<item>Ported from dater RFC-0015 — parameterized host allowlist and cert SANs.</item>
|
|
11
|
-
</CHANGE_SUMMARY>
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { createServer, type Server } from "node:net";
|
|
15
|
-
import { TLSSocket, createSecureContext } from "node:tls";
|
|
16
|
-
import { execFileSync } from "node:child_process";
|
|
17
|
-
import { X509Certificate, createHash } from "node:crypto";
|
|
18
|
-
import { readFileSync, mkdtempSync } from "node:fs";
|
|
19
|
-
import { join } from "node:path";
|
|
20
|
-
import { tmpdir } from "node:os";
|
|
21
|
-
|
|
22
|
-
export interface FixtureProxy {
|
|
23
|
-
port: number;
|
|
24
|
-
/** Base64 SHA-256 of the leaf cert's SPKI — for --ignore-certificate-errors-spki-list. */
|
|
25
|
-
spkiFingerprint: string;
|
|
26
|
-
/** Swap the HTML served for every intercepted request. */
|
|
27
|
-
setContent(html: string): void;
|
|
28
|
-
close(): void;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface FixtureProxyOptions {
|
|
32
|
-
/** Host suffixes the proxy may MITM — e.g. ["example.com"] also covers sub.example.com. */
|
|
33
|
-
hosts: string[];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function generateCert(dir: string, hosts: string[]): { key: Buffer; cert: Buffer } {
|
|
37
|
-
const keyPath = join(dir, "key.pem");
|
|
38
|
-
const certPath = join(dir, "cert.pem");
|
|
39
|
-
const primary = hosts[0];
|
|
40
|
-
if (!primary) throw new Error("fixture proxy needs at least one host");
|
|
41
|
-
const san = hosts.flatMap((h) => [`DNS:${h}`, `DNS:*.${h}`]).join(",");
|
|
42
|
-
execFileSync("openssl", [
|
|
43
|
-
"req", "-x509", "-newkey", "rsa:2048", "-nodes",
|
|
44
|
-
"-keyout", keyPath,
|
|
45
|
-
"-out", certPath,
|
|
46
|
-
"-days", "1",
|
|
47
|
-
"-subj", `/CN=*.${primary}`,
|
|
48
|
-
"-addext", `subjectAltName=${san}`,
|
|
49
|
-
]);
|
|
50
|
-
return { key: readFileSync(keyPath), cert: readFileSync(certPath) };
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Base64 SHA-256 of the cert's SubjectPublicKeyInfo — Chromium's spki-list format. */
|
|
54
|
-
function spkiFingerprintOf(cert: Buffer): string {
|
|
55
|
-
const spki = new X509Certificate(cert).publicKey.export({ format: "der", type: "spki" });
|
|
56
|
-
return createHash("sha256").update(spki).digest("base64");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Start a CONNECT proxy that MITMs the allowlisted hosts. Launch the browser
|
|
61
|
-
* with --proxy-server pointing here, --proxy-bypass-list for the local
|
|
62
|
-
* backend, and --ignore-certificate-errors-spki-list scoped to
|
|
63
|
-
* proxy.spkiFingerprint.
|
|
64
|
-
*/
|
|
65
|
-
export async function startFixtureProxy(options: FixtureProxyOptions): Promise<FixtureProxy> {
|
|
66
|
-
const dir = mkdtempSync(join(tmpdir(), "e2e-fixture-cert-"));
|
|
67
|
-
const { key, cert } = generateCert(dir, options.hosts);
|
|
68
|
-
const secureContext = createSecureContext({ key, cert });
|
|
69
|
-
const spkiFingerprint = spkiFingerprintOf(cert);
|
|
70
|
-
let content = "<html><body>no fixture installed</body></html>";
|
|
71
|
-
|
|
72
|
-
const server: Server = createServer((sock) => {
|
|
73
|
-
sock.once("data", (head) => {
|
|
74
|
-
const line = head.toString("utf8").split("\r\n")[0] ?? "";
|
|
75
|
-
const m = line.match(/^CONNECT ([^:]+):(\d+)/);
|
|
76
|
-
if (!m) {
|
|
77
|
-
sock.destroy();
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
const host = m[1]!;
|
|
81
|
-
if (!options.hosts.some((s) => host === s || host.endsWith(`.${s}`))) {
|
|
82
|
-
sock.destroy();
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
sock.write("HTTP/1.1 200 Connection Established\r\n\r\n");
|
|
86
|
-
const tls = new TLSSocket(sock, { secureContext, isServer: true });
|
|
87
|
-
tls.once("secure", () => {
|
|
88
|
-
tls.once("data", () => {
|
|
89
|
-
const body = content;
|
|
90
|
-
tls.end(
|
|
91
|
-
`HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: ${Buffer.byteLength(body)}\r\nConnection: close\r\n\r\n${body}`,
|
|
92
|
-
);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
tls.on("error", () => sock.destroy());
|
|
96
|
-
});
|
|
97
|
-
sock.on("error", () => sock.destroy());
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
await new Promise<void>((resolveListen) => server.listen(0, "127.0.0.1", resolveListen));
|
|
101
|
-
const port = (server.address() as { port: number }).port;
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
port,
|
|
105
|
-
spkiFingerprint,
|
|
106
|
-
setContent(html: string) {
|
|
107
|
-
content = html;
|
|
108
|
-
},
|
|
109
|
-
close() {
|
|
110
|
-
server.close();
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
}
|