@nerviq/cli 1.29.0 → 1.29.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 (80) hide show
  1. package/CHANGELOG.md +1527 -1493
  2. package/README.md +550 -538
  3. package/SECURITY.md +82 -82
  4. package/bin/cli.js +2562 -2558
  5. package/docs/api-reference.md +356 -356
  6. package/docs/audit-fix.md +109 -0
  7. package/docs/autofix.md +3 -62
  8. package/docs/getting-started.md +1 -1
  9. package/docs/index.html +592 -592
  10. package/docs/integration-contracts.md +287 -287
  11. package/docs/maintenance.md +128 -128
  12. package/docs/new-platform-guide.md +202 -202
  13. package/docs/release-process.md +63 -0
  14. package/docs/shallow-risk.md +244 -244
  15. package/docs/why-nerviq.md +82 -82
  16. package/package.json +67 -67
  17. package/src/aider/activity.js +226 -226
  18. package/src/aider/context.js +162 -162
  19. package/src/aider/freshness.js +123 -123
  20. package/src/aider/techniques.js +3465 -3465
  21. package/src/audit/layers.js +180 -180
  22. package/src/audit.js +1032 -1032
  23. package/src/benchmark.js +299 -299
  24. package/src/codex/activity.js +324 -324
  25. package/src/codex/freshness.js +142 -142
  26. package/src/codex/techniques.js +4895 -4895
  27. package/src/context.js +326 -326
  28. package/src/continuous-ops.js +11 -1
  29. package/src/convert.js +340 -340
  30. package/src/copilot/config-parser.js +280 -280
  31. package/src/copilot/context.js +218 -218
  32. package/src/copilot/freshness.js +177 -177
  33. package/src/copilot/patch.js +238 -238
  34. package/src/copilot/techniques.js +3578 -3578
  35. package/src/cursor/freshness.js +194 -194
  36. package/src/cursor/patch.js +243 -243
  37. package/src/cursor/techniques.js +3735 -3735
  38. package/src/doctor.js +201 -201
  39. package/src/fix-engine.js +511 -8
  40. package/src/formatters/csv.js +86 -86
  41. package/src/formatters/junit.js +123 -123
  42. package/src/formatters/markdown.js +164 -164
  43. package/src/formatters/otel.js +151 -151
  44. package/src/freshness.js +156 -156
  45. package/src/gemini/activity.js +402 -402
  46. package/src/gemini/context.js +290 -290
  47. package/src/gemini/freshness.js +183 -183
  48. package/src/gemini/patch.js +229 -229
  49. package/src/gemini/techniques.js +3811 -3811
  50. package/src/governance.js +533 -533
  51. package/src/harmony/audit.js +306 -306
  52. package/src/i18n.js +63 -63
  53. package/src/insights.js +119 -119
  54. package/src/integrations.js +134 -134
  55. package/src/locales/en.json +33 -33
  56. package/src/locales/es.json +33 -33
  57. package/src/migrate.js +354 -354
  58. package/src/opencode/activity.js +286 -286
  59. package/src/opencode/freshness.js +137 -137
  60. package/src/opencode/techniques.js +3450 -3450
  61. package/src/setup/analysis.js +12 -12
  62. package/src/setup.js +7 -6
  63. package/src/shallow-risk/index.js +56 -56
  64. package/src/shallow-risk/patterns/agent-config-cross-platform-drift.js +50 -50
  65. package/src/shallow-risk/patterns/agent-config-dangerous-autoapprove.js +46 -46
  66. package/src/shallow-risk/patterns/agent-config-deprecated-keys.js +46 -46
  67. package/src/shallow-risk/patterns/agent-config-missing-file.js +317 -317
  68. package/src/shallow-risk/patterns/agent-config-secret-literal.js +49 -49
  69. package/src/shallow-risk/patterns/agent-config-stack-contradiction.js +34 -34
  70. package/src/shallow-risk/patterns/hook-script-missing.js +70 -70
  71. package/src/shallow-risk/patterns/mcp-server-no-allowlist.js +52 -52
  72. package/src/shallow-risk/shared.js +648 -648
  73. package/src/source-urls.js +295 -295
  74. package/src/state-paths.js +85 -85
  75. package/src/supplemental-checks.js +805 -805
  76. package/src/telemetry.js +160 -160
  77. package/src/windsurf/context.js +359 -359
  78. package/src/windsurf/freshness.js +194 -194
  79. package/src/windsurf/patch.js +231 -231
  80. package/src/windsurf/techniques.js +3779 -3779
