@nerviq/cli 1.20.1 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/LICENSE +23 -23
  2. package/README.md +2 -2
  3. package/package.json +1 -1
  4. package/src/activity.js +1039 -1039
  5. package/src/adoption-advisor.js +299 -299
  6. package/src/aider/config-parser.js +166 -166
  7. package/src/aider/context.js +4 -1
  8. package/src/aider/deep-review.js +316 -316
  9. package/src/aider/domain-packs.js +303 -303
  10. package/src/aider/freshness.js +93 -93
  11. package/src/aider/governance.js +253 -253
  12. package/src/aider/interactive.js +334 -334
  13. package/src/aider/mcp-packs.js +329 -329
  14. package/src/aider/patch.js +214 -214
  15. package/src/aider/plans.js +186 -186
  16. package/src/aider/premium.js +360 -360
  17. package/src/aider/setup.js +404 -404
  18. package/src/aider/techniques.js +312 -67
  19. package/src/analyze.js +951 -951
  20. package/src/anti-patterns.js +485 -485
  21. package/src/audit/instruction-files.js +180 -180
  22. package/src/audit/recommendations.js +577 -577
  23. package/src/auto-suggest.js +154 -154
  24. package/src/badge.js +13 -13
  25. package/src/behavioral-drift.js +801 -801
  26. package/src/benchmark.js +67 -67
  27. package/src/catalog.js +103 -103
  28. package/src/certification.js +128 -128
  29. package/src/codex/config-parser.js +183 -183
  30. package/src/codex/context.js +223 -223
  31. package/src/codex/deep-review.js +493 -493
  32. package/src/codex/domain-packs.js +394 -394
  33. package/src/codex/freshness.js +84 -84
  34. package/src/codex/governance.js +192 -192
  35. package/src/codex/interactive.js +618 -618
  36. package/src/codex/mcp-packs.js +914 -914
  37. package/src/codex/patch.js +209 -209
  38. package/src/codex/plans.js +251 -251
  39. package/src/codex/premium.js +614 -614
  40. package/src/codex/setup.js +591 -591
  41. package/src/continuous-ops.js +681 -681
  42. package/src/copilot/activity.js +309 -309
  43. package/src/copilot/deep-review.js +346 -346
  44. package/src/copilot/domain-packs.js +372 -372
  45. package/src/copilot/freshness.js +57 -57
  46. package/src/copilot/governance.js +222 -222
  47. package/src/copilot/interactive.js +406 -406
  48. package/src/copilot/mcp-packs.js +826 -826
  49. package/src/copilot/plans.js +253 -253
  50. package/src/copilot/premium.js +451 -451
  51. package/src/copilot/setup.js +488 -488
  52. package/src/cost-tracking.js +61 -61
  53. package/src/cursor/activity.js +301 -301
  54. package/src/cursor/config-parser.js +265 -265
  55. package/src/cursor/context.js +256 -256
  56. package/src/cursor/deep-review.js +334 -334
  57. package/src/cursor/domain-packs.js +368 -368
  58. package/src/cursor/freshness.js +65 -65
  59. package/src/cursor/governance.js +229 -229
  60. package/src/cursor/interactive.js +391 -391
  61. package/src/cursor/mcp-packs.js +828 -828
  62. package/src/cursor/plans.js +254 -254
  63. package/src/cursor/premium.js +469 -469
  64. package/src/cursor/setup.js +488 -488
  65. package/src/dashboard.js +493 -493
  66. package/src/deep-review.js +428 -428
  67. package/src/deprecation.js +98 -98
  68. package/src/diff-only.js +280 -280
  69. package/src/doctor.js +119 -119
  70. package/src/domain-pack-expansion.js +1033 -1033
  71. package/src/domain-packs.js +387 -387
  72. package/src/feedback.js +178 -178
  73. package/src/fix-engine.js +783 -783
  74. package/src/fix-prompts.js +122 -122
  75. package/src/formatters/sarif.js +115 -115
  76. package/src/freshness.js +74 -74
  77. package/src/gemini/config-parser.js +275 -275
  78. package/src/gemini/deep-review.js +559 -559
  79. package/src/gemini/domain-packs.js +393 -393
  80. package/src/gemini/freshness.js +66 -66
  81. package/src/gemini/governance.js +201 -201
  82. package/src/gemini/interactive.js +860 -860
  83. package/src/gemini/mcp-packs.js +915 -915
  84. package/src/gemini/plans.js +269 -269
  85. package/src/gemini/premium.js +760 -760
  86. package/src/gemini/setup.js +692 -692
  87. package/src/governance.js +72 -72
  88. package/src/harmony/add.js +68 -68
  89. package/src/harmony/advisor.js +333 -333
  90. package/src/harmony/canon.js +565 -565
  91. package/src/harmony/cli.js +591 -591
  92. package/src/harmony/drift.js +401 -401
  93. package/src/harmony/governance.js +313 -313
  94. package/src/harmony/memory.js +239 -239
  95. package/src/harmony/sync.js +475 -475
  96. package/src/harmony/watch.js +370 -370
  97. package/src/hook-validation.js +342 -342
  98. package/src/index.js +271 -271
  99. package/src/init.js +184 -184
  100. package/src/instruction-surfaces.js +185 -185
  101. package/src/integrations.js +144 -144
  102. package/src/interactive.js +118 -118
  103. package/src/locales/en.json +1 -1
  104. package/src/locales/es.json +1 -1
  105. package/src/mcp-packs.js +830 -830
  106. package/src/mcp-server.js +726 -726
  107. package/src/mcp-validation.js +337 -337
  108. package/src/nerviq-sync.json +7 -7
  109. package/src/opencode/config-parser.js +109 -109
  110. package/src/opencode/context.js +247 -247
  111. package/src/opencode/deep-review.js +313 -313
  112. package/src/opencode/domain-packs.js +262 -262
  113. package/src/opencode/freshness.js +66 -66
  114. package/src/opencode/governance.js +159 -159
  115. package/src/opencode/interactive.js +392 -392
  116. package/src/opencode/mcp-packs.js +705 -705
  117. package/src/opencode/patch.js +184 -184
  118. package/src/opencode/plans.js +231 -231
  119. package/src/opencode/premium.js +413 -413
  120. package/src/opencode/setup.js +449 -449
  121. package/src/opencode/techniques.js +27 -27
  122. package/src/operating-profile.js +574 -574
  123. package/src/org.js +152 -152
  124. package/src/permission-rules.js +218 -218
  125. package/src/plans.js +839 -839
  126. package/src/platform-change-manifest.js +86 -86
  127. package/src/plugins.js +110 -110
  128. package/src/policy-layers.js +210 -210
  129. package/src/profiles.js +124 -124
  130. package/src/prompt-injection.js +74 -74
  131. package/src/public-api.js +173 -173
  132. package/src/recommendation-rules.js +84 -84
  133. package/src/repo-archetype.js +386 -386
  134. package/src/secret-patterns.js +39 -39
  135. package/src/server.js +527 -527
  136. package/src/setup/analysis.js +607 -607
  137. package/src/setup/runtime.js +172 -172
  138. package/src/setup.js +677 -677
  139. package/src/shared/capabilities.js +194 -194
  140. package/src/source-urls.js +132 -132
  141. package/src/stack-checks.js +565 -565
  142. package/src/supplemental-checks.js +13 -13
  143. package/src/synergy/adaptive.js +261 -261
  144. package/src/synergy/compensation.js +137 -137
  145. package/src/synergy/evidence.js +193 -193
  146. package/src/synergy/learning.js +199 -199
  147. package/src/synergy/patterns.js +227 -227
  148. package/src/synergy/ranking.js +83 -83
  149. package/src/synergy/report.js +165 -165
  150. package/src/synergy/routing.js +146 -146
  151. package/src/techniques/api.js +407 -407
  152. package/src/techniques/automation.js +316 -316
  153. package/src/techniques/compliance.js +257 -257
  154. package/src/techniques/hygiene.js +294 -294
  155. package/src/techniques/instructions.js +243 -243
  156. package/src/techniques/observability.js +226 -226
  157. package/src/techniques/optimization.js +142 -142
  158. package/src/techniques/quality.js +318 -318
  159. package/src/techniques/security.js +237 -237
  160. package/src/techniques/shared.js +443 -443
  161. package/src/techniques/stacks.js +2294 -2294
  162. package/src/techniques/tools.js +106 -106
  163. package/src/techniques/workflow.js +413 -413
  164. package/src/techniques.js +81 -81
  165. package/src/terminology.js +73 -73
  166. package/src/token-estimate.js +35 -35
  167. package/src/usage-patterns.js +99 -99
  168. package/src/verification-metadata.js +145 -145
  169. package/src/watch.js +247 -247
  170. package/src/windsurf/activity.js +302 -302
  171. package/src/windsurf/config-parser.js +267 -267
  172. package/src/windsurf/deep-review.js +337 -337
  173. package/src/windsurf/domain-packs.js +370 -370
  174. package/src/windsurf/freshness.js +36 -36
  175. package/src/windsurf/governance.js +231 -231
  176. package/src/windsurf/interactive.js +388 -388
  177. package/src/windsurf/mcp-packs.js +792 -792
  178. package/src/windsurf/plans.js +247 -247
  179. package/src/windsurf/premium.js +468 -468
  180. package/src/windsurf/setup.js +471 -471
  181. package/src/workspace.js +375 -375
