@nerviq/cli 1.10.0 → 1.12.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 (57) hide show
  1. package/README.md +176 -47
  2. package/bin/cli.js +842 -287
  3. package/package.json +2 -2
  4. package/src/activity.js +225 -59
  5. package/src/adoption-advisor.js +299 -0
  6. package/src/aider/freshness.js +28 -25
  7. package/src/aider/techniques.js +16 -11
  8. package/src/analyze.js +131 -1
  9. package/src/anti-patterns.js +17 -2
  10. package/src/audit.js +197 -96
  11. package/src/behavioral-drift.js +801 -0
  12. package/src/benchmark.js +15 -10
  13. package/src/continuous-ops.js +681 -0
  14. package/src/cost-tracking.js +61 -0
  15. package/src/cursor/techniques.js +17 -12
  16. package/src/deep-review.js +83 -0
  17. package/src/diff-only.js +280 -0
  18. package/src/doctor.js +118 -55
  19. package/src/governance.js +72 -50
  20. package/src/hook-validation.js +342 -0
  21. package/src/index.js +7 -1
  22. package/src/integrations.js +144 -60
  23. package/src/mcp-validation.js +337 -0
  24. package/src/opencode/techniques.js +12 -7
  25. package/src/operating-profile.js +574 -0
  26. package/src/org.js +97 -13
  27. package/src/permission-rules.js +218 -0
  28. package/src/plans.js +192 -8
  29. package/src/platform-change-manifest.js +86 -0
  30. package/src/policy-layers.js +210 -0
  31. package/src/profiles.js +4 -1
  32. package/src/prompt-injection.js +74 -0
  33. package/src/repo-archetype.js +386 -0
  34. package/src/secret-patterns.js +9 -0
  35. package/src/server.js +398 -3
  36. package/src/setup.js +36 -2
  37. package/src/source-urls.js +132 -132
  38. package/src/supplemental-checks.js +13 -12
  39. package/src/techniques/api.js +407 -0
  40. package/src/techniques/automation.js +316 -0
  41. package/src/techniques/compliance.js +257 -0
  42. package/src/techniques/hygiene.js +294 -0
  43. package/src/techniques/instructions.js +243 -0
  44. package/src/techniques/observability.js +226 -0
  45. package/src/techniques/optimization.js +142 -0
  46. package/src/techniques/quality.js +317 -0
  47. package/src/techniques/security.js +237 -0
  48. package/src/techniques/shared.js +443 -0
  49. package/src/techniques/stacks.js +2294 -0
  50. package/src/techniques/tools.js +106 -0
  51. package/src/techniques/workflow.js +413 -0
  52. package/src/techniques.js +78 -5611
  53. package/src/terminology.js +73 -0
  54. package/src/token-estimate.js +35 -0
  55. package/src/watch.js +18 -0
  56. package/src/windsurf/techniques.js +17 -12
  57. package/src/workspace.js +105 -8
@@ -28,19 +28,19 @@ const SOURCE_URLS = {
28
28
  'api-design': 'https://code.claude.com/docs/en/best-practices',
29
29
  database: 'https://code.claude.com/docs/en/common-workflows',
30
30
  authentication: 'https://code.claude.com/docs/en/permissions',
31
- monitoring: 'https://code.claude.com/docs/en/common-workflows',
31
+ monitoring: 'https://code.claude.com/docs/en/best-practices',
32
32
  'dependency-management': 'https://code.claude.com/docs/en/best-practices',
33
33
  'cost-optimization': 'https://code.claude.com/docs/en/memory',
34
- python: 'https://code.claude.com/docs/en/common-workflows',
35
- go: 'https://code.claude.com/docs/en/common-workflows',
36
- rust: 'https://code.claude.com/docs/en/common-workflows',
37
- java: 'https://code.claude.com/docs/en/common-workflows',
38
- ruby: 'https://code.claude.com/docs/en/common-workflows',
39
- dotnet: 'https://code.claude.com/docs/en/common-workflows',
40
- php: 'https://code.claude.com/docs/en/common-workflows',
41
- flutter: 'https://code.claude.com/docs/en/common-workflows',
42
- swift: 'https://code.claude.com/docs/en/common-workflows',
43
- kotlin: 'https://code.claude.com/docs/en/common-workflows',
34
+ python: 'https://code.claude.com/docs/en/best-practices',
35
+ go: 'https://code.claude.com/docs/en/best-practices',
36
+ rust: 'https://code.claude.com/docs/en/best-practices',
37
+ java: 'https://code.claude.com/docs/en/best-practices',
38
+ ruby: 'https://code.claude.com/docs/en/best-practices',
39
+ dotnet: 'https://code.claude.com/docs/en/best-practices',
40
+ php: 'https://code.claude.com/docs/en/best-practices',
41
+ flutter: 'https://code.claude.com/docs/en/best-practices',
42
+ swift: 'https://code.claude.com/docs/en/best-practices',
43
+ kotlin: 'https://code.claude.com/docs/en/best-practices',
44
44
  },
