Feature/migrate python to typescript #5

Closed
andreferraro wants to merge 5 commits from feature/migrate-python-to-typescript into main
Owner

PR Type

Enhancement, Documentation


Description

  • Bootstrap Spec Kit SDD workflow with PowerShell scripts

  • Add Cursor skills for Spec Kit command integration

  • Include TicketLab constitution and project templates

  • Configure Spec Kit integration and initialization options


Diagram Walkthrough

flowchart LR
  A["PowerShell Scripts"] --> B["Spec Kit Workflow"]
  C["Cursor Skills"] --> B
  D["Constitution & Templates"] --> B
  B --> E["SDD Ready Project"]

File Walkthrough

Relevant files
Enhancement
3 files
common.ps1
Add common PowerShell functions for Spec Kit                         
+796/-0 
create-new-feature.ps1
Add feature creation script                                                           
+319/-0 
check-prerequisites.ps1
Add prerequisites check script                                                     
+169/-0 
Documentation
7 files
SKILL.md
Add specify skill documentation                                                   
+345/-0 
SKILL.md
Add clarify skill documentation                                                   
+291/-0 
SKILL.md
Add analyze skill documentation                                                   
+259/-0 
SKILL.md
Add checklist skill documentation                                               
+373/-0 
constitution.md
Add TicketLab constitution                                                             
+141/-0 
checklist-template.md
Add checklist template                                                                     
+40/-0   
ticketlab-sdd-workflow.mdc
Add SDD workflow rules                                                                     
+105/-0 
Configuration changes
2 files
integration.json
Add Spec Kit integration config                                                   
+15/-0   
init-options.json
Add initialization options config                                               
+9/-0     
Additional files
16 files
graphify.mdc +21/-0   
ponytail.mdc +36/-0   
SKILL.md +177/-0 
SKILL.md +277/-0 
SKILL.md +223/-0 
SKILL.md +166/-0 
SKILL.md +214/-0 
SKILL.md +109/-0 
.env.example +13/-0   
cursor-agent.manifest.json +17/-0   
speckit.manifest.json +19/-0   
.constitution-template.json +4/-0     
resolve-template.ps1 +38/-0   
setup-plan.ps1 +83/-0   
setup-tasks.ps1 +88/-0   
constitution-template.md +50/-0   

### **PR Type** Enhancement, Documentation ___ ### **Description** - Bootstrap Spec Kit SDD workflow with PowerShell scripts - Add Cursor skills for Spec Kit command integration - Include TicketLab constitution and project templates - Configure Spec Kit integration and initialization options ___ ### Diagram Walkthrough ```mermaid flowchart LR A["PowerShell Scripts"] --> B["Spec Kit Workflow"] C["Cursor Skills"] --> B D["Constitution & Templates"] --> B B --> E["SDD Ready Project"] ``` <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>3 files</summary><table> <tr> <td><strong>common.ps1</strong><dd><code>Add common PowerShell functions for Spec Kit</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/common.ps1">+796/-0</a>&nbsp; </td> </tr> <tr> <td><strong>create-new-feature.ps1</strong><dd><code>Add feature creation script</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/create-new-feature.ps1">+319/-0</a>&nbsp; </td> </tr> <tr> <td><strong>check-prerequisites.ps1</strong><dd><code>Add prerequisites check script</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/check-prerequisites.ps1">+169/-0</a>&nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>7 files</summary><table> <tr> <td><strong>SKILL.md</strong><dd><code>Add specify skill documentation</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-specify/SKILL.md">+345/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong><dd><code>Add clarify skill documentation</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-clarify/SKILL.md">+291/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong><dd><code>Add analyze skill documentation</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-analyze/SKILL.md">+259/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong><dd><code>Add checklist skill documentation</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-checklist/SKILL.md">+373/-0</a>&nbsp; </td> </tr> <tr> <td><strong>constitution.md</strong><dd><code>Add TicketLab constitution</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/memory/constitution.md">+141/-0</a>&nbsp; </td> </tr> <tr> <td><strong>checklist-template.md</strong><dd><code>Add checklist template</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/templates/checklist-template.md">+40/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>ticketlab-sdd-workflow.mdc</strong><dd><code>Add SDD workflow rules</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/rules/ticketlab-sdd-workflow.mdc">+105/-0</a>&nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Configuration changes</strong></td><td><details><summary>2 files</summary><table> <tr> <td><strong>integration.json</strong><dd><code>Add Spec Kit integration config</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/integration.json">+15/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>init-options.json</strong><dd><code>Add initialization options config</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/init-options.json">+9/-0</a>&nbsp; &nbsp; &nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Additional files</strong></td><td><details><summary>16 files</summary><table> <tr> <td><strong>graphify.mdc</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/rules/graphify.mdc">+21/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>ponytail.mdc</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/rules/ponytail.mdc">+36/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-constitution/SKILL.md">+177/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-converge/SKILL.md">+277/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-implement/SKILL.md">+223/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-plan/SKILL.md">+166/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-tasks/SKILL.md">+214/-0</a>&nbsp; </td> </tr> <tr> <td><strong>SKILL.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-taskstoissues/SKILL.md">+109/-0</a>&nbsp; </td> </tr> <tr> <td><strong>.env.example</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.env.example">+13/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>cursor-agent.manifest.json</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/integrations/cursor-agent.manifest.json">+17/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>speckit.manifest.json</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/integrations/speckit.manifest.json">+19/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>.constitution-template.json</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/memory/.constitution-template.json">+4/-0</a>&nbsp; &nbsp; &nbsp; </td> </tr> <tr> <td><strong>resolve-template.ps1</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/resolve-template.ps1">+38/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>setup-plan.ps1</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/setup-plan.ps1">+83/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>setup-tasks.ps1</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/setup-tasks.ps1">+88/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>constitution-template.md</strong></td> <td><a href="https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/templates/constitution-template.md">+50/-0</a>&nbsp; &nbsp; </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___
andreferraro added 5 commits 2026-08-11 14:59:29 -03:00
feat: add greet helper and document Sonar quality gate
sonar / sonar (push) Skipped
sonar / sonar (pull_request) Successful in 28s
7b73b8a876
Co-authored-by: Cursor <cursoragent@cursor.com>
Reviewed-on: #1
feat: migrate hello baseline from Python to TypeScript
sonar / sonar (push) Skipped
sonar / sonar (pull_request) Successful in 39s
fc577aadf1
Replace the greenfield Python hello world with a Node.js 22/TypeScript/npm toolchain while preserving the existing greeting behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
feat: bootstrap Spec Kit SDD workflow and TicketLab constitution
sonar / sonar (push) Skipped
sonar / sonar (pull_request) Successful in 41s
5307e2a9fa
Add Spec Kit (cursor-agent), Constitution 1.0.1, Cursor skills/rules, and tooling docs so workshop agents follow Plane-backed SDD with versioned agent assets.