@@ -41,25 +41,25 @@ const P0_SOURCES = [
41
41
  stalenessThresholdDays: 30,
42
42
  verifiedAt: '2026-04-07',
43
43
  },
44
- {
45
- key: 'windsurf-workflows-docs',
46
- label: 'Workflows Documentation',
47
- url: 'https://docs.windsurf.com/windsurf/cascade/workflows',
48
- stalenessThresholdDays: 30,
49
- verifiedAt: '2026-04-07',
50
- },
51
- {
52
- key: 'windsurf-models-docs',
53
- label: 'Windsurf Models & BYOK',
54
- url: 'https://docs.windsurf.com/windsurf/models',
55
- stalenessThresholdDays: 14,
56
- verifiedAt: '2026-04-10',
57
- },
58
- {
59
- key: 'windsurf-steps-docs',
60
- label: 'Steps Documentation (via Workflows)',
61
- url: 'https://docs.windsurf.com/windsurf/cascade/workflows',
62
- stalenessThresholdDays: 30,
44
+ {
45
+ key: 'windsurf-workflows-docs',
46
+ label: 'Workflows Documentation',
47
+ url: 'https://docs.windsurf.com/windsurf/cascade/workflows',
48
+ stalenessThresholdDays: 30,
49
+ verifiedAt: '2026-04-07',
50
+ },
51
+ {
52
+ key: 'windsurf-models-docs',
53
+ label: 'Windsurf Models & BYOK',
54
+ url: 'https://docs.windsurf.com/windsurf/models',
55
+ stalenessThresholdDays: 14,
56
+ verifiedAt: '2026-04-10',
57
+ },
58
+ {
59
+ key: 'windsurf-steps-docs',
60
+ label: 'Steps Documentation (via Workflows)',
61
+ url: 'https://docs.windsurf.com/windsurf/cascade/workflows',
62
+ stalenessThresholdDays: 30,
63
63
  verifiedAt: '2026-04-07',
64
64
  },
65
65
  {
@@ -147,23 +147,23 @@ const PROPAGATION_CHECKLIST = [
147
147
  'src/windsurf/patch.js — update patchCascadeignore',
148
148
  ],
149
149
  },
150
- {
151
- trigger: '10K char rule limit change',
152
- targets: [
153
- 'src/windsurf/techniques.js — update WS-A05, WS-L05',
154
- 'src/windsurf/context.js — update overLimit calculation',
155
- 'src/windsurf/governance.js — update rule-char-limit caveat',
156
- ],
157
- },
158
- {
159
- trigger: 'Windsurf model catalog / BYOK / pricing behavior change',
160
- targets: [
161
- 'src/windsurf/techniques.js — update model-awareness and cost/trust assumptions',
162
- 'src/windsurf/governance.js — update BYOK and model-selection caveats',
163
- 'src/source-urls.js — refresh Windsurf model source mappings',
164
- ],
165
- },
166
- ];
150
+ {
151
+ trigger: '10K char rule limit change',
152
+ targets: [
153
+ 'src/windsurf/techniques.js — update WS-A05, WS-L05',
154
+ 'src/windsurf/context.js — update overLimit calculation',
155
+ 'src/windsurf/governance.js — update rule-char-limit caveat',
156
+ ],
157
+ },
158
+ {
159
+ trigger: 'Windsurf model catalog / BYOK / pricing behavior change',
160
+ targets: [
161
+ 'src/windsurf/techniques.js — update model-awareness and cost/trust assumptions',
162
+ 'src/windsurf/governance.js — update BYOK and model-selection caveats',
163
+ 'src/source-urls.js — refresh Windsurf model source mappings',
164
+ ],
165
+ },
166
+ ];
167
167
 