@@ -1,36 +1,36 @@
1
- /**
2
- * Official source URL + confidence registry for platform technique catalogs.
3
- *
4
- * We attach metadata at export time so the catalogs stay maintainable without
5
- * hand-editing hundreds of technique literals.
6
- */
7
-
8
- const SOURCE_URLS = {
9
- claude: {
10
- defaultUrl: 'https://code.claude.com/docs/en/overview',
11
- byCategory: {
12
- memory: 'https://code.claude.com/docs/en/memory',
13
- quality: 'https://code.claude.com/docs/en/common-workflows',
14
- git: 'https://code.claude.com/docs/en/settings',
15
- workflow: 'https://code.claude.com/docs/en/common-workflows',
16
- security: 'https://code.claude.com/docs/en/permissions',
17
- automation: 'https://code.claude.com/docs/en/hooks',
18
- design: 'https://code.claude.com/docs/en/best-practices',
19
- devops: 'https://code.claude.com/docs/en/common-workflows',
20
- hygiene: 'https://code.claude.com/docs/en/overview',
21
- performance: 'https://code.claude.com/docs/en/memory',
22
- tools: 'https://code.claude.com/docs/en/mcp',
23
- prompting: 'https://code.claude.com/docs/en/best-practices',
24
- features: 'https://code.claude.com/docs/en/commands',
25
- 'quality-deep': 'https://code.claude.com/docs/en/best-practices',
26
- 'testing-strategy': 'https://code.claude.com/docs/en/common-workflows',
27
- 'code-quality': 'https://code.claude.com/docs/en/best-practices',
28
- 'api-design': 'https://code.claude.com/docs/en/best-practices',
29
- database: 'https://code.claude.com/docs/en/common-workflows',
30
- authentication: 'https://code.claude.com/docs/en/permissions',
1
+ /**
2
+ * Official source URL + confidence registry for platform technique catalogs.
3
+ *
4
+ * We attach metadata at export time so the catalogs stay maintainable without
5
+ * hand-editing hundreds of technique literals.
6
+ */
7
+
8
+ const SOURCE_URLS = {
9
+ claude: {
10
+ defaultUrl: 'https://code.claude.com/docs/en/overview',
11
+ byCategory: {
12
+ memory: 'https://code.claude.com/docs/en/memory',
13
+ quality: 'https://code.claude.com/docs/en/common-workflows',
14
+ git: 'https://code.claude.com/docs/en/settings',
15
+ workflow: 'https://code.claude.com/docs/en/common-workflows',
16
+ security: 'https://code.claude.com/docs/en/permissions',
17
+ automation: 'https://code.claude.com/docs/en/hooks',
18
+ design: 'https://code.claude.com/docs/en/best-practices',
19
+ devops: 'https://code.claude.com/docs/en/common-workflows',
20
+ hygiene: 'https://code.claude.com/docs/en/overview',
21
+ performance: 'https://code.claude.com/docs/en/memory',
22
+ tools: 'https://code.claude.com/docs/en/mcp',
23
+ prompting: 'https://code.claude.com/docs/en/best-practices',
24
+ features: 'https://code.claude.com/docs/en/commands',
25
+ 'quality-deep': 'https://code.claude.com/docs/en/best-practices',
26
+ 'testing-strategy': 'https://code.claude.com/docs/en/common-workflows',
27
+ 'code-quality': 'https://code.claude.com/docs/en/best-practices',
28
+ 'api-design': 'https://code.claude.com/docs/en/best-practices',
29
+ database: 'https://code.claude.com/docs/en/common-workflows',
30
+ authentication: 'https://code.claude.com/docs/en/permissions',
31
31
  monitoring: 'https://code.claude.com/docs/en/best-practices',
32
- 'dependency-management': 'https://code.claude.com/docs/en/best-practices',
33
- 'cost-optimization': 'https://code.claude.com/docs/en/memory',
32
+ 'dependency-management': 'https://code.claude.com/docs/en/best-practices',
33
+ 'cost-optimization': 'https://code.claude.com/docs/en/memory',
34
34
  python: 'https://code.claude.com/docs/en/best-practices',
35
35
  go: 'https://code.claude.com/docs/en/best-practices',
36
36
  rust: 'https://code.claude.com/docs/en/best-practices',
@@ -41,49 +41,49 @@ const SOURCE_URLS = {
41
41
  flutter: 'https://code.claude.com/docs/en/best-practices',
42
42
  swift: 'https://code.claude.com/docs/en/best-practices',
43
43
  kotlin: 'https://code.claude.com/docs/en/best-practices',
44
- },
45
- byKey: {
46
- customCommands: 'https://code.claude.com/docs/en/commands',
47
- multipleCommands: 'https://code.claude.com/docs/en/commands',
48
- deployCommand: 'https://code.claude.com/docs/en/commands',
49
- reviewCommand: 'https://code.claude.com/docs/en/commands',
50
- agents: 'https://code.claude.com/docs/en/sub-agents',
51
- multipleAgents: 'https://code.claude.com/docs/en/sub-agents',
52
- agentsHaveMaxTurns: 'https://code.claude.com/docs/en/sub-agents',
53
- agentHasAllowedTools: 'https://code.claude.com/docs/en/sub-agents',
54
- skills: 'https://code.claude.com/docs/en/skills',
55
- multipleSkills: 'https://code.claude.com/docs/en/skills',
56
- skillUsesPaths: 'https://code.claude.com/docs/en/skills',
57
- frontendDesignSkill: 'https://code.claude.com/docs/en/skills',
58
- },
59
- },
60
- codex: {
61
- defaultUrl: 'https://developers.openai.com/codex/cli',
62
- byCategory: {
63
- instructions: 'https://developers.openai.com/codex/guides/agents-md',
64
- config: 'https://developers.openai.com/codex/config-reference',
65
- trust: 'https://developers.openai.com/codex/agent-approvals-security',
66
- rules: 'https://developers.openai.com/codex/rules',
67
- hooks: 'https://developers.openai.com/codex/hooks',
68
- mcp: 'https://developers.openai.com/codex/mcp',
69
- skills: 'https://developers.openai.com/codex/skills',
70
- agents: 'https://developers.openai.com/codex/subagents',
71
- automation: 'https://developers.openai.com/codex/app/automations',
44
+ },
45
+ byKey: {
46
+ customCommands: 'https://code.claude.com/docs/en/commands',
47
+ multipleCommands: 'https://code.claude.com/docs/en/commands',
48
+ deployCommand: 'https://code.claude.com/docs/en/commands',
49
+ reviewCommand: 'https://code.claude.com/docs/en/commands',
50
+ agents: 'https://code.claude.com/docs/en/sub-agents',
51
+ multipleAgents: 'https://code.claude.com/docs/en/sub-agents',
52
+ agentsHaveMaxTurns: 'https://code.claude.com/docs/en/sub-agents',
53
+ agentHasAllowedTools: 'https://code.claude.com/docs/en/sub-agents',
54
+ skills: 'https://code.claude.com/docs/en/skills',
55
+ multipleSkills: 'https://code.claude.com/docs/en/skills',
56
+ skillUsesPaths: 'https://code.claude.com/docs/en/skills',
57
+ frontendDesignSkill: 'https://code.claude.com/docs/en/skills',
58
+ },
59
+ },
60
+ codex: {
61
+ defaultUrl: 'https://developers.openai.com/codex/cli',
62
+ byCategory: {
63
+ instructions: 'https://developers.openai.com/codex/guides/agents-md',
64
+ config: 'https://developers.openai.com/codex/config-reference',
65
+ trust: 'https://developers.openai.com/codex/agent-approvals-security',
66
+ rules: 'https://developers.openai.com/codex/rules',
67
+ hooks: 'https://developers.openai.com/codex/hooks',
68
+ mcp: 'https://developers.openai.com/codex/mcp',
69
+ skills: 'https://developers.openai.com/codex/skills',
70
+ agents: 'https://developers.openai.com/codex/subagents',
71
+ automation: 'https://developers.openai.com/codex/app/automations',
72
72
  review: 'https://developers.openai.com/codex/guides/agents-md',
73
- local: 'https://developers.openai.com/codex/app/local-environments',
74
- 'quality-deep': 'https://developers.openai.com/codex/feature-maturity',
73
+ local: 'https://developers.openai.com/codex/app/local-environments',
74
+ 'quality-deep': 'https://developers.openai.com/codex/feature-maturity',
75
75
  advisory: 'https://developers.openai.com/codex/feature-maturity',
76
- 'pack-posture': 'https://developers.openai.com/codex/mcp',
76
+ 'pack-posture': 'https://developers.openai.com/codex/mcp',
77
77
  'repeat-usage': 'https://developers.openai.com/codex/app/local-environments',
78
- 'release-freshness': 'https://developers.openai.com/codex/changelog',
78
+ 'release-freshness': 'https://developers.openai.com/codex/changelog',
79
79
  'testing-strategy': 'https://developers.openai.com/codex/guides/agents-md',
80
- 'code-quality': 'https://developers.openai.com/codex/rules',
81
- 'api-design': 'https://developers.openai.com/codex/guides/agents-md',
80
+ 'code-quality': 'https://developers.openai.com/codex/rules',
81
+ 'api-design': 'https://developers.openai.com/codex/guides/agents-md',
82
82
  database: 'https://developers.openai.com/codex/app/local-environments',
83
- authentication: 'https://developers.openai.com/codex/agent-approvals-security',
84
- monitoring: 'https://developers.openai.com/codex/feature-maturity',
85
- 'dependency-management': 'https://developers.openai.com/codex/config-reference',
86
- 'cost-optimization': 'https://developers.openai.com/codex/guides/agents-md',
83
+ authentication: 'https://developers.openai.com/codex/agent-approvals-security',
84
+ monitoring: 'https://developers.openai.com/codex/feature-maturity',
85
+ 'dependency-management': 'https://developers.openai.com/codex/config-reference',
86
+ 'cost-optimization': 'https://developers.openai.com/codex/guides/agents-md',
87
87
  python: 'https://developers.openai.com/codex/rules',
88
88
  go: 'https://developers.openai.com/codex/rules',
89
89
  rust: 'https://developers.openai.com/codex/rules',
@@ -94,47 +94,47 @@ const SOURCE_URLS = {
94
94
  flutter: 'https://developers.openai.com/codex/guides/agents-md',
95
95
  swift: 'https://developers.openai.com/codex/guides/agents-md',
96
96
  kotlin: 'https://developers.openai.com/codex/guides/agents-md',
97
- },
98
- byKey: {
99
- codexAutomationManuallyTested: 'https://developers.openai.com/codex/app/automations',
100
- codexAutomationAppPrereqAcknowledged: 'https://developers.openai.com/codex/app/automations',
101
- codexGitHubActionSafeStrategy: 'https://developers.openai.com/codex/github-action',
102
- codexGitHubActionPromptSourceExclusive: 'https://developers.openai.com/codex/github-action',
103
- codexGitHubActionSinglePromptSource: 'https://developers.openai.com/codex/github-action',
104
- codexGitHubActionTriggerAllowlistsExplicit: 'https://developers.openai.com/codex/github-action',
105
- codexCiAuthUsesManagedKey: 'https://developers.openai.com/codex/github-action',
106
- codexPluginConfigValid: 'https://developers.openai.com/codex/skills',
107
- codexUndoExplicit: 'https://developers.openai.com/codex/config-reference',
108
- codexWorktreeLifecycleDocumented: 'https://developers.openai.com/codex/app/local-environments',
109
- },
110
- },
111
- gemini: {
112
- defaultUrl: 'https://geminicli.com/docs/get-started/',
113
- byCategory: {
114
- instructions: 'https://geminicli.com/docs/cli/gemini-md/',
115
- config: 'https://geminicli.com/docs/reference/configuration/',
116
- trust: 'https://geminicli.com/docs/cli/trusted-folders/',
117
- hooks: 'https://geminicli.com/docs/hooks/reference/',
118
- mcp: 'https://geminicli.com/docs/tools/mcp-server/',
119
- sandbox: 'https://geminicli.com/docs/cli/sandbox/',
120
- agents: 'https://geminicli.com/docs/core/subagents/',
121
- skills: 'https://geminicli.com/docs/cli/skills/',
97
+ },
98
+ byKey: {
99
+ codexAutomationManuallyTested: 'https://developers.openai.com/codex/app/automations',
100
+ codexAutomationAppPrereqAcknowledged: 'https://developers.openai.com/codex/app/automations',
101
+ codexGitHubActionSafeStrategy: 'https://developers.openai.com/codex/github-action',
102
+ codexGitHubActionPromptSourceExclusive: 'https://developers.openai.com/codex/github-action',
103
+ codexGitHubActionSinglePromptSource: 'https://developers.openai.com/codex/github-action',
104
+ codexGitHubActionTriggerAllowlistsExplicit: 'https://developers.openai.com/codex/github-action',
105
+ codexCiAuthUsesManagedKey: 'https://developers.openai.com/codex/github-action',
106
+ codexPluginConfigValid: 'https://developers.openai.com/codex/skills',
107
+ codexUndoExplicit: 'https://developers.openai.com/codex/config-reference',
108
+ codexWorktreeLifecycleDocumented: 'https://developers.openai.com/codex/app/local-environments',
109
+ },
110
+ },
111
+ gemini: {
112
+ defaultUrl: 'https://geminicli.com/docs/get-started/',
113
+ byCategory: {
114
+ instructions: 'https://geminicli.com/docs/cli/gemini-md/',
115
+ config: 'https://geminicli.com/docs/reference/configuration/',
116
+ trust: 'https://geminicli.com/docs/cli/trusted-folders/',
117
+ hooks: 'https://geminicli.com/docs/hooks/reference/',
118
+ mcp: 'https://geminicli.com/docs/tools/mcp-server/',
119
+ sandbox: 'https://geminicli.com/docs/cli/sandbox/',
120
+ agents: 'https://geminicli.com/docs/core/subagents/',
121
+ skills: 'https://geminicli.com/docs/cli/skills/',
122
122
  automation: 'https://geminicli.com/docs/cli/session-management/',
123
- extensions: 'https://geminicli.com/docs/extensions/',
123
+ extensions: 'https://geminicli.com/docs/extensions/',
124
124
  review: 'https://geminicli.com/docs/cli/session-management/',
125
125
  'quality-deep': 'https://geminicli.com/docs/cli/gemini-md/',
126
- commands: 'https://geminicli.com/docs/cli/custom-commands/',
126
+ commands: 'https://geminicli.com/docs/cli/custom-commands/',
127
127
  advisory: 'https://geminicli.com/docs/cli/session-management/',
128
- 'pack-posture': 'https://geminicli.com/docs/tools/mcp-server/',
129
- 'repeat-usage': 'https://geminicli.com/docs/cli/session-management/',
130
- 'release-freshness': 'https://geminicli.com/docs/changelogs/latest/',
128
+ 'pack-posture': 'https://geminicli.com/docs/tools/mcp-server/',
129
+ 'repeat-usage': 'https://geminicli.com/docs/cli/session-management/',
130
+ 'release-freshness': 'https://geminicli.com/docs/changelogs/latest/',
131
131
  'testing-strategy': 'https://geminicli.com/docs/cli/gemini-md/',
132
- 'code-quality': 'https://geminicli.com/docs/cli/gemini-md/',
133
- 'api-design': 'https://geminicli.com/docs/cli/gemini-md/',
132
+ 'code-quality': 'https://geminicli.com/docs/cli/gemini-md/',
133
+ 'api-design': 'https://geminicli.com/docs/cli/gemini-md/',
134
134
  database: 'https://geminicli.com/docs/reference/configuration/',
135
- authentication: 'https://geminicli.com/docs/cli/trusted-folders/',
135
+ authentication: 'https://geminicli.com/docs/cli/trusted-folders/',
136
136
  monitoring: 'https://geminicli.com/docs/reference/configuration/',
137
- 'dependency-management': 'https://geminicli.com/docs/reference/configuration/',
137
+ 'dependency-management': 'https://geminicli.com/docs/reference/configuration/',
138
138
  'cost-optimization': 'https://geminicli.com/docs/cli/session-management/',
139
139
  python: 'https://geminicli.com/docs/cli/gemini-md/',
140
140
  go: 'https://geminicli.com/docs/cli/gemini-md/',
@@ -146,33 +146,33 @@ const SOURCE_URLS = {
146
146
  flutter: 'https://geminicli.com/docs/cli/gemini-md/',
147
147
  swift: 'https://geminicli.com/docs/cli/gemini-md/',
148
148
  kotlin: 'https://geminicli.com/docs/cli/gemini-md/',
149
- },
150
- },
151
- copilot: {
152
- defaultUrl: 'https://docs.github.com/en/copilot',
153
- byCategory: {
154
- instructions: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
149
+ },
150
+ },
151
+ copilot: {
152
+ defaultUrl: 'https://docs.github.com/en/copilot',
153
+ byCategory: {
154
+ instructions: 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
155
155
  config: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
156
- trust: 'https://docs.github.com/en/copilot/responsible-use-of-github-copilot-features/github-copilot-data-handling',
157
- mcp: 'https://docs.github.com/en/copilot/customizing-copilot/using-model-context-protocol/extending-copilot-chat-with-mcp',
158
- 'cloud-agent': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
159
- organization: 'https://docs.github.com/en/copilot/how-tos/administer-copilot/manage-for-organization/manage-policies',
160
- 'prompt-files': 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
161
- 'skills-agents': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
162
- 'ci-automation': 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
163
- enterprise: 'https://docs.github.com/en/copilot/how-tos/administer-copilot/manage-for-enterprise',
164
- extensions: 'https://docs.github.com/en/copilot/building-copilot-extensions/about-building-copilot-extensions',
165
- 'quality-deep': 'https://docs.github.com/en/copilot',
166
- advisory: 'https://docs.github.com/en/copilot',
167
- freshness: 'https://docs.github.com/en/copilot',
156
+ trust: 'https://docs.github.com/en/copilot/responsible-use-of-github-copilot-features/github-copilot-data-handling',
157
+ mcp: 'https://docs.github.com/en/copilot/customizing-copilot/using-model-context-protocol/extending-copilot-chat-with-mcp',
158
+ 'cloud-agent': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
159
+ organization: 'https://docs.github.com/en/copilot/how-tos/administer-copilot/manage-for-organization/manage-policies',
160
+ 'prompt-files': 'https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot',
161
+ 'skills-agents': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
162
+ 'ci-automation': 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
163
+ enterprise: 'https://docs.github.com/en/copilot/how-tos/administer-copilot/manage-for-enterprise',
164
+ extensions: 'https://docs.github.com/en/copilot/building-copilot-extensions/about-building-copilot-extensions',
165
+ 'quality-deep': 'https://docs.github.com/en/copilot',
166
+ advisory: 'https://docs.github.com/en/copilot',
167
+ freshness: 'https://docs.github.com/en/copilot',
168
168
  'testing-strategy': 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
169
169
  'code-quality': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
170
170
  'api-design': 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
171
- database: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
172
- authentication: 'https://docs.github.com/en/copilot/responsible-use-of-github-copilot-features/github-copilot-data-handling',
173
- monitoring: 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
171
+ database: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
172
+ authentication: 'https://docs.github.com/en/copilot/responsible-use-of-github-copilot-features/github-copilot-data-handling',
173
+ monitoring: 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
174
174
  'dependency-management': 'https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment',
175
- 'cost-optimization': 'https://docs.github.com/en/copilot',
175
+ 'cost-optimization': 'https://docs.github.com/en/copilot',
176
176
  python: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
177
177
  go: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
178
178
  rust: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
@@ -183,33 +183,33 @@ const SOURCE_URLS = {
183
183
  flutter: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
184
184
  swift: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
185
185
  kotlin: 'https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent',
186
- },
187
- },
188
- cursor: {
189
- defaultUrl: 'https://docs.cursor.com/',
190
- byCategory: {
191
- rules: 'https://docs.cursor.com/context/rules',
192
- config: 'https://docs.cursor.com/',
193
- trust: 'https://docs.cursor.com/enterprise/privacy-and-data-governance',
194
- 'agent-mode': 'https://docs.cursor.com/en/chat/agent',
195
- mcp: 'https://docs.cursor.com/cli/mcp',
186
+ },
187
+ },
188
+ cursor: {
189
+ defaultUrl: 'https://docs.cursor.com/',
190
+ byCategory: {
191
+ rules: 'https://docs.cursor.com/context/rules',
192
+ config: 'https://docs.cursor.com/',
193
+ trust: 'https://docs.cursor.com/enterprise/privacy-and-data-governance',
194
+ 'agent-mode': 'https://docs.cursor.com/en/chat/agent',
195
+ mcp: 'https://docs.cursor.com/cli/mcp',
196
196
  'instructions-quality': 'https://docs.cursor.com/context/rules',
197
- 'background-agents': 'https://docs.cursor.com/en/background-agents',
198
- automations: 'https://docs.cursor.com/en/background-agents/automations',
199
- enterprise: 'https://docs.cursor.com/enterprise',
200
- bugbot: 'https://docs.cursor.com/bugbot',
201
- 'cross-surface': 'https://docs.cursor.com/',
197
+ 'background-agents': 'https://docs.cursor.com/en/background-agents',
198
+ automations: 'https://docs.cursor.com/en/background-agents/automations',
199
+ enterprise: 'https://docs.cursor.com/enterprise',
200
+ bugbot: 'https://docs.cursor.com/bugbot',
201
+ 'cross-surface': 'https://docs.cursor.com/',
202
202
  'quality-deep': 'https://docs.cursor.com/context/rules',
203
- advisory: 'https://docs.cursor.com/',
204
- freshness: 'https://docs.cursor.com/',
203
+ advisory: 'https://docs.cursor.com/',
204
+ freshness: 'https://docs.cursor.com/',
205
205
  'testing-strategy': 'https://docs.cursor.com/context/rules',
206
- 'code-quality': 'https://docs.cursor.com/context/rules',
206
+ 'code-quality': 'https://docs.cursor.com/context/rules',
207
207
  'api-design': 'https://docs.cursor.com/context/rules',
208
208
  database: 'https://docs.cursor.com/context/rules',
209
- authentication: 'https://docs.cursor.com/enterprise/privacy-and-data-governance',
209
+ authentication: 'https://docs.cursor.com/enterprise/privacy-and-data-governance',
210
210
  monitoring: 'https://docs.cursor.com/context/rules',
211
211
  'dependency-management': 'https://docs.cursor.com/context/rules',
212
- 'cost-optimization': 'https://docs.cursor.com/account',
212
+ 'cost-optimization': 'https://docs.cursor.com/account',
213
213
  python: 'https://docs.cursor.com/context/rules',
214
214
  go: 'https://docs.cursor.com/context/rules',
215
215
  rust: 'https://docs.cursor.com/context/rules',
@@ -220,33 +220,33 @@ const SOURCE_URLS = {
220
220
  flutter: 'https://docs.cursor.com/context/rules',
221
221
  swift: 'https://docs.cursor.com/context/rules',
222
222
  kotlin: 'https://docs.cursor.com/context/rules',
223
- },
224
- },
225
- windsurf: {
226
- defaultUrl: 'https://docs.windsurf.com/windsurf/cascade/cascade',
227
- byCategory: {
223
+ },
224
+ },
225
+ windsurf: {
226
+ defaultUrl: 'https://docs.windsurf.com/windsurf/cascade/cascade',
227
+ byCategory: {
228
228
  rules: 'https://docs.windsurf.com/windsurf/cascade/agents-md',
229
- config: 'https://docs.windsurf.com/windsurf/cascade/cascade',
230
- trust: 'https://docs.windsurf.com/windsurf/cascade/cascade',
231
- 'cascade-agent': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
232
- mcp: 'https://docs.windsurf.com/windsurf/cascade/mcp',
233
- 'instructions-quality': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
234
- workflows: 'https://docs.windsurf.com/windsurf/cascade/workflows',
235
- memories: 'https://docs.windsurf.com/windsurf/cascade/memories',
236
- enterprise: 'https://docs.windsurf.com/windsurf/cascade/cascade',
237
- cascadeignore: 'https://docs.windsurf.com/windsurf/cascade/cascade',
238
- 'cross-surface': 'https://docs.windsurf.com/windsurf/cascade/cascade',
229
+ config: 'https://docs.windsurf.com/windsurf/cascade/cascade',
230
+ trust: 'https://docs.windsurf.com/windsurf/cascade/cascade',
231
+ 'cascade-agent': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
232
+ mcp: 'https://docs.windsurf.com/windsurf/cascade/mcp',
233
+ 'instructions-quality': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
234
+ workflows: 'https://docs.windsurf.com/windsurf/cascade/workflows',
235
+ memories: 'https://docs.windsurf.com/windsurf/cascade/memories',
236
+ enterprise: 'https://docs.windsurf.com/windsurf/cascade/cascade',
237
+ cascadeignore: 'https://docs.windsurf.com/windsurf/cascade/cascade',
238
+ 'cross-surface': 'https://docs.windsurf.com/windsurf/cascade/cascade',
239
239
  'quality-deep': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
240
- advisory: 'https://docs.windsurf.com/windsurf/cascade/cascade',
241
- freshness: 'https://docs.windsurf.com/windsurf/cascade/cascade',
240
+ advisory: 'https://docs.windsurf.com/windsurf/cascade/cascade',
241
+ freshness: 'https://docs.windsurf.com/windsurf/cascade/cascade',
242
242
  'testing-strategy': 'https://docs.windsurf.com/windsurf/cascade/workflows',
243
243
  'code-quality': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
244
244
  'api-design': 'https://docs.windsurf.com/windsurf/cascade/agents-md',
245
245
  database: 'https://docs.windsurf.com/windsurf/cascade/workflows',
246
- authentication: 'https://docs.windsurf.com/windsurf/cascade/cascade',
246
+ authentication: 'https://docs.windsurf.com/windsurf/cascade/cascade',
247
247
  monitoring: 'https://docs.windsurf.com/windsurf/cascade/workflows',
248
248
  'dependency-management': 'https://docs.windsurf.com/windsurf/cascade/workflows',
249
- 'cost-optimization': 'https://docs.windsurf.com/windsurf/cascade/cascade',
249
+ 'cost-optimization': 'https://docs.windsurf.com/windsurf/cascade/cascade',
250
250
  python: 'https://docs.windsurf.com/windsurf/cascade/workflows',
251
251
  go: 'https://docs.windsurf.com/windsurf/cascade/workflows',
252
252
  rust: 'https://docs.windsurf.com/windsurf/cascade/workflows',
@@ -257,22 +257,22 @@ const SOURCE_URLS = {
257
257
  flutter: 'https://docs.windsurf.com/windsurf/cascade/workflows',
258
258
  swift: 'https://docs.windsurf.com/windsurf/cascade/workflows',
259
259
  kotlin: 'https://docs.windsurf.com/windsurf/cascade/workflows',
260
- },
261
- },
262
- aider: {
263
- defaultUrl: 'https://aider.chat/docs/',
264
- byCategory: {
265
- config: 'https://aider.chat/docs/config.html',
266
- 'advanced-config': 'https://aider.chat/docs/config/aider_conf.html',
267
- 'git-safety': 'https://aider.chat/docs/git.html',
268
- 'model-config': 'https://aider.chat/docs/config/adv-model-settings.html',
269
- conventions: 'https://aider.chat/docs/usage/conventions.html',
270
- architecture: 'https://aider.chat/docs/usage/modes.html',
271
- security: 'https://aider.chat/docs/config/dotenv.html',
272
- ci: 'https://aider.chat/docs/usage/modes.html',
260
+ },
261
+ },
262
+ aider: {
263
+ defaultUrl: 'https://aider.chat/docs/',
264
+ byCategory: {
265
+ config: 'https://aider.chat/docs/config.html',
266
+ 'advanced-config': 'https://aider.chat/docs/config/aider_conf.html',
267
+ 'git-safety': 'https://aider.chat/docs/git.html',
268
+ 'model-config': 'https://aider.chat/docs/config/adv-model-settings.html',
269
+ conventions: 'https://aider.chat/docs/usage/conventions.html',
270
+ architecture: 'https://aider.chat/docs/usage/modes.html',
271
+ security: 'https://aider.chat/docs/config/dotenv.html',
272
+ ci: 'https://aider.chat/docs/usage/modes.html',
273
273
  quality: 'https://aider.chat/docs/usage/conventions.html',
274
- 'workflow-patterns': 'https://aider.chat/docs/usage/modes.html',
275
- 'editor-integration': 'https://aider.chat/docs/config.html',
274
+ 'workflow-patterns': 'https://aider.chat/docs/usage/modes.html',
275
+ 'editor-integration': 'https://aider.chat/docs/config.html',
276
276
  'release-readiness': 'https://aider.chat/docs/config.html',
277
277
  'testing-strategy': 'https://aider.chat/docs/usage/conventions.html',
278
278
  'code-quality': 'https://aider.chat/docs/usage/conventions.html',
@@ -292,27 +292,27 @@ const SOURCE_URLS = {
292
292
  flutter: 'https://aider.chat/docs/usage/conventions.html',
293
293
  swift: 'https://aider.chat/docs/usage/conventions.html',
294
294
  kotlin: 'https://aider.chat/docs/usage/conventions.html',
295
- },
296
- },
297
- opencode: {
298
- defaultUrl: 'https://github.com/sst/opencode',
299
- byCategory: {
300
- instructions: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
301
- config: 'https://github.com/sst/opencode/tree/dev/.opencode',
302
- permissions: 'https://github.com/sst/opencode/tree/dev/.opencode',
303
- plugins: 'https://github.com/sst/opencode/tree/dev/.opencode',
304
- security: 'https://github.com/sst/opencode/blob/dev/SECURITY.md',
305
- mcp: 'https://github.com/sst/opencode/tree/dev/.opencode',
306
- ci: 'https://github.com/sst/opencode/tree/dev/.github',
307
- 'quality-deep': 'https://github.com/sst/opencode/blob/dev/README.md',
308
- skills: 'https://github.com/sst/opencode/tree/dev/.opencode',
309
- agents: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
310
- commands: 'https://github.com/sst/opencode/tree/dev/.opencode',
311
- tui: 'https://github.com/sst/opencode/blob/dev/README.md',
312
- governance: 'https://github.com/sst/opencode/blob/dev/SECURITY.md',
313
- 'release-freshness': 'https://github.com/sst/opencode/releases',
314
- 'mixed-agent': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
315
- propagation: 'https://github.com/sst/opencode/tree/dev/.opencode',
295
+ },
296
+ },
297
+ opencode: {
298
+ defaultUrl: 'https://github.com/sst/opencode',
299
+ byCategory: {
300
+ instructions: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
301
+ config: 'https://github.com/sst/opencode/tree/dev/.opencode',
302
+ permissions: 'https://github.com/sst/opencode/tree/dev/.opencode',
303
+ plugins: 'https://github.com/sst/opencode/tree/dev/.opencode',
304
+ security: 'https://github.com/sst/opencode/blob/dev/SECURITY.md',
305
+ mcp: 'https://github.com/sst/opencode/tree/dev/.opencode',
306
+ ci: 'https://github.com/sst/opencode/tree/dev/.github',
307
+ 'quality-deep': 'https://github.com/sst/opencode/blob/dev/README.md',
308
+ skills: 'https://github.com/sst/opencode/tree/dev/.opencode',
309
+ agents: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
310
+ commands: 'https://github.com/sst/opencode/tree/dev/.opencode',
311
+ tui: 'https://github.com/sst/opencode/blob/dev/README.md',
312
+ governance: 'https://github.com/sst/opencode/blob/dev/SECURITY.md',
313
+ 'release-freshness': 'https://github.com/sst/opencode/releases',
314
+ 'mixed-agent': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
315
+ propagation: 'https://github.com/sst/opencode/tree/dev/.opencode',
316
316
  'testing-strategy': 'https://github.com/sst/opencode/tree/dev/.github',
317
317
  'code-quality': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
318
318
  'api-design': 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
@@ -331,97 +331,97 @@ const SOURCE_URLS = {
331
331
  flutter: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
332
332
  swift: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
333
333
  kotlin: 'https://github.com/sst/opencode/blob/dev/AGENTS.md',
334
- },
335
- },
336
- };
337
-
338
- const STALE_CONFIDENCE_IDS = new Set([
339
- 'CX-B04',
340
- 'CX-B09',
341
- 'CX-C05',
342
- 'CX-C06',
343
- ]);
344
-
345
- const LAST_VERIFIED = {
346
- default: '2026-04-05',
347
- };
348
-
349
- const RUNTIME_CONFIDENCE_IDS = {
350
- codex: new Set([
351
- 'CX-B01',
352
- 'CX-C01',
353
- 'CX-C02',
354
- 'CX-C03',
355
- 'CX-D01',
356
- 'CX-E02',
357
- 'CX-H02',
358
- 'CX-H03',
359
- 'CX-I01',
360
- ]),
361
- gemini: new Set(['GM-Q01', 'GM-Q02', 'GM-Q03', 'GM-Q04', 'GM-Q05']),
362
- copilot: new Set(['CP-Q01', 'CP-Q02', 'CP-Q03', 'CP-Q04', 'CP-Q05']),
363
- };
364
-
365
- function hasRuntimeVerificationSignal(technique) {
366
- const haystack = `${technique.name || ''}\n${technique.fix || ''}`;
367
- return /experiment(?:ally)? confirmed|confirmed by (?:live )?experiment|current runtime|runtime evidence|runtime-verified|validated in current runtime|observed in current runtime|measured in live experiment|reproduced in runtime|confirmed by experiment/i.test(haystack);
368
- }
369
-
370
- // Stack categories where checks are generated/adapted rather than individually verified
371
- const STACK_CATEGORIES = new Set([
372
- 'python', 'go', 'rust', 'java', 'ruby', 'dotnet', 'php', 'flutter', 'swift', 'kotlin',
373
- ]);
374
-
375
- function resolveConfidence(platform, technique) {
376
- if (STALE_CONFIDENCE_IDS.has(technique.id)) {
377
- return 0.3;
378
- }
379
-
380
- // Runtime-verified: highest confidence
381
- if (RUNTIME_CONFIDENCE_IDS[platform]?.has(technique.id) || hasRuntimeVerificationSignal(technique)) {
382
- return 0.9;
383
- }
384
-
385
- // Has fix template: author wrote specific remediation → higher confidence
386
- if (technique.template) {
387
- return 0.8;
388
- }
389
-
390
- // Stack-specific checks: generated per-language, less individually verified
391
- if (STACK_CATEGORIES.has(technique.category)) {
392
- return 0.6;
393
- }
394
-
395
- // Default: documented but not individually experiment-verified
396
- return 0.7;
397
- }
398
-
399
- function attachSourceUrls(platform, techniques) {
400
- const mapping = SOURCE_URLS[platform];
401
- if (!mapping) {
402
- throw new Error(`Unknown source-url platform '${platform}'`);
403
- }
404
-
405
- for (const [key, technique] of Object.entries(techniques)) {
406
- const resolved =
407
- mapping.byKey?.[key] ||
408
- mapping.byCategory?.[technique.category] ||
409
- mapping.defaultUrl;
410
-
411
- if (!resolved) {
412
- throw new Error(`No sourceUrl mapping found for ${platform}:${key}`);
413
- }
414
-
415
- technique.sourceUrl = technique.sourceUrl || resolved;
416
- technique.confidence = resolveConfidence(platform, technique);
417
- technique.lastVerified = technique.lastVerified || LAST_VERIFIED[platform] || LAST_VERIFIED.default;
418
- }
419
-
420
- return techniques;
421
- }
422
-
423
- module.exports = {
424
- SOURCE_URLS,
425
- LAST_VERIFIED,
426
- attachSourceUrls,
427
- };
334
+ },
335
+ },
336
+ };
337
+
338
+ const STALE_CONFIDENCE_IDS = new Set([
339
+ 'CX-B04',
340
+ 'CX-B09',
341
+ 'CX-C05',
342
+ 'CX-C06',
343
+ ]);
344
+
345
+ const LAST_VERIFIED = {
346
+ default: '2026-04-05',
347
+ };
348
+
349
+ const RUNTIME_CONFIDENCE_IDS = {
350
+ codex: new Set([
351
+ 'CX-B01',
352
+ 'CX-C01',
353
+ 'CX-C02',
354
+ 'CX-C03',
355
+ 'CX-D01',
356
+ 'CX-E02',
357
+ 'CX-H02',
358
+ 'CX-H03',
359
+ 'CX-I01',
360
+ ]),
361
+ gemini: new Set(['GM-Q01', 'GM-Q02', 'GM-Q03', 'GM-Q04', 'GM-Q05']),
362
+ copilot: new Set(['CP-Q01', 'CP-Q02', 'CP-Q03', 'CP-Q04', 'CP-Q05']),
363
+ };
364
+
365
+ function hasRuntimeVerificationSignal(technique) {
366
+ const haystack = `${technique.name || ''}\n${technique.fix || ''}`;
367
+ return /experiment(?:ally)? confirmed|confirmed by (?:live )?experiment|current runtime|runtime evidence|runtime-verified|validated in current runtime|observed in current runtime|measured in live experiment|reproduced in runtime|confirmed by experiment/i.test(haystack);
368
+ }
369
+
370
+ // Stack categories where checks are generated/adapted rather than individually verified
371
+ const STACK_CATEGORIES = new Set([
372
+ 'python', 'go', 'rust', 'java', 'ruby', 'dotnet', 'php', 'flutter', 'swift', 'kotlin',
373
+ ]);
374
+
375
+ function resolveConfidence(platform, technique) {
376
+ if (STALE_CONFIDENCE_IDS.has(technique.id)) {
377
+ return 0.3;
378
+ }
379
+
380
+ // Runtime-verified: highest confidence
381
+ if (RUNTIME_CONFIDENCE_IDS[platform]?.has(technique.id) || hasRuntimeVerificationSignal(technique)) {
382
+ return 0.9;
383
+ }
384
+
385
+ // Has fix template: author wrote specific remediation → higher confidence
386
+ if (technique.template) {
387
+ return 0.8;
388
+ }
389
+
390
+ // Stack-specific checks: generated per-language, less individually verified
391
+ if (STACK_CATEGORIES.has(technique.category)) {
392
+ return 0.6;
393
+ }
394
+
395
+ // Default: documented but not individually experiment-verified
396
+ return 0.7;
397
+ }
398
+
399
+ function attachSourceUrls(platform, techniques) {
400
+ const mapping = SOURCE_URLS[platform];
401
+ if (!mapping) {
402
+ throw new Error(`Unknown source-url platform '${platform}'`);
403
+ }
404
+
405
+ for (const [key, technique] of Object.entries(techniques)) {
406
+ const resolved =
407
+ mapping.byKey?.[key] ||
408
+ mapping.byCategory?.[technique.category] ||
409
+ mapping.defaultUrl;
410
+
411
+ if (!resolved) {
412
+ throw new Error(`No sourceUrl mapping found for ${platform}:${key}`);
413
+ }
414
+
415
+ technique.sourceUrl = technique.sourceUrl || resolved;
416
+ technique.confidence = resolveConfidence(platform, technique);
417
+ technique.lastVerified = technique.lastVerified || LAST_VERIFIED[platform] || LAST_VERIFIED.default;
418
+ }
419
+
420
+ return techniques;
421
+ }
422
+
423
+ module.exports = {
424
+ SOURCE_URLS,
425
+ LAST_VERIFIED,
426
+ attachSourceUrls,
427
+ };