impact-compass 0.2.1 → 0.2.3
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 +31 -17
- package/bin/impact-compass.js +17 -0
- package/package.json +38 -33
- package/src/cli.ts +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
*grab a compass before you sail soldier*
|
|
4
4
|
|
|
5
|
+
```bash
|
|
6
|
+
npm i impact-compass
|
|
7
|
+
npx impact-compass idea.json output.json
|
|
8
|
+
```
|
|
9
|
+
|
|
5
10
|
A purely statistical, deterministic project idea validator and market research CLI.
|
|
6
11
|
|
|
7
12
|
Impact Compass fetches keyword rankings and engagement signals from real sources like GitHub, npm, Reddit, Stack Exchange, Hacker News, Wikipedia, and the App Store. It checks the *hype* around your project before you waste six months, a billion tokens, and enough coffee to make your keyboard anxious.
|
|
@@ -22,25 +27,34 @@ Why? Because you didn't measure the noise. High demand means nothing if the mark
|
|
|
22
27
|
|
|
23
28
|
Impact Compass takes your idea and compiles a query bundle (problems, solutions, target audiences, and competitors). It then pulls live data from seven pillars of public evidence and runs an advanced logarithmic scoring algorithm.
|
|
24
29
|
|
|
30
|
+
```mermaid
|
|
31
|
+
flowchart TD
|
|
32
|
+
A["Idea brief JSON"] --> B["Query bundle compiler"]
|
|
33
|
+
B --> C["35 source adapters"]
|
|
34
|
+
C --> D["Public APIs: GitHub, Reddit, npm, Hacker News, Stack Exchange, Wikipedia, App Store"]
|
|
35
|
+
D --> E["Evidence normalizer"]
|
|
36
|
+
E --> F["Relevance filter: weak keyword match loses 60% signal"]
|
|
37
|
+
F --> G["Pillar scorers: demand, pain, momentum, activity, competition, channel fit, evidence quality"]
|
|
38
|
+
G --> H["Weighted score engine"]
|
|
39
|
+
H --> I["Red ocean saturation penalty"]
|
|
40
|
+
I --> J["Final score, confidence, interpretation, JSON report"]
|
|
41
|
+
```
|
|
42
|
+
|
|
25
43
|
It measures:
|
|
26
44
|
- **Demand & Pain:** Are people actually complaining about this, or is the problem minor?
|
|
27
45
|
- **Momentum & Activity:** Are developers and founders actively building in this space right now?
|
|
28
46
|
- **Competition Fit:** If the tool finds 10,000 competitors, your score tanks. Red oceans get penalized heavily.
|
|
29
47
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
0, & \text{otherwise}
|
|
39
|
-
\end{cases}
|
|
40
|
-
\right)
|
|
41
|
-
```
|
|
48
|
+
The score is intentionally simple to read:
|
|
49
|
+
|
|
50
|
+
1. Score each pillar from 0 to 100.
|
|
51
|
+
2. Multiply every pillar by its weight.
|
|
52
|
+
3. Add those weighted pillar scores together.
|
|
53
|
+
4. Divide by the total weight.
|
|
54
|
+
5. Clamp the result between 0 and 100.
|
|
55
|
+
6. If demand is above 70 but competition fit is below 30, subtract an extra red-ocean penalty.
|
|
42
56
|
|
|
43
|
-
|
|
57
|
+
Translation: big demand is good, but big demand plus a crushed competition score means you are sailing into a red ocean with a paper boat.
|
|
44
58
|
|
|
45
59
|
The engine spits out a final score out of 100, along with a brutally honest interpretation of whether you should build it, pivot, or drop the idea entirely.
|
|
46
60
|
|
|
@@ -50,11 +64,11 @@ The engine spits out a final score out of 100, along with a brutally honest inte
|
|
|
50
64
|
|
|
51
65
|
## Quickstart
|
|
52
66
|
|
|
53
|
-
Install
|
|
67
|
+
Install the published package, then run an evaluation:
|
|
54
68
|
|
|
55
69
|
```bash
|
|
56
|
-
npm
|
|
57
|
-
|
|
70
|
+
npm i impact-compass
|
|
71
|
+
npx impact-compass idea.json output.json
|
|
58
72
|
```
|
|
59
73
|
|
|
60
74
|
### The Input Schema
|
|
@@ -79,7 +93,7 @@ Give Impact Compass an idea brief and a locked query bundle. The CLI does the di
|
|
|
79
93
|
}
|
|
80
94
|
```
|
|
81
95
|
|
|
82
|
-
##
|
|
96
|
+
## Scoring Logic
|
|
83
97
|
|
|
84
98
|
We stripped out the generic averages. The engine uses logarithmic scaling, so a GitHub repo with 5,000 stars is weighted accurately against one with 5 stars. It applies relevance penalties. If a search result does not contain your target keywords, it loses 60% of its value instantly.
|
|
85
99
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
3
|
+
const { spawnSync } = require("node:child_process");
|
|
4
|
+
const path = require("node:path");
|
|
5
|
+
|
|
6
|
+
const tsxCli = require.resolve("tsx/cli");
|
|
7
|
+
const cliEntry = path.resolve(__dirname, "../src/cli.ts");
|
|
8
|
+
const result = spawnSync(process.execPath, [tsxCli, cliEntry, ...process.argv.slice(2)], {
|
|
9
|
+
stdio: "inherit",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
if (result.error) {
|
|
13
|
+
console.error(result.error.message);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
process.exit(result.status ?? 1);
|
package/package.json
CHANGED
|
@@ -1,14 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "impact-compass",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Deterministic market research CLI for startup idea validation, demand scoring, and competitive analysis.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/adityachauhan0/impact-compass.git"
|
|
9
9
|
},
|
|
10
|
+
"homepage": "https://github.com/adityachauhan0/impact-compass#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/adityachauhan0/impact-compass/issues"
|
|
13
|
+
},
|
|
10
14
|
"private": false,
|
|
15
|
+
"bin": {
|
|
16
|
+
"impact-compass": "./bin/impact-compass.js"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"market-research",
|
|
20
|
+
"idea-validation",
|
|
21
|
+
"startup-validation",
|
|
22
|
+
"product-validation",
|
|
23
|
+
"market-validation",
|
|
24
|
+
"competitive-analysis",
|
|
25
|
+
"product-market-fit",
|
|
26
|
+
"demand-validation",
|
|
27
|
+
"demand-analysis",
|
|
28
|
+
"market-analysis",
|
|
29
|
+
"startup",
|
|
30
|
+
"founder-tools",
|
|
31
|
+
"indie-hacker",
|
|
32
|
+
"mvp",
|
|
33
|
+
"cli",
|
|
34
|
+
"analytics",
|
|
35
|
+
"developer-tools",
|
|
36
|
+
"scoring",
|
|
37
|
+
"deterministic",
|
|
38
|
+
"no-ai",
|
|
39
|
+
"github",
|
|
40
|
+
"npm",
|
|
41
|
+
"reddit",
|
|
42
|
+
"hacker-news",
|
|
43
|
+
"stackexchange"
|
|
44
|
+
],
|
|
11
45
|
"files": [
|
|
46
|
+
"bin/",
|
|
12
47
|
"src/",
|
|
13
48
|
"DOCUMENTATION.md",
|
|
14
49
|
"SKILLS.md",
|
|
@@ -28,7 +63,8 @@
|
|
|
28
63
|
"lucide-react": "^1.16.0",
|
|
29
64
|
"next": "16.2.6",
|
|
30
65
|
"react": "19.2.4",
|
|
31
|
-
"react-dom": "19.2.4"
|
|
66
|
+
"react-dom": "19.2.4",
|
|
67
|
+
"tsx": "^4.22.3"
|
|
32
68
|
},
|
|
33
69
|
"devDependencies": {
|
|
34
70
|
"@tailwindcss/postcss": "^4",
|
|
@@ -47,36 +83,5 @@
|
|
|
47
83
|
},
|
|
48
84
|
"overrides": {
|
|
49
85
|
"postcss": "8.5.15"
|
|
50
|
-
},
|
|
51
|
-
"keywords": [
|
|
52
|
-
"market-research",
|
|
53
|
-
"idea-validation",
|
|
54
|
-
"startup-validation",
|
|
55
|
-
"product-validation",
|
|
56
|
-
"market-validation",
|
|
57
|
-
"competitive-analysis",
|
|
58
|
-
"product-market-fit",
|
|
59
|
-
"demand-validation",
|
|
60
|
-
"demand-analysis",
|
|
61
|
-
"market-analysis",
|
|
62
|
-
"startup",
|
|
63
|
-
"founder-tools",
|
|
64
|
-
"indie-hacker",
|
|
65
|
-
"mvp",
|
|
66
|
-
"cli",
|
|
67
|
-
"analytics",
|
|
68
|
-
"developer-tools",
|
|
69
|
-
"scoring",
|
|
70
|
-
"deterministic",
|
|
71
|
-
"no-ai",
|
|
72
|
-
"github",
|
|
73
|
-
"npm",
|
|
74
|
-
"reddit",
|
|
75
|
-
"hacker-news",
|
|
76
|
-
"stackexchange"
|
|
77
|
-
],
|
|
78
|
-
"homepage": "https://github.com/adityachauhan0/impact-compass#readme",
|
|
79
|
-
"bugs": {
|
|
80
|
-
"url": "https://github.com/adityachauhan0/impact-compass/issues"
|
|
81
86
|
}
|
|
82
87
|
}
|
package/src/cli.ts
CHANGED
|
@@ -59,7 +59,7 @@ function wrapText(text: string, width: number): string[] {
|
|
|
59
59
|
async function main() {
|
|
60
60
|
const args = process.argv.slice(2);
|
|
61
61
|
if (args.length < 2) {
|
|
62
|
-
console.error(`Usage:
|
|
62
|
+
console.error(`Usage: impact-compass <input.json> <output.json>`);
|
|
63
63
|
process.exit(1);
|
|
64
64
|
}
|
|
65
65
|
|