@rwendell/dossier 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +322 -2
- package/agents/dossier-answerer.md +168 -0
- package/agents/dossier-proposer.md +215 -0
- package/agents/dossier-tailor.md +232 -0
- package/dist/answer/prompt.d.ts +17 -0
- package/dist/answer/prompt.js +44 -0
- package/dist/answer/prompt.js.map +1 -0
- package/dist/answer/run.d.ts +21 -0
- package/dist/answer/run.js +272 -0
- package/dist/answer/run.js.map +1 -0
- package/dist/career/import-resume.d.ts +17 -0
- package/dist/career/import-resume.js +194 -0
- package/dist/career/import-resume.js.map +1 -0
- package/dist/career/load.d.ts +10 -0
- package/dist/career/load.js +96 -0
- package/dist/career/load.js.map +1 -0
- package/dist/career/schema.d.ts +147 -0
- package/dist/career/schema.js +95 -0
- package/dist/career/schema.js.map +1 -0
- package/dist/clean/run.d.ts +1 -0
- package/dist/clean/run.js +8 -0
- package/dist/clean/run.js.map +1 -0
- package/dist/cli/commands/answer.d.ts +23 -0
- package/dist/cli/commands/answer.js +110 -0
- package/dist/cli/commands/answer.js.map +1 -0
- package/dist/cli/commands/clean.d.ts +2 -0
- package/dist/cli/commands/clean.js +11 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +83 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.js +80 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/paths.d.ts +7 -0
- package/dist/cli/commands/paths.js +42 -0
- package/dist/cli/commands/paths.js.map +1 -0
- package/dist/cli/commands/proposal.d.ts +30 -0
- package/dist/cli/commands/proposal.js +148 -0
- package/dist/cli/commands/proposal.js.map +1 -0
- package/dist/cli/commands/pull-private.d.ts +8 -0
- package/dist/cli/commands/pull-private.js +30 -0
- package/dist/cli/commands/pull-private.js.map +1 -0
- package/dist/cli/commands/score.d.ts +11 -0
- package/dist/cli/commands/score.js +58 -0
- package/dist/cli/commands/score.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +13 -0
- package/dist/cli/commands/sync.js +65 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/tailor.d.ts +24 -0
- package/dist/cli/commands/tailor.js +113 -0
- package/dist/cli/commands/tailor.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +6 -0
- package/dist/cli/commands/verify.js +15 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +85 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/config.d.ts +36 -0
- package/dist/config/config.js +71 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/paths.d.ts +34 -0
- package/dist/config/paths.js +126 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/evidence/numbers.d.ts +2 -0
- package/dist/evidence/numbers.js +26 -0
- package/dist/evidence/numbers.js.map +1 -0
- package/dist/evidence/verify.d.ts +109 -0
- package/dist/evidence/verify.js +445 -0
- package/dist/evidence/verify.js.map +1 -0
- package/dist/job/input.d.ts +9 -0
- package/dist/job/input.js +141 -0
- package/dist/job/input.js.map +1 -0
- package/dist/job/page.d.ts +14 -0
- package/dist/job/page.js +426 -0
- package/dist/job/page.js.map +1 -0
- package/dist/job/types.d.ts +30 -0
- package/dist/job/types.js +2 -0
- package/dist/job/types.js.map +1 -0
- package/dist/llm/agents.d.ts +7 -0
- package/dist/llm/agents.js +46 -0
- package/dist/llm/agents.js.map +1 -0
- package/dist/llm/opencode.d.ts +19 -0
- package/dist/llm/opencode.js +117 -0
- package/dist/llm/opencode.js.map +1 -0
- package/dist/llm/providers.d.ts +63 -0
- package/dist/llm/providers.js +207 -0
- package/dist/llm/providers.js.map +1 -0
- package/dist/private/pull.d.ts +7 -0
- package/dist/private/pull.js +168 -0
- package/dist/private/pull.js.map +1 -0
- package/dist/projects/rank.d.ts +17 -0
- package/dist/projects/rank.js +100 -0
- package/dist/projects/rank.js.map +1 -0
- package/dist/projects/store.d.ts +7 -0
- package/dist/projects/store.js +31 -0
- package/dist/projects/store.js.map +1 -0
- package/dist/projects/sync-github.d.ts +11 -0
- package/dist/projects/sync-github.js +269 -0
- package/dist/projects/sync-github.js.map +1 -0
- package/dist/projects/sync-local.d.ts +8 -0
- package/dist/projects/sync-local.js +318 -0
- package/dist/projects/sync-local.js.map +1 -0
- package/dist/projects/types.d.ts +71 -0
- package/dist/projects/types.js +2 -0
- package/dist/projects/types.js.map +1 -0
- package/dist/proposal/prompt.d.ts +20 -0
- package/dist/proposal/prompt.js +64 -0
- package/dist/proposal/prompt.js.map +1 -0
- package/dist/proposal/run.d.ts +28 -0
- package/dist/proposal/run.js +386 -0
- package/dist/proposal/run.js.map +1 -0
- package/dist/resume/basics.d.ts +4 -0
- package/dist/resume/basics.js +33 -0
- package/dist/resume/basics.js.map +1 -0
- package/dist/resume/find.d.ts +12 -0
- package/dist/resume/find.js +27 -0
- package/dist/resume/find.js.map +1 -0
- package/dist/resume/format.d.ts +3 -0
- package/dist/resume/format.js +53 -0
- package/dist/resume/format.js.map +1 -0
- package/dist/resume/one-page.d.ts +149 -0
- package/dist/resume/one-page.js +164 -0
- package/dist/resume/one-page.js.map +1 -0
- package/dist/resume/prompt.d.ts +10 -0
- package/dist/resume/prompt.js +23 -0
- package/dist/resume/prompt.js.map +1 -0
- package/dist/resume/render.d.ts +8 -0
- package/dist/resume/render.js +84 -0
- package/dist/resume/render.js.map +1 -0
- package/dist/resume/run.d.ts +21 -0
- package/dist/resume/run.js +350 -0
- package/dist/resume/run.js.map +1 -0
- package/dist/resume/skills.d.ts +6 -0
- package/dist/resume/skills.js +47 -0
- package/dist/resume/skills.js.map +1 -0
- package/dist/resume/trace.d.ts +13 -0
- package/dist/resume/trace.js +82 -0
- package/dist/resume/trace.js.map +1 -0
- package/dist/resume/types.d.ts +94 -0
- package/dist/resume/types.js +2 -0
- package/dist/resume/types.js.map +1 -0
- package/dist/resume/verify.d.ts +19 -0
- package/dist/resume/verify.js +193 -0
- package/dist/resume/verify.js.map +1 -0
- package/dist/upwork/profile.d.ts +50 -0
- package/dist/upwork/profile.js +302 -0
- package/dist/upwork/profile.js.map +1 -0
- package/dist/upwork/settings.d.ts +96 -0
- package/dist/upwork/settings.js +166 -0
- package/dist/upwork/settings.js.map +1 -0
- package/dist/util/open-file.d.ts +1 -0
- package/dist/util/open-file.js +24 -0
- package/dist/util/open-file.js.map +1 -0
- package/dist/util/slug.d.ts +2 -0
- package/dist/util/slug.js +13 -0
- package/dist/util/slug.js.map +1 -0
- package/dist/verify/run.d.ts +4 -0
- package/dist/verify/run.js +91 -0
- package/dist/verify/run.js.map +1 -0
- package/package.json +67 -4
- package/templates/career.example.yml +63 -0
- package/templates/career.private.example.yml +10 -0
- package/templates/config.example.yml +16 -0
- package/templates/freelance.example.yml +48 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export function rankProjects(github, local, career, job, limit = 12) {
|
|
2
|
+
const repos = [
|
|
3
|
+
...(github?.repos ?? []).map((repo) => ({
|
|
4
|
+
...repo,
|
|
5
|
+
source: repo.source || 'github',
|
|
6
|
+
evidence: repo.evidence ||
|
|
7
|
+
(repo.source === 'org' && repo.fullName
|
|
8
|
+
? `github:${repo.fullName}`
|
|
9
|
+
: `github:${repo.name}`),
|
|
10
|
+
})),
|
|
11
|
+
...(local?.projects ?? []).map((project) => ({
|
|
12
|
+
...project,
|
|
13
|
+
source: 'local',
|
|
14
|
+
evidence: project.evidence || `local:${project.name}`,
|
|
15
|
+
pushedAt: project.lastCommit,
|
|
16
|
+
})),
|
|
17
|
+
].filter((repo) => repo.included !== false);
|
|
18
|
+
const tokens = keywords(job.body || job.title);
|
|
19
|
+
if (repos.length === 0) {
|
|
20
|
+
return { tokens, scored: [], selected: [] };
|
|
21
|
+
}
|
|
22
|
+
const curatedRepos = new Set(career.projects
|
|
23
|
+
.map((project) => project.repo)
|
|
24
|
+
.filter(Boolean)
|
|
25
|
+
.map((repo) => String(repo).split('/').pop().toLowerCase()));
|
|
26
|
+
const scored = repos
|
|
27
|
+
.filter((repo) => repo.source === 'local' ||
|
|
28
|
+
!curatedRepos.has(repo.name.toLowerCase()))
|
|
29
|
+
.map((repo) => {
|
|
30
|
+
const strongHaystack = [
|
|
31
|
+
repo.name,
|
|
32
|
+
'displayName' in repo ? repo.displayName : '',
|
|
33
|
+
repo.description,
|
|
34
|
+
...(repo.topics ?? []),
|
|
35
|
+
...(repo.languages ?? []),
|
|
36
|
+
...('localCommits' in repo ? (repo.localCommits ?? []) : []),
|
|
37
|
+
]
|
|
38
|
+
.join(' ')
|
|
39
|
+
.toLowerCase();
|
|
40
|
+
const readmeHaystack = String(repo.readme ?? '').toLowerCase();
|
|
41
|
+
const matchedStrong = tokens.filter((token) => strongHaystack.includes(token));
|
|
42
|
+
const matchedWeak = tokens.filter((token) => !matchedStrong.includes(token) &&
|
|
43
|
+
readmeHaystack.includes(token));
|
|
44
|
+
return {
|
|
45
|
+
repo,
|
|
46
|
+
matched: [...matchedStrong, ...matchedWeak],
|
|
47
|
+
baseScore: matchedStrong.length,
|
|
48
|
+
pinned: Boolean(repo.pinned),
|
|
49
|
+
score: matchedStrong.length * 5 + Math.min(matchedWeak.length, 5),
|
|
50
|
+
};
|
|
51
|
+
})
|
|
52
|
+
.sort((a, b) => b.score - a.score ||
|
|
53
|
+
Number(b.pinned) - Number(a.pinned) ||
|
|
54
|
+
String(b.repo.pushedAt).localeCompare(String(a.repo.pushedAt)));
|
|
55
|
+
return {
|
|
56
|
+
tokens,
|
|
57
|
+
scored,
|
|
58
|
+
selected: scored
|
|
59
|
+
.filter((entry) => entry.score > 0)
|
|
60
|
+
.slice(0, limit)
|
|
61
|
+
.map(({ repo }) => toCandidate(repo)),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function selectProjects(github, local, career, job, limit = 12) {
|
|
65
|
+
return rankProjects(github, local, career, job, limit).selected;
|
|
66
|
+
}
|
|
67
|
+
function toCandidate(repo) {
|
|
68
|
+
const local = repo;
|
|
69
|
+
const github = repo;
|
|
70
|
+
return {
|
|
71
|
+
name: repo.name,
|
|
72
|
+
displayName: local.displayName || repo.name,
|
|
73
|
+
source: repo.source || 'github',
|
|
74
|
+
evidence: repo.evidence || `github:${repo.name}`,
|
|
75
|
+
url: repo.url || local.remote || '',
|
|
76
|
+
homepage: github.homepage || '',
|
|
77
|
+
description: repo.description || '',
|
|
78
|
+
topics: repo.topics ?? [],
|
|
79
|
+
languages: repo.languages ?? [],
|
|
80
|
+
pinned: Boolean(github.pinned),
|
|
81
|
+
included: true,
|
|
82
|
+
localPath: local.path || undefined,
|
|
83
|
+
localCommits: local.localCommits ?? [],
|
|
84
|
+
remoteFullName: local.remoteFullName || undefined,
|
|
85
|
+
readme: String(repo.readme ?? '').slice(0, 2500),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const STOPWORDS = new Set(`about above after again against all also and any are because been before being below between both but can could did does doing down during each few for from further had has have having here how into its itself just more most only other our out over own same should some such than that the their them then there these they this those through too under until very was were what when where which while who whom why will with would you your no nor not
|
|
89
|
+
able across add added already also always another apply application applications around available back based become becomes best better big build building built call calls case cases change changes come comes company companies complete could create current currently day days different does done during each easy end enough even every example experience experienced feel find first fit following form found full get gets give gives go going good great group groups help high hire hiring idea important include includes including instead job jobs keep kind know last later least less let like likely long look looking lot low make makes many may maybe mean means might more most much must need needed needs new next note notes now off often old once one ones only open order other others over part per place plan please position positions possible post posted project projects provide provides put quick really right role roles run running same say see seem seems set several should show side since small some someone something start started still strong sure take taken task tasks team teams tell than that thing things think time times today together took try two under until use used useful uses using usually view want wants way ways week weeks well whole will work worked working works year years`
|
|
90
|
+
.split(/\s+/)
|
|
91
|
+
.filter(Boolean));
|
|
92
|
+
function keywords(text) {
|
|
93
|
+
return [
|
|
94
|
+
...new Set(text
|
|
95
|
+
.toLowerCase()
|
|
96
|
+
.split(/[^a-z0-9+#.]+/)
|
|
97
|
+
.filter((word) => word.length > 2 && !STOPWORDS.has(word))),
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/projects/rank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Career } from '../career/schema.js';
|
|
2
|
+
import type { Job } from '../job/types.js';
|
|
3
|
+
import type { GitHubData, LocalProjectsData, ProjectCandidate } from './types.js';
|
|
4
|
+
export declare function loadGithub(): GitHubData | null;
|
|
5
|
+
export declare function loadLocal(): LocalProjectsData | null;
|
|
6
|
+
export declare function loadCandidates(career: Career, job: Job, limit?: number): ProjectCandidate[];
|
|
7
|
+
export declare function hasProjectCache(): boolean;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { getGithubCacheFile, getLocalProjectsCacheFile, } from '../config/paths.js';
|
|
3
|
+
import { selectProjects } from './rank.js';
|
|
4
|
+
export function loadGithub() {
|
|
5
|
+
return readJson(getGithubCacheFile());
|
|
6
|
+
}
|
|
7
|
+
export function loadLocal() {
|
|
8
|
+
return readJson(getLocalProjectsCacheFile());
|
|
9
|
+
}
|
|
10
|
+
export function loadCandidates(career, job, limit = 12) {
|
|
11
|
+
const github = loadGithub();
|
|
12
|
+
const local = loadLocal();
|
|
13
|
+
if (!github && !local)
|
|
14
|
+
return [];
|
|
15
|
+
return selectProjects(github, local, career, job, limit);
|
|
16
|
+
}
|
|
17
|
+
export function hasProjectCache() {
|
|
18
|
+
return (existsSync(getGithubCacheFile()) ||
|
|
19
|
+
existsSync(getLocalProjectsCacheFile()));
|
|
20
|
+
}
|
|
21
|
+
function readJson(path) {
|
|
22
|
+
if (!existsSync(path))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/projects/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAO3C,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAa,kBAAkB,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAoB,yBAAyB,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,GAAQ,EACR,KAAK,GAAG,EAAE;IAEV,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CACL,UAAU,CAAC,kBAAkB,EAAE,CAAC;QAChC,UAAU,CAAC,yBAAyB,EAAE,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAI,IAAY;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GitHubData } from './types.js';
|
|
2
|
+
export interface SyncGithubOptions {
|
|
3
|
+
user?: string;
|
|
4
|
+
out?: string;
|
|
5
|
+
limit?: number;
|
|
6
|
+
readmeChars?: number;
|
|
7
|
+
publicOnly?: boolean;
|
|
8
|
+
skipOrgs?: boolean;
|
|
9
|
+
skipLocal?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function syncGithub(options?: SyncGithubOptions): GitHubData;
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { loadCareer } from '../career/load.js';
|
|
5
|
+
import { getGithubCacheFile } from '../config/paths.js';
|
|
6
|
+
import { syncLocal } from './sync-local.js';
|
|
7
|
+
const JSON_FIELDS = 'name,nameWithOwner,owner,description,isFork,isArchived,isPrivate,primaryLanguage,repositoryTopics,pushedAt,createdAt,url,homepageUrl,stargazerCount';
|
|
8
|
+
export function syncGithub(options = {}) {
|
|
9
|
+
const { career } = loadCareer({ optional: true });
|
|
10
|
+
const githubConfig = (career.github ?? {});
|
|
11
|
+
const user = options.user || githubConfig.username || '';
|
|
12
|
+
if (!user) {
|
|
13
|
+
throw new Error('No GitHub username. Pass --user <login> or set github.username in career.yml.');
|
|
14
|
+
}
|
|
15
|
+
const outPath = resolve(options.out || getGithubCacheFile());
|
|
16
|
+
const limit = options.limit ?? 100;
|
|
17
|
+
const readmeChars = options.readmeChars ?? 5000;
|
|
18
|
+
const excluded = new Set((githubConfig.exclude ?? []).map((name) => String(name).toLowerCase()));
|
|
19
|
+
console.log(`dossier: syncing GitHub repositories for ${user}`);
|
|
20
|
+
let pinned = [];
|
|
21
|
+
try {
|
|
22
|
+
const query = `
|
|
23
|
+
query($login: String!) {
|
|
24
|
+
user(login: $login) {
|
|
25
|
+
pinnedItems(first: 6, types: REPOSITORY) {
|
|
26
|
+
nodes { ... on Repository { name } }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
const result = ghJson(['api', 'graphql', '-f', `query=${query}`, '-f', `login=${user}`]);
|
|
32
|
+
pinned = (result?.data?.user?.pinnedItems?.nodes ?? [])
|
|
33
|
+
.map((repo) => repo.name ?? '')
|
|
34
|
+
.filter(Boolean);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
console.warn('dossier: could not fetch pinned repositories; continuing');
|
|
38
|
+
}
|
|
39
|
+
const personalRepos = listRepos(user, limit).filter((repo) => !repo.isFork && !repo.isArchived && !repo.isPrivate);
|
|
40
|
+
const orgs = options.skipOrgs ? [] : getOrgs();
|
|
41
|
+
const orgRepos = [];
|
|
42
|
+
for (const org of orgs) {
|
|
43
|
+
const contributed = getContributedRepos(org, user);
|
|
44
|
+
if (contributed.size === 0)
|
|
45
|
+
continue;
|
|
46
|
+
const listed = listRepos(org, limit).filter((repo) => {
|
|
47
|
+
if (repo.isFork || repo.isArchived)
|
|
48
|
+
return false;
|
|
49
|
+
if (options.publicOnly && repo.isPrivate)
|
|
50
|
+
return false;
|
|
51
|
+
return contributed.has(String(repo.nameWithOwner ?? '').toLowerCase());
|
|
52
|
+
});
|
|
53
|
+
if (listed.length > 0) {
|
|
54
|
+
console.log(`dossier: ${org} — ${listed.length} contributed repo(s)${listed.some((repo) => repo.isPrivate)
|
|
55
|
+
? ' (includes private)'
|
|
56
|
+
: ''}`);
|
|
57
|
+
}
|
|
58
|
+
orgRepos.push(...listed);
|
|
59
|
+
}
|
|
60
|
+
const allRepos = [
|
|
61
|
+
...personalRepos.map((repo) => ({ repo, source: 'github' })),
|
|
62
|
+
...orgRepos.map((repo) => ({ repo, source: 'org' })),
|
|
63
|
+
];
|
|
64
|
+
const seen = new Set();
|
|
65
|
+
const synced = [];
|
|
66
|
+
for (const { repo, source } of allRepos) {
|
|
67
|
+
const fullName = repo.nameWithOwner ||
|
|
68
|
+
`${repo.owner?.login ?? user}/${repo.name}`;
|
|
69
|
+
const key = fullName.toLowerCase();
|
|
70
|
+
if (seen.has(key))
|
|
71
|
+
continue;
|
|
72
|
+
seen.add(key);
|
|
73
|
+
const reasons = [];
|
|
74
|
+
if (excluded.has(repo.name.toLowerCase()) ||
|
|
75
|
+
excluded.has(fullName.toLowerCase())) {
|
|
76
|
+
reasons.push('excluded in career.yml or career.private.yml');
|
|
77
|
+
}
|
|
78
|
+
let readme = '';
|
|
79
|
+
try {
|
|
80
|
+
const encoded = gh([
|
|
81
|
+
'api',
|
|
82
|
+
`repos/${fullName}/readme`,
|
|
83
|
+
'--jq',
|
|
84
|
+
'.content',
|
|
85
|
+
]);
|
|
86
|
+
readme = Buffer.from(encoded, 'base64').toString('utf8');
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
reasons.push('no README');
|
|
90
|
+
}
|
|
91
|
+
let languages = {};
|
|
92
|
+
try {
|
|
93
|
+
languages =
|
|
94
|
+
ghJson([
|
|
95
|
+
'api',
|
|
96
|
+
`repos/${fullName}/languages`,
|
|
97
|
+
]) ?? {};
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Language metadata is optional.
|
|
101
|
+
}
|
|
102
|
+
readme = cleanReadme(readme).slice(0, readmeChars);
|
|
103
|
+
if (!readme && !repo.description) {
|
|
104
|
+
reasons.push('no README or description');
|
|
105
|
+
}
|
|
106
|
+
const owner = repo.owner?.login || fullName.split('/')[0];
|
|
107
|
+
synced.push({
|
|
108
|
+
name: repo.name,
|
|
109
|
+
fullName,
|
|
110
|
+
owner,
|
|
111
|
+
source,
|
|
112
|
+
visibility: repo.isPrivate ? 'private' : 'public',
|
|
113
|
+
evidence: source === 'org' ? `github:${fullName}` : `github:${repo.name}`,
|
|
114
|
+
url: repo.url,
|
|
115
|
+
homepage: repo.homepageUrl || '',
|
|
116
|
+
description: repo.description || '',
|
|
117
|
+
topics: (repo.repositoryTopics ?? [])
|
|
118
|
+
.map((topic) => topic.name ?? '')
|
|
119
|
+
.filter(Boolean),
|
|
120
|
+
languages: Object.entries(languages)
|
|
121
|
+
.sort(([, a], [, b]) => b - a)
|
|
122
|
+
.map(([name]) => name),
|
|
123
|
+
stars: repo.stargazerCount ?? 0,
|
|
124
|
+
pushedAt: repo.pushedAt,
|
|
125
|
+
createdAt: repo.createdAt,
|
|
126
|
+
pinned: source === 'github' && pinned.includes(repo.name),
|
|
127
|
+
included: reasons.length === 0,
|
|
128
|
+
reasons,
|
|
129
|
+
readme,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
synced.sort((a, b) => {
|
|
133
|
+
if (a.pinned !== b.pinned)
|
|
134
|
+
return a.pinned ? -1 : 1;
|
|
135
|
+
if (a.included !== b.included)
|
|
136
|
+
return a.included ? -1 : 1;
|
|
137
|
+
return String(b.pushedAt).localeCompare(String(a.pushedAt));
|
|
138
|
+
});
|
|
139
|
+
const output = {
|
|
140
|
+
owner: user,
|
|
141
|
+
syncedAt: new Date().toISOString(),
|
|
142
|
+
orgs,
|
|
143
|
+
pinned,
|
|
144
|
+
repos: synced,
|
|
145
|
+
};
|
|
146
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
147
|
+
writeFileSync(outPath, `${JSON.stringify(output, null, 2)}\n`);
|
|
148
|
+
console.log(`dossier: wrote ${synced.length} repos (${synced.filter((repo) => repo.included).length} eligible; ${orgRepos.length} from orgs) to ${outPath}`);
|
|
149
|
+
if (!options.skipLocal) {
|
|
150
|
+
try {
|
|
151
|
+
syncLocal();
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.warn(`dossier: local project sync failed; continuing: ${error.message}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return output;
|
|
158
|
+
}
|
|
159
|
+
function gh(args) {
|
|
160
|
+
try {
|
|
161
|
+
return execFileSync('gh', args, {
|
|
162
|
+
encoding: 'utf8',
|
|
163
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
164
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
165
|
+
}).trim();
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error.code === 'ENOENT') {
|
|
169
|
+
throw new Error('GitHub CLI (`gh`) not found. Install it from https://cli.github.com and run `gh auth login`.');
|
|
170
|
+
}
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function ghJson(args) {
|
|
175
|
+
const output = gh(args);
|
|
176
|
+
return output ? JSON.parse(output) : null;
|
|
177
|
+
}
|
|
178
|
+
function listRepos(owner, limit) {
|
|
179
|
+
try {
|
|
180
|
+
return (ghJson([
|
|
181
|
+
'repo',
|
|
182
|
+
'list',
|
|
183
|
+
owner,
|
|
184
|
+
'--limit',
|
|
185
|
+
String(limit),
|
|
186
|
+
'--json',
|
|
187
|
+
JSON_FIELDS,
|
|
188
|
+
]) ?? []);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.error(`dossier: could not list repositories for ${owner}: ${error.message}`);
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function getOrgs() {
|
|
196
|
+
try {
|
|
197
|
+
const output = gh([
|
|
198
|
+
'api',
|
|
199
|
+
'user/orgs',
|
|
200
|
+
'--paginate',
|
|
201
|
+
'--jq',
|
|
202
|
+
'.[].login',
|
|
203
|
+
]);
|
|
204
|
+
return output
|
|
205
|
+
.split('\n')
|
|
206
|
+
.map((line) => line.trim())
|
|
207
|
+
.filter(Boolean);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.warn(`dossier: could not list organizations: ${error.message}`);
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function getContributedRepos(org, login) {
|
|
215
|
+
const repos = new Set();
|
|
216
|
+
try {
|
|
217
|
+
const output = gh([
|
|
218
|
+
'api',
|
|
219
|
+
'-X',
|
|
220
|
+
'GET',
|
|
221
|
+
'search/commits',
|
|
222
|
+
'-f',
|
|
223
|
+
`q=author:${login} org:${org}`,
|
|
224
|
+
'--paginate',
|
|
225
|
+
'--jq',
|
|
226
|
+
'.items[].repository.full_name',
|
|
227
|
+
]);
|
|
228
|
+
for (const name of output.split('\n')) {
|
|
229
|
+
if (name.trim())
|
|
230
|
+
repos.add(name.trim().toLowerCase());
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Search can fail on permissions or rate limits; try PRs next.
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
const output = gh([
|
|
238
|
+
'api',
|
|
239
|
+
'-X',
|
|
240
|
+
'GET',
|
|
241
|
+
'search/issues',
|
|
242
|
+
'-f',
|
|
243
|
+
`q=author:${login} org:${org} type:pr`,
|
|
244
|
+
'--paginate',
|
|
245
|
+
'--jq',
|
|
246
|
+
'.items[].repository_url',
|
|
247
|
+
]);
|
|
248
|
+
for (const url of output.split('\n')) {
|
|
249
|
+
const match = url.trim().match(/repos\/([^/]+\/[^/]+)$/);
|
|
250
|
+
if (match)
|
|
251
|
+
repos.add(match[1].toLowerCase());
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// PR search is optional.
|
|
256
|
+
}
|
|
257
|
+
return repos;
|
|
258
|
+
}
|
|
259
|
+
function cleanReadme(text) {
|
|
260
|
+
return text
|
|
261
|
+
.replace(/<!--[\s\S]*?-->/g, '')
|
|
262
|
+
.replace(/!\[[^\]]*\]\([^)]*\)/g, '')
|
|
263
|
+
.replace(/<img[^>]*>/gi, '')
|
|
264
|
+
.replace(/\[!\[[^\]]*\]\([^)]*\)\]\([^)]*\)/g, '')
|
|
265
|
+
.replace(/\r\n/g, '\n')
|
|
266
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
267
|
+
.trim();
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=sync-github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-github.js","sourceRoot":"","sources":["../../src/projects/sync-github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA8B5C,MAAM,WAAW,GACf,qJAAqJ,CAAC;AAExJ,MAAM,UAAU,UAAU,CAAC,OAAO,GAAsB,EAAE;IACxD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAGxC,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAC3B,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IAEhE,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG;;;;;;;;KAQb,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAMlB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;aACpD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;aAC9B,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CACjD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAC9D,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,SAAS;QAErC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YACjD,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YACvD,OAAO,WAAW,CAAC,GAAG,CACpB,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAC/C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CACT,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,uBAChC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnC,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,EACN,EAAE,CACH,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAiB,EAAE,CAAC,CAAC;QACrE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAc,EAAE,CAAC,CAAC;KAC9D,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxC,MAAM,QAAQ,GACZ,IAAI,CAAC,aAAa;YAClB,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IACE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC;gBACjB,KAAK;gBACL,SAAS,QAAQ,SAAS;gBAC1B,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;YACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,SAAS,GAA2B,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,SAAS;gBACP,MAAM,CAAyB;oBAC7B,KAAK;oBACL,SAAS,QAAQ,YAAY;iBAC9B,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAEnD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,KAAK;YACL,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YACjD,QAAQ,EACN,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE;YACjE,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YAChC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;iBAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;iBAChC,MAAM,CAAC,OAAO,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;iBACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;iBAC7B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;YACxB,KAAK,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;YAC9B,OAAO;YACP,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAe;QACzB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAClC,IAAI;QACJ,MAAM;QACN,KAAK,EAAE,MAAM;KACd,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CACT,kBAAkB,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,cAAc,QAAQ,CAAC,MAAM,kBAAkB,OAAO,EAAE,CAChJ,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,mDAAoD,KAAe,CAAC,OAAO,EAAE,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,EAAE,CAAC,IAAc;IACxB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE;YAC9B,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAI,IAAc;IAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,OAAO,CACL,MAAM,CAAW;YACf,MAAM;YACN,MAAM;YACN,KAAK;YACL,SAAS;YACT,MAAM,CAAC,KAAK,CAAC;YACb,QAAQ;YACR,WAAW;SACZ,CAAC,IAAI,EAAE,CACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,4CAA4C,KAAK,KAAM,KAAe,CAAC,OAAO,EAAE,CACjF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,OAAO;IACd,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK;YACL,WAAW;YACX,YAAY;YACZ,MAAM;YACN,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,0CAA2C,KAAe,CAAC,OAAO,EAAE,CACrE,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAa;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK;YACL,IAAI;YACJ,KAAK;YACL,gBAAgB;YAChB,IAAI;YACJ,YAAY,KAAK,QAAQ,GAAG,EAAE;YAC9B,YAAY;YACZ,MAAM;YACN,+BAA+B;SAChC,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK;YACL,IAAI;YACJ,KAAK;YACL,eAAe;YACf,IAAI;YACJ,YAAY,KAAK,QAAQ,GAAG,UAAU;YACtC,YAAY;YACZ,MAAM;YACN,yBAAyB;SAC1B,CAAC,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACzD,IAAI,KAAK;gBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;SACpC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC;SACjD,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC"}
|