Co-authored-by: Cursor <cursoragent@cursor.com>
feat: add lab SQLite migrate, LiteLLM env, and OTEL/Grafana stack
sonar / sonar (push) Skipped
sonar / sonar (pull_request) Failing after 40s
3b5c3fb86f
Enable local workshop readiness with executable SQLite migrations, OpenTelemetry hello signals, and a provisioned Grafana demo dashboard over Tempo/Loki/Prometheus.

Co-authored-by: Cursor <cursoragent@cursor.com>
andreferraro closed this pull request 2026-08-11 15:01:53 -03:00
Author
Owner

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Missing -LiteralPath

The Test-Path call at line 189 checks for feature.json without -LiteralPath, while other path checks in the same file consistently use -LiteralPath. If the repository root path contains wildcard characters (e.g., square brackets), this check could misinterpret the path and fail to locate the file, breaking feature resolution for projects in such directories.

} elseif (Test-Path $featureJson) {
Invalid PowerShell command

The skill instructs the agent to run mkdir -p SPECIFY_FEATURE_DIRECTORY, which is a Unix command. In PowerShell, mkdir is an alias for New-Item and does not accept the -p flag. This will cause a parameter binding error and break the spec creation workflow on Windows/PowerShell environments.

- `mkdir -p SPECIFY_FEATURE_DIRECTORY`
Incomplete path traversal check

The regex \.\.[\\/] at line 686 only catches parent directory traversal when followed by a path separator. It misses .. at the end of a path without a trailing separator (e.g., foo/..). While manifests are typically trusted, this could allow path traversal if an attacker can influence the manifest file path to reference files outside the preset directory.

if ([System.IO.Path]::IsPathRooted($manifestFilePath) -or $manifestFilePath -match '\.\.[\\/]') {
## PR Reviewer Guide 🔍 Here are some key observations to aid the review process: <table> <tr><td>⏱️&nbsp;<strong>Estimated effort to review</strong>: 3 🔵🔵🔵⚪⚪</td></tr> <tr><td>🧪&nbsp;<strong>No relevant tests</strong></td></tr> <tr><td>🔒&nbsp;<strong>No security concerns identified</strong></td></tr> <tr><td>⚡&nbsp;<strong>Recommended focus areas for review</strong><br><br> <details><summary><a href='https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/common.ps1#L189-L189'><strong>Missing -LiteralPath</strong></a> The Test-Path call at line 189 checks for feature.json without -LiteralPath, while other path checks in the same file consistently use -LiteralPath. If the repository root path contains wildcard characters (e.g., square brackets), this check could misinterpret the path and fail to locate the file, breaking feature resolution for projects in such directories. </summary> ```powershell } elseif (Test-Path $featureJson) { ``` </details> <details><summary><a href='https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.cursor/skills/speckit-specify/SKILL.md#L94-L94'><strong>Invalid PowerShell command</strong></a> The skill instructs the agent to run `mkdir -p SPECIFY_FEATURE_DIRECTORY`, which is a Unix command. In PowerShell, `mkdir` is an alias for New-Item and does not accept the `-p` flag. This will cause a parameter binding error and break the spec creation workflow on Windows/PowerShell environments. </summary> ```markdown - `mkdir -p SPECIFY_FEATURE_DIRECTORY` ``` </details> <details><summary><a href='https://gitea.app.andreferraro.com/andreferraro/TicketLab_MCP/src/branch/feature/migrate-python-to-typescript/.specify/scripts/powershell/common.ps1#L686-L686'><strong>Incomplete path traversal check</strong></a> The regex `\.\.[\\/]` at line 686 only catches parent directory traversal when followed by a path separator. It misses `..` at the end of a path without a trailing separator (e.g., `foo/..`). While manifests are typically trusted, this could allow path traversal if an attacker can influence the manifest file path to reference files outside the preset directory. </summary> ```powershell if ([System.IO.Path]::IsPathRooted($manifestFilePath) -or $manifestFilePath -match '\.\.[\\/]') { ``` </details> </td></tr> </table>
Author
Owner

Failed to generate code suggestions for PR

Failed to generate code suggestions for PR

Pull request closed

Please reopen this pull request to perform a merge.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: andreferraro/TicketLab_MCP#5