standout 0.5.33 → 0.5.35
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/dist/cli.js +7431 -559
- package/package.json +9 -3
- package/dist/ai-usage.d.ts +0 -164
- package/dist/ai-usage.js +0 -1306
- package/dist/api.d.ts +0 -10
- package/dist/api.js +0 -94
- package/dist/browser-session.d.ts +0 -3
- package/dist/browser-session.js +0 -227
- package/dist/cli.d.ts +0 -2
- package/dist/cursor.d.ts +0 -57
- package/dist/cursor.js +0 -562
- package/dist/dev-env.d.ts +0 -28
- package/dist/dev-env.js +0 -264
- package/dist/gather.d.ts +0 -82
- package/dist/gather.js +0 -922
- package/dist/heap.d.ts +0 -1
- package/dist/heap.js +0 -25
- package/dist/identity.d.ts +0 -8
- package/dist/identity.js +0 -29
- package/dist/linkedin-scrape.d.ts +0 -2
- package/dist/linkedin-scrape.js +0 -56
- package/dist/mcp.d.ts +0 -1
- package/dist/mcp.js +0 -25
- package/dist/payload.d.ts +0 -8
- package/dist/payload.js +0 -163
- package/dist/prompt.d.ts +0 -1
- package/dist/prompt.js +0 -247
- package/dist/proxy.d.ts +0 -1
- package/dist/proxy.js +0 -27
- package/dist/redact.d.ts +0 -1
- package/dist/redact.js +0 -37
- package/dist/tools.d.ts +0 -4
- package/dist/tools.js +0 -182
- package/dist/twitter-scrape.d.ts +0 -1
- package/dist/twitter-scrape.js +0 -48
- package/dist/wrapped/aggregate.d.ts +0 -6
- package/dist/wrapped/aggregate.js +0 -811
- package/dist/wrapped/chrono-critters.d.ts +0 -8
- package/dist/wrapped/chrono-critters.js +0 -32
- package/dist/wrapped/index.d.ts +0 -3
- package/dist/wrapped/index.js +0 -2
- package/dist/wrapped/mascots.d.ts +0 -2
- package/dist/wrapped/mascots.js +0 -35
- package/dist/wrapped/preview.d.ts +0 -1
- package/dist/wrapped/preview.js +0 -97
- package/dist/wrapped/render.d.ts +0 -14
- package/dist/wrapped/render.js +0 -1025
- package/dist/wrapped/tiers.d.ts +0 -9
- package/dist/wrapped/tiers.js +0 -73
- package/dist/wrapped/types.d.ts +0 -189
- package/dist/wrapped/types.js +0 -4
- package/dist/wrapped-client.d.ts +0 -16
- package/dist/wrapped-client.js +0 -166
- package/dist/wrapped-share.d.ts +0 -1
- package/dist/wrapped-share.js +0 -6
package/dist/dev-env.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { execSync } from "child_process";
|
|
2
|
-
import { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
const INTERESTING_TOOLS = [
|
|
6
|
-
"docker",
|
|
7
|
-
"kubectl",
|
|
8
|
-
"terraform",
|
|
9
|
-
"aws",
|
|
10
|
-
"gcloud",
|
|
11
|
-
"bun",
|
|
12
|
-
"pnpm",
|
|
13
|
-
"yarn",
|
|
14
|
-
"deno",
|
|
15
|
-
"gh",
|
|
16
|
-
"vercel",
|
|
17
|
-
"supabase",
|
|
18
|
-
"npm",
|
|
19
|
-
"node",
|
|
20
|
-
"python3",
|
|
21
|
-
"go",
|
|
22
|
-
"cargo",
|
|
23
|
-
"rustc",
|
|
24
|
-
"java",
|
|
25
|
-
"ruby",
|
|
26
|
-
"rails",
|
|
27
|
-
"psql",
|
|
28
|
-
"redis-cli",
|
|
29
|
-
"mongo",
|
|
30
|
-
"ollama",
|
|
31
|
-
"fly",
|
|
32
|
-
"heroku",
|
|
33
|
-
"claude",
|
|
34
|
-
"codex",
|
|
35
|
-
];
|
|
36
|
-
function execSafe(cmd, timeout = 5000) {
|
|
37
|
-
try {
|
|
38
|
-
return execSync(cmd, {
|
|
39
|
-
timeout,
|
|
40
|
-
maxBuffer: 2 * 1024 * 1024,
|
|
41
|
-
encoding: "utf-8",
|
|
42
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
43
|
-
}).trim();
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return "";
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function readFileSafe(path, maxBytes = 3000) {
|
|
50
|
-
try {
|
|
51
|
-
const content = readFileSync(path, "utf-8");
|
|
52
|
-
return content.length > maxBytes ? content.slice(0, maxBytes) : content;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function collectAgentsMd() {
|
|
59
|
-
const candidates = [
|
|
60
|
-
"AGENTS.md",
|
|
61
|
-
join(homedir(), "AGENTS.md"),
|
|
62
|
-
join(homedir(), ".codex", "AGENTS.md"),
|
|
63
|
-
];
|
|
64
|
-
const result = [];
|
|
65
|
-
const seen = new Set();
|
|
66
|
-
for (const path of candidates) {
|
|
67
|
-
if (seen.has(path))
|
|
68
|
-
continue;
|
|
69
|
-
seen.add(path);
|
|
70
|
-
const contents = readFileSafe(path);
|
|
71
|
-
if (contents) {
|
|
72
|
-
result.push({ path: path.replace(homedir(), "~"), contents });
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
function summarizeClaudeSettingsFile(path, displayPath) {
|
|
78
|
-
if (!existsSync(path))
|
|
79
|
-
return null;
|
|
80
|
-
try {
|
|
81
|
-
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
82
|
-
const hooksObj = raw.hooks;
|
|
83
|
-
const hooks = hooksObj ? Object.keys(hooksObj) : [];
|
|
84
|
-
const mcpServersObj = raw.mcpServers;
|
|
85
|
-
const mcpServers = mcpServersObj ? Object.keys(mcpServersObj) : [];
|
|
86
|
-
const permsObj = raw.permissions;
|
|
87
|
-
let permissionsCount = 0;
|
|
88
|
-
if (permsObj) {
|
|
89
|
-
for (const key of ["allow", "deny", "ask"]) {
|
|
90
|
-
const arr = permsObj[key];
|
|
91
|
-
if (Array.isArray(arr))
|
|
92
|
-
permissionsCount += arr.length;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
path: displayPath,
|
|
97
|
-
hooks,
|
|
98
|
-
mcp_servers: mcpServers,
|
|
99
|
-
permissions_count: permissionsCount,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
function collectClaudeSettings() {
|
|
107
|
-
const candidates = [
|
|
108
|
-
{
|
|
109
|
-
path: join(homedir(), ".claude", "settings.json"),
|
|
110
|
-
display: "~/.claude/settings.json",
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
path: join(homedir(), ".claude", "settings.local.json"),
|
|
114
|
-
display: "~/.claude/settings.local.json",
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
path: ".claude/settings.json",
|
|
118
|
-
display: "<project>/.claude/settings.json",
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
path: ".claude/settings.local.json",
|
|
122
|
-
display: "<project>/.claude/settings.local.json",
|
|
123
|
-
},
|
|
124
|
-
];
|
|
125
|
-
const results = [];
|
|
126
|
-
for (const c of candidates) {
|
|
127
|
-
const s = summarizeClaudeSettingsFile(c.path, c.display);
|
|
128
|
-
if (s)
|
|
129
|
-
results.push(s);
|
|
130
|
-
}
|
|
131
|
-
return results;
|
|
132
|
-
}
|
|
133
|
-
function collectFromDir(dir) {
|
|
134
|
-
if (!existsSync(dir))
|
|
135
|
-
return [];
|
|
136
|
-
try {
|
|
137
|
-
return readdirSync(dir)
|
|
138
|
-
.filter((f) => !f.startsWith("."))
|
|
139
|
-
.map((f) => f.replace(/\.md$/, ""))
|
|
140
|
-
.slice(0, 50);
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
return [];
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
function collectClaudeCommands() {
|
|
147
|
-
const dirs = [join(homedir(), ".claude", "commands"), ".claude/commands"];
|
|
148
|
-
const all = new Set();
|
|
149
|
-
for (const d of dirs) {
|
|
150
|
-
collectFromDir(d).forEach((name) => all.add(name));
|
|
151
|
-
}
|
|
152
|
-
return [...all].slice(0, 50);
|
|
153
|
-
}
|
|
154
|
-
function collectClaudeSkills() {
|
|
155
|
-
const dirs = [join(homedir(), ".claude", "skills"), ".claude/skills"];
|
|
156
|
-
const all = new Set();
|
|
157
|
-
for (const d of dirs) {
|
|
158
|
-
collectFromDir(d).forEach((name) => all.add(name));
|
|
159
|
-
}
|
|
160
|
-
return [...all].slice(0, 50);
|
|
161
|
-
}
|
|
162
|
-
function collectCursorRules() {
|
|
163
|
-
const result = [];
|
|
164
|
-
const legacy = ".cursorrules";
|
|
165
|
-
const legacyContent = readFileSafe(legacy, 2000);
|
|
166
|
-
if (legacyContent) {
|
|
167
|
-
result.push({ path: legacy, contents: legacyContent });
|
|
168
|
-
}
|
|
169
|
-
const rulesDir = join(".cursor", "rules");
|
|
170
|
-
if (existsSync(rulesDir)) {
|
|
171
|
-
try {
|
|
172
|
-
const entries = readdirSync(rulesDir);
|
|
173
|
-
for (const entry of entries.slice(0, 20)) {
|
|
174
|
-
const full = join(rulesDir, entry);
|
|
175
|
-
const stat = statSync(full);
|
|
176
|
-
if (stat.isFile() && /\.(md|mdc|txt)$/.test(entry)) {
|
|
177
|
-
const contents = readFileSafe(full, 1500);
|
|
178
|
-
if (contents) {
|
|
179
|
-
result.push({ path: full, contents });
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
catch {
|
|
185
|
-
// skip
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return result;
|
|
189
|
-
}
|
|
190
|
-
function collectVscodeExtensions() {
|
|
191
|
-
const extDir = join(homedir(), ".vscode", "extensions");
|
|
192
|
-
if (!existsSync(extDir))
|
|
193
|
-
return [];
|
|
194
|
-
try {
|
|
195
|
-
return readdirSync(extDir)
|
|
196
|
-
.filter((e) => !e.startsWith(".") && !e.endsWith(".json"))
|
|
197
|
-
.map((e) => e.replace(/-\d+\.\d+\.\d+.*$/, ""))
|
|
198
|
-
.filter((e, i, arr) => arr.indexOf(e) === i)
|
|
199
|
-
.slice(0, 80);
|
|
200
|
-
}
|
|
201
|
-
catch {
|
|
202
|
-
return [];
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
function collectGlobalNpm() {
|
|
206
|
-
const out = execSafe("npm ls -g --depth=0 --parseable --long=false", 8000);
|
|
207
|
-
if (!out)
|
|
208
|
-
return [];
|
|
209
|
-
const names = [];
|
|
210
|
-
for (const line of out.split("\n")) {
|
|
211
|
-
const match = line.match(/node_modules\/([^/]+(?:\/[^/]+)?)$/);
|
|
212
|
-
if (match) {
|
|
213
|
-
const name = match[1];
|
|
214
|
-
if (!name.startsWith("npm") && !name.startsWith("corepack")) {
|
|
215
|
-
names.push(name);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return names.slice(0, 50);
|
|
220
|
-
}
|
|
221
|
-
function collectGlobalBrew() {
|
|
222
|
-
const out = execSafe("brew list --formula -1", 6000);
|
|
223
|
-
if (!out)
|
|
224
|
-
return [];
|
|
225
|
-
return out.split("\n").filter(Boolean).slice(0, 100);
|
|
226
|
-
}
|
|
227
|
-
function collectGlobalPip() {
|
|
228
|
-
const out = execSafe("pip3 list --user --format=freeze 2>/dev/null || pip list --format=freeze 2>/dev/null", 6000);
|
|
229
|
-
if (!out)
|
|
230
|
-
return [];
|
|
231
|
-
return out
|
|
232
|
-
.split("\n")
|
|
233
|
-
.map((l) => l.split("==")[0])
|
|
234
|
-
.filter(Boolean)
|
|
235
|
-
.slice(0, 60);
|
|
236
|
-
}
|
|
237
|
-
function collectTools() {
|
|
238
|
-
const tools = [];
|
|
239
|
-
for (const name of INTERESTING_TOOLS) {
|
|
240
|
-
const versionOut = execSafe(`${name} --version 2>&1`, 2000);
|
|
241
|
-
if (!versionOut)
|
|
242
|
-
continue;
|
|
243
|
-
const firstLine = versionOut.split("\n")[0].trim();
|
|
244
|
-
// Filter macOS command-not-found stubs (e.g. "Rails is not currently installed on this system")
|
|
245
|
-
if (/is not currently installed|command not found|No such file/i.test(firstLine))
|
|
246
|
-
continue;
|
|
247
|
-
tools.push({ name, version: firstLine.slice(0, 80) });
|
|
248
|
-
}
|
|
249
|
-
return tools;
|
|
250
|
-
}
|
|
251
|
-
export async function gatherDevEnvironment() {
|
|
252
|
-
return {
|
|
253
|
-
agents_md: collectAgentsMd(),
|
|
254
|
-
claude_settings: collectClaudeSettings(),
|
|
255
|
-
claude_commands: collectClaudeCommands(),
|
|
256
|
-
claude_skills: collectClaudeSkills(),
|
|
257
|
-
cursor_rules: collectCursorRules(),
|
|
258
|
-
vscode_extensions: collectVscodeExtensions(),
|
|
259
|
-
global_npm_packages: collectGlobalNpm(),
|
|
260
|
-
global_brew_packages: collectGlobalBrew(),
|
|
261
|
-
global_pip_packages: collectGlobalPip(),
|
|
262
|
-
tools: collectTools(),
|
|
263
|
-
};
|
|
264
|
-
}
|
package/dist/gather.d.ts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { type AiUsage } from "./ai-usage.js";
|
|
2
|
-
import { type DevEnvironment } from "./dev-env.js";
|
|
3
|
-
export interface GatheredProfile {
|
|
4
|
-
readiness: GatherReadiness;
|
|
5
|
-
identity: {
|
|
6
|
-
name: string | null;
|
|
7
|
-
email: string | null;
|
|
8
|
-
github_username: string | null;
|
|
9
|
-
twitter_username: string | null;
|
|
10
|
-
remotes: string[];
|
|
11
|
-
};
|
|
12
|
-
github: {
|
|
13
|
-
profile: Record<string, unknown> | null;
|
|
14
|
-
repos: Record<string, unknown>[];
|
|
15
|
-
starred: Record<string, unknown>[];
|
|
16
|
-
following: Record<string, unknown>[];
|
|
17
|
-
events: Record<string, unknown>[];
|
|
18
|
-
prs_authored: Record<string, unknown>[];
|
|
19
|
-
contribution_graph: Record<string, unknown> | null;
|
|
20
|
-
repo_contents: Record<string, Record<string, unknown>[]>;
|
|
21
|
-
readmes: Record<string, string>;
|
|
22
|
-
commit_messages: Record<string, string[]>;
|
|
23
|
-
npm_packages: Record<string, unknown>[];
|
|
24
|
-
enrichment: Record<string, unknown> | null;
|
|
25
|
-
};
|
|
26
|
-
linkedin: {
|
|
27
|
-
url: string | null;
|
|
28
|
-
url_resolution_source: "email" | "ai_search" | "chrome_session" | null;
|
|
29
|
-
profile: Record<string, unknown> | null;
|
|
30
|
-
company_enrichments: Record<string, Record<string, unknown>>;
|
|
31
|
-
};
|
|
32
|
-
twitter: {
|
|
33
|
-
handle: string | null;
|
|
34
|
-
url: string | null;
|
|
35
|
-
profile: Record<string, unknown> | null;
|
|
36
|
-
};
|
|
37
|
-
local: {
|
|
38
|
-
repos: {
|
|
39
|
-
path: string;
|
|
40
|
-
name: string;
|
|
41
|
-
commit_count: number;
|
|
42
|
-
last_commit: string;
|
|
43
|
-
readme_excerpt: string | null;
|
|
44
|
-
}[];
|
|
45
|
-
commit_patterns: string[];
|
|
46
|
-
collaborators: string[];
|
|
47
|
-
};
|
|
48
|
-
ai_coding: {
|
|
49
|
-
total_commits_since_2024: number;
|
|
50
|
-
ai_assisted_commits: number;
|
|
51
|
-
lines_added_since_2024: number;
|
|
52
|
-
lines_deleted_since_2024: number;
|
|
53
|
-
median_commit_size: number;
|
|
54
|
-
biggest_commit_size: number;
|
|
55
|
-
commit_subjects: string[];
|
|
56
|
-
claude_md_contents: string | null;
|
|
57
|
-
claude_dirs: string[];
|
|
58
|
-
other_ai_tools: string[];
|
|
59
|
-
cursorrules: string | null;
|
|
60
|
-
};
|
|
61
|
-
ai_usage: AiUsage;
|
|
62
|
-
dev_environment: DevEnvironment;
|
|
63
|
-
}
|
|
64
|
-
export type GatherStatus = "ready" | "scanning" | "enriching" | "unavailable" | "error";
|
|
65
|
-
export interface GatherReadiness {
|
|
66
|
-
usage_stats_status: GatherStatus;
|
|
67
|
-
profile_basics_status: GatherStatus;
|
|
68
|
-
enrichment_status: GatherStatus;
|
|
69
|
-
}
|
|
70
|
-
type ProfileBasics = Pick<GatheredProfile, "identity" | "github" | "local" | "readiness">;
|
|
71
|
-
export interface FullEnrichmentOptions {
|
|
72
|
-
aiUsage?: AiUsage;
|
|
73
|
-
profileBasics?: ProfileBasics;
|
|
74
|
-
verbose?: boolean;
|
|
75
|
-
localOnly?: boolean;
|
|
76
|
-
}
|
|
77
|
-
export declare function emptyGatheredProfile(readiness?: GatherReadiness): GatheredProfile;
|
|
78
|
-
export declare function gatherUsageStats(): Promise<Pick<GatheredProfile, "ai_usage" | "readiness">>;
|
|
79
|
-
export declare function gatherProfileBasics(): Promise<ProfileBasics>;
|
|
80
|
-
export declare function gatherFullEnrichment(options?: FullEnrichmentOptions): Promise<GatheredProfile>;
|
|
81
|
-
export declare function gather(options?: FullEnrichmentOptions): Promise<GatheredProfile>;
|
|
82
|
-
export {};
|