noah-cursor 1.5.9 → 1.5.11
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.
- package/README.md +259 -188
- package/assets/qr-code.png +0 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +2 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +48 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +67 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +3 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +92 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +109 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +21 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.d.ts +3 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +27 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/favorite.d.ts +3 -0
- package/dist/commands/favorite.d.ts.map +1 -0
- package/dist/commands/favorite.js +64 -0
- package/dist/commands/favorite.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +83 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +27 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/plugin.d.ts +3 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +39 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/preview.d.ts +3 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +25 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +22 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/recent.d.ts +3 -0
- package/dist/commands/recent.d.ts.map +1 -0
- package/dist/commands/recent.js +27 -0
- package/dist/commands/recent.js.map +1 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +2 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +39 -2
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/try.d.ts +3 -0
- package/dist/commands/try.d.ts.map +1 -0
- package/dist/commands/try.js +22 -0
- package/dist/commands/try.js.map +1 -0
- package/dist/commands/undo.d.ts +3 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +24 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +52 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +2 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wizard.d.ts +3 -0
- package/dist/commands/wizard.d.ts.map +1 -0
- package/dist/commands/wizard.js +61 -0
- package/dist/commands/wizard.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +84 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/constants/ides.d.ts +2 -2
- package/dist/constants/ides.d.ts.map +1 -1
- package/dist/constants/ides.js +47 -3
- package/dist/constants/ides.js.map +1 -1
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +4 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/core/program.d.ts.map +1 -1
- package/dist/core/program.js +38 -5
- package/dist/core/program.js.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata/user-store.d.ts +16 -0
- package/dist/metadata/user-store.d.ts.map +1 -0
- package/dist/metadata/user-store.js +99 -0
- package/dist/metadata/user-store.js.map +1 -0
- package/dist/noah-registry/manifest.json +129 -16
- package/dist/services/doctor-service.d.ts.map +1 -1
- package/dist/services/doctor-service.js +74 -7
- package/dist/services/doctor-service.js.map +1 -1
- package/dist/services/ecosystem.d.ts +17 -0
- package/dist/services/ecosystem.d.ts.map +1 -0
- package/dist/services/ecosystem.js +136 -0
- package/dist/services/ecosystem.js.map +1 -0
- package/dist/services/extras.d.ts +29 -0
- package/dist/services/extras.d.ts.map +1 -0
- package/dist/services/extras.js +164 -0
- package/dist/services/extras.js.map +1 -0
- package/dist/services/install-service.d.ts +12 -0
- package/dist/services/install-service.d.ts.map +1 -1
- package/dist/services/install-service.js +169 -12
- package/dist/services/install-service.js.map +1 -1
- package/dist/services/intelligence.d.ts +20 -0
- package/dist/services/intelligence.d.ts.map +1 -0
- package/dist/services/intelligence.js +146 -0
- package/dist/services/intelligence.js.map +1 -0
- package/dist/services/lockfile-service.d.ts +7 -0
- package/dist/services/lockfile-service.d.ts.map +1 -0
- package/dist/services/lockfile-service.js +36 -0
- package/dist/services/lockfile-service.js.map +1 -0
- package/dist/services/project-awareness.d.ts +12 -0
- package/dist/services/project-awareness.d.ts.map +1 -0
- package/dist/services/project-awareness.js +200 -0
- package/dist/services/project-awareness.js.map +1 -0
- package/dist/services/workspace-service.d.ts +49 -0
- package/dist/services/workspace-service.d.ts.map +1 -0
- package/dist/services/workspace-service.js +92 -0
- package/dist/services/workspace-service.js.map +1 -0
- package/dist/types/index.d.ts +508 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +72 -0
- package/dist/types/index.js.map +1 -1
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +2 -3
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/homeMenu.d.ts +6 -0
- package/dist/ui/homeMenu.d.ts.map +1 -0
- package/dist/ui/homeMenu.js +72 -0
- package/dist/ui/homeMenu.js.map +1 -0
- package/dist/ui/preview.d.ts +3 -0
- package/dist/ui/preview.d.ts.map +1 -0
- package/dist/ui/preview.js +36 -0
- package/dist/ui/preview.js.map +1 -0
- package/dist/utils/assets.d.ts +7 -0
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/assets.js +18 -14
- package/dist/utils/assets.js.map +1 -1
- package/dist/utils/fuzzy.d.ts +6 -0
- package/dist/utils/fuzzy.d.ts.map +1 -0
- package/dist/utils/fuzzy.js +51 -0
- package/dist/utils/fuzzy.js.map +1 -0
- package/dist/utils/registry.d.ts +8 -1
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +13 -5
- package/dist/utils/registry.js.map +1 -1
- package/dist/utils/semver.d.ts +11 -0
- package/dist/utils/semver.d.ts.map +1 -0
- package/dist/utils/semver.js +41 -0
- package/dist/utils/semver.js.map +1 -0
- package/package.json +6 -4
|
@@ -1,50 +1,94 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "noah-registry",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Noah
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Noah registry — Skills, Rules, Prompts, MCP configs, and Presets for AI-assisted development",
|
|
5
5
|
"author": "Noah Poli",
|
|
6
6
|
"skills": [
|
|
7
7
|
{
|
|
8
8
|
"id": "test",
|
|
9
9
|
"version": "1.0.0",
|
|
10
10
|
"description": "Sample skill for verifying noah-cursor installs",
|
|
11
|
-
"tags": ["test", "sample"]
|
|
11
|
+
"tags": ["test", "sample"],
|
|
12
|
+
"author": "Noah Poli",
|
|
13
|
+
"verified": true,
|
|
14
|
+
"downloads": 1200,
|
|
15
|
+
"rating": 4.5,
|
|
16
|
+
"updatedAt": "2026-07-01T00:00:00.000Z",
|
|
17
|
+
"changelog": "Initial sample skill"
|
|
12
18
|
},
|
|
13
19
|
{
|
|
14
20
|
"id": "commit-push",
|
|
15
21
|
"version": "1.0.0",
|
|
16
22
|
"description": "Stage all changes, group by category, draft a linepush-style commit, commit, and push",
|
|
17
|
-
"tags": ["git", "commit", "push", "conventional-commits"]
|
|
23
|
+
"tags": ["git", "commit", "push", "conventional-commits"],
|
|
24
|
+
"author": "Noah Poli",
|
|
25
|
+
"verified": true,
|
|
26
|
+
"downloads": 8420,
|
|
27
|
+
"rating": 4.8,
|
|
28
|
+
"updatedAt": "2026-07-10T00:00:00.000Z",
|
|
29
|
+
"changelog": "Conventional commit grouping"
|
|
18
30
|
},
|
|
19
31
|
{
|
|
20
32
|
"id": "react-doctor-fix",
|
|
21
33
|
"version": "1.0.0",
|
|
22
34
|
"description": "Run react-doctor, fix all findings, and verify features still work",
|
|
23
|
-
"tags": ["react", "react-doctor", "lint", "refactor", "qa"]
|
|
35
|
+
"tags": ["react", "react-doctor", "lint", "refactor", "qa"],
|
|
36
|
+
"author": "Noah Poli",
|
|
37
|
+
"verified": true,
|
|
38
|
+
"downloads": 5120,
|
|
39
|
+
"rating": 4.7,
|
|
40
|
+
"dependsOn": ["rule/react-spa-dashboard"],
|
|
41
|
+
"updatedAt": "2026-07-12T00:00:00.000Z",
|
|
42
|
+
"changelog": "Added verification checklist"
|
|
24
43
|
},
|
|
25
44
|
{
|
|
26
45
|
"id": "larastan-fix",
|
|
27
46
|
"version": "1.0.0",
|
|
28
47
|
"description": "Run Larastan on Laravel, fix all findings, and verify features still work",
|
|
29
|
-
"tags": ["laravel", "php", "larastan", "phpstan", "qa"]
|
|
48
|
+
"tags": ["laravel", "php", "larastan", "phpstan", "qa"],
|
|
49
|
+
"author": "Noah Poli",
|
|
50
|
+
"verified": true,
|
|
51
|
+
"downloads": 3900,
|
|
52
|
+
"rating": 4.6,
|
|
53
|
+
"dependsOn": ["rule/laravel-api"],
|
|
54
|
+
"updatedAt": "2026-07-08T00:00:00.000Z",
|
|
55
|
+
"changelog": "Larastan level guidance"
|
|
30
56
|
},
|
|
31
57
|
{
|
|
32
58
|
"id": "nestjs-knip-fix",
|
|
33
59
|
"version": "1.0.0",
|
|
34
60
|
"description": "Run Knip on NestJS, fix unused code/deps, and verify features still work",
|
|
35
|
-
"tags": ["nestjs", "knip", "node", "typescript", "qa"]
|
|
61
|
+
"tags": ["nestjs", "knip", "node", "typescript", "qa"],
|
|
62
|
+
"author": "Noah Poli",
|
|
63
|
+
"verified": true,
|
|
64
|
+
"downloads": 2100,
|
|
65
|
+
"rating": 4.4,
|
|
66
|
+
"updatedAt": "2026-07-05T00:00:00.000Z",
|
|
67
|
+
"changelog": "NestJS Knip presets"
|
|
36
68
|
},
|
|
37
69
|
{
|
|
38
70
|
"id": "node-doctor-fix",
|
|
39
71
|
"version": "1.0.0",
|
|
40
72
|
"description": "Run bundled node-doctor (Knip + hygiene), fix findings, verify features still work",
|
|
41
|
-
"tags": ["node", "knip", "doctor", "qa", "cli"]
|
|
73
|
+
"tags": ["node", "knip", "doctor", "qa", "cli"],
|
|
74
|
+
"author": "Noah Poli",
|
|
75
|
+
"verified": true,
|
|
76
|
+
"downloads": 1800,
|
|
77
|
+
"rating": 4.3,
|
|
78
|
+
"updatedAt": "2026-07-03T00:00:00.000Z",
|
|
79
|
+
"changelog": "Bundled node-doctor config"
|
|
42
80
|
},
|
|
43
81
|
{
|
|
44
82
|
"id": "generate-readme",
|
|
45
83
|
"version": "1.0.0",
|
|
46
84
|
"description": "Generate a project README with stack, deps, prerequisites, and setup guide",
|
|
47
|
-
"tags": ["docs", "readme", "documentation", "setup"]
|
|
85
|
+
"tags": ["docs", "readme", "documentation", "setup"],
|
|
86
|
+
"author": "Noah Poli",
|
|
87
|
+
"verified": true,
|
|
88
|
+
"downloads": 6700,
|
|
89
|
+
"rating": 4.9,
|
|
90
|
+
"updatedAt": "2026-07-15T00:00:00.000Z",
|
|
91
|
+
"changelog": "Stack-aware README template"
|
|
48
92
|
}
|
|
49
93
|
],
|
|
50
94
|
"rules": [
|
|
@@ -52,40 +96,109 @@
|
|
|
52
96
|
"id": "test",
|
|
53
97
|
"version": "1.0.0",
|
|
54
98
|
"description": "Sample rule for verifying noah-cursor installs",
|
|
55
|
-
"tags": ["test", "sample"]
|
|
99
|
+
"tags": ["test", "sample"],
|
|
100
|
+
"author": "Noah Poli",
|
|
101
|
+
"verified": true,
|
|
102
|
+
"downloads": 900,
|
|
103
|
+
"rating": 4.2,
|
|
104
|
+
"updatedAt": "2026-07-01T00:00:00.000Z",
|
|
105
|
+
"changelog": "Initial sample rule"
|
|
56
106
|
},
|
|
57
107
|
{
|
|
58
108
|
"id": "stack-architecture",
|
|
59
109
|
"version": "1.0.0",
|
|
60
110
|
"description": "When to use React SPA dashboards, Laravel APIs, and Next/Nuxt marketing sites",
|
|
61
|
-
"tags": ["architecture", "stack"]
|
|
111
|
+
"tags": ["architecture", "stack"],
|
|
112
|
+
"author": "Noah Poli",
|
|
113
|
+
"verified": true,
|
|
114
|
+
"downloads": 4200,
|
|
115
|
+
"rating": 4.8,
|
|
116
|
+
"updatedAt": "2026-07-11T00:00:00.000Z",
|
|
117
|
+
"changelog": "Stack decision guide"
|
|
62
118
|
},
|
|
63
119
|
{
|
|
64
120
|
"id": "react-spa-dashboard",
|
|
65
121
|
"version": "1.0.0",
|
|
66
122
|
"description": "React client-side SPA rules for dashboards consuming a Laravel API",
|
|
67
|
-
"tags": ["react", "spa", "dashboard", "typescript", "tanstack-query"]
|
|
123
|
+
"tags": ["react", "spa", "dashboard", "typescript", "tanstack-query"],
|
|
124
|
+
"author": "Noah Poli",
|
|
125
|
+
"verified": true,
|
|
126
|
+
"downloads": 5600,
|
|
127
|
+
"rating": 4.7,
|
|
128
|
+
"updatedAt": "2026-07-14T00:00:00.000Z",
|
|
129
|
+
"changelog": "TanStack Query conventions"
|
|
68
130
|
},
|
|
69
131
|
{
|
|
70
132
|
"id": "laravel-api",
|
|
71
133
|
"version": "1.0.0",
|
|
72
134
|
"description": "Laravel API-only backend rules for headless SPA clients",
|
|
73
|
-
"tags": ["laravel", "php", "api", "sanctum"]
|
|
135
|
+
"tags": ["laravel", "php", "api", "sanctum"],
|
|
136
|
+
"author": "Noah Poli",
|
|
137
|
+
"verified": true,
|
|
138
|
+
"downloads": 6100,
|
|
139
|
+
"rating": 4.9,
|
|
140
|
+
"updatedAt": "2026-07-16T00:00:00.000Z",
|
|
141
|
+
"changelog": "Sanctum + API resource patterns"
|
|
74
142
|
},
|
|
75
143
|
{
|
|
76
144
|
"id": "nextjs-marketing",
|
|
77
145
|
"version": "1.0.0",
|
|
78
146
|
"description": "Next.js App Router rules for marketing and branding websites",
|
|
79
|
-
"tags": ["nextjs", "marketing", "seo", "branding"]
|
|
147
|
+
"tags": ["nextjs", "marketing", "seo", "branding"],
|
|
148
|
+
"author": "Noah Poli",
|
|
149
|
+
"verified": true,
|
|
150
|
+
"downloads": 3300,
|
|
151
|
+
"rating": 4.6,
|
|
152
|
+
"updatedAt": "2026-07-09T00:00:00.000Z",
|
|
153
|
+
"changelog": "App Router SEO defaults"
|
|
80
154
|
},
|
|
81
155
|
{
|
|
82
156
|
"id": "nuxt-marketing",
|
|
83
157
|
"version": "1.0.0",
|
|
84
158
|
"description": "Nuxt 3+ rules for marketing and branding websites",
|
|
85
|
-
"tags": ["nuxt", "vue", "marketing", "seo", "branding"]
|
|
159
|
+
"tags": ["nuxt", "vue", "marketing", "seo", "branding"],
|
|
160
|
+
"author": "Noah Poli",
|
|
161
|
+
"verified": true,
|
|
162
|
+
"downloads": 2400,
|
|
163
|
+
"rating": 4.5,
|
|
164
|
+
"updatedAt": "2026-07-07T00:00:00.000Z",
|
|
165
|
+
"changelog": "Nuxt 3 marketing patterns"
|
|
86
166
|
}
|
|
87
167
|
],
|
|
88
168
|
"prompts": [],
|
|
89
169
|
"mcp": [],
|
|
90
|
-
"presets": [
|
|
170
|
+
"presets": [
|
|
171
|
+
{
|
|
172
|
+
"id": "laravel-enterprise",
|
|
173
|
+
"version": "1.0.0",
|
|
174
|
+
"description": "Laravel API + Larastan QA + README + git workflow",
|
|
175
|
+
"tags": ["laravel", "php", "api", "enterprise"],
|
|
176
|
+
"author": "Noah Poli",
|
|
177
|
+
"verified": true,
|
|
178
|
+
"downloads": 1500,
|
|
179
|
+
"rating": 4.8,
|
|
180
|
+
"updatedAt": "2026-07-18T00:00:00.000Z",
|
|
181
|
+
"changelog": "Initial Laravel enterprise preset",
|
|
182
|
+
"includes": {
|
|
183
|
+
"skills": ["larastan-fix", "generate-readme", "commit-push"],
|
|
184
|
+
"rules": ["laravel-api", "stack-architecture"]
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "react-performance",
|
|
189
|
+
"version": "1.0.0",
|
|
190
|
+
"description": "React SPA dashboard rules + react-doctor QA",
|
|
191
|
+
"tags": ["react", "spa", "performance"],
|
|
192
|
+
"author": "Noah Poli",
|
|
193
|
+
"verified": true,
|
|
194
|
+
"downloads": 1100,
|
|
195
|
+
"rating": 4.7,
|
|
196
|
+
"updatedAt": "2026-07-18T00:00:00.000Z",
|
|
197
|
+
"changelog": "Initial React performance preset",
|
|
198
|
+
"includes": {
|
|
199
|
+
"skills": ["react-doctor-fix", "commit-push"],
|
|
200
|
+
"rules": ["react-spa-dashboard", "stack-architecture"]
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
]
|
|
91
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-service.d.ts","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"doctor-service.d.ts","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,KAAK,EACX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,wBAAsB,SAAS,CAC7B,GAAG,SAAgB,EACnB,GAAG,GAAE,KAAmB,GACvB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmLxB"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import fs from "fs-extra";
|
|
3
|
-
import { DEFAULT_IDE, getIdeDefinition, METADATA_FILE, } from "../constants/index.js";
|
|
3
|
+
import { DEFAULT_IDE, getIdeDefinition, METADATA_FILE, WORKSPACE_FILE, LOCKFILE_NAME, } from "../constants/index.js";
|
|
4
4
|
import { readMetadata } from "../metadata/store.js";
|
|
5
5
|
import { assetTypeToDir } from "../utils/assets.js";
|
|
6
6
|
import { resolveIdeDir, resolveProjectRoot } from "../utils/fs.js";
|
|
7
|
+
import { computeHealthScores, detectProjectStack } from "./project-awareness.js";
|
|
8
|
+
import { getSettings } from "../metadata/user-store.js";
|
|
7
9
|
export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
8
10
|
const checks = [];
|
|
9
11
|
const ideDef = getIdeDefinition(ide);
|
|
10
|
-
// Node version
|
|
11
12
|
const major = Number(process.versions.node.split(".")[0]);
|
|
12
13
|
checks.push({
|
|
13
14
|
name: "Node.js version",
|
|
@@ -16,7 +17,6 @@ export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
|
16
17
|
? `Node.js ${process.versions.node}`
|
|
17
18
|
: `Node.js ${process.versions.node} (requires >= 20)`,
|
|
18
19
|
});
|
|
19
|
-
// Project writable
|
|
20
20
|
const root = resolveProjectRoot(cwd);
|
|
21
21
|
try {
|
|
22
22
|
await fs.access(root, fs.constants.W_OK);
|
|
@@ -33,7 +33,6 @@ export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
|
33
33
|
message: `Cannot write to ${root}`,
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
-
// IDE directory
|
|
37
36
|
const ideDir = resolveIdeDir(ide, cwd);
|
|
38
37
|
const ideExists = await fs.pathExists(ideDir);
|
|
39
38
|
checks.push({
|
|
@@ -43,7 +42,6 @@ export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
|
43
42
|
? `Found at ${ideDir}`
|
|
44
43
|
: `Missing — will be created on first install`,
|
|
45
44
|
});
|
|
46
|
-
// Metadata
|
|
47
45
|
const metadataPath = path.join(ideDir, METADATA_FILE);
|
|
48
46
|
const metadata = await readMetadata(cwd, ide).catch(() => null);
|
|
49
47
|
if (!(await fs.pathExists(metadataPath))) {
|
|
@@ -66,7 +64,6 @@ export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
|
66
64
|
status: "pass",
|
|
67
65
|
message: `${metadata.installed.length} installed asset(s) from ${metadata.registry}`,
|
|
68
66
|
});
|
|
69
|
-
// Orphan / missing file checks
|
|
70
67
|
let missingFiles = 0;
|
|
71
68
|
for (const asset of metadata.installed) {
|
|
72
69
|
if (asset.type === "preset")
|
|
@@ -84,7 +81,6 @@ export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
|
84
81
|
: `${missingFiles} recorded asset(s) missing from disk`,
|
|
85
82
|
});
|
|
86
83
|
}
|
|
87
|
-
// Git availability (optional; registry ships bundled with the package)
|
|
88
84
|
try {
|
|
89
85
|
const { execa } = await import("execa");
|
|
90
86
|
const result = await execa("git", ["--version"]);
|
|
@@ -101,6 +97,77 @@ export async function runDoctor(cwd = process.cwd(), ide = DEFAULT_IDE) {
|
|
|
101
97
|
message: "Git not found (optional — registry is bundled with the package)",
|
|
102
98
|
});
|
|
103
99
|
}
|
|
100
|
+
// Project awareness
|
|
101
|
+
const stack = await detectProjectStack(cwd);
|
|
102
|
+
checks.push({
|
|
103
|
+
name: "Framework detection",
|
|
104
|
+
status: stack.frameworks.length > 0 ? "pass" : "warn",
|
|
105
|
+
message: stack.frameworks.length > 0
|
|
106
|
+
? stack.frameworks.join(", ")
|
|
107
|
+
: "No framework detected",
|
|
108
|
+
});
|
|
109
|
+
const health = await computeHealthScores(cwd, ide);
|
|
110
|
+
checks.push({
|
|
111
|
+
name: "Architecture score",
|
|
112
|
+
status: health.architecture >= 5 ? "pass" : "warn",
|
|
113
|
+
message: String(health.architecture),
|
|
114
|
+
});
|
|
115
|
+
checks.push({
|
|
116
|
+
name: "Security score",
|
|
117
|
+
status: health.security >= 5 ? "pass" : "warn",
|
|
118
|
+
message: String(health.security),
|
|
119
|
+
});
|
|
120
|
+
checks.push({
|
|
121
|
+
name: "Documentation score",
|
|
122
|
+
status: health.documentation >= 5 ? "pass" : "warn",
|
|
123
|
+
message: String(health.documentation),
|
|
124
|
+
});
|
|
125
|
+
checks.push({
|
|
126
|
+
name: "Testing score",
|
|
127
|
+
status: health.testing >= 5 ? "pass" : "warn",
|
|
128
|
+
message: String(health.testing),
|
|
129
|
+
});
|
|
130
|
+
checks.push({
|
|
131
|
+
name: "Overall health",
|
|
132
|
+
status: health.overall >= 5 ? "pass" : "warn",
|
|
133
|
+
message: `${health.overall} (${Math.round(health.overall * 10)}%)`,
|
|
134
|
+
});
|
|
135
|
+
const hasDocker = (await fs.pathExists(path.join(cwd, "Dockerfile"))) ||
|
|
136
|
+
(await fs.pathExists(path.join(cwd, "docker-compose.yml")));
|
|
137
|
+
checks.push({
|
|
138
|
+
name: "Docker",
|
|
139
|
+
status: hasDocker ? "pass" : "warn",
|
|
140
|
+
message: hasDocker ? "Dockerfile or compose present" : "No Docker config detected",
|
|
141
|
+
});
|
|
142
|
+
const hasCi = (await fs.pathExists(path.join(cwd, ".github/workflows"))) ||
|
|
143
|
+
(await fs.pathExists(path.join(cwd, ".gitlab-ci.yml")));
|
|
144
|
+
checks.push({
|
|
145
|
+
name: "CI",
|
|
146
|
+
status: hasCi ? "pass" : "warn",
|
|
147
|
+
message: hasCi ? "CI config found" : "No CI config detected",
|
|
148
|
+
});
|
|
149
|
+
checks.push({
|
|
150
|
+
name: WORKSPACE_FILE,
|
|
151
|
+
status: (await fs.pathExists(path.join(cwd, WORKSPACE_FILE))) ? "pass" : "warn",
|
|
152
|
+
message: (await fs.pathExists(path.join(cwd, WORKSPACE_FILE)))
|
|
153
|
+
? "Team workspace configured"
|
|
154
|
+
: "Missing — run `noah-cursor workspace init` or `bootstrap`",
|
|
155
|
+
});
|
|
156
|
+
checks.push({
|
|
157
|
+
name: LOCKFILE_NAME,
|
|
158
|
+
status: (await fs.pathExists(path.join(cwd, LOCKFILE_NAME))) ? "pass" : "warn",
|
|
159
|
+
message: (await fs.pathExists(path.join(cwd, LOCKFILE_NAME)))
|
|
160
|
+
? "Lockfile present"
|
|
161
|
+
: "Missing — generated on install",
|
|
162
|
+
});
|
|
163
|
+
const settings = await getSettings();
|
|
164
|
+
if (settings.privateRegistry) {
|
|
165
|
+
checks.push({
|
|
166
|
+
name: "Private registry",
|
|
167
|
+
status: "pass",
|
|
168
|
+
message: settings.privateRegistry,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
104
171
|
return checks;
|
|
105
172
|
}
|
|
106
173
|
//# sourceMappingURL=doctor-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-service.js","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,GAEd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-service.js","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SearchResult } from "../types/index.js";
|
|
2
|
+
export declare function listTrending(period?: "today" | "week" | "month", options?: {
|
|
3
|
+
verbose?: boolean;
|
|
4
|
+
}): Promise<SearchResult[]>;
|
|
5
|
+
export declare function login(username?: string): Promise<{
|
|
6
|
+
username: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function logout(): Promise<void>;
|
|
9
|
+
export declare function whoami(): Promise<string | null>;
|
|
10
|
+
export declare function runPublishWizard(cwd?: string): Promise<void>;
|
|
11
|
+
export declare function getAnalyticsSummary(): Promise<{
|
|
12
|
+
favorites: number;
|
|
13
|
+
recent: number;
|
|
14
|
+
auditEvents: number;
|
|
15
|
+
loggedIn: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=ecosystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecosystem.d.ts","sourceRoot":"","sources":["../../src/services/ecosystem.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItF,wBAAsB,YAAY,CAChC,MAAM,GAAE,OAAO,GAAG,MAAM,GAAG,OAAgB,EAC3C,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,YAAY,EAAE,CAAC,CAWzB;AAED,wBAAsB,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB5E;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5C;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGrD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFzE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC,CAQD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { input, select, confirm } from "@inquirer/prompts";
|
|
4
|
+
import { ASSET_DIRECTORIES, ASSET_TYPES, MANIFEST_FILE } from "../constants/index.js";
|
|
5
|
+
import { ValidationError } from "../core/errors.js";
|
|
6
|
+
import { logInfo, logSuccess, logTitle } from "../core/logger.js";
|
|
7
|
+
import { ManifestSchema } from "../types/index.js";
|
|
8
|
+
import { listRegistryAssets } from "./install-service.js";
|
|
9
|
+
import { appendAudit, readUserStore, writeUserStore } from "../metadata/user-store.js";
|
|
10
|
+
export async function listTrending(period = "week", options = {}) {
|
|
11
|
+
const listed = await listRegistryAssets(undefined, options);
|
|
12
|
+
const sorted = [...listed.assets].sort((a, b) => {
|
|
13
|
+
const da = a.downloads ?? 0;
|
|
14
|
+
const db = b.downloads ?? 0;
|
|
15
|
+
if (db !== da)
|
|
16
|
+
return db - da;
|
|
17
|
+
return (b.rating ?? 0) - (a.rating ?? 0);
|
|
18
|
+
});
|
|
19
|
+
// Period is reserved for future registry API; local registry uses downloads/rating.
|
|
20
|
+
void period;
|
|
21
|
+
return sorted.slice(0, 10);
|
|
22
|
+
}
|
|
23
|
+
export async function login(username) {
|
|
24
|
+
const name = username ??
|
|
25
|
+
(await input({
|
|
26
|
+
message: "Username / email",
|
|
27
|
+
validate: (v) => (v.trim().length > 0 ? true : "Required"),
|
|
28
|
+
}));
|
|
29
|
+
const store = await readUserStore();
|
|
30
|
+
store.auth = {
|
|
31
|
+
username: name.trim(),
|
|
32
|
+
token: `local-${Buffer.from(name.trim()).toString("base64url")}`,
|
|
33
|
+
loggedInAt: new Date().toISOString(),
|
|
34
|
+
};
|
|
35
|
+
await writeUserStore(store);
|
|
36
|
+
await appendAudit("login", name.trim());
|
|
37
|
+
logSuccess(`Logged in as ${name.trim()}`);
|
|
38
|
+
logInfo("Token stored locally in ~/.noah (for future publish/sync).");
|
|
39
|
+
return { username: name.trim() };
|
|
40
|
+
}
|
|
41
|
+
export async function logout() {
|
|
42
|
+
const store = await readUserStore();
|
|
43
|
+
store.auth = undefined;
|
|
44
|
+
await writeUserStore(store);
|
|
45
|
+
await appendAudit("logout");
|
|
46
|
+
logSuccess("Logged out.");
|
|
47
|
+
}
|
|
48
|
+
export async function whoami() {
|
|
49
|
+
const store = await readUserStore();
|
|
50
|
+
return store.auth?.username ?? null;
|
|
51
|
+
}
|
|
52
|
+
export async function runPublishWizard(cwd = process.cwd()) {
|
|
53
|
+
const store = await readUserStore();
|
|
54
|
+
if (!store.auth?.username) {
|
|
55
|
+
logInfo("Not logged in. Run `noah-cursor login` first (local auth).");
|
|
56
|
+
}
|
|
57
|
+
const type = (await select({
|
|
58
|
+
message: "Package type",
|
|
59
|
+
choices: ASSET_TYPES.filter((t) => t !== "preset").map((t) => ({ name: t, value: t })),
|
|
60
|
+
}));
|
|
61
|
+
const id = await input({
|
|
62
|
+
message: "Package id (kebab-case)",
|
|
63
|
+
validate: (v) => (/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v) ? true : "Use kebab-case id"),
|
|
64
|
+
});
|
|
65
|
+
const description = await input({
|
|
66
|
+
message: "Short description",
|
|
67
|
+
default: "",
|
|
68
|
+
});
|
|
69
|
+
const version = await input({
|
|
70
|
+
message: "Version",
|
|
71
|
+
default: "1.0.0",
|
|
72
|
+
});
|
|
73
|
+
const dirName = ASSET_DIRECTORIES[type];
|
|
74
|
+
const targetDir = path.join(cwd, dirName, id);
|
|
75
|
+
if (await fs.pathExists(targetDir)) {
|
|
76
|
+
throw new ValidationError(`${dirName}/${id} already exists`);
|
|
77
|
+
}
|
|
78
|
+
const ok = await confirm({
|
|
79
|
+
message: `Create ${dirName}/${id} and register in ${MANIFEST_FILE}?`,
|
|
80
|
+
default: true,
|
|
81
|
+
});
|
|
82
|
+
if (!ok) {
|
|
83
|
+
logInfo("Publish cancelled.");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await fs.ensureDir(targetDir);
|
|
87
|
+
const body = type === "skill"
|
|
88
|
+
? `# ${id}\n\n${description}\n`
|
|
89
|
+
: type === "rule"
|
|
90
|
+
? `# ${id}\n\n${description}\n`
|
|
91
|
+
: `${description}\n`;
|
|
92
|
+
const fileName = type === "skill" || type === "rule" ? (type === "skill" ? "SKILL.md" : "RULE.md") : "README.md";
|
|
93
|
+
await fs.writeFile(path.join(targetDir, fileName), body, "utf8");
|
|
94
|
+
const manifestPath = path.join(cwd, MANIFEST_FILE);
|
|
95
|
+
if (await fs.pathExists(manifestPath)) {
|
|
96
|
+
const raw = await fs.readJson(manifestPath);
|
|
97
|
+
const manifest = ManifestSchema.parse(raw);
|
|
98
|
+
const entry = {
|
|
99
|
+
id,
|
|
100
|
+
version,
|
|
101
|
+
description: description || undefined,
|
|
102
|
+
tags: [],
|
|
103
|
+
author: store.auth?.username,
|
|
104
|
+
verified: false,
|
|
105
|
+
downloads: 0,
|
|
106
|
+
rating: 0,
|
|
107
|
+
updatedAt: new Date().toISOString(),
|
|
108
|
+
changelog: "Initial release",
|
|
109
|
+
};
|
|
110
|
+
if (type === "skill")
|
|
111
|
+
manifest.skills.push(entry);
|
|
112
|
+
else if (type === "rule")
|
|
113
|
+
manifest.rules.push(entry);
|
|
114
|
+
else if (type === "prompt")
|
|
115
|
+
manifest.prompts.push(entry);
|
|
116
|
+
else if (type === "mcp")
|
|
117
|
+
manifest.mcp.push(entry);
|
|
118
|
+
await fs.writeJson(manifestPath, manifest, { spaces: 2 });
|
|
119
|
+
}
|
|
120
|
+
await appendAudit("publish", `${type}/${id}@${version}`);
|
|
121
|
+
logSuccess(`Scaffolded ${dirName}/${id}`);
|
|
122
|
+
logTitle("Next steps");
|
|
123
|
+
console.log(" 1. Edit the package content");
|
|
124
|
+
console.log(" 2. Commit and open a PR to the Noah registry");
|
|
125
|
+
console.log(" 3. After merge, users can: noah-cursor install " + `${type}/${id}`);
|
|
126
|
+
}
|
|
127
|
+
export async function getAnalyticsSummary() {
|
|
128
|
+
const store = await readUserStore();
|
|
129
|
+
return {
|
|
130
|
+
favorites: store.favorites.length,
|
|
131
|
+
recent: store.recent.length,
|
|
132
|
+
auditEvents: store.auditLog.length,
|
|
133
|
+
loggedIn: Boolean(store.auth?.username),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ecosystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecosystem.js","sourceRoot":"","sources":["../../src/services/ecosystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type IdeId } from "../constants/index.js";
|
|
2
|
+
export declare function runUndo(options?: {
|
|
3
|
+
yes?: boolean;
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function tryPackage(input: string, options?: {
|
|
8
|
+
ide?: IdeId;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
}): Promise<string>;
|
|
11
|
+
export declare function showDashboard(ide?: IdeId): Promise<void>;
|
|
12
|
+
export declare function addPlugin(name: string): Promise<void>;
|
|
13
|
+
export declare function listPlugins(): Promise<string[]>;
|
|
14
|
+
export declare function createTemplate(name: string, options?: {
|
|
15
|
+
ide?: IdeId;
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
verbose?: boolean;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
export declare function previewDiff(input: string, options?: {
|
|
20
|
+
ide?: IdeId;
|
|
21
|
+
verbose?: boolean;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare function interactivePackagePicker(packages: Array<{
|
|
24
|
+
type: string;
|
|
25
|
+
id: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
}>): Promise<string | null>;
|
|
28
|
+
export declare function ensurePackageExists(input: string): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=extras.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extras.d.ts","sourceRoot":"","sources":["../../src/services/extras.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAwBlF,wBAAsB,OAAO,CAC3B,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACnE,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,aAAa,CAAC,GAAG,GAAE,KAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB3E;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrD;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE"}
|