@seanmars/tospec 0.19.0-beta.8 → 0.20.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/CHANGELOG.md +60 -310
- package/README.md +69 -82
- package/assets/dashboard/app.js +11 -0
- package/assets/dashboard/style.css +7 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +89 -106
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts +9 -17
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +293 -145
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +57 -99
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +190 -313
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/decision.d.ts +38 -27
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +296 -128
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/metrics.d.ts +28 -51
- package/dist/commands/metrics.d.ts.map +1 -1
- package/dist/commands/metrics.js +62 -93
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/shared-output.d.ts +12 -27
- package/dist/commands/shared-output.d.ts.map +1 -1
- package/dist/commands/shared-output.js +22 -45
- package/dist/commands/shared-output.js.map +1 -1
- package/dist/commands/show.d.ts +4 -7
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +23 -11
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/validate.d.ts +34 -58
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +225 -141
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/workflow/index.d.ts +1 -5
- package/dist/commands/workflow/index.d.ts.map +1 -1
- package/dist/commands/workflow/index.js +1 -5
- package/dist/commands/workflow/index.js.map +1 -1
- package/dist/commands/workflow/instructions.d.ts +14 -24
- package/dist/commands/workflow/instructions.d.ts.map +1 -1
- package/dist/commands/workflow/instructions.js +219 -128
- package/dist/commands/workflow/instructions.js.map +1 -1
- package/dist/commands/workflow/new-change.d.ts +2 -5
- package/dist/commands/workflow/new-change.d.ts.map +1 -1
- package/dist/commands/workflow/new-change.js +69 -32
- package/dist/commands/workflow/new-change.js.map +1 -1
- package/dist/commands/workflow/schemas.d.ts +1 -5
- package/dist/commands/workflow/schemas.d.ts.map +1 -1
- package/dist/commands/workflow/schemas.js +6 -17
- package/dist/commands/workflow/schemas.js.map +1 -1
- package/dist/commands/workflow/shared.d.ts +37 -42
- package/dist/commands/workflow/shared.d.ts.map +1 -1
- package/dist/commands/workflow/shared.js +23 -54
- package/dist/commands/workflow/shared.js.map +1 -1
- package/dist/commands/workflow/status.d.ts +7 -17
- package/dist/commands/workflow/status.d.ts.map +1 -1
- package/dist/commands/workflow/status.js +57 -72
- package/dist/commands/workflow/status.js.map +1 -1
- package/dist/commands/workflow/templates.d.ts +8 -8
- package/dist/commands/workflow/templates.d.ts.map +1 -1
- package/dist/commands/workflow/templates.js +32 -46
- package/dist/commands/workflow/templates.js.map +1 -1
- package/dist/core/archive.d.ts +22 -31
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +296 -283
- package/dist/core/archive.js.map +1 -1
- package/dist/core/artifact-graph/graph.d.ts +25 -42
- package/dist/core/artifact-graph/graph.d.ts.map +1 -1
- package/dist/core/artifact-graph/graph.js +45 -63
- package/dist/core/artifact-graph/graph.js.map +1 -1
- package/dist/core/artifact-graph/index.d.ts +1 -1
- package/dist/core/artifact-graph/index.d.ts.map +1 -1
- package/dist/core/artifact-graph/index.js +1 -1
- package/dist/core/artifact-graph/index.js.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts +54 -120
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +129 -111
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
- package/dist/core/artifact-graph/outputs.d.ts +9 -23
- package/dist/core/artifact-graph/outputs.d.ts.map +1 -1
- package/dist/core/artifact-graph/outputs.js +45 -38
- package/dist/core/artifact-graph/outputs.js.map +1 -1
- package/dist/core/artifact-graph/resolver.d.ts +36 -81
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
- package/dist/core/artifact-graph/resolver.js +60 -101
- package/dist/core/artifact-graph/resolver.js.map +1 -1
- package/dist/core/artifact-graph/schema.d.ts +0 -6
- package/dist/core/artifact-graph/schema.d.ts.map +1 -1
- package/dist/core/artifact-graph/schema.js +7 -32
- package/dist/core/artifact-graph/schema.js.map +1 -1
- package/dist/core/artifact-graph/state.d.ts +1 -8
- package/dist/core/artifact-graph/state.d.ts.map +1 -1
- package/dist/core/artifact-graph/state.js +2 -17
- package/dist/core/artifact-graph/state.js.map +1 -1
- package/dist/core/artifact-graph/stub-detection.d.ts +6 -14
- package/dist/core/artifact-graph/stub-detection.d.ts.map +1 -1
- package/dist/core/artifact-graph/stub-detection.js +13 -16
- package/dist/core/artifact-graph/stub-detection.js.map +1 -1
- package/dist/core/artifact-graph/types.d.ts +4 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -1
- package/dist/core/artifact-graph/types.js +30 -10
- package/dist/core/artifact-graph/types.js.map +1 -1
- package/dist/core/available-tools.d.ts +3 -12
- package/dist/core/available-tools.d.ts.map +1 -1
- package/dist/core/available-tools.js +4 -13
- package/dist/core/available-tools.js.map +1 -1
- package/dist/core/change-metadata/schema.d.ts +1 -1
- package/dist/core/change-metadata/schema.d.ts.map +1 -1
- package/dist/core/change-metadata/schema.js +10 -7
- package/dist/core/change-metadata/schema.js.map +1 -1
- package/dist/core/change-presenter.d.ts +16 -27
- package/dist/core/change-presenter.d.ts.map +1 -1
- package/dist/core/change-presenter.js +53 -53
- package/dist/core/change-presenter.js.map +1 -1
- package/dist/core/change-status-policy.d.ts +4 -8
- package/dist/core/change-status-policy.d.ts.map +1 -1
- package/dist/core/change-status-policy.js +9 -17
- package/dist/core/change-status-policy.js.map +1 -1
- package/dist/core/codex-metrics.d.ts +25 -45
- package/dist/core/codex-metrics.d.ts.map +1 -1
- package/dist/core/codex-metrics.js +44 -88
- package/dist/core/codex-metrics.js.map +1 -1
- package/dist/core/codex-residue.d.ts +14 -15
- package/dist/core/codex-residue.d.ts.map +1 -1
- package/dist/core/codex-residue.js +18 -22
- package/dist/core/codex-residue.js.map +1 -1
- package/dist/core/command-generation/adapters/claude.d.ts +2 -9
- package/dist/core/command-generation/adapters/claude.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/claude.js +2 -12
- package/dist/core/command-generation/adapters/claude.js.map +1 -1
- package/dist/core/command-generation/adapters/index.d.ts +1 -9
- package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/index.js +1 -9
- package/dist/core/command-generation/adapters/index.js.map +1 -1
- package/dist/core/command-generation/generator.d.ts +0 -17
- package/dist/core/command-generation/generator.d.ts.map +1 -1
- package/dist/core/command-generation/generator.js +0 -17
- package/dist/core/command-generation/generator.js.map +1 -1
- package/dist/core/command-generation/index.d.ts +2 -5
- package/dist/core/command-generation/index.d.ts.map +1 -1
- package/dist/core/command-generation/index.js +0 -9
- package/dist/core/command-generation/index.js.map +1 -1
- package/dist/core/command-generation/types.d.ts +10 -36
- package/dist/core/command-generation/types.d.ts.map +1 -1
- package/dist/core/command-generation/types.js +0 -6
- package/dist/core/command-generation/types.js.map +1 -1
- package/dist/core/command-generation/yaml.d.ts +3 -18
- package/dist/core/command-generation/yaml.d.ts.map +1 -1
- package/dist/core/command-generation/yaml.js +5 -23
- package/dist/core/command-generation/yaml.js.map +1 -1
- package/dist/core/config-prompts.d.ts +2 -4
- package/dist/core/config-prompts.d.ts.map +1 -1
- package/dist/core/config-prompts.js +2 -7
- package/dist/core/config-prompts.js.map +1 -1
- package/dist/core/config-schema.d.ts +7 -41
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +35 -74
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/config.d.ts +25 -49
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +22 -45
- package/dist/core/config.js.map +1 -1
- package/dist/core/dashboard-activity.d.ts +7 -9
- package/dist/core/dashboard-activity.d.ts.map +1 -1
- package/dist/core/dashboard-activity.js +26 -24
- package/dist/core/dashboard-activity.js.map +1 -1
- package/dist/core/dashboard-data.d.ts +35 -22
- package/dist/core/dashboard-data.d.ts.map +1 -1
- package/dist/core/dashboard-data.js +57 -72
- package/dist/core/dashboard-data.js.map +1 -1
- package/dist/core/global-config.d.ts +24 -53
- package/dist/core/global-config.d.ts.map +1 -1
- package/dist/core/global-config.js +38 -67
- package/dist/core/global-config.js.map +1 -1
- package/dist/core/init.d.ts +12 -28
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +90 -168
- package/dist/core/init.js.map +1 -1
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +80 -38
- package/dist/core/list.js.map +1 -1
- package/dist/core/local-server.d.ts +41 -83
- package/dist/core/local-server.d.ts.map +1 -1
- package/dist/core/local-server.js +53 -98
- package/dist/core/local-server.js.map +1 -1
- package/dist/core/markdown-render.d.ts +15 -23
- package/dist/core/markdown-render.d.ts.map +1 -1
- package/dist/core/markdown-render.js +25 -34
- package/dist/core/markdown-render.js.map +1 -1
- package/dist/core/migrate.d.ts +19 -16
- package/dist/core/migrate.d.ts.map +1 -1
- package/dist/core/migrate.js +151 -135
- package/dist/core/migrate.js.map +1 -1
- package/dist/core/parsers/change-parser.d.ts +7 -10
- package/dist/core/parsers/change-parser.d.ts.map +1 -1
- package/dist/core/parsers/change-parser.js +48 -56
- package/dist/core/parsers/change-parser.js.map +1 -1
- package/dist/core/parsers/markdown-parser.d.ts +8 -9
- package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
- package/dist/core/parsers/markdown-parser.js +23 -30
- package/dist/core/parsers/markdown-parser.js.map +1 -1
- package/dist/core/parsers/requirement-blocks.d.ts +43 -15
- package/dist/core/parsers/requirement-blocks.d.ts.map +1 -1
- package/dist/core/parsers/requirement-blocks.js +142 -70
- package/dist/core/parsers/requirement-blocks.js.map +1 -1
- package/dist/core/parsers/requirement-text.d.ts +73 -79
- package/dist/core/parsers/requirement-text.d.ts.map +1 -1
- package/dist/core/parsers/requirement-text.js +137 -79
- package/dist/core/parsers/requirement-text.js.map +1 -1
- package/dist/core/parsers/spec-structure.d.ts.map +1 -1
- package/dist/core/parsers/spec-structure.js +10 -6
- package/dist/core/parsers/spec-structure.js.map +1 -1
- package/dist/core/profiles.d.ts +3 -10
- package/dist/core/profiles.d.ts.map +1 -1
- package/dist/core/profiles.js +5 -12
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/project-config.d.ts +43 -44
- package/dist/core/project-config.d.ts.map +1 -1
- package/dist/core/project-config.js +107 -82
- package/dist/core/project-config.js.map +1 -1
- package/dist/core/project-layout.d.ts +9 -17
- package/dist/core/project-layout.d.ts.map +1 -1
- package/dist/core/project-layout.js +16 -26
- package/dist/core/project-layout.js.map +1 -1
- package/dist/core/root-selection.d.ts +8 -14
- package/dist/core/root-selection.d.ts.map +1 -1
- package/dist/core/root-selection.js +3 -6
- package/dist/core/root-selection.js.map +1 -1
- package/dist/core/rules.d.ts.map +1 -1
- package/dist/core/rules.js +2 -3
- package/dist/core/rules.js.map +1 -1
- package/dist/core/schema-names.d.ts +16 -0
- package/dist/core/schema-names.d.ts.map +1 -0
- package/dist/core/schema-names.js +16 -0
- package/dist/core/schema-names.js.map +1 -0
- package/dist/core/schemas/base.schema.d.ts.map +1 -1
- package/dist/core/schemas/base.schema.js +6 -12
- package/dist/core/schemas/base.schema.js.map +1 -1
- package/dist/core/schemas/change.schema.d.ts +8 -0
- package/dist/core/schemas/change.schema.d.ts.map +1 -1
- package/dist/core/schemas/change.schema.js +41 -10
- package/dist/core/schemas/change.schema.js.map +1 -1
- package/dist/core/shared/index.d.ts +2 -7
- package/dist/core/shared/index.d.ts.map +1 -1
- package/dist/core/shared/index.js +2 -7
- package/dist/core/shared/index.js.map +1 -1
- package/dist/core/shared/rules-generation.d.ts +5 -15
- package/dist/core/shared/rules-generation.d.ts.map +1 -1
- package/dist/core/shared/rules-generation.js +33 -37
- package/dist/core/shared/rules-generation.js.map +1 -1
- package/dist/core/shared/skill-generation.d.ts +28 -43
- package/dist/core/shared/skill-generation.d.ts.map +1 -1
- package/dist/core/shared/skill-generation.js +82 -51
- package/dist/core/shared/skill-generation.js.map +1 -1
- package/dist/core/shared/tool-detection.d.ts +35 -76
- package/dist/core/shared/tool-detection.d.ts.map +1 -1
- package/dist/core/shared/tool-detection.js +73 -93
- package/dist/core/shared/tool-detection.js.map +1 -1
- package/dist/core/skill-metrics.d.ts +36 -63
- package/dist/core/skill-metrics.d.ts.map +1 -1
- package/dist/core/skill-metrics.js +34 -73
- package/dist/core/skill-metrics.js.map +1 -1
- package/dist/core/spec-presenter.d.ts.map +1 -1
- package/dist/core/spec-presenter.js +5 -10
- package/dist/core/spec-presenter.js.map +1 -1
- package/dist/core/specs-apply.d.ts +16 -31
- package/dist/core/specs-apply.d.ts.map +1 -1
- package/dist/core/specs-apply.js +146 -195
- package/dist/core/specs-apply.js.map +1 -1
- package/dist/core/templates/fragments/interview.d.ts +2 -6
- package/dist/core/templates/fragments/interview.d.ts.map +1 -1
- package/dist/core/templates/fragments/interview.js +2 -6
- package/dist/core/templates/fragments/interview.js.map +1 -1
- package/dist/core/templates/fragments/next-step.d.ts +4 -8
- package/dist/core/templates/fragments/next-step.d.ts.map +1 -1
- package/dist/core/templates/fragments/next-step.js +4 -8
- package/dist/core/templates/fragments/next-step.js.map +1 -1
- package/dist/core/templates/fragments/validate.d.ts +13 -0
- package/dist/core/templates/fragments/validate.d.ts.map +1 -0
- package/dist/core/templates/fragments/validate.js +13 -0
- package/dist/core/templates/fragments/validate.js.map +1 -0
- package/dist/core/templates/fragments/verify.d.ts +9 -12
- package/dist/core/templates/fragments/verify.d.ts.map +1 -1
- package/dist/core/templates/fragments/verify.js +9 -12
- package/dist/core/templates/fragments/verify.js.map +1 -1
- package/dist/core/templates/index.d.ts +0 -6
- package/dist/core/templates/index.d.ts.map +1 -1
- package/dist/core/templates/index.js +0 -7
- package/dist/core/templates/index.js.map +1 -1
- package/dist/core/templates/skill-templates.d.ts +1 -5
- package/dist/core/templates/skill-templates.d.ts.map +1 -1
- package/dist/core/templates/skill-templates.js +0 -5
- package/dist/core/templates/skill-templates.js.map +1 -1
- package/dist/core/templates/types.d.ts +3 -7
- package/dist/core/templates/types.d.ts.map +1 -1
- package/dist/core/templates/types.js +0 -3
- package/dist/core/templates/types.js.map +1 -1
- package/dist/core/templates/workflows/apply.d.ts +3 -9
- package/dist/core/templates/workflows/apply.d.ts.map +1 -1
- package/dist/core/templates/workflows/apply.js +11 -13
- package/dist/core/templates/workflows/apply.js.map +1 -1
- package/dist/core/templates/workflows/archive.d.ts +0 -6
- package/dist/core/templates/workflows/archive.d.ts.map +1 -1
- package/dist/core/templates/workflows/archive.js +16 -5
- package/dist/core/templates/workflows/archive.js.map +1 -1
- package/dist/core/templates/workflows/decision.js +3 -3
- package/dist/core/templates/workflows/decision.js.map +1 -1
- package/dist/core/templates/workflows/explore.js +1 -1
- package/dist/core/templates/workflows/grill.d.ts.map +1 -1
- package/dist/core/templates/workflows/grill.js +0 -2
- package/dist/core/templates/workflows/grill.js.map +1 -1
- package/dist/core/templates/workflows/issue.d.ts +0 -6
- package/dist/core/templates/workflows/issue.d.ts.map +1 -1
- package/dist/core/templates/workflows/issue.js +3 -2
- package/dist/core/templates/workflows/issue.js.map +1 -1
- package/dist/core/templates/workflows/propose.d.ts +0 -6
- package/dist/core/templates/workflows/propose.d.ts.map +1 -1
- package/dist/core/templates/workflows/propose.js +2 -2
- package/dist/core/templates/workflows/propose.js.map +1 -1
- package/dist/core/templates/workflows/sync.d.ts +2 -8
- package/dist/core/templates/workflows/sync.d.ts.map +1 -1
- package/dist/core/templates/workflows/sync.js +4 -3
- package/dist/core/templates/workflows/sync.js.map +1 -1
- package/dist/core/templates/workflows/update.d.ts +0 -6
- package/dist/core/templates/workflows/update.d.ts.map +1 -1
- package/dist/core/templates/workflows/update.js +9 -2
- package/dist/core/templates/workflows/update.js.map +1 -1
- package/dist/core/update.d.ts +10 -36
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +59 -126
- package/dist/core/update.js.map +1 -1
- package/dist/core/user-state-migration.d.ts +13 -15
- package/dist/core/user-state-migration.d.ts.map +1 -1
- package/dist/core/user-state-migration.js +16 -20
- package/dist/core/user-state-migration.js.map +1 -1
- package/dist/core/validation/constants.d.ts +4 -10
- package/dist/core/validation/constants.d.ts.map +1 -1
- package/dist/core/validation/constants.js +25 -25
- package/dist/core/validation/constants.js.map +1 -1
- package/dist/core/validation/prose-length.d.ts +15 -0
- package/dist/core/validation/prose-length.d.ts.map +1 -0
- package/dist/core/validation/prose-length.js +29 -0
- package/dist/core/validation/prose-length.js.map +1 -0
- package/dist/core/validation/purpose-placeholder.d.ts +9 -16
- package/dist/core/validation/purpose-placeholder.d.ts.map +1 -1
- package/dist/core/validation/purpose-placeholder.js +30 -44
- package/dist/core/validation/purpose-placeholder.js.map +1 -1
- package/dist/core/validation/section-validator.d.ts +4 -4
- package/dist/core/validation/section-validator.d.ts.map +1 -1
- package/dist/core/validation/section-validator.js +30 -12
- package/dist/core/validation/section-validator.js.map +1 -1
- package/dist/core/validation/task-numbering.d.ts +6 -3
- package/dist/core/validation/task-numbering.d.ts.map +1 -1
- package/dist/core/validation/task-numbering.js +23 -11
- package/dist/core/validation/task-numbering.js.map +1 -1
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.d.ts.map +1 -1
- package/dist/core/validation/types.js +12 -1
- package/dist/core/validation/types.js.map +1 -1
- package/dist/core/validation/validator.d.ts +42 -68
- package/dist/core/validation/validator.d.ts.map +1 -1
- package/dist/core/validation/validator.js +468 -285
- package/dist/core/validation/validator.js.map +1 -1
- package/dist/prompts/searchable-multi-select.d.ts +3 -8
- package/dist/prompts/searchable-multi-select.d.ts.map +1 -1
- package/dist/prompts/searchable-multi-select.js +16 -39
- package/dist/prompts/searchable-multi-select.js.map +1 -1
- package/dist/utils/change-metadata.d.ts +11 -50
- package/dist/utils/change-metadata.d.ts.map +1 -1
- package/dist/utils/change-metadata.js +48 -67
- package/dist/utils/change-metadata.js.map +1 -1
- package/dist/utils/change-utils.d.ts +24 -76
- package/dist/utils/change-utils.d.ts.map +1 -1
- package/dist/utils/change-utils.js +95 -142
- package/dist/utils/change-utils.js.map +1 -1
- package/dist/utils/file-lock.d.ts +39 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +149 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/file-system.d.ts +12 -32
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +16 -40
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +7 -11
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +11 -11
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/interactive.d.ts +4 -9
- package/dist/utils/interactive.d.ts.map +1 -1
- package/dist/utils/interactive.js +2 -4
- package/dist/utils/interactive.js.map +1 -1
- package/dist/utils/item-discovery.d.ts +10 -20
- package/dist/utils/item-discovery.d.ts.map +1 -1
- package/dist/utils/item-discovery.js +31 -55
- package/dist/utils/item-discovery.js.map +1 -1
- package/dist/utils/link.d.ts +9 -18
- package/dist/utils/link.d.ts.map +1 -1
- package/dist/utils/link.js +9 -18
- package/dist/utils/link.js.map +1 -1
- package/dist/utils/requirement-diff.d.ts +13 -23
- package/dist/utils/requirement-diff.d.ts.map +1 -1
- package/dist/utils/requirement-diff.js +13 -23
- package/dist/utils/requirement-diff.js.map +1 -1
- package/dist/utils/spec-files.d.ts +7 -20
- package/dist/utils/spec-files.d.ts.map +1 -1
- package/dist/utils/spec-files.js +26 -51
- package/dist/utils/spec-files.js.map +1 -1
- package/dist/utils/task-progress.d.ts +11 -9
- package/dist/utils/task-progress.d.ts.map +1 -1
- package/dist/utils/task-progress.js +53 -32
- package/dist/utils/task-progress.js.map +1 -1
- package/dist/utils/timestamp.d.ts +5 -8
- package/dist/utils/timestamp.d.ts.map +1 -1
- package/dist/utils/timestamp.js +5 -8
- package/dist/utils/timestamp.js.map +1 -1
- package/package.json +2 -3
- package/schemas/issue/schema.yaml +8 -1
- package/schemas/issue/templates/spec.md +20 -3
- package/schemas/sdd/schema.yaml +20 -1
- package/schemas/sdd/templates/spec.md +20 -3
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
/**
|
|
3
|
-
* Zod schema for global Tospec configuration.
|
|
4
|
-
* Uses passthrough() to preserve unknown fields for forward compatibility.
|
|
5
|
-
*/
|
|
2
|
+
/** passthrough() preserves unknown fields, for forward compatibility. */
|
|
6
3
|
export const GlobalConfigSchema = z
|
|
7
4
|
.object({
|
|
8
5
|
profile: z
|
|
@@ -14,9 +11,6 @@ export const GlobalConfigSchema = z
|
|
|
14
11
|
.optional(),
|
|
15
12
|
})
|
|
16
13
|
.passthrough();
|
|
17
|
-
/**
|
|
18
|
-
* Default configuration values.
|
|
19
|
-
*/
|
|
20
14
|
export const DEFAULT_CONFIG = {
|
|
21
15
|
profile: 'core',
|
|
22
16
|
};
|
|
@@ -31,16 +25,12 @@ function hasUnsafeSegment(keys) {
|
|
|
31
25
|
}
|
|
32
26
|
/**
|
|
33
27
|
* True when a dot-notation key path contains a prototype-reaching segment.
|
|
34
|
-
*
|
|
35
|
-
* bypass this.
|
|
28
|
+
* `--allow-unknown` relaxes key validation, never this.
|
|
36
29
|
*/
|
|
37
30
|
export function hasUnsafeKeySegment(path) {
|
|
38
31
|
return hasUnsafeSegment(path.split('.'));
|
|
39
32
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Validate a config key path for CLI set operations.
|
|
42
|
-
* Unknown top-level keys are rejected unless explicitly allowed by the caller.
|
|
43
|
-
*/
|
|
33
|
+
/** Unknown top-level keys are rejected unless the caller allows them. */
|
|
44
34
|
export function validateConfigKeyPath(path) {
|
|
45
35
|
const rawKeys = path.split('.');
|
|
46
36
|
if (rawKeys.length === 0 || rawKeys.some((key) => key.trim() === '')) {
|
|
@@ -59,13 +49,7 @@ export function validateConfigKeyPath(path) {
|
|
|
59
49
|
}
|
|
60
50
|
return { valid: true };
|
|
61
51
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Get a nested value from an object using dot notation.
|
|
64
|
-
*
|
|
65
|
-
* @param obj - The object to access
|
|
66
|
-
* @param path - Dot-separated path (e.g., "featureFlags.someFlag")
|
|
67
|
-
* @returns The value at the path, or undefined if not found
|
|
68
|
-
*/
|
|
52
|
+
/** Reads `obj` at a dot-separated path, e.g. "featureFlags.someFlag". */
|
|
69
53
|
export function getNestedValue(obj, path) {
|
|
70
54
|
const keys = path.split('.');
|
|
71
55
|
if (hasUnsafeSegment(keys)) {
|
|
@@ -83,19 +67,12 @@ export function getNestedValue(obj, path) {
|
|
|
83
67
|
}
|
|
84
68
|
return current;
|
|
85
69
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Set a nested value in an object using dot notation.
|
|
88
|
-
* Creates intermediate objects as needed.
|
|
89
|
-
*
|
|
90
|
-
* @param obj - The object to modify (mutated in place)
|
|
91
|
-
* @param path - Dot-separated path (e.g., "featureFlags.someFlag")
|
|
92
|
-
* @param value - The value to set
|
|
93
|
-
*/
|
|
70
|
+
/** Writes `obj` at a dot-separated path, creating intermediate objects. */
|
|
94
71
|
export function setNestedValue(obj, path, value) {
|
|
95
72
|
const keys = path.split('.');
|
|
96
|
-
// Compared literally rather than through a helper, so the guard is plain to
|
|
97
|
-
//
|
|
98
|
-
//
|
|
73
|
+
// Compared literally rather than through a helper, so the guard is plain to
|
|
74
|
+
// static analysis. Checked for the whole path before anything is written, so
|
|
75
|
+
// a rejected key leaves no half-created objects.
|
|
99
76
|
for (const key of keys) {
|
|
100
77
|
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
|
101
78
|
return;
|
|
@@ -112,13 +89,7 @@ export function setNestedValue(obj, path, value) {
|
|
|
112
89
|
const lastKey = keys[keys.length - 1];
|
|
113
90
|
current[lastKey] = value;
|
|
114
91
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Delete a nested value from an object using dot notation.
|
|
117
|
-
*
|
|
118
|
-
* @param obj - The object to modify (mutated in place)
|
|
119
|
-
* @param path - Dot-separated path (e.g., "featureFlags.someFlag")
|
|
120
|
-
* @returns true if the key existed and was deleted, false otherwise
|
|
121
|
-
*/
|
|
92
|
+
/** Deletes `obj`'s value at a dot-separated path; false when it was absent. */
|
|
122
93
|
export function deleteNestedValue(obj, path) {
|
|
123
94
|
const keys = path.split('.');
|
|
124
95
|
for (const key of keys) {
|
|
@@ -127,38 +98,37 @@ export function deleteNestedValue(obj, path) {
|
|
|
127
98
|
}
|
|
128
99
|
}
|
|
129
100
|
let current = obj;
|
|
101
|
+
// Every container on the way down, so emptied parents can be pruned after
|
|
102
|
+
// the leaf goes: `unset foo.bar` used to leave `foo: {}` behind, a key
|
|
103
|
+
// `config list` then showed as if the user had set it.
|
|
104
|
+
const trail = [];
|
|
130
105
|
for (let i = 0; i < keys.length - 1; i++) {
|
|
131
106
|
const key = keys[i];
|
|
132
107
|
if (current[key] === undefined || current[key] === null || typeof current[key] !== 'object') {
|
|
133
108
|
return false;
|
|
134
109
|
}
|
|
110
|
+
trail.push({ parent: current, key });
|
|
135
111
|
current = current[key];
|
|
136
112
|
}
|
|
137
113
|
const lastKey = keys[keys.length - 1];
|
|
138
|
-
if (lastKey in current) {
|
|
139
|
-
|
|
140
|
-
|
|
114
|
+
if (!(lastKey in current)) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
delete current[lastKey];
|
|
118
|
+
for (let i = trail.length - 1; i >= 0; i--) {
|
|
119
|
+
const { parent, key } = trail[i];
|
|
120
|
+
const container = parent[key];
|
|
121
|
+
if (Object.keys(container).length > 0)
|
|
122
|
+
break;
|
|
123
|
+
delete parent[key];
|
|
141
124
|
}
|
|
142
|
-
return
|
|
125
|
+
return true;
|
|
143
126
|
}
|
|
144
127
|
/**
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
* - Everything else -> string
|
|
150
|
-
*
|
|
151
|
-
* @param value - The string value to coerce
|
|
152
|
-
* @param forceString - If true, always return the value as a string
|
|
153
|
-
* @returns The coerced value
|
|
154
|
-
*/
|
|
155
|
-
/**
|
|
156
|
-
* Config keys whose value is a list.
|
|
157
|
-
*
|
|
158
|
-
* Splitting on commas cannot be decided from the value alone: a string key such
|
|
159
|
-
* as `context` may legitimately contain commas, and turning that into an array
|
|
160
|
-
* would corrupt it. So the decision is keyed on the field, from the same schema
|
|
161
|
-
* that validates the result.
|
|
128
|
+
* Config keys whose value is a list. Splitting on commas cannot be decided from
|
|
129
|
+
* the value alone — a string key such as `context` may legitimately contain
|
|
130
|
+
* them — so the decision is keyed on the field, read from the same schema that
|
|
131
|
+
* validates the result.
|
|
162
132
|
*/
|
|
163
133
|
const ARRAY_VALUED_KEYS = new Set(Object.entries(GlobalConfigSchema.shape)
|
|
164
134
|
.filter(([, field]) => {
|
|
@@ -167,18 +137,18 @@ const ARRAY_VALUED_KEYS = new Set(Object.entries(GlobalConfigSchema.shape)
|
|
|
167
137
|
return inner instanceof z.ZodArray;
|
|
168
138
|
})
|
|
169
139
|
.map(([name]) => name));
|
|
140
|
+
/** Reads a CLI string as a boolean, number, JSON container, list, or string. */
|
|
170
141
|
export function coerceValue(value, forceString = false, key) {
|
|
171
142
|
if (forceString) {
|
|
172
143
|
return value;
|
|
173
144
|
}
|
|
174
|
-
// Boolean coercion
|
|
175
145
|
if (value === 'true') {
|
|
176
146
|
return true;
|
|
177
147
|
}
|
|
178
148
|
if (value === 'false') {
|
|
179
149
|
return false;
|
|
180
150
|
}
|
|
181
|
-
//
|
|
151
|
+
// Finite numbers only; `''`, `'NaN'` and `'Infinity'` stay strings.
|
|
182
152
|
const num = Number(value);
|
|
183
153
|
if (!isNaN(num) && isFinite(num) && value.trim() !== '') {
|
|
184
154
|
return num;
|
|
@@ -187,11 +157,9 @@ export function coerceValue(value, forceString = false, key) {
|
|
|
187
157
|
if (jsonContainer !== undefined) {
|
|
188
158
|
return jsonContainer;
|
|
189
159
|
}
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
//
|
|
193
|
-
// accepted form. JSON is tried first (above), so an explicit array literal
|
|
194
|
-
// still wins and `--string` still opts out entirely.
|
|
160
|
+
// `--tools a,b,c` already reads this way, so requiring a JSON array would make
|
|
161
|
+
// the syntax the CLI teaches elsewhere fail with a type error. JSON is tried
|
|
162
|
+
// first, so an explicit array literal still wins and `--string` opts out.
|
|
195
163
|
if (key !== undefined && ARRAY_VALUED_KEYS.has(key)) {
|
|
196
164
|
return value
|
|
197
165
|
.split(',')
|
|
@@ -221,12 +189,6 @@ function parseJsonContainer(value) {
|
|
|
221
189
|
}
|
|
222
190
|
return undefined;
|
|
223
191
|
}
|
|
224
|
-
/**
|
|
225
|
-
* Validate a configuration object against the schema.
|
|
226
|
-
*
|
|
227
|
-
* @param config - The configuration to validate
|
|
228
|
-
* @returns Validation result with success status and optional error message
|
|
229
|
-
*/
|
|
230
192
|
export function validateConfig(config) {
|
|
231
193
|
try {
|
|
232
194
|
GlobalConfigSchema.parse(config);
|
|
@@ -234,8 +196,7 @@ export function validateConfig(config) {
|
|
|
234
196
|
}
|
|
235
197
|
catch (error) {
|
|
236
198
|
if (error instanceof z.ZodError) {
|
|
237
|
-
const
|
|
238
|
-
const messages = zodError.issues.map((e) => `${e.path.join('.')}: ${e.message}`);
|
|
199
|
+
const messages = error.issues.map((e) => `${e.path.join('.')}: ${e.message}`);
|
|
239
200
|
return { success: false, error: messages.join('; ') };
|
|
240
201
|
}
|
|
241
202
|
return { success: false, error: 'Unknown validation error' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -5,35 +5,22 @@ export declare const TOSPEC_DIR_NAME = "tospec";
|
|
|
5
5
|
*/
|
|
6
6
|
export declare const TOOL_RULES_SUBDIR: readonly ['rules', 'tospec'];
|
|
7
7
|
/**
|
|
8
|
-
* The workflow rule document
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* the write target for rules-generation, and the durable proof that tospec
|
|
13
|
-
* currently manages a tool dir (`isToolInstalled`). Specifically this file and
|
|
14
|
-
* not the `rules/tospec/` directory: that directory also holds `decision.md`,
|
|
15
|
-
* which an older tospec wrote from init only — its presence says tospec touched
|
|
16
|
-
* the dir once, not that it manages it now. The two readings only agree while
|
|
17
|
-
* both sides read the name from here.
|
|
8
|
+
* The workflow rule document: both the write target for rules-generation and the
|
|
9
|
+
* proof that tospec currently manages a tool dir (`isToolInstalled`). This file,
|
|
10
|
+
* not the `rules/tospec/` directory, whose other contents only prove tospec
|
|
11
|
+
* touched the dir once.
|
|
18
12
|
*/
|
|
19
13
|
export declare const WORKFLOW_RULE_FILENAME = "single-source-of-truth.md";
|
|
20
14
|
/**
|
|
21
|
-
* The same document under its previous, misspelled name
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* leaving it beside the corrected one, where two rule files with the same body
|
|
25
|
-
* would both be loaded. Detection accepts it too, so a project that has not been
|
|
26
|
-
* updated yet still reads as installed.
|
|
15
|
+
* The same document under its previous, misspelled name. Kept so init/update can
|
|
16
|
+
* retire an older copy instead of loading two rule files with the same body;
|
|
17
|
+
* detection accepts it, so a not-yet-updated project still reads as installed.
|
|
27
18
|
*/
|
|
28
19
|
export declare const LEGACY_WORKFLOW_RULE_FILENAME = "single-sourc-of-truth.md";
|
|
29
20
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* Deliberately not usable as proof that tospec manages a tool dir: an older
|
|
34
|
-
* tospec wrote this file from init only, so a project can hold an untouched copy
|
|
35
|
-
* left by a version that no longer maintains it. `isToolInstalled` reads
|
|
36
|
-
* WORKFLOW_RULE_FILENAME for that reason.
|
|
21
|
+
* Written beside the workflow rule, but not proof that tospec manages a tool
|
|
22
|
+
* dir: an older tospec wrote it from init only, so a project can hold an
|
|
23
|
+
* untouched copy. `isToolInstalled` reads WORKFLOW_RULE_FILENAME.
|
|
37
24
|
*/
|
|
38
25
|
export declare const DECISION_RULE_FILENAME = "decision.md";
|
|
39
26
|
export interface TospecConfig {
|
|
@@ -47,36 +34,27 @@ export interface AIToolOption {
|
|
|
47
34
|
skillsDir?: string;
|
|
48
35
|
detectionPaths?: string[];
|
|
49
36
|
/**
|
|
50
|
-
* Tool ids this target is built out of.
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* hiding the relationship: every row stays a real, clearable choice, and the
|
|
54
|
-
* reason a row arrives uninvited is something the user can see.
|
|
37
|
+
* Tool ids this target is built out of. Selection expands along this edge
|
|
38
|
+
* instead of the menu hiding the relationship, so every row stays a real,
|
|
39
|
+
* clearable choice and the reason a row arrives uninvited is visible.
|
|
55
40
|
*/
|
|
56
41
|
requires?: string[];
|
|
57
42
|
/**
|
|
58
|
-
* Used when nothing was selected and nothing was detected.
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* the alternative is producing nothing on first setup.
|
|
43
|
+
* Used when nothing was selected and nothing was detected. Not "always
|
|
44
|
+
* written": clearing every checkbox writes nothing. This only decides what a
|
|
45
|
+
* non-interactive run with no information falls back to.
|
|
62
46
|
*/
|
|
63
47
|
fallback?: boolean;
|
|
64
48
|
}
|
|
65
49
|
export declare const AI_TOOLS: AIToolOption[];
|
|
66
50
|
/**
|
|
67
|
-
* Expands a selection along `requires`, dependencies first.
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* in order. Unknown ids are passed through untouched so the caller's own
|
|
72
|
-
* "unknown tool" error still fires instead of being silently dropped here.
|
|
51
|
+
* Expands a selection along `requires`, dependencies first. Order is part of the
|
|
52
|
+
* contract: callers write targets in the returned order, and the canonical
|
|
53
|
+
* directory must exist before anything is copied from it. Unknown ids pass
|
|
54
|
+
* through untouched so the caller's own "unknown tool" error still fires.
|
|
73
55
|
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* dependency, since the inner call pushes first — and the caller would then
|
|
77
|
-
* link into a directory nothing had written yet. There is no ordering that
|
|
78
|
-
* satisfies a cycle, so the table is wrong and has to say so at the point the
|
|
79
|
-
* edit is made.
|
|
56
|
+
* A cycle throws rather than resolving: no ordering satisfies one, so the table
|
|
57
|
+
* is wrong and has to say so.
|
|
80
58
|
*/
|
|
81
59
|
export declare function resolveToolSelection(toolIds: readonly string[]): string[];
|
|
82
60
|
/** Ids at least one other target is built from, so refreshing them fans out. */
|
|
@@ -84,11 +62,9 @@ export declare function dependencyToolIds(): string[];
|
|
|
84
62
|
/** Ids used when a non-interactive run detects nothing and names nothing. */
|
|
85
63
|
export declare function fallbackToolIds(): string[];
|
|
86
64
|
/**
|
|
87
|
-
* The target Codex reads from
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* matches it by coincidence and would drift the notice onto the wrong target
|
|
91
|
-
* the moment another row gained that property.
|
|
65
|
+
* The target Codex reads from. Named rather than derived: the predicates that
|
|
66
|
+
* select this row (dependency, fallback) match by coincidence, and would drift
|
|
67
|
+
* the Codex notice onto the wrong target once another row gained one.
|
|
92
68
|
*/
|
|
93
69
|
export declare const CODEX_TARGET_ID = "agents";
|
|
94
70
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAAI,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAAI,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,6BAA6B,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,EAAE,YAAY,EAMlC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAsBzE;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,WAAW,CAAC"}
|
package/dist/core/config.js
CHANGED
|
@@ -5,60 +5,39 @@ export const TOSPEC_DIR_NAME = 'tospec';
|
|
|
5
5
|
*/
|
|
6
6
|
export const TOOL_RULES_SUBDIR = ['rules', 'tospec'];
|
|
7
7
|
/**
|
|
8
|
-
* The workflow rule document
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* the write target for rules-generation, and the durable proof that tospec
|
|
13
|
-
* currently manages a tool dir (`isToolInstalled`). Specifically this file and
|
|
14
|
-
* not the `rules/tospec/` directory: that directory also holds `decision.md`,
|
|
15
|
-
* which an older tospec wrote from init only — its presence says tospec touched
|
|
16
|
-
* the dir once, not that it manages it now. The two readings only agree while
|
|
17
|
-
* both sides read the name from here.
|
|
8
|
+
* The workflow rule document: both the write target for rules-generation and the
|
|
9
|
+
* proof that tospec currently manages a tool dir (`isToolInstalled`). This file,
|
|
10
|
+
* not the `rules/tospec/` directory, whose other contents only prove tospec
|
|
11
|
+
* touched the dir once.
|
|
18
12
|
*/
|
|
19
13
|
export const WORKFLOW_RULE_FILENAME = 'single-source-of-truth.md';
|
|
20
14
|
/**
|
|
21
|
-
* The same document under its previous, misspelled name
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* leaving it beside the corrected one, where two rule files with the same body
|
|
25
|
-
* would both be loaded. Detection accepts it too, so a project that has not been
|
|
26
|
-
* updated yet still reads as installed.
|
|
15
|
+
* The same document under its previous, misspelled name. Kept so init/update can
|
|
16
|
+
* retire an older copy instead of loading two rule files with the same body;
|
|
17
|
+
* detection accepts it, so a not-yet-updated project still reads as installed.
|
|
27
18
|
*/
|
|
28
19
|
export const LEGACY_WORKFLOW_RULE_FILENAME = 'single-sourc-of-truth.md';
|
|
29
20
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* Deliberately not usable as proof that tospec manages a tool dir: an older
|
|
34
|
-
* tospec wrote this file from init only, so a project can hold an untouched copy
|
|
35
|
-
* left by a version that no longer maintains it. `isToolInstalled` reads
|
|
36
|
-
* WORKFLOW_RULE_FILENAME for that reason.
|
|
21
|
+
* Written beside the workflow rule, but not proof that tospec manages a tool
|
|
22
|
+
* dir: an older tospec wrote it from init only, so a project can hold an
|
|
23
|
+
* untouched copy. `isToolInstalled` reads WORKFLOW_RULE_FILENAME.
|
|
37
24
|
*/
|
|
38
25
|
export const DECISION_RULE_FILENAME = 'decision.md';
|
|
39
26
|
export const AI_TOOLS = [
|
|
40
|
-
// `.agents`
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
// Codex is deliberately absent as a row of its own: it reads skills from
|
|
44
|
-
// `.agents`, so a `.codex` target was a second copy nothing ever loaded.
|
|
27
|
+
// `.agents` holds the canonical copy every other target is built from, and is
|
|
28
|
+
// where Codex reads skills, so Codex has no row of its own: a `.codex` target
|
|
29
|
+
// would be a second copy nothing loads.
|
|
45
30
|
{ name: 'Agents', value: 'agents', available: true, successLabel: 'Agents', skillsDir: '.agents', fallback: true },
|
|
46
31
|
{ name: 'Claude Code', value: 'claude', available: true, successLabel: 'Claude Code', skillsDir: '.claude', requires: ['agents'] }
|
|
47
32
|
];
|
|
48
33
|
/**
|
|
49
|
-
* Expands a selection along `requires`, dependencies first.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* in order. Unknown ids are passed through untouched so the caller's own
|
|
54
|
-
* "unknown tool" error still fires instead of being silently dropped here.
|
|
34
|
+
* Expands a selection along `requires`, dependencies first. Order is part of the
|
|
35
|
+
* contract: callers write targets in the returned order, and the canonical
|
|
36
|
+
* directory must exist before anything is copied from it. Unknown ids pass
|
|
37
|
+
* through untouched so the caller's own "unknown tool" error still fires.
|
|
55
38
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* dependency, since the inner call pushes first — and the caller would then
|
|
59
|
-
* link into a directory nothing had written yet. There is no ordering that
|
|
60
|
-
* satisfies a cycle, so the table is wrong and has to say so at the point the
|
|
61
|
-
* edit is made.
|
|
39
|
+
* A cycle throws rather than resolving: no ordering satisfies one, so the table
|
|
40
|
+
* is wrong and has to say so.
|
|
62
41
|
*/
|
|
63
42
|
export function resolveToolSelection(toolIds) {
|
|
64
43
|
const resolved = [];
|
|
@@ -90,11 +69,9 @@ export function fallbackToolIds() {
|
|
|
90
69
|
return AI_TOOLS.filter((tool) => tool.fallback && tool.skillsDir).map((tool) => tool.value);
|
|
91
70
|
}
|
|
92
71
|
/**
|
|
93
|
-
* The target Codex reads from
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* matches it by coincidence and would drift the notice onto the wrong target
|
|
97
|
-
* the moment another row gained that property.
|
|
72
|
+
* The target Codex reads from. Named rather than derived: the predicates that
|
|
73
|
+
* select this row (dependency, fallback) match by coincidence, and would drift
|
|
74
|
+
* the Codex notice onto the wrong target once another row gained one.
|
|
98
75
|
*/
|
|
99
76
|
export const CODEX_TARGET_ID = 'agents';
|
|
100
77
|
//# sourceMappingURL=config.js.map
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,0BAA0B,CAAC;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AA2BpD,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,8EAA8E;IAC9E,8EAA8E;IAC9E,wCAAwC;IACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClH,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE;CACnI,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA0B;IAC7D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAQ,EAAE;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO;QAClC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,4CAA4C,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;gBACpF,sFAAsF,CACzF,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACpF,KAAK,CAAC,UAAU,CAAC,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,OAAO;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dashboard git activity + health signals (ADR 001, D4-D7, D12, D16).
|
|
3
3
|
*
|
|
4
|
-
* Two `git log` runs produce a 30-day daily series: commits repo-wide vs
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* can exercise it without a repo.
|
|
4
|
+
* Two `git log` runs produce a 30-day daily series: commits repo-wide vs commits
|
|
5
|
+
* touching `tospec/`. The gap between the two is the spec-drift signal. Pure
|
|
6
|
+
* aggregation is split from the git-spawning wrapper so tests need no repo.
|
|
8
7
|
*/
|
|
9
8
|
export declare const DEFAULT_STALE_DAYS = 14;
|
|
10
9
|
/** Series window: trailing day count, or 'all' for the full git history. */
|
|
@@ -40,11 +39,10 @@ export declare function historySpanDays(repoDates: string[], tospecDates: string
|
|
|
40
39
|
/** Stale-change threshold from tospec/config.yaml, defaulting to 14 days. */
|
|
41
40
|
export declare function resolveStaleDays(projectRoot: string): number;
|
|
42
41
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* config, not git, so it is always populated.
|
|
42
|
+
* The activity payload. `changeName` narrows the tospec series to that change's
|
|
43
|
+
* directory; the repo series stays repo-wide. `window` is the trailing day count
|
|
44
|
+
* (default 30) or 'all'. Git being unavailable degrades to `{available: false}`
|
|
45
|
+
* (D6) — staleDays comes from config, so it is always populated.
|
|
48
46
|
*/
|
|
49
47
|
export declare function collectActivity(projectRoot: string, changeName?: string, window?: ActivityWindow): Promise<DashboardActivity>;
|
|
50
48
|
//# sourceMappingURL=dashboard-activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-activity.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-activity.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dashboard-activity.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-activity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAIrC,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,MAAsB,EAC5B,KAAK,GAAE,IAAiB,GACvB,WAAW,EAAE,CAaf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EAAE,EACnB,iBAAiB,EAAE,MAAM,EACzB,UAAU,GAAE,MAA0B,GACrC,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,MAAsB,EAC/B,KAAK,GAAE,IAAiB,GACvB,MAAM,CAWR;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5D;AAsCD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,cAA8B,GACrC,OAAO,CAAC,iBAAiB,CAAC,CA+B5B"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dashboard git activity + health signals (ADR 001, D4-D7, D12, D16).
|
|
3
3
|
*
|
|
4
|
-
* Two `git log` runs produce a 30-day daily series: commits repo-wide vs
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* can exercise it without a repo.
|
|
4
|
+
* Two `git log` runs produce a 30-day daily series: commits repo-wide vs commits
|
|
5
|
+
* touching `tospec/`. The gap between the two is the spec-drift signal. Pure
|
|
6
|
+
* aggregation is split from the git-spawning wrapper so tests need no repo.
|
|
8
7
|
*/
|
|
9
8
|
import { execFile } from 'node:child_process';
|
|
10
9
|
import { promisify } from 'node:util';
|
|
@@ -15,9 +14,6 @@ const execFileAsync = promisify(execFile);
|
|
|
15
14
|
export const DEFAULT_STALE_DAYS = 14;
|
|
16
15
|
const ACTIVITY_DAYS = 30;
|
|
17
16
|
const DRIFT_WINDOW_DAYS = 7;
|
|
18
|
-
// -----------------------------------------------------------------------------
|
|
19
|
-
// Pure aggregation (unit-testable)
|
|
20
|
-
// -----------------------------------------------------------------------------
|
|
21
17
|
/**
|
|
22
18
|
* Buckets two lists of commit dates (yyyy-mm-dd, from `git log --date=short`)
|
|
23
19
|
* into a zero-filled daily series covering the last `days` days ending `today`.
|
|
@@ -77,9 +73,6 @@ export function resolveStaleDays(projectRoot) {
|
|
|
77
73
|
return DEFAULT_STALE_DAYS;
|
|
78
74
|
}
|
|
79
75
|
}
|
|
80
|
-
// -----------------------------------------------------------------------------
|
|
81
|
-
// Git wrapper
|
|
82
|
-
// -----------------------------------------------------------------------------
|
|
83
76
|
/** Commit dates (yyyy-mm-dd, one per commit), newest first. */
|
|
84
77
|
async function gitLogDates(projectRoot, window, pathFilters) {
|
|
85
78
|
const args = ['log', '--format=%cd', '--date=short'];
|
|
@@ -87,8 +80,8 @@ async function gitLogDates(projectRoot, window, pathFilters) {
|
|
|
87
80
|
args.splice(1, 0, `--since=${window} days ago`);
|
|
88
81
|
if (pathFilters)
|
|
89
82
|
args.push('--', ...pathFilters);
|
|
90
|
-
// windowsHide: git is a console app
|
|
91
|
-
//
|
|
83
|
+
// windowsHide: git is a console app, and the dashboard runs several of these
|
|
84
|
+
// per activity refresh — each would flash a window on Windows.
|
|
92
85
|
const { stdout } = await execFileAsync('git', args, { cwd: projectRoot, windowsHide: true });
|
|
93
86
|
return stdout.split(/\r?\n/).filter((line) => /^\d{4}-\d{2}-\d{2}$/.test(line));
|
|
94
87
|
}
|
|
@@ -96,19 +89,29 @@ async function gitLogDates(projectRoot, window, pathFilters) {
|
|
|
96
89
|
async function gitUnavailableReason(projectRoot) {
|
|
97
90
|
try {
|
|
98
91
|
await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], { cwd: projectRoot, windowsHide: true });
|
|
99
|
-
return null;
|
|
100
92
|
}
|
|
101
93
|
catch (err) {
|
|
102
94
|
const code = err.code;
|
|
103
95
|
return code === 'ENOENT' ? 'git not found' : 'not a git repository';
|
|
104
96
|
}
|
|
97
|
+
// A freshly `git init`ed repo passes the work-tree check but has no HEAD, and
|
|
98
|
+
// `git log` there exits non-zero ("does not have any commits yet") — which
|
|
99
|
+
// surfaced as a 500 from /api/activity on exactly the project a first-time
|
|
100
|
+
// dashboard user has. Unborn HEAD is the same "nothing to chart" case as no
|
|
101
|
+
// repo at all, so it degrades the same way.
|
|
102
|
+
try {
|
|
103
|
+
await execFileAsync('git', ['rev-parse', '--verify', '--quiet', 'HEAD'], { cwd: projectRoot, windowsHide: true });
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return 'no commits yet';
|
|
108
|
+
}
|
|
105
109
|
}
|
|
106
110
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* config, not git, so it is always populated.
|
|
111
|
+
* The activity payload. `changeName` narrows the tospec series to that change's
|
|
112
|
+
* directory; the repo series stays repo-wide. `window` is the trailing day count
|
|
113
|
+
* (default 30) or 'all'. Git being unavailable degrades to `{available: false}`
|
|
114
|
+
* (D6) — staleDays comes from config, so it is always populated.
|
|
112
115
|
*/
|
|
113
116
|
export async function collectActivity(projectRoot, changeName, window = ACTIVITY_DAYS) {
|
|
114
117
|
const staleDays = resolveStaleDays(projectRoot);
|
|
@@ -117,10 +120,9 @@ export async function collectActivity(projectRoot, changeName, window = ACTIVITY
|
|
|
117
120
|
return { available: false, reason, days: [], specDrift: false, staleDays };
|
|
118
121
|
}
|
|
119
122
|
// `tospec migrate` copies openspec/ into tospec/, so commit history for
|
|
120
|
-
// migrated changes lives under openspec/ paths. A pathspec
|
|
121
|
-
//
|
|
122
|
-
// Limitation: only
|
|
123
|
-
// migrate source dirs in config if anyone needs them counted.
|
|
123
|
+
// migrated changes lives under openspec/ paths. A pathspec matching nothing
|
|
124
|
+
// is harmless, so the legacy prefix is always included.
|
|
125
|
+
// Limitation: only the default `openspec` source dir.
|
|
124
126
|
const pathFilters = changeName
|
|
125
127
|
? [`tospec/changes/${changeName}/`, `openspec/changes/${changeName}/`]
|
|
126
128
|
: ['tospec/', 'openspec/'];
|
|
@@ -128,8 +130,8 @@ export async function collectActivity(projectRoot, changeName, window = ACTIVITY
|
|
|
128
130
|
gitLogDates(projectRoot, window),
|
|
129
131
|
gitLogDates(projectRoot, window, pathFilters),
|
|
130
132
|
]);
|
|
131
|
-
// Limitation: 'all' zero-fills one entry per day since the first commit
|
|
132
|
-
// decade-old repo
|
|
133
|
+
// Limitation: 'all' zero-fills one entry per day since the first commit, so a
|
|
134
|
+
// decade-old repo yields a few thousand points.
|
|
133
135
|
const spanDays = window === 'all' ? historySpanDays(repoDates, tospecDates) : window;
|
|
134
136
|
const days = aggregateDaily(repoDates, tospecDates, spanDays);
|
|
135
137
|
// Drift only makes sense repo-wide, not for a single change's series.
|