45
45
  byKey: {
46
46
  customCommands: 'https://code.claude.com/docs/en/commands',
@@ -69,31 +69,31 @@ const SOURCE_URLS = {
69
69
  skills: 'https://developers.openai.com/codex/skills',
70
70
  agents: 'https://developers.openai.com/codex/subagents',
71
71
  automation: 'https://developers.openai.com/codex/app/automations',
72
- review: 'https://developers.openai.com/codex/cli',
72
+ review: 'https://developers.openai.com/codex/guides/agents-md',
73
73
  local: 'https://developers.openai.com/codex/app/local-environments',
74
74
  'quality-deep': 'https://developers.openai.com/codex/feature-maturity',
75
- advisory: 'https://developers.openai.com/codex/cli',
75
+ advisory: 'https://developers.openai.com/codex/feature-maturity',
76
76
  'pack-posture': 'https://developers.openai.com/codex/mcp',
77
- 'repeat-usage': 'https://developers.openai.com/codex/cli',
77
+ 'repeat-usage': 'https://developers.openai.com/codex/app/local-environments',
78
78
  'release-freshness': 'https://developers.openai.com/codex/changelog',
79
- 'testing-strategy': 'https://developers.openai.com/codex/cli',
79
+ 'testing-strategy': 'https://developers.openai.com/codex/guides/agents-md',
80
80
  'code-quality': 'https://developers.openai.com/codex/rules',
81
81
  'api-design': 'https://developers.openai.com/codex/guides/agents-md',
82
- database: 'https://developers.openai.com/codex/cli',
82
+ database: 'https://developers.openai.com/codex/app/local-environments',
83
83
  authentication: 'https://developers.openai.com/codex/agent-approvals-security',
84
84
  monitoring: 'https://developers.openai.com/codex/feature-maturity',
85
85
  'dependency-management': 'https://developers.openai.com/codex/config-reference',
86
86
  'cost-optimization': 'https://developers.openai.com/codex/guides/agents-md',
87
- python: 'https://developers.openai.com/codex/cli',
88
- go: 'https://developers.openai.com/codex/cli',
89
- rust: 'https://developers.openai.com/codex/cli',
90
- java: 'https://developers.openai.com/codex/cli',
91
- ruby: 'https://developers.openai.com/codex/cli',
92
- dotnet: 'https://developers.openai.com/codex/cli',
93
- php: 'https://developers.openai.com/codex/cli',
94
- flutter: 'https://developers.openai.com/codex/cli',
95
- swift: 'https://developers.openai.com/codex/cli',
96
- kotlin: 'https://developers.openai.com/codex/cli',
87
+ python: 'https://developers.openai.com/codex/rules',
88
+ go: 'https://developers.openai.com/codex/rules',
89
+ rust: 'https://developers.openai.com/codex/rules',
90
+ java: 'https://developers.openai.com/codex/rules',
91
+ ruby: 'https://developers.openai.com/codex/rules',
92
+ dotnet: 'https://developers.openai.com/codex/rules',
93
+ php: 'https://developers.openai.com/codex/rules',
94
+ flutter: 'https://developers.openai.com/codex/guides/agents-md',
95
+ swift: 'https://developers.openai.com/codex/guides/agents-md',
96
+ kotlin: 'https://developers.openai.com/codex/guides/agents-md',
97
97
  },
98
98
  byKey: {
99
99
  codexAutomationManuallyTested: 'https://developers.openai.com/codex/app/automations',
@@ -119,40 +119,40 @@ const SOURCE_URLS = {
119
119
  sandbox: 'https://geminicli.com/docs/cli/sandbox/',
120
120
  agents: 'https://geminicli.com/docs/core/subagents/',
121
121
  skills: 'https://geminicli.com/docs/cli/skills/',
122
- automation: 'https://geminicli.com/docs/get-started/',
122
+ automation: 'https://geminicli.com/docs/cli/session-management/',
123
123
  extensions: 'https://geminicli.com/docs/extensions/',
124
- review: 'https://geminicli.com/docs/get-started/',
125
- 'quality-deep': 'https://geminicli.com/docs/get-started/',
124
+ review: 'https://geminicli.com/docs/cli/session-management/',
125
+ 'quality-deep': 'https://geminicli.com/docs/cli/gemini-md/',
126
126
  commands: 'https://geminicli.com/docs/cli/custom-commands/',
127
- advisory: 'https://geminicli.com/docs/get-started/',
127
+ advisory: 'https://geminicli.com/docs/cli/session-management/',
128
128
  'pack-posture': 'https://geminicli.com/docs/tools/mcp-server/',
129
129
  'repeat-usage': 'https://geminicli.com/docs/cli/session-management/',
130
130
  'release-freshness': 'https://geminicli.com/docs/changelogs/latest/',
131
- 'testing-strategy': 'https://geminicli.com/docs/get-started/',
131
+ 'testing-strategy': 'https://geminicli.com/docs/cli/gemini-md/',
132
132
  'code-quality': 'https://geminicli.com/docs/cli/gemini-md/',
133
133
  'api-design': 'https://geminicli.com/docs/cli/gemini-md/',
134
- database: 'https://geminicli.com/docs/get-started/',
134
+ database: 'https://geminicli.com/docs/reference/configuration/',
135
135
  authentication: 'https://geminicli.com/docs/cli/trusted-folders/',
136
- monitoring: 'https://geminicli.com/docs/get-started/',
136
+ monitoring: 'https://geminicli.com/docs/reference/configuration/',
137
137
  'dependency-management': 'https://geminicli.com/docs/reference/configuration/',
138
- 'cost-optimization': 'https://geminicli.com/docs/get-started/',
139
- python: 'https://geminicli.com/docs/get-started/',
140
- go: 'https://geminicli.com/docs/get-started/',
141
- rust: 'https://geminicli.com/docs/get-started/',
142
- java: 'https://geminicli.com/docs/get-started/',
143
- ruby: 'https://geminicli.com/docs/get-started/',
144
- dotnet: 'https://geminicli.com/docs/get-started/',
145
- php: 'https://geminicli.com/docs/get-started/',
146
- flutter: 'https://geminicli.com/docs/get-started/',
147
- swift: 'https://geminicli.com/docs/get-started/',
148
- kotlin: 'https://geminicli.com/docs/get-started/',
138
+ 'cost-optimization': 'https://geminicli.com/docs/cli/session-management/',
139
+ python: 'https://geminicli.com/docs/cli/gemini-md/',
140
+ go: 'https://geminicli.com/docs/cli/gemini-md/',
141
+ rust: 'https://geminicli.com/docs/cli/gemini-md/',
142
+ java: 'https://geminicli.com/docs/cli/gemini-md/',
143
+ ruby: 'https://geminicli.com/docs/cli/gemini-md/',
144
+ dotnet: 'https://geminicli.com/docs/cli/gemini-md/',
145
+ php: 'https://geminicli.com/docs/cli/gemini-md/',
146
+ flutter: 'https://geminicli.com/docs/cli/gemini-md/',
147
+ swift: 'https://geminicli.com/docs/cli/gemini-md/',
148
+ kotlin: 'https://geminicli.com/docs/cli/gemini-md/',
149
149
  },
150
150
  },
151
151
  copilot: {
152
152
  defaultUrl: 'https://docs.github.com/en/copilot',
153
153
  byCategory: {
154
154
  instructions: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
155
- config: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
155
+ config: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
156
156
  trust: 'https://docs.github.com/en/copilot/responsible-use-of-github-copilot-features/github-copilot-data-handling',
157
157
  mcp: 'https://docs.github.com/en/copilot/customizing-copilot/using-model-context-protocol/extending-copilot-chat-with-mcp',
158
158
  'cloud-agent': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
@@ -165,24 +165,24 @@ const SOURCE_URLS = {
165
165
  'quality-deep': 'https://docs.github.com/en/copilot',
166
166
  advisory: 'https://docs.github.com/en/copilot',
167
167
  freshness: 'https://docs.github.com/en/copilot',
168
- 'testing-strategy': 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
169
- 'code-quality': 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
170
- 'api-design': 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
168
+ 'testing-strategy': 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
169
+ 'code-quality': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
170
+ 'api-design': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
171
171
  database: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
172
172
  authentication: 'https://docs.github.com/en/copilot/responsible-use-of-github-copilot-features/github-copilot-data-handling',
173
173
  monitoring: 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
174
- 'dependency-management': 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
174
+ 'dependency-management': 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
175
175
  'cost-optimization': 'https://docs.github.com/en/copilot',
176
- python: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
177
- go: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
178
- rust: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
179
- java: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
180
- ruby: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
181
- dotnet: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
182
- php: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
183
- flutter: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
184
- swift: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
185
- kotlin: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
176
+ python: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
177
+ go: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
178
+ rust: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
179
+ java: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
180
+ ruby: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
181
+ dotnet: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
182
+ php: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
183
+ flutter: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
184
+ swift: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
185
+ kotlin: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
186
186
  },
187
187
  },
188
188
  cursor: {
@@ -193,39 +193,39 @@ const SOURCE_URLS = {
193
193
  trust: 'https://docs.cursor.com/enterprise/privacy-and-data-governance',
194
194
  'agent-mode': 'https://docs.cursor.com/en/chat/agent',
195
195
  mcp: 'https://docs.cursor.com/cli/mcp',
196
- 'instructions-quality': 'https://docs.cursor.com/guides/working-with-context',
196
+ 'instructions-quality': 'https://docs.cursor.com/context/rules',
197
197
  'background-agents': 'https://docs.cursor.com/en/background-agents',
198
198
  automations: 'https://docs.cursor.com/en/background-agents/automations',
199
199
  enterprise: 'https://docs.cursor.com/enterprise',
200
200
  bugbot: 'https://docs.cursor.com/bugbot',
201
201
  'cross-surface': 'https://docs.cursor.com/',
202
- 'quality-deep': 'https://docs.cursor.com/guides/working-with-context',
202
+ 'quality-deep': 'https://docs.cursor.com/context/rules',
203
203
  advisory: 'https://docs.cursor.com/',
204
204
  freshness: 'https://docs.cursor.com/',
205
- 'testing-strategy': 'https://docs.cursor.com/guides/working-with-context',
205
+ 'testing-strategy': 'https://docs.cursor.com/context/rules',
206
206
  'code-quality': 'https://docs.cursor.com/context/rules',
207
- 'api-design': 'https://docs.cursor.com/guides/working-with-context',
208
- database: 'https://docs.cursor.com/guides/working-with-context',
207
+ 'api-design': 'https://docs.cursor.com/context/rules',
208
+ database: 'https://docs.cursor.com/context/rules',
209
209
  authentication: 'https://docs.cursor.com/enterprise/privacy-and-data-governance',
210
- monitoring: 'https://docs.cursor.com/guides/working-with-context',
211
- 'dependency-management': 'https://docs.cursor.com/guides/working-with-context',
210
+ monitoring: 'https://docs.cursor.com/context/rules',
211
+ 'dependency-management': 'https://docs.cursor.com/context/rules',
212
212
  'cost-optimization': 'https://docs.cursor.com/account',
213
- python: 'https://docs.cursor.com/guides/working-with-context',
214
- go: 'https://docs.cursor.com/guides/working-with-context',
215
- rust: 'https://docs.cursor.com/guides/working-with-context',
216
- java: 'https://docs.cursor.com/guides/working-with-context',
217
- ruby: 'https://docs.cursor.com/guides/working-with-context',
218
- dotnet: 'https://docs.cursor.com/guides/working-with-context',
219
- php: 'https://docs.cursor.com/guides/working-with-context',
220
- flutter: 'https://docs.cursor.com/guides/working-with-context',
221
- swift: 'https://docs.cursor.com/guides/working-with-context',
222
- kotlin: 'https://docs.cursor.com/guides/working-with-context',
213
+ python: 'https://docs.cursor.com/context/rules',
214
+ go: 'https://docs.cursor.com/context/rules',
215
+ rust: 'https://docs.cursor.com/context/rules',
216
+ java: 'https://docs.cursor.com/context/rules',
217
+ ruby: 'https://docs.cursor.com/context/rules',
218
+ dotnet: 'https://docs.cursor.com/context/rules',
219
+ php: 'https://docs.cursor.com/context/rules',
220
+ flutter: 'https://docs.cursor.com/context/rules',
221
+ swift: 'https://docs.cursor.com/context/rules',
222
+ kotlin: 'https://docs.cursor.com/context/rules',
223
223
  },
224
224
  },
225
225
  windsurf: {
226
226
  defaultUrl: 'https://docs.windsurf.com/windsurf/cascade/cascade',
227
227
  byCategory: {
228
- rules: 'https://docs.windsurf.com/windsurf/cascade/cascade',
228
+ rules: 'https://docs.windsurf.com/windsurf/cascade/agents-md',
229
229
  config: 'https://docs.windsurf.com/windsurf/cascade/cascade',
230
230
  trust: 'https://docs.windsurf.com/windsurf/cascade/cascade',
231
231
  'cascade-agent': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
@@ -236,27 +236,27 @@ const SOURCE_URLS = {
236
236
  enterprise: 'https://docs.windsurf.com/windsurf/cascade/cascade',
237
237
  cascadeignore: 'https://docs.windsurf.com/windsurf/cascade/cascade',
238
238
  'cross-surface': 'https://docs.windsurf.com/windsurf/cascade/cascade',
239
- 'quality-deep': 'https://docs.windsurf.com/windsurf/cascade/cascade',
239
+ 'quality-deep': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
240
240
  advisory: 'https://docs.windsurf.com/windsurf/cascade/cascade',
241
241
  freshness: 'https://docs.windsurf.com/windsurf/cascade/cascade',
242
- 'testing-strategy': 'https://docs.windsurf.com/windsurf/cascade/cascade',
243
- 'code-quality': 'https://docs.windsurf.com/windsurf/cascade/cascade',
244
- 'api-design': 'https://docs.windsurf.com/windsurf/cascade/cascade',
245
- database: 'https://docs.windsurf.com/windsurf/cascade/cascade',
242
+ 'testing-strategy': 'https://docs.windsurf.com/windsurf/cascade/workflows',
243
+ 'code-quality': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
244
+ 'api-design': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
245
+ database: 'https://docs.windsurf.com/windsurf/cascade/workflows',
246
246
  authentication: 'https://docs.windsurf.com/windsurf/cascade/cascade',
247
- monitoring: 'https://docs.windsurf.com/windsurf/cascade/cascade',
248
- 'dependency-management': 'https://docs.windsurf.com/windsurf/cascade/cascade',
247
+ monitoring: 'https://docs.windsurf.com/windsurf/cascade/workflows',
248
+ 'dependency-management': 'https://docs.windsurf.com/windsurf/cascade/workflows',
249
249
  'cost-optimization': 'https://docs.windsurf.com/windsurf/cascade/cascade',
250
- python: 'https://docs.windsurf.com/windsurf/cascade/cascade',
251
- go: 'https://docs.windsurf.com/windsurf/cascade/cascade',
252
- rust: 'https://docs.windsurf.com/windsurf/cascade/cascade',
253
- java: 'https://docs.windsurf.com/windsurf/cascade/cascade',
254
- ruby: 'https://docs.windsurf.com/windsurf/cascade/cascade',
255
- dotnet: 'https://docs.windsurf.com/windsurf/cascade/cascade',
256
- php: 'https://docs.windsurf.com/windsurf/cascade/cascade',
257
- flutter: 'https://docs.windsurf.com/windsurf/cascade/cascade',
258
- swift: 'https://docs.windsurf.com/windsurf/cascade/cascade',
259
- kotlin: 'https://docs.windsurf.com/windsurf/cascade/cascade',
250
+ python: 'https://docs.windsurf.com/windsurf/cascade/workflows',
251
+ go: 'https://docs.windsurf.com/windsurf/cascade/workflows',
252
+ rust: 'https://docs.windsurf.com/windsurf/cascade/workflows',
253
+ java: 'https://docs.windsurf.com/windsurf/cascade/workflows',
254
+ ruby: 'https://docs.windsurf.com/windsurf/cascade/workflows',
255
+ dotnet: 'https://docs.windsurf.com/windsurf/cascade/workflows',
256
+ php: 'https://docs.windsurf.com/windsurf/cascade/workflows',
257
+ flutter: 'https://docs.windsurf.com/windsurf/cascade/workflows',
258
+ swift: 'https://docs.windsurf.com/windsurf/cascade/workflows',
259
+ kotlin: 'https://docs.windsurf.com/windsurf/cascade/workflows',
260
260
  },
261
261
  },
262
262
  aider: {
@@ -270,28 +270,28 @@ const SOURCE_URLS = {
270
270
  architecture: 'https://aider.chat/docs/usage/modes.html',
271
271
  security: 'https://aider.chat/docs/config/dotenv.html',
272
272
  ci: 'https://aider.chat/docs/usage/modes.html',
273
- quality: 'https://aider.chat/docs/usage/modes.html',
273
+ quality: 'https://aider.chat/docs/usage/conventions.html',
274
274
  'workflow-patterns': 'https://aider.chat/docs/usage/modes.html',
275
275
  'editor-integration': 'https://aider.chat/docs/config.html',
276
- 'release-readiness': 'https://aider.chat/docs/',
277
- 'testing-strategy': 'https://aider.chat/docs/',
278
- 'code-quality': 'https://aider.chat/docs/',
279
- 'api-design': 'https://aider.chat/docs/',
280
- database: 'https://aider.chat/docs/',
281
- authentication: 'https://aider.chat/docs/',
282
- monitoring: 'https://aider.chat/docs/',
283
- 'dependency-management': 'https://aider.chat/docs/',
284
- 'cost-optimization': 'https://aider.chat/docs/',
285
- python: 'https://aider.chat/docs/',
286
- go: 'https://aider.chat/docs/',
287
- rust: 'https://aider.chat/docs/',
288
- java: 'https://aider.chat/docs/',
289
- ruby: 'https://aider.chat/docs/',
290
- dotnet: 'https://aider.chat/docs/',
291
- php: 'https://aider.chat/docs/',
292
- flutter: 'https://aider.chat/docs/',
293
- swift: 'https://aider.chat/docs/',
294
- kotlin: 'https://aider.chat/docs/',
276
+ 'release-readiness': 'https://aider.chat/docs/config.html',
277
+ 'testing-strategy': 'https://aider.chat/docs/usage/conventions.html',
278
+ 'code-quality': 'https://aider.chat/docs/usage/conventions.html',
279
+ 'api-design': 'https://aider.chat/docs/usage/conventions.html',
280
+ database: 'https://aider.chat/docs/usage/modes.html',
281
+ authentication: 'https://aider.chat/docs/config/dotenv.html',
282
+ monitoring: 'https://aider.chat/docs/usage/modes.html',
283
+ 'dependency-management': 'https://aider.chat/docs/config.html',
284
+ 'cost-optimization': 'https://aider.chat/docs/usage/modes.html',
285
+ python: 'https://aider.chat/docs/usage/conventions.html',
286
+ go: 'https://aider.chat/docs/usage/conventions.html',
287
+ rust: 'https://aider.chat/docs/usage/conventions.html',
288
+ java: 'https://aider.chat/docs/usage/conventions.html',
289
+ ruby: 'https://aider.chat/docs/usage/conventions.html',
290
+ dotnet: 'https://aider.chat/docs/usage/conventions.html',
291
+ php: 'https://aider.chat/docs/usage/conventions.html',
292
+ flutter: 'https://aider.chat/docs/usage/conventions.html',
293
+ swift: 'https://aider.chat/docs/usage/conventions.html',
294
+ kotlin: 'https://aider.chat/docs/usage/conventions.html',
295
295
  },
296
296
  },
297
297
  opencode: {
@@ -313,24 +313,24 @@ const SOURCE_URLS = {
313
313
  'release-freshness': 'https://github.com/sst/opencode/releases',
314
314
  'mixed-agent': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
315
315
  propagation: 'https://github.com/sst/opencode/tree/dev/.opencode',
316
- 'testing-strategy': 'https://github.com/sst/opencode',
317
- 'code-quality': 'https://github.com/sst/opencode',
318
- 'api-design': 'https://github.com/sst/opencode',
319
- database: 'https://github.com/sst/opencode',
320
- authentication: 'https://github.com/sst/opencode',
321
- monitoring: 'https://github.com/sst/opencode',
322
- 'dependency-management': 'https://github.com/sst/opencode',
323
- 'cost-optimization': 'https://github.com/sst/opencode',
324
- python: 'https://github.com/sst/opencode',
325
- go: 'https://github.com/sst/opencode',
326
- rust: 'https://github.com/sst/opencode',
327
- java: 'https://github.com/sst/opencode',
328
- ruby: 'https://github.com/sst/opencode',
329
- dotnet: 'https://github.com/sst/opencode',
330
- php: 'https://github.com/sst/opencode',
331
- flutter: 'https://github.com/sst/opencode',
332
- swift: 'https://github.com/sst/opencode',
333
- kotlin: 'https://github.com/sst/opencode',
316
+ 'testing-strategy': 'https://github.com/sst/opencode/tree/dev/.github',
317
+ 'code-quality': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
318
+ 'api-design': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
319
+ database: 'https://github.com/sst/opencode/blob/dev/README.md',
320
+ authentication: 'https://github.com/sst/opencode/blob/dev/SECURITY.md',
321
+ monitoring: 'https://github.com/sst/opencode/blob/dev/README.md',
322
+ 'dependency-management': 'https://github.com/sst/opencode/blob/dev/README.md',
323
+ 'cost-optimization': 'https://github.com/sst/opencode/blob/dev/README.md',
324
+ python: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
325
+ go: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
326
+ rust: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
327
+ java: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
328
+ ruby: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
329
+ dotnet: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
330
+ php: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
331
+ flutter: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
332
+ swift: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
333
+ kotlin: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
334
334
  },
335
335
  },
336
336
  };
@@ -1,4 +1,5 @@
1
- const path = require('path');
1
+ const path = require('path');
2
+ const { hasCostBudgetOrUsageTracking } = require('./cost-tracking');
2
3
 
3
4
  function normalizeText(value) {
4
5
  return String(value || '');
@@ -756,17 +757,17 @@ const CHECK_DEFS = [
756
757
  ? docMatches(surface.docs, [/\bbatch\b/i, /\bbulk\b/i, /\bqueue\b/i, /\bcoalesce\b/i])
757
758
  : null,
758
759
  },
759
- {
760
- key: 'costOptimizationBudgetGuardrails',
761
- suffix: '47',
762
- name: 'Cost optimization: budget guardrails mentioned',
763
- category: 'cost-optimization',
764
- impact: 'low',
765
- fix: 'Document spend or usage guardrails so automation has a visible budget boundary.',
766
- check: (_ctx, surface) => surface.docs
767
- ? docMatches(surface.docs, [/\bbudget\b/i, /\bquota\b/i, /\bcap\b/i, /\bcost limit\b/i])
768
- : null,
769
- },
760
+ {
761
+ key: 'costOptimizationBudgetGuardrails',
762
+ suffix: '47',
763
+ name: 'Cost optimization: budget guardrails or per-run usage tracking',
764
+ category: 'cost-optimization',
765
+ impact: 'low',
766
+ fix: 'Document spend guardrails or per-run usage/cost tracking so agent automation has an explicit budget boundary and observability trail.',
767
+ check: (ctx, surface) => hasRelevantProject(surface)
768
+ ? hasCostBudgetOrUsageTracking(surface.project, ctx)
769
+ : null,
770
+ },
770
771
  {
771
772
  key: 'costOptimizationContextPruning',
772
773
  suffix: '48',