@specforge/mcp 3.2.3 → 3.3.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.
Files changed (148) hide show
  1. package/README.md +1 -1
  2. package/dist/autopilot/api/autopilot-api-client.js +1 -1
  3. package/dist/autopilot/api/autopilot-api-client.js.map +1 -1
  4. package/dist/cli/commands/complete.d.ts +14 -0
  5. package/dist/cli/commands/complete.d.ts.map +1 -0
  6. package/dist/cli/commands/complete.js +96 -0
  7. package/dist/cli/commands/complete.js.map +1 -0
  8. package/dist/cli/commands/docs/content/examples.d.ts.map +1 -1
  9. package/dist/cli/commands/docs/content/examples.js +35 -40
  10. package/dist/cli/commands/docs/content/examples.js.map +1 -1
  11. package/dist/cli/commands/docs/content/workflow.d.ts.map +1 -1
  12. package/dist/cli/commands/docs/content/workflow.js +9 -13
  13. package/dist/cli/commands/docs/content/workflow.js.map +1 -1
  14. package/dist/cli/commands/index.d.ts +2 -0
  15. package/dist/cli/commands/index.d.ts.map +1 -1
  16. package/dist/cli/commands/index.js +2 -0
  17. package/dist/cli/commands/index.js.map +1 -1
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +100 -14
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/init.types.d.ts +2 -0
  22. package/dist/cli/commands/init.types.d.ts.map +1 -1
  23. package/dist/cli/commands/init.types.js.map +1 -1
  24. package/dist/cli/commands/review-planning.d.ts +1 -0
  25. package/dist/cli/commands/review-planning.d.ts.map +1 -1
  26. package/dist/cli/commands/review-planning.js +2 -0
  27. package/dist/cli/commands/review-planning.js.map +1 -1
  28. package/dist/cli/commands/scaffold/agent-types.d.ts +1 -7
  29. package/dist/cli/commands/scaffold/agent-types.d.ts.map +1 -1
  30. package/dist/cli/commands/scaffold/agent-types.js +0 -12
  31. package/dist/cli/commands/scaffold/agent-types.js.map +1 -1
  32. package/dist/cli/commands/scaffold/types.d.ts +1 -7
  33. package/dist/cli/commands/scaffold/types.d.ts.map +1 -1
  34. package/dist/cli/commands/scaffold/types.js +2 -7
  35. package/dist/cli/commands/scaffold/types.js.map +1 -1
  36. package/dist/cli/commands/set-status.d.ts +14 -0
  37. package/dist/cli/commands/set-status.d.ts.map +1 -0
  38. package/dist/cli/commands/set-status.js +109 -0
  39. package/dist/cli/commands/set-status.js.map +1 -0
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +5 -1
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +3 -2
  44. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -1
  45. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +118 -61
  46. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -1
  47. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts +3 -2
  48. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -1
  49. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +302 -81
  50. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -1
  51. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +3 -2
  52. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -1
  53. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +209 -83
  54. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -1
  55. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts +2 -2
  56. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts.map +1 -1
  57. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js +84 -106
  58. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js.map +1 -1
  59. package/dist/cli/templates/agents/index.d.ts.map +1 -1
  60. package/dist/cli/templates/agents/index.js +0 -23
  61. package/dist/cli/templates/agents/index.js.map +1 -1
  62. package/dist/cli/templates/commands.d.ts +0 -3
  63. package/dist/cli/templates/commands.d.ts.map +1 -1
  64. package/dist/cli/templates/commands.js +0 -89
  65. package/dist/cli/templates/commands.js.map +1 -1
  66. package/dist/cli/templates/content/sf-blockers.d.ts +1 -1
  67. package/dist/cli/templates/content/sf-blockers.d.ts.map +1 -1
  68. package/dist/cli/templates/content/sf-blockers.js +5 -2
  69. package/dist/cli/templates/content/sf-blockers.js.map +1 -1
  70. package/dist/cli/templates/content/sf-commit.d.ts +1 -1
  71. package/dist/cli/templates/content/sf-commit.d.ts.map +1 -1
  72. package/dist/cli/templates/content/sf-commit.js +11 -8
  73. package/dist/cli/templates/content/sf-commit.js.map +1 -1
  74. package/dist/cli/templates/content/sf-context.d.ts +1 -1
  75. package/dist/cli/templates/content/sf-context.d.ts.map +1 -1
  76. package/dist/cli/templates/content/sf-context.js +16 -15
  77. package/dist/cli/templates/content/sf-context.js.map +1 -1
  78. package/dist/cli/templates/content/sf-help.d.ts +1 -1
  79. package/dist/cli/templates/content/sf-help.d.ts.map +1 -1
  80. package/dist/cli/templates/content/sf-help.js +4 -21
  81. package/dist/cli/templates/content/sf-help.js.map +1 -1
  82. package/dist/cli/templates/content/sf-init.d.ts +1 -1
  83. package/dist/cli/templates/content/sf-init.d.ts.map +1 -1
  84. package/dist/cli/templates/content/sf-init.js +10 -7
  85. package/dist/cli/templates/content/sf-init.js.map +1 -1
  86. package/dist/cli/templates/content/sf-reset.d.ts +1 -1
  87. package/dist/cli/templates/content/sf-reset.d.ts.map +1 -1
  88. package/dist/cli/templates/content/sf-reset.js +10 -19
  89. package/dist/cli/templates/content/sf-reset.js.map +1 -1
  90. package/dist/cli/templates/content/sf-search.d.ts +1 -1
  91. package/dist/cli/templates/content/sf-search.d.ts.map +1 -1
  92. package/dist/cli/templates/content/sf-search.js +5 -4
  93. package/dist/cli/templates/content/sf-search.js.map +1 -1
  94. package/dist/cli/templates/content/sf-status.d.ts +1 -1
  95. package/dist/cli/templates/content/sf-status.d.ts.map +1 -1
  96. package/dist/cli/templates/content/sf-status.js +5 -8
  97. package/dist/cli/templates/content/sf-status.js.map +1 -1
  98. package/dist/cli/ui/banner.d.ts +17 -0
  99. package/dist/cli/ui/banner.d.ts.map +1 -0
  100. package/dist/cli/ui/banner.js +105 -0
  101. package/dist/cli/ui/banner.js.map +1 -0
  102. package/dist/tools/core/admin.js +5 -5
  103. package/dist/tools/core/admin.js.map +1 -1
  104. package/dist/tools/core/help.js +1 -1
  105. package/dist/tools/core/help.js.map +1 -1
  106. package/dist/tools/core/ticket.d.ts.map +1 -1
  107. package/dist/tools/core/ticket.js +12 -0
  108. package/dist/tools/core/ticket.js.map +1 -1
  109. package/dist/tools/index.js +4 -4
  110. package/dist/tools/index.js.map +1 -1
  111. package/dist/types/index.d.ts +2 -2
  112. package/dist/types/index.d.ts.map +1 -1
  113. package/dist/validation/index.js +1 -1
  114. package/dist/validation/index.js.map +1 -1
  115. package/package.json +1 -1
  116. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +118 -61
  117. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +302 -81
  118. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +209 -83
  119. package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +84 -106
  120. package/src/cli/templates/agents/index.ts +0 -27
  121. package/src/cli/templates/commands.ts +0 -89
  122. package/src/cli/templates/content/sf-blockers.ts +5 -2
  123. package/src/cli/templates/content/sf-commit.ts +11 -8
  124. package/src/cli/templates/content/sf-context.ts +16 -15
  125. package/src/cli/templates/content/sf-help.ts +4 -21
  126. package/src/cli/templates/content/sf-init.ts +10 -7
  127. package/src/cli/templates/content/sf-reset.ts +10 -19
  128. package/src/cli/templates/content/sf-search.ts +5 -4
  129. package/src/cli/templates/content/sf-status.ts +5 -8
  130. package/src/cli/templates/skills/specforge-orchestrator.md +1 -1
  131. package/src/cli/templates/skills/specforge-worker.md +51 -19
  132. package/src/cli/templates/agents/content/core/sfag-implementer.ts +0 -113
  133. package/src/cli/templates/agents/content/task-type/sfag-api-implementer.ts +0 -132
  134. package/src/cli/templates/agents/content/task-type/sfag-docs-writer.ts +0 -183
  135. package/src/cli/templates/agents/content/task-type/sfag-frontend-builder.ts +0 -141
  136. package/src/cli/templates/agents/content/task-type/sfag-infra-architect.ts +0 -149
  137. package/src/cli/templates/agents/content/task-type/sfag-schema-designer.ts +0 -132
  138. package/src/cli/templates/agents/content/task-type/sfag-test-writer.ts +0 -171
  139. package/src/cli/templates/content/sf-autonomous.ts +0 -78
  140. package/src/cli/templates/content/sf-create-epics.ts +0 -129
  141. package/src/cli/templates/content/sf-create-spec.ts +0 -136
  142. package/src/cli/templates/content/sf-create-tickets.ts +0 -148
  143. package/src/cli/templates/content/sf-epic.ts +0 -69
  144. package/src/cli/templates/content/sf-import.ts +0 -88
  145. package/src/cli/templates/content/sf-next.ts +0 -67
  146. package/src/cli/templates/content/sf-review.ts +0 -67
  147. package/src/cli/templates/content/sf-ticket.ts +0 -76
  148. package/src/cli/templates/content/sf-validate.ts +0 -78
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/templates/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAEpF,0BAA0B;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAE3E,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF;;GAEG;AACH,MAAM,eAAe,GAAoB;IACvC,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,uBAAuB;IAEvB,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAEhB,kBAAkB;IAClB,uBAAuB;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IACzD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/templates/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,MAAM,eAAe,GAAoB;IACvC,iBAAiB;IACjB,iBAAiB;IACjB,uBAAuB;IACvB,uBAAuB;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IACzD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -5,9 +5,6 @@
5
5
  * for scaffolding to AI CLI tools.