168
168
  /**
169
169
  * Release gate: check if all P0 sources are within staleness threshold.
@@ -1,231 +1,231 @@
1
- /**
2
- * Windsurf Governance Module
3
- *
4
- * 6 permission profiles, 7 hook equivalents, 5 policy packs.
5
- *
6
- * Windsurf-specific differences from Cursor:
7
- * - NO background agents (Cascade runs in foreground only)
8
- * - Cascade: autonomous agent with multi-file editing
9
- * - Memories: team-syncable persistent context
10
- * - Workflows: slash commands
11
- * - Steps: automation sequences
12
- * - .cascadeignore: gitignore-like for Cascade
13
- * - MCP with team whitelist
14
- * - 10K char rule limit per file
15
- * - 4 activation modes: Always, Auto, Agent-Requested, Manual
16
- */
17
-
18
- const { WINDSURF_DOMAIN_PACKS } = require('./domain-packs');
19
- const { WINDSURF_MCP_PACKS } = require('./mcp-packs');
20
-
21
- const WINDSURF_PERMISSION_PROFILES = [
22
- {
23
- key: 'read-only',
24
- label: 'Read Only',
25
- risk: 'low',
26
- defaultSandbox: 'no-writes',
27
- approvalPolicy: 'always-confirm',
28
- useWhen: 'First contact with a repo, security review, or auditing.',
29
- behavior: 'Cascade can read and suggest, but all edits and terminal commands require explicit confirmation.',
30
- surfaces: ['foreground'],
31
- },
32
- {
33
- key: 'standard',
34
- label: 'Standard',
35
- risk: 'medium',
36
- defaultSandbox: 'user-approval',
37
- approvalPolicy: 'selective-approval',
38
- useWhen: 'Default product work where Cascade edits locally but risky commands need review.',
39
- behavior: 'Cascade proposes edits. Terminal commands require per-command approval.',
40
- surfaces: ['foreground'],
41
- },
42
- {
43
- key: 'cascade-agent',
44
- label: 'Cascade Agent',
45
- risk: 'medium',
46
- defaultSandbox: 'auto-run-trusted',
47
- approvalPolicy: 'auto-approve-safe',
48
- useWhen: 'Trusted repos where full Cascade agent mode is the primary workflow.',
49
- behavior: 'Full Cascade agent mode. Multi-file edits with auto-approval for safe operations.',
50
- surfaces: ['foreground'],
51
- },
52
- {
53
- key: 'steps-automation',
54
- label: 'Steps Automation',
55
- risk: 'medium',
56
- defaultSandbox: 'step-scoped',
57
- approvalPolicy: 'step-level-approval',
58
- useWhen: 'Complex multi-step tasks using Steps automation.',
59
- behavior: 'Cascade runs multi-step workflows. Each step can be reviewed before proceeding.',
60
- surfaces: ['foreground'],
61
- },
62
- {
63
- key: 'team-managed',
64
- label: 'Team Managed',
65
- risk: 'medium',
66
- defaultSandbox: 'team-policy',
67
- approvalPolicy: 'team-controlled',
68
- useWhen: 'Team environments with shared memories and MCP whitelist.',
69
- behavior: 'Team-level policies for MCP whitelist, memories sync, and workflow access.',
70
- surfaces: ['foreground'],
71
- },
72
- {
73
- key: 'enterprise',
74
- label: 'Enterprise',
75
- risk: 'low',
76
- defaultSandbox: 'org-policy-enforced',
77
- approvalPolicy: 'org-admin-controlled',
78
- useWhen: 'Enterprise tier with team sync, MCP whitelist, audit logs.',
79
- behavior: 'Admin-managed policies. MCP whitelist enforced. Audit logs and team sync policies.',
80
- surfaces: ['foreground'],
81
- },
82
- ];
83
-
84
- const WINDSURF_HOOK_REGISTRY = [
85
- {
86
- key: 'always-rules',
87
- file: '.windsurf/rules/*.md',
88
- triggerPoint: 'trigger: always',
89
- matcher: 'every Cascade interaction',
90
- purpose: 'Inject core instructions into every Cascade interaction.',
91
- risk: 'low',
92
- },
93
- {
94
- key: 'auto-rules',
95
- file: '.windsurf/rules/*.md',
96
- triggerPoint: 'trigger: auto, globs match',
97
- matcher: 'file glob patterns',
98
- purpose: 'Inject context-specific rules when matching files are referenced.',
99
- risk: 'low',
100
- },
101
- {
102
- key: 'agent-requested-rules',
103
- file: '.windsurf/rules/*.md',
104
- triggerPoint: 'trigger: agent_requested',
105
- matcher: 'Cascade agent decision',
106
- purpose: 'Rules that Cascade can choose to apply based on description relevance.',
107
- risk: 'low',
108
- },
109
- {
110
- key: 'workflow-trigger',
111
- file: '.windsurf/workflows/*.md',
112
- triggerPoint: 'slash command invocation',
113
- matcher: 'user-triggered slash command',
114
- purpose: 'Execute predefined workflows via slash commands.',
115
- risk: 'medium',
116
- },
117
- {
118
- key: 'memory-load',
119
- file: '.windsurf/memories/',
120
- triggerPoint: 'session start',
121
- matcher: 'persistent context',
122
- purpose: 'Load team-syncable memories into Cascade context.',
123
- risk: 'low',
124
- },
125
- {
126
- key: 'cascadeignore-filter',
127
- file: '.cascadeignore',
128
- triggerPoint: 'file access',
129
- matcher: 'gitignore-style patterns',
130
- purpose: 'Prevent Cascade from accessing sensitive files.',
131
- risk: 'low',
132
- },
133
- {
134
- key: 'mcp-tool-access',
135
- file: '.windsurf/mcp.json',
136
- triggerPoint: 'MCP tool invocation',
137
- matcher: 'tool name/server + team whitelist',
138
- purpose: 'Control which MCP tools are available. Team whitelist for controlled environments.',
139
- risk: 'medium',
140
- },
141
- ];
142
-
143
- const WINDSURF_POLICY_PACKS = [
144
- {
145
- key: 'baseline-safe',
146
- label: 'Baseline Safe',
147
- modules: ['.windsurf/rules/ with trigger: always', 'no .windsurfrules', '.cascadeignore configured', 'no secrets in rules'],
148
- useWhen: 'Default local Windsurf rollout.',
149
- },
150
- {
151
- key: 'cascade-safe',
152
- label: 'Cascade Safe',
153
- modules: ['cascadeignore for secrets', 'PR review gate', 'multi-file review before commit', 'Steps scoped'],
154
- useWhen: 'Repos using Cascade for autonomous multi-file editing.',
155
- },
156
- {
157
- key: 'team-safe',
158
- label: 'Team Safe',
159
- modules: ['MCP team whitelist', 'memories no secrets', 'shared workflows reviewed', 'sync policies documented'],
160
- useWhen: 'Team environments with shared Windsurf configuration.',
161
- },
162
- {
163
- key: 'enterprise-governed',
164
- label: 'Enterprise Governed',
165
- modules: ['MCP whitelist enforced', 'audit logs enabled', 'team sync policies', 'model access policy'],
166
- useWhen: 'Enterprise tier repos with strict governance requirements.',
167
- },
168
- {
169
- key: 'security-first',
170
- label: 'Security First',
171
- modules: ['.cascadeignore comprehensive', 'no secrets in any Windsurf config', 'MCP env vars secured', 'memories reviewed for PII'],
172
- useWhen: 'Repos handling sensitive data where security is paramount.',
173
- },
174
- ];
175
-
176
- const WINDSURF_PILOT_ROLLOUT_KIT = {
177
- recommendedScope: [
178
- 'Start with audit and setup on one trusted repo.',
179
- 'Keep .windsurf/rules/ and .windsurf/mcp.json in version control.',
180
- 'Configure .cascadeignore before enabling Cascade on sensitive repos.',
181
- 'Migrate .windsurfrules to .windsurf/rules/*.md before relying on Cascade.',
182
- 'Review team-synced memories for secrets or PII before sharing.',
183
- 'Test workflows on non-critical repos first.',
184
- ],
185
- approvals: [
186
- 'Engineering owner approves Cascade usage scope and MCP whitelist.',
187
- 'Security owner approves .cascadeignore and memory sync policies.',
188
- 'Pilot owner records before/after audit deltas and rollback expectations.',
189
- 'Team lead approves shared workflow definitions.',
190
- ],
191
- successMetrics: [
192
- 'Audit score delta',
193
- 'Surface coverage (rules + workflows + memories)',
194
- 'Time to first useful Cascade task',
195
- 'No-overwrite rate on existing repo files',
196
- 'Legacy .windsurfrules migration completion',
197
- 'MCP server whitelist compliance',
198
- ],
199
- rollbackExpectations: [
200
- 'Every Windsurf setup/apply write path should emit a rollback artifact.',
201
- 'Re-run audit after rollback to confirm the repo returned to expected state.',
202
- 'Cascade can be limited by removing .windsurf/rules/ or configuring .cascadeignore.',
203
- 'Team sync can be disabled by removing .windsurf/memories/.',
204
- ],
205
- };
206
-
207
- function getWindsurfGovernanceSummary() {
208
- return {
209
- platform: 'windsurf',
210
- platformLabel: 'Windsurf (Cascade)',
211
- permissionProfiles: WINDSURF_PERMISSION_PROFILES,
212
- hookRegistry: WINDSURF_HOOK_REGISTRY,
213
- policyPacks: WINDSURF_POLICY_PACKS,
214
- domainPacks: WINDSURF_DOMAIN_PACKS,
215
- mcpPacks: WINDSURF_MCP_PACKS,
216
- pilotRolloutKit: WINDSURF_PILOT_ROLLOUT_KIT,
217
- platformCaveats: [
218
- { id: 'windsurfrules-legacy', severity: 'high', message: '.windsurfrules is legacy format — migrate to .windsurf/rules/*.md with YAML frontmatter.' },
219
- { id: 'no-background-agents', severity: 'info', message: 'Windsurf has NO background agents (unlike Cursor). All Cascade runs are foreground.' },
220
- { id: 'rule-char-limit', severity: 'medium', message: 'Windsurf enforces a 10K character limit per rule file.' },
221
- { id: 'memories-team-sync', severity: 'high', message: 'Memories sync across team members — never put secrets or PII in memory files.' },
222
- { id: 'mcp-team-whitelist', severity: 'medium', message: 'MCP servers can be whitelisted at team level. Ensure only approved servers are listed.' },
223
- { id: 'cascadeignore-important', severity: 'high', message: 'Use .cascadeignore to prevent Cascade from accessing sensitive files (similar to .gitignore).' },
224
- { id: 'cascade-multi-file', severity: 'medium', message: 'Cascade performs multi-file edits. Review all changed files before committing.' },
225
- ],
226
- };
227
- }
228
-
229
- module.exports = {
230
- getWindsurfGovernanceSummary,
231
- };
1
+ /**
2
+ * Windsurf Governance Module
3
+ *
4
+ * 6 permission profiles, 7 hook equivalents, 5 policy packs.
5
+ *
6
+ * Windsurf-specific differences from Cursor:
7
+ * - NO background agents (Cascade runs in foreground only)
8
+ * - Cascade: autonomous agent with multi-file editing
9
+ * - Memories: team-syncable persistent context
10
+ * - Workflows: slash commands
11
+ * - Steps: automation sequences
12
+ * - .cascadeignore: gitignore-like for Cascade
13
+ * - MCP with team whitelist
14
+ * - 10K char rule limit per file
15
+ * - 4 activation modes: Always, Auto, Agent-Requested, Manual
16
+ */
17
+
18
+ const { WINDSURF_DOMAIN_PACKS } = require('./domain-packs');
19
+ const { WINDSURF_MCP_PACKS } = require('./mcp-packs');
20
+
21
+ const WINDSURF_PERMISSION_PROFILES = [
22
+ {
23
+ key: 'read-only',
24
+ label: 'Read Only',
25
+ risk: 'low',
26
+ defaultSandbox: 'no-writes',
27
+ approvalPolicy: 'always-confirm',
28
+ useWhen: 'First contact with a repo, security review, or auditing.',
29
+ behavior: 'Cascade can read and suggest, but all edits and terminal commands require explicit confirmation.',
30
+ surfaces: ['foreground'],
31
+ },
32
+ {
33
+ key: 'standard',
34
+ label: 'Standard',
35
+ risk: 'medium',
36
+ defaultSandbox: 'user-approval',
37
+ approvalPolicy: 'selective-approval',
38
+ useWhen: 'Default product work where Cascade edits locally but risky commands need review.',
39
+ behavior: 'Cascade proposes edits. Terminal commands require per-command approval.',
40
+ surfaces: ['foreground'],
41
+ },
42
+ {
43
+ key: 'cascade-agent',
44
+ label: 'Cascade Agent',
45
+ risk: 'medium',
46
+ defaultSandbox: 'auto-run-trusted',
47
+ approvalPolicy: 'auto-approve-safe',
48
+ useWhen: 'Trusted repos where full Cascade agent mode is the primary workflow.',
49
+ behavior: 'Full Cascade agent mode. Multi-file edits with auto-approval for safe operations.',
50
+ surfaces: ['foreground'],
51
+ },
52
+ {
53
+ key: 'steps-automation',
54
+ label: 'Steps Automation',
55
+ risk: 'medium',
56
+ defaultSandbox: 'step-scoped',
57
+ approvalPolicy: 'step-level-approval',
58
+ useWhen: 'Complex multi-step tasks using Steps automation.',
59
+ behavior: 'Cascade runs multi-step workflows. Each step can be reviewed before proceeding.',
60
+ surfaces: ['foreground'],
61
+ },
62
+ {
63
+ key: 'team-managed',
64
+ label: 'Team Managed',
65
+ risk: 'medium',
66
+ defaultSandbox: 'team-policy',
67
+ approvalPolicy: 'team-controlled',
68
+ useWhen: 'Team environments with shared memories and MCP whitelist.',
69
+ behavior: 'Team-level policies for MCP whitelist, memories sync, and workflow access.',
70
+ surfaces: ['foreground'],
71
+ },
72
+ {
73
+ key: 'enterprise',
74
+ label: 'Enterprise',
75
+ risk: 'low',
76
+ defaultSandbox: 'org-policy-enforced',
77
+ approvalPolicy: 'org-admin-controlled',
78
+ useWhen: 'Enterprise tier with team sync, MCP whitelist, audit logs.',
79
+ behavior: 'Admin-managed policies. MCP whitelist enforced. Audit logs and team sync policies.',
80
+ surfaces: ['foreground'],
81
+ },
82
+ ];
83
+
84
+ const WINDSURF_HOOK_REGISTRY = [
85
+ {
86
+ key: 'always-rules',
87
+ file: '.windsurf/rules/*.md',
88
+ triggerPoint: 'trigger: always',
89
+ matcher: 'every Cascade interaction',
90
+ purpose: 'Inject core instructions into every Cascade interaction.',
91
+ risk: 'low',
92
+ },
93
+ {
94
+ key: 'auto-rules',
95
+ file: '.windsurf/rules/*.md',
96
+ triggerPoint: 'trigger: auto, globs match',
97
+ matcher: 'file glob patterns',
98
+ purpose: 'Inject context-specific rules when matching files are referenced.',
99
+ risk: 'low',
100
+ },
101
+ {
102
+ key: 'agent-requested-rules',
103
+ file: '.windsurf/rules/*.md',
104
+ triggerPoint: 'trigger: agent_requested',
105
+ matcher: 'Cascade agent decision',
106
+ purpose: 'Rules that Cascade can choose to apply based on description relevance.',
107
+ risk: 'low',
108
+ },
109
+ {
110
+ key: 'workflow-trigger',
111
+ file: '.windsurf/workflows/*.md',
112
+ triggerPoint: 'slash command invocation',
113
+ matcher: 'user-triggered slash command',
114
+ purpose: 'Execute predefined workflows via slash commands.',
115
+ risk: 'medium',
116
+ },
117
+ {
118
+ key: 'memory-load',
119
+ file: '.windsurf/memories/',
120
+ triggerPoint: 'session start',
121
+ matcher: 'persistent context',
122
+ purpose: 'Load team-syncable memories into Cascade context.',
123
+ risk: 'low',
124
+ },
125
+ {
126
+ key: 'cascadeignore-filter',
127
+ file: '.cascadeignore',
128
+ triggerPoint: 'file access',
129
+ matcher: 'gitignore-style patterns',
130
+ purpose: 'Prevent Cascade from accessing sensitive files.',
131
+ risk: 'low',
132
+ },
133
+ {
134
+ key: 'mcp-tool-access',
135
+ file: '.windsurf/mcp.json',
136
+ triggerPoint: 'MCP tool invocation',
137
+ matcher: 'tool name/server + team whitelist',
138
+ purpose: 'Control which MCP tools are available. Team whitelist for controlled environments.',
139
+ risk: 'medium',
140
+ },
141
+ ];
142
+
143
+ const WINDSURF_POLICY_PACKS = [
144
+ {
145
+ key: 'baseline-safe',
146
+ label: 'Baseline Safe',
147
+ modules: ['.windsurf/rules/ with trigger: always', 'no .windsurfrules', '.cascadeignore configured', 'no secrets in rules'],
148
+ useWhen: 'Default local Windsurf rollout.',
149
+ },
150
+ {
151
+ key: 'cascade-safe',
152
+ label: 'Cascade Safe',
153
+ modules: ['cascadeignore for secrets', 'PR review gate', 'multi-file review before commit', 'Steps scoped'],
154
+ useWhen: 'Repos using Cascade for autonomous multi-file editing.',
155
+ },
156
+ {
157
+ key: 'team-safe',
158
+ label: 'Team Safe',
159
+ modules: ['MCP team whitelist', 'memories no secrets', 'shared workflows reviewed', 'sync policies documented'],
160
+ useWhen: 'Team environments with shared Windsurf configuration.',
161
+ },
162
+ {
163
+ key: 'enterprise-governed',
164
+ label: 'Enterprise Governed',
165
+ modules: ['MCP whitelist enforced', 'audit logs enabled', 'team sync policies', 'model access policy'],
166
+ useWhen: 'Enterprise tier repos with strict governance requirements.',
167
+ },
168
+ {
169
+ key: 'security-first',
170
+ label: 'Security First',
171
+ modules: ['.cascadeignore comprehensive', 'no secrets in any Windsurf config', 'MCP env vars secured', 'memories reviewed for PII'],
172
+ useWhen: 'Repos handling sensitive data where security is paramount.',
173
+ },
174
+ ];
175
+
176
+ const WINDSURF_PILOT_ROLLOUT_KIT = {
177
+ recommendedScope: [
178
+ 'Start with audit and setup on one trusted repo.',
179
+ 'Keep .windsurf/rules/ and .windsurf/mcp.json in version control.',
180
+ 'Configure .cascadeignore before enabling Cascade on sensitive repos.',
181
+ 'Migrate .windsurfrules to .windsurf/rules/*.md before relying on Cascade.',
182
+ 'Review team-synced memories for secrets or PII before sharing.',
183
+ 'Test workflows on non-critical repos first.',
184
+ ],
185
+ approvals: [
186
+ 'Engineering owner approves Cascade usage scope and MCP whitelist.',
187
+ 'Security owner approves .cascadeignore and memory sync policies.',
188
+ 'Pilot owner records before/after audit deltas and rollback expectations.',
189
+ 'Team lead approves shared workflow definitions.',
190
+ ],
191
+ successMetrics: [
192
+ 'Audit score delta',
193
+ 'Surface coverage (rules + workflows + memories)',
194
+ 'Time to first useful Cascade task',
195
+ 'No-overwrite rate on existing repo files',
196
+ 'Legacy .windsurfrules migration completion',
197
+ 'MCP server whitelist compliance',
198
+ ],
199
+ rollbackExpectations: [
200
+ 'Every Windsurf setup/apply write path should emit a rollback artifact.',
201
+ 'Re-run audit after rollback to confirm the repo returned to expected state.',
202
+ 'Cascade can be limited by removing .windsurf/rules/ or configuring .cascadeignore.',
203
+ 'Team sync can be disabled by removing .windsurf/memories/.',
204
+ ],
205
+ };
206
+
207
+ function getWindsurfGovernanceSummary() {
208
+ return {
209
+ platform: 'windsurf',
210
+ platformLabel: 'Windsurf (Cascade)',
211
+ permissionProfiles: WINDSURF_PERMISSION_PROFILES,
212
+ hookRegistry: WINDSURF_HOOK_REGISTRY,
213
+ policyPacks: WINDSURF_POLICY_PACKS,
214
+ domainPacks: WINDSURF_DOMAIN_PACKS,
215
+ mcpPacks: WINDSURF_MCP_PACKS,
216
+ pilotRolloutKit: WINDSURF_PILOT_ROLLOUT_KIT,
217
+ platformCaveats: [
218
+ { id: 'windsurfrules-legacy', severity: 'high', message: '.windsurfrules is legacy format — migrate to .windsurf/rules/*.md with YAML frontmatter.' },
219
+ { id: 'no-background-agents', severity: 'info', message: 'Windsurf has NO background agents (unlike Cursor). All Cascade runs are foreground.' },
220
+ { id: 'rule-char-limit', severity: 'medium', message: 'Windsurf enforces a 10K character limit per rule file.' },
221
+ { id: 'memories-team-sync', severity: 'high', message: 'Memories sync across team members — never put secrets or PII in memory files.' },
222
+ { id: 'mcp-team-whitelist', severity: 'medium', message: 'MCP servers can be whitelisted at team level. Ensure only approved servers are listed.' },
223
+ { id: 'cascadeignore-important', severity: 'high', message: 'Use .cascadeignore to prevent Cascade from accessing sensitive files (similar to .gitignore).' },
224
+ { id: 'cascade-multi-file', severity: 'medium', message: 'Cascade performs multi-file edits. Review all changed files before committing.' },
225
+ ],
226
+ };
227
+ }
228
+
229
+ module.exports = {
230
+ getWindsurfGovernanceSummary,
231
+ };