6
6
  */
7
7
  import type { CommandTemplate } from '../commands/scaffold/types.js';
8
- /**
9
- * Get all command templates
10
- */
11
8
  export declare function getCommandTemplates(): CommandTemplate[];
12
9
  /**
13
10
  * Get a specific command template by name
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAsBrE;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAoIvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAEzE"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAWrE,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAyDvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAEzE"}
@@ -4,31 +4,16 @@
4
4
  * Defines all SpecForge slash commands with their full markdown content
5
5
  * for scaffolding to AI CLI tools.
6
6
  */
7
- // Import all command content
8
7
  import { SF_INIT_CONTENT } from './content/sf-init.js';
9
8
  import { SF_STATUS_CONTENT } from './content/sf-status.js';
10
- import { SF_NEXT_CONTENT } from './content/sf-next.js';
11
- import { SF_TICKET_IMPLEMENTATION_CONTENT } from './content/sf-ticket.js';
12
- import { SF_RUN_AUTONOMOUS_CONTENT } from './content/sf-autonomous.js';
13
- import { SF_REVIEW_CONTENT } from './content/sf-review.js';
14
- import { SF_VALIDATE_CONTENT } from './content/sf-validate.js';
15
9
  import { SF_RESET_CONTENT } from './content/sf-reset.js';
16
10
  import { SF_ANALYZE_BLOCKERS_CONTENT } from './content/sf-blockers.js';
17
- import { SF_IMPORT_PLAN_CONTENT } from './content/sf-import.js';
18
- import { SF_CREATE_SPEC_CONTENT } from './content/sf-create-spec.js';
19
- import { SF_CREATE_EPICS_CONTENT } from './content/sf-create-epics.js';
20
- import { SF_CREATE_TICKETS_CONTENT } from './content/sf-create-tickets.js';
21
11
  import { SF_CONTEXT_CONTENT } from './content/sf-context.js';
22
12
  import { SF_SEARCH_CONTENT } from './content/sf-search.js';
23
- import { SF_EPIC_CONTENT } from './content/sf-epic.js';
24
13
  import { SF_COMMIT_CONTENT } from './content/sf-commit.js';
25
14
  import { SF_HELP_CONTENT } from './content/sf-help.js';
26
- /**
27
- * Get all command templates
28
- */
29
15
  export function getCommandTemplates() {
30
16
  return [
31
- // Setup
32
17
  {
33
18
  name: 'sf-init',
34
19
  description: 'Initialize ticket system for a specification',
@@ -43,7 +28,6 @@ export function getCommandTemplates() {
43
28
  content: SF_CONTEXT_CONTENT,
44
29
  category: 'Setup',
45
30
  },
46
- // Status
47
31
  {
48
32
  name: 'sf-status',
49
33
  description: 'Display implementation status with consolidated tools',
@@ -51,77 +35,12 @@ export function getCommandTemplates() {
51
35
  content: SF_STATUS_CONTENT,
52
36
  category: 'Status',
53
37
  },
54
- {
55
- name: 'sf-validate',
56
- description: 'Validate ticket system health',
57
- argumentHint: '[specification-id]',
58
- content: SF_VALIDATE_CONTENT,
59
- category: 'Status',
60
- },
61
38
  {
62
39
  name: 'sf-analyze-blockers',
63
40
  description: 'Analyze blockers and dependency bottlenecks',
64
41
  content: SF_ANALYZE_BLOCKERS_CONTENT,
65
42
  category: 'Status',
66
43
  },
67
- // Implementation
68
- {
69
- name: 'sf-next',
70
- description: 'Quick start the next ready ticket',
71
- content: SF_NEXT_CONTENT,
72
- category: 'Implementation',
73
- },
74
- {
75
- name: 'sf-ticket-implementation',
76
- description: 'Implement a ticket with streamlined workflow',
77
- argumentHint: '[ticket-id]',
78
- content: SF_TICKET_IMPLEMENTATION_CONTENT,
79
- category: 'Implementation',
80
- },
81
- {
82
- name: 'sf-run-autonomous',
83
- description: 'Run autonomous implementation for multiple tickets',
84
- argumentHint: '[max-tickets]',
85
- content: SF_RUN_AUTONOMOUS_CONTENT,
86
- category: 'Implementation',
87
- },
88
- // Planning
89
- {
90
- name: 'sf-import-plan',
91
- description: 'Transform a plan into a complete SpecForge specification',
92
- argumentHint: '<plan-file-path>',
93
- content: SF_IMPORT_PLAN_CONTENT,
94
- category: 'Planning',
95
- },
96
- {
97
- name: 'sf-create-spec',
98
- description: 'Create a SpecForge specification with patterns',
99
- argumentHint: '<plan-file-path>',
100
- content: SF_CREATE_SPEC_CONTENT,
101
- category: 'Planning',
102
- },
103
- {
104
- name: 'sf-create-epics',
105
- description: 'Create epics with epic-level patterns',
106
- argumentHint: '<specification-id>',
107
- content: SF_CREATE_EPICS_CONTENT,
108
- category: 'Planning',
109
- },
110
- {
111
- name: 'sf-create-tickets',
112
- description: 'Create detailed tickets with full implementation context',
113
- argumentHint: '<epic-id>',
114
- content: SF_CREATE_TICKETS_CONTENT,
115
- category: 'Planning',
116
- },
117
- // Review
118
- {
119
- name: 'sf-review',
120
- description: 'Review accomplishments and progress analysis',
121
- argumentHint: '[specification-id]',
122
- content: SF_REVIEW_CONTENT,
123
- category: 'Review',
124
- },
125
44
  {
126
45
  name: 'sf-search',
127
46
  description: 'Search tickets by text, tags, or filters',
@@ -129,14 +48,6 @@ export function getCommandTemplates() {
129
48
  content: SF_SEARCH_CONTENT,
130
49
  category: 'Review',
131
50
  },
132
- {
133
- name: 'sf-epic',
134
- description: 'View epic details and progress',
135
- argumentHint: '<epic-id>',
136
- content: SF_EPIC_CONTENT,
137
- category: 'Review',
138
- },
139
- // Utilities
140
51
  {
141
52
  name: 'sf-reset',
142
53
  description: 'Reset ticket statuses with dependency awareness',
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/cli/templates/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/cli/templates/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL;YACE,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,8CAA8C;YAC3D,YAAY,EAAE,oBAAoB;YAClC,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,OAAO;SAClB;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,gCAAgC;YAC7C,YAAY,EAAE,sBAAsB;YACpC,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE,OAAO;SAClB;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,uDAAuD;YACpE,YAAY,EAAE,oBAAoB;YAClC,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,QAAQ;SACnB;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE,2BAA2B;YACpC,QAAQ,EAAE,QAAQ;SACnB;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,0CAA0C;YACvD,YAAY,EAAE,SAAS;YACvB,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,QAAQ;SACnB;QACD;YACE,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,iDAAiD;YAC9D,YAAY,EAAE,oBAAoB;YAClC,OAAO,EAAE,gBAAgB;YACzB,QAAQ,EAAE,WAAW;SACtB;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,+CAA+C;YAC5D,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,WAAW;SACtB;QACD;YACE,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,4CAA4C;YACzD,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,WAAW;SACtB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,mBAAmB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACpE,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for analyzing blockers and dependency bottlenecks.
5
5
  */
6
- export declare const SF_ANALYZE_BLOCKERS_CONTENT = "# Analyze Blockers (SpecForge)\n\nAnalyze dependency bottlenecks and identify critical path tickets.\n\n## Task\n\n### 1. Get Implementation Data\n\n**MCP Calls:**\n```typescript\nget_working_context()\nget_specification(specificationId)\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n```\n\n### 2. Analyze Dependencies\n\n**Logic:**\n- Build dependency graph\n- Calculate blocking relationships\n- Identify critical path\n- Find bottleneck tickets\n\n### 3. Display Analysis Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nBLOCKER ANALYSIS\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSpecification: {title}\n\nCRITICAL PATH\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nLength: {pathLength} tickets\nImpact: {blockedCount} tickets blocked\n\nE{n}-T{m} \u2192 E{n}-T{m} \u2192 E{n}-T{m} \u2192 ...\n\nHIGH-IMPACT BLOCKERS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title} \u2502 Blocking {count} tickets\n \u21B3 E{n}-T{m}, E{n}-T{m}, E{n}-T{m}\n\nBLOCKED TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title}\n \u26A0 Waiting on: E{n}-T{m} ({status})\n\nRECOMMENDATIONS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2022 Prioritize E{n}-T{m} to unblock {count} tickets\n\u2022 Review dependency chain for E{n}-T{m}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- Identifies tickets blocking the most work\n- Shows critical path through implementation\n- Provides actionable recommendations\n";
6
+ export declare const SF_ANALYZE_BLOCKERS_CONTENT = "# Analyze Blockers (SpecForge)\n\nAnalyze dependency bottlenecks and identify critical path tickets.\n\n## Task\n\n### 1. Get Implementation Data\n\n**MCP Calls:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = config.activeSpecification?.id\n\nget_specification({ specificationId })\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n```\n\n### 2. Analyze Dependencies\n\n**Logic:**\n- Build dependency graph\n- Calculate blocking relationships\n- Identify critical path\n- Find bottleneck tickets\n\n### 3. Display Analysis Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nBLOCKER ANALYSIS\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSpecification: {title}\n\nCRITICAL PATH\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nLength: {pathLength} tickets\nImpact: {blockedCount} tickets blocked\n\nE{n}-T{m} \u2192 E{n}-T{m} \u2192 E{n}-T{m} \u2192 ...\n\nHIGH-IMPACT BLOCKERS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title} \u2502 Blocking {count} tickets\n \u21B3 E{n}-T{m}, E{n}-T{m}, E{n}-T{m}\n\nBLOCKED TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title}\n \u26A0 Waiting on: E{n}-T{m} ({status})\n\nRECOMMENDATIONS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2022 Prioritize E{n}-T{m} to unblock {count} tickets\n\u2022 Review dependency chain for E{n}-T{m}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- Identifies tickets blocking the most work\n- Shows critical path through implementation\n- Provides actionable recommendations\n";
7
7
  //# sourceMappingURL=sf-blockers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-blockers.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-blockers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,2BAA2B,ylHA6DvC,CAAC"}
1
+ {"version":3,"file":"sf-blockers.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-blockers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,2BAA2B,osHAgEvC,CAAC"}
@@ -13,8 +13,11 @@ Analyze dependency bottlenecks and identify critical path tickets.
13
13
 
14
14
  **MCP Calls:**
15
15
  \`\`\`typescript
16
- get_working_context()
17
- get_specification(specificationId)
16
+ // Read project config
17
+ const config = readFile('.specforge.json')
18
+ const specificationId = config.activeSpecification?.id
19
+
20
+ get_specification({ specificationId })
18
21
  list_epics({ specificationId })
19
22
  list_tickets({ specificationId })
20
23
  \`\`\`
@@ -1 +1 @@
1
- {"version":3,"file":"sf-blockers.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-blockers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6D1C,CAAC"}
1
+ {"version":3,"file":"sf-blockers.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-blockers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE1C,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for committing changes with SpecForge ticket metadata.
5
5
  */
6
- export declare const SF_COMMIT_CONTENT = "# Commit Changes (SpecForge)\n\nCreate a git commit with SpecForge ticket metadata.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Ticket ID (uses context if not provided)\n\n## Task\n\n### 1. Get Ticket Context\n\n**MCP Calls:**\n```typescript\nif ($ARGUMENTS) {\n get_ticket($ARGUMENTS)\n} else {\n get_working_context()\n get_ticket(context.ticketId)\n}\n```\n\n### 2. Generate Commit Message\n\n**Logic:**\n- Format: `feat(scope): description (TICKET-ID)`\n- Extract scope from epic\n- Use ticket title as description\n- Add ticket ID reference\n\n### 3. Create Commit\n\n**Shell:**\n```bash\ngit add .\ngit commit -m \"{type}({scope}): {description} ({ticketId})\"\n```\n\n### 4. Update Ticket Status\n\n**MCP Calls:**\n```typescript\nupdate_ticket({\n ticketId: ticket.id,\n status: 'done',\n completedAt: new Date().toISOString()\n})\n```\n\n### 5. Display Commit Result\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nCOMMIT CREATED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTicket: E{n}-T{m}\nMessage: {commitMessage}\nHash: {commitHash}\n\nTICKET COMPLETED\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2713 E{n}-T{m} marked as done\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nNext: Run /sf-next for the next ticket\n```\n\n## Notes\n- Automatically marks ticket as done\n- Uses conventional commit format\n- Includes ticket ID for traceability\n";
6
+ export declare const SF_COMMIT_CONTENT = "# Commit Changes (SpecForge)\n\nCreate a git commit with SpecForge ticket metadata.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Ticket ID (uses context if not provided)\n\n## Task\n\n### 1. Get Ticket Context\n\n**MCP Calls:**\n```typescript\nif ($ARGUMENTS) {\n get_ticket({ ticketId: $ARGUMENTS })\n} else {\n // Read active ticket from .specforge.json or find active ticket\n const config = readFile('.specforge.json')\n const specificationId = config.activeSpecification?.id\n // Find the currently active ticket\n list_tickets({ specificationId, status: [\"active\"] })\n // Use the active ticket\n get_ticket({ ticketId: activeTicket.id })\n}\n```\n\n### 2. Generate Commit Message\n\n**Logic:**\n- Format: `feat(scope): description (TICKET-ID)`\n- Extract scope from epic\n- Use ticket title as description\n- Add ticket ID reference\n\n### 3. Create Commit\n\n**Shell:**\n```bash\ngit add .\ngit commit -m \"{type}({scope}): {description} ({ticketId})\"\n```\n\n### 4. Update Ticket Status\n\n**MCP Calls:**\n```typescript\ncomplete_work_session({\n ticketId: ticket.id\n})\n```\n\n### 5. Display Commit Result\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nCOMMIT CREATED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTicket: E{n}-T{m}\nMessage: {commitMessage}\nHash: {commitHash}\n\nTICKET COMPLETED\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2713 E{n}-T{m} marked as done\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nNext: Run /sf-next for the next ticket\n```\n\n## Notes\n- Automatically completes the work session\n- Uses conventional commit format\n- Includes ticket ID for traceability\n";
7
7
  //# sourceMappingURL=sf-commit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-commit.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,k9EAuE7B,CAAC"}
1
+ {"version":3,"file":"sf-commit.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,+sFA0E7B,CAAC"}
@@ -17,10 +17,15 @@ Create a git commit with SpecForge ticket metadata.
17
17
  **MCP Calls:**
18
18
  \`\`\`typescript
19
19
  if ($ARGUMENTS) {
20
- get_ticket($ARGUMENTS)
20
+ get_ticket({ ticketId: $ARGUMENTS })
21
21
  } else {
22
- get_working_context()
23
- get_ticket(context.ticketId)
22
+ // Read active ticket from .specforge.json or find active ticket
23
+ const config = readFile('.specforge.json')
24
+ const specificationId = config.activeSpecification?.id
25
+ // Find the currently active ticket
26
+ list_tickets({ specificationId, status: ["active"] })
27
+ // Use the active ticket
28
+ get_ticket({ ticketId: activeTicket.id })
24
29
  }
25
30
  \`\`\`
26
31
 
@@ -44,10 +49,8 @@ git commit -m "{type}({scope}): {description} ({ticketId})"
44
49
 
45
50
  **MCP Calls:**
46
51
  \`\`\`typescript
47
- update_ticket({
48
- ticketId: ticket.id,
49
- status: 'done',
50
- completedAt: new Date().toISOString()
52
+ complete_work_session({
53
+ ticketId: ticket.id
51
54
  })
52
55
  \`\`\`
53
56
 
@@ -71,7 +74,7 @@ Next: Run /sf-next for the next ticket
71
74
  \`\`\`
72
75
 
73
76
  ## Notes
74
- - Automatically marks ticket as done
77
+ - Automatically completes the work session
75
78
  - Uses conventional commit format
76
79
  - Includes ticket ID for traceability
77
80
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"sf-commit.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEhC,CAAC"}
1
+ {"version":3,"file":"sf-commit.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0EhC,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for viewing or switching working context.
5
5
  */
6
- export declare const SF_CONTEXT_CONTENT = "# Working Context (SpecForge)\n\nQuickly view or switch the current working context.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Project or Specification ID to switch to\n\n## Task\n\n### 1. If No Arguments - Show Current Context\n\n**MCP Calls:**\n```typescript\nget_working_context()\n```\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nWORKING CONTEXT\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nProject: {project.name}\nSpecification: {spec.title}\nEpic: {epic.title} (if set)\nTicket: E{n}-T{m} {title} (if set)\n\nSession: {active/none}\nProgress: {done}/{total} ({pct}%)\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n### 2. If Arguments - Switch Context\n\n**MCP Calls:**\n```typescript\n// Try as specification first\nget_specification($ARGUMENTS)\n\n// If not found, try as project\nget_project($ARGUMENTS)\n\n// Set context\nset_working_context({\n projectId: project.id,\n specificationId: spec?.id\n})\n```\n\n**Output:**\n```\n\u2713 Switched to: {name}\n```\n\n## Notes\n- No argument = show current context\n- With argument = switch context\n- Auto-detects if ID is project or specification\n";
6
+ export declare const SF_CONTEXT_CONTENT = "# Working Context (SpecForge)\n\nQuickly view or switch the current working context.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Project or Specification ID to switch to\n\n## Task\n\n### 1. If No Arguments - Show Current Context\n\n**Logic:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst projectId = config.project.id\nconst specificationId = config.activeSpecification?.id\n\n// Load details\nif (specificationId) {\n get_specification({ specificationId, include: [\"status\"] })\n}\n```\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nWORKING CONTEXT\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nProject: {project.name}\nSpecification: {spec.title}\nSource: .specforge.json\n\nProgress: {done}/{total} ({pct}%)\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n### 2. If Arguments - Switch Context\n\n**Logic:**\n```typescript\n// Try as specification first\nget_specification({ specificationId: $ARGUMENTS })\n\n// Update .specforge.json activeSpecification\n// (or inform user to update manually)\n```\n\n**Output:**\n```\n\u2713 Switched to: {name}\n Update .specforge.json activeSpecification.id to persist.\n```\n\n## Notes\n- No argument = show current context\n- With argument = switch context\n- Auto-detects if ID is project or specification\n";
7
7
  //# sourceMappingURL=sf-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-context.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,kBAAkB,y5DAyD9B,CAAC"}
1
+ {"version":3,"file":"sf-context.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,kBAAkB,skEA0D9B,CAAC"}
@@ -14,9 +14,17 @@ Quickly view or switch the current working context.
14
14
 
15
15
  ### 1. If No Arguments - Show Current Context
16
16
 
17
- **MCP Calls:**
17
+ **Logic:**
18
18
  \`\`\`typescript
19
- get_working_context()
19
+ // Read project config
20
+ const config = readFile('.specforge.json')
21
+ const projectId = config.project.id
22
+ const specificationId = config.activeSpecification?.id
23
+
24
+ // Load details
25
+ if (specificationId) {
26
+ get_specification({ specificationId, include: ["status"] })
27
+ }
20
28
  \`\`\`
21
29
 
22
30
  **Output:**
@@ -26,34 +34,27 @@ WORKING CONTEXT
26
34
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
27
35
  Project: {project.name}
28
36
  Specification: {spec.title}
29
- Epic: {epic.title} (if set)
30
- Ticket: E{n}-T{m} {title} (if set)
37
+ Source: .specforge.json
31
38
 
32
- Session: {active/none}
33
39
  Progress: {done}/{total} ({pct}%)
34
40
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
35
41
  \`\`\`
36
42
 
37
43
  ### 2. If Arguments - Switch Context
38
44
 
39
- **MCP Calls:**
45
+ **Logic:**
40
46
  \`\`\`typescript
41
47
  // Try as specification first
42
- get_specification($ARGUMENTS)
43
-
44
- // If not found, try as project
45
- get_project($ARGUMENTS)
48
+ get_specification({ specificationId: $ARGUMENTS })
46
49
 
47
- // Set context
48
- set_working_context({
49
- projectId: project.id,
50
- specificationId: spec?.id
51
- })
50
+ // Update .specforge.json activeSpecification
51
+ // (or inform user to update manually)
52
52
  \`\`\`
53
53
 
54
54
  **Output:**
55
55
  \`\`\`
56
56
  ✓ Switched to: {name}
57
+ Update .specforge.json activeSpecification.id to persist.
57
58
  \`\`\`
58
59
 
59
60
  ## Notes
@@ -1 +1 @@
1
- {"version":3,"file":"sf-context.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDjC,CAAC"}
1
+ {"version":3,"file":"sf-context.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DjC,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for displaying SpecForge command reference.
5
5
  */
6
- export declare const SF_HELP_CONTENT = "# SpecForge Command Reference\n\nQuick reference for all available SpecForge slash commands.\n\n## Task\n\nDisplay the command reference:\n\n```\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n SPECFORGE COMMAND REFERENCE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nSETUP & CONTEXT\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/sf-init [spec-id] Initialize specification for work\n/sf-context [id] View or switch working context\n\nSTATUS & ANALYSIS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/sf-status [spec-id] Implementation status overview\n/sf-validate [spec-id] System health check\n/sf-analyze-blockers Dependency bottleneck analysis\n/sf-epic <epic-id> Epic details and progress\n/sf-search <query> Search tickets\n\nIMPLEMENTATION\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/sf-next Start next ready ticket\n/sf-ticket-implementation Implement specific ticket\n/sf-run-autonomous [max] Batch implement tickets\n/sf-commit [ticket-id] Commit with ticket metadata\n\nPLANNING\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/sf-import-plan <file> Import plan to full spec\n/sf-create-spec <file> Create spec from plan\n/sf-create-epics <spec> Create epics for spec\n/sf-create-tickets <epic> Create tickets for epic\n\nMANAGEMENT\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/sf-review [spec-id] Accomplishment review\n/sf-reset [spec-id] Reset ticket statuses\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nTip: Use /sf-init first to set up your working context.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n```\n\n## Notes\n- Commands use MCP tools from @specforge/mcp\n- Context is persisted across commands\n- Use /sf-status to see current progress\n";
6
+ export declare const SF_HELP_CONTENT = "# SpecForge Command Reference\n\nQuick reference for all available SpecForge slash commands.\n\n## Task\n\nDisplay the command reference:\n\n```\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n SPECFORGE COMMAND REFERENCE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nSETUP & CONTEXT\n/sf-init [spec-id] Initialize specification for work\n/sf-context [id] View or switch working context\n\nSTATUS & ANALYSIS\n/sf-status [spec-id] Implementation status overview\n/sf-analyze-blockers Dependency bottleneck analysis\n\nSEARCH\n/sf-search <query> Search tickets\n\nUTILITIES\n/sf-reset [spec-id] Reset ticket statuses\n/sf-commit [ticket-id] Commit with ticket metadata\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nTip: Use /sf-init first to set up your working context.\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n```\n\n## Notes\n- Commands use MCP tools from @specforge/mcp\n- Context is persisted across commands\n- Use /sf-status to see current progress\n";
7
7
  //# sourceMappingURL=sf-help.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-help.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,eAAe,y4JAsD3B,CAAC"}
1
+ {"version":3,"file":"sf-help.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,eAAe,q7EAqC3B,CAAC"}
@@ -17,36 +17,19 @@ Display the command reference:
17
17
  ═══════════════════════════════════════════════════════════════════
18
18
 
19
19
  SETUP & CONTEXT
20
- ─────────────────────────────────────────────────────────────────
21
20
  /sf-init [spec-id] Initialize specification for work
22
21
  /sf-context [id] View or switch working context
23
22
 
24
23
  STATUS & ANALYSIS
25
- ─────────────────────────────────────────────────────────────────
26
24
  /sf-status [spec-id] Implementation status overview
27
- /sf-validate [spec-id] System health check
28
25
  /sf-analyze-blockers Dependency bottleneck analysis
29
- /sf-epic <epic-id> Epic details and progress
30
- /sf-search <query> Search tickets
31
-
32
- IMPLEMENTATION
33
- ─────────────────────────────────────────────────────────────────
34
- /sf-next Start next ready ticket
35
- /sf-ticket-implementation Implement specific ticket
36
- /sf-run-autonomous [max] Batch implement tickets
37
- /sf-commit [ticket-id] Commit with ticket metadata
38
26
 
39
- PLANNING
40
- ─────────────────────────────────────────────────────────────────
41
- /sf-import-plan <file> Import plan to full spec
42
- /sf-create-spec <file> Create spec from plan
43
- /sf-create-epics <spec> Create epics for spec
44
- /sf-create-tickets <epic> Create tickets for epic
27
+ SEARCH
28
+ /sf-search <query> Search tickets
45
29
 
46
- MANAGEMENT
47
- ─────────────────────────────────────────────────────────────────
48
- /sf-review [spec-id] Accomplishment review
30
+ UTILITIES
49
31
  /sf-reset [spec-id] Reset ticket statuses
32
+ /sf-commit [ticket-id] Commit with ticket metadata
50
33
 
51
34
  ═══════════════════════════════════════════════════════════════════
52
35
  Tip: Use /sf-init first to set up your working context.
@@ -1 +1 @@
1
- {"version":3,"file":"sf-help.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD9B,CAAC"}
1
+ {"version":3,"file":"sf-help.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC9B,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for initializing SpecForge specification for implementation work.
5
5
  */
6
- export declare const SF_INIT_CONTENT = "# Initialize Ticket System (SpecForge)\n\nInitialize a SpecForge specification for implementation work.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Specification ID to initialize\n\n## Task\n\n### 1. Get or Set Working Context\n\n**MCP Calls:**\n```typescript\n// Get current context\nget_working_context()\n\n// If $ARGUMENTS provided, set specification\nset_working_context({\n specificationId: \"$ARGUMENTS\"\n})\n```\n\n### 2. Load Specification Details\n\n**MCP Calls:**\n```typescript\nget_specification(specificationId)\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n```\n\n### 3. Display Initialization Summary\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSPECFORGE INITIALIZED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSpecification: {title}\nStatus: {status}\nEpics: {epicCount}\nTickets: {ticketCount}\n\nProgress: {done}/{total} ({percentage}%)\nReady: {readyCount} tickets available\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nNext: Run /sf-next to start the next ready ticket\n```\n\n## Notes\n- Context persists across commands\n- Use /sf-status for detailed view\n- Use /sf-next to start implementation\n";
6
+ export declare const SF_INIT_CONTENT = "# Initialize Ticket System (SpecForge)\n\nInitialize a SpecForge specification for implementation work.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Specification ID to initialize\n\n## Task\n\n### 1. Get or Set Working Context\n\n**Logic:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst projectId = config.project.id\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\n// If no spec found, list available specs\nif (!specificationId) {\n list_specifications({ projectId })\n // Let user pick\n}\n```\n\n### 2. Load Specification Details\n\n**MCP Calls:**\n```typescript\nget_specification(specificationId)\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n```\n\n### 3. Display Initialization Summary\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSPECFORGE INITIALIZED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSpecification: {title}\nStatus: {status}\nEpics: {epicCount}\nTickets: {ticketCount}\n\nProgress: {done}/{total} ({percentage}%)\nReady: {readyCount} tickets available\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nNext: Run /sf-next to start the next ready ticket\n```\n\n## Notes\n- Context persists across commands\n- Use /sf-status for detailed view\n- Use /sf-next to start implementation\n";
7
7
  //# sourceMappingURL=sf-init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-init.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,eAAe,87DAsD3B,CAAC"}
1
+ {"version":3,"file":"sf-init.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,eAAe,+kEAyD3B,CAAC"}
@@ -14,15 +14,18 @@ Initialize a SpecForge specification for implementation work.
14
14
 
15
15
  ### 1. Get or Set Working Context
16
16
 
17
- **MCP Calls:**
17
+ **Logic:**
18
18
  \`\`\`typescript
19
- // Get current context
20
- get_working_context()
19
+ // Read project config
20
+ const config = readFile('.specforge.json')
21
+ const projectId = config.project.id
22
+ const specificationId = $ARGUMENTS || config.activeSpecification?.id
21
23
 
22
- // If $ARGUMENTS provided, set specification
23
- set_working_context({
24
- specificationId: "$ARGUMENTS"
25
- })
24
+ // If no spec found, list available specs
25
+ if (!specificationId) {
26
+ list_specifications({ projectId })
27
+ // Let user pick
28
+ }
26
29
  \`\`\`
27
30
 
28
31
  ### 2. Load Specification Details
@@ -1 +1 @@
1
- {"version":3,"file":"sf-init.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD9B,CAAC"}
1
+ {"version":3,"file":"sf-init.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyD9B,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for resetting ticket statuses with dependency awareness.
5
5
  */
6
- export declare const SF_RESET_CONTENT = "# Reset Ticket Statuses (SpecForge)\n\nReset ticket statuses to ready state with dependency awareness.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Specification ID or ticket ID to reset\n\n## Task\n\n### 1. Get Reset Scope\n\n**MCP Calls:**\n```typescript\nget_working_context()\n\nif ($ARGUMENTS.match(/Ed+-Td+/)) {\n // Single ticket reset\n get_ticket($ARGUMENTS)\n} else {\n // Full specification reset\n if ($ARGUMENTS) {\n set_working_context({ specificationId: \"$ARGUMENTS\" })\n }\n list_tickets({ specificationId })\n}\n```\n\n### 2. Reset Tickets\n\n**MCP Calls:**\n```typescript\n// For each ticket to reset\nfor (const ticket of tickets) {\n // Check dependencies\n const allDepsCompleted = ticket.dependencies.every(\n dep => getTicketStatus(dep) === 'done'\n );\n\n // Update status\n update_ticket({\n ticketId: ticket.id,\n status: allDepsCompleted ? 'ready' : 'blocked'\n })\n}\n```\n\n### 3. Display Reset Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTICKET RESET COMPLETE\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nScope: {scope}\n\nRESET SUMMARY\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nReady: {readyCount} tickets\nBlocked: {blockedCount} tickets\nDone: {doneCount} tickets (unchanged)\n\nRESET TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {oldStatus} \u2192 {newStatus}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- Respects dependency constraints\n- Can reset single ticket or entire specification\n- Completed tickets remain unchanged by default\n";
6
+ export declare const SF_RESET_CONTENT = "# Reset Ticket Statuses (SpecForge)\n\nReset ticket statuses to ready state with dependency awareness.\n\n## Arguments\n- `$ARGUMENTS` - Optional: Specification ID or ticket ID to reset\n\n## Task\n\n### 1. Get Reset Scope\n\n**MCP Calls:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\nif ($ARGUMENTS?.match(/Ed+-Td+/)) {\n // Single ticket reset\n get_ticket({ ticketId: $ARGUMENTS })\n} else {\n // Full specification reset\n list_tickets({ specificationId })\n}\n```\n\n### 2. Reset Tickets\n\n**MCP Calls:**\n```typescript\n// Reset tickets via lifecycle operation\nreset_work_session({\n specificationId,\n ticketId: $ARGUMENTS.match(/Ed+-Td+/) ? $ARGUMENTS : undefined\n})\n```\n\n### 3. Display Reset Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTICKET RESET COMPLETE\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nScope: {scope}\n\nRESET SUMMARY\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nReady: {readyCount} tickets\nBlocked: {blockedCount} tickets\nDone: {doneCount} tickets (unchanged)\n\nRESET TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {oldStatus} \u2192 {newStatus}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- Respects dependency constraints\n- Can reset single ticket or entire specification\n- Completed tickets remain unchanged by default\n";
7
7
  //# sourceMappingURL=sf-reset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-reset.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-reset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,6+FAuE5B,CAAC"}
1
+ {"version":3,"file":"sf-reset.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-reset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,i3FA8D5B,CAAC"}
@@ -16,16 +16,15 @@ Reset ticket statuses to ready state with dependency awareness.
16
16
 
17
17
  **MCP Calls:**
18
18
  \`\`\`typescript
19
- get_working_context()
19
+ // Read project config
20
+ const config = readFile('.specforge.json')
21
+ const specificationId = $ARGUMENTS || config.activeSpecification?.id
20
22
 
21
- if ($ARGUMENTS.match(/E\d+-T\d+/)) {
23
+ if ($ARGUMENTS?.match(/E\d+-T\d+/)) {
22
24
  // Single ticket reset
23
- get_ticket($ARGUMENTS)
25
+ get_ticket({ ticketId: $ARGUMENTS })
24
26
  } else {
25
27
  // Full specification reset
26
- if ($ARGUMENTS) {
27
- set_working_context({ specificationId: "$ARGUMENTS" })
28
- }
29
28
  list_tickets({ specificationId })
30
29
  }
31
30
  \`\`\`
@@ -34,19 +33,11 @@ if ($ARGUMENTS.match(/E\d+-T\d+/)) {
34
33
 
35
34
  **MCP Calls:**
36
35
  \`\`\`typescript
37
- // For each ticket to reset
38
- for (const ticket of tickets) {
39
- // Check dependencies
40
- const allDepsCompleted = ticket.dependencies.every(
41
- dep => getTicketStatus(dep) === 'done'
42
- );
43
-
44
- // Update status
45
- update_ticket({
46
- ticketId: ticket.id,
47
- status: allDepsCompleted ? 'ready' : 'blocked'
48
- })
49
- }
36
+ // Reset tickets via lifecycle operation
37
+ reset_work_session({
38
+ specificationId,
39
+ ticketId: $ARGUMENTS.match(/E\d+-T\d+/) ? $ARGUMENTS : undefined
40
+ })
50
41
  \`\`\`
51
42
 
52
43
  ### 3. Display Reset Results
@@ -1 +1 @@
1
- {"version":3,"file":"sf-reset.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-reset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuE/B,CAAC"}
1
+ {"version":3,"file":"sf-reset.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-reset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8D/B,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Template for searching tickets by text, tags, or filters.
5
5
  */
6
- export declare const SF_SEARCH_CONTENT = "# Search Tickets (SpecForge)\n\nSearch tickets by text, tags, status, or other filters.\n\n## Arguments\n- `$ARGUMENTS` - Required: Search query\n\n## Task\n\n### 1. Parse Search Query\n\n**Logic:**\n- Extract search terms\n- Parse filters (status:, epic:, tag:)\n- Identify text search vs filter search\n\n### 2. Search Tickets\n\n**MCP Calls:**\n```typescript\nget_working_context()\n\nlist_tickets({\n specificationId,\n search: extractedTerms,\n status: extractedStatus,\n epicId: extractedEpicId,\n tags: extractedTags\n})\n```\n\n### 3. Display Search Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSEARCH RESULTS\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nQuery: {query}\nFound: {resultCount} tickets\n\nRESULTS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title} \u2502 {status}\n {matchedText}...\n\nE{n}-T{m} \u2502 {title} \u2502 {status}\n {matchedText}...\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nTip: Use filters like status:ready or epic:E1\n```\n\n## Notes\n- Supports text search and filters\n- Filters: status:, epic:, tag:, priority:\n- Can combine multiple filters\n";
6
+ export declare const SF_SEARCH_CONTENT = "# Search Tickets (SpecForge)\n\nSearch tickets by text, tags, status, or other filters.\n\n## Arguments\n- `$ARGUMENTS` - Required: Search query\n\n## Task\n\n### 1. Parse Search Query\n\n**Logic:**\n- Extract search terms\n- Parse filters (status:, epic:, tag:)\n- Identify text search vs filter search\n\n### 2. Search Tickets\n\n**MCP Calls:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = config.activeSpecification?.id\n\nsearch_tickets({\n specificationId,\n query: extractedTerms,\n status: extractedStatus,\n tags: extractedTags\n})\n```\n\n### 3. Display Search Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSEARCH RESULTS\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nQuery: {query}\nFound: {resultCount} tickets\n\nRESULTS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title} \u2502 {status}\n {matchedText}...\n\nE{n}-T{m} \u2502 {title} \u2502 {status}\n {matchedText}...\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nTip: Use filters like status:ready or epic:E1\n```\n\n## Notes\n- Supports text search and filters\n- Filters: status:, epic:, tag:, priority:\n- Can combine multiple filters\n";
7
7
  //# sourceMappingURL=sf-search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sf-search.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,guEAyD7B,CAAC"}
1
+ {"version":3,"file":"sf-search.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,0yEA0D7B,CAAC"}