@noclaf/cli 0.7.0 → 0.9.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/README.md +26 -84
- package/dist/app.js +13 -0
- package/dist/app.js.map +1 -0
- package/dist/brand.js +9 -49
- package/dist/brand.js.map +1 -1
- package/dist/cli.js +3 -37
- package/dist/cli.js.map +1 -1
- package/dist/mcp-server.js +3 -187
- package/dist/mcp-server.js.map +1 -1
- package/package.json +8 -17
- package/dist/adapters/supabase/allocation-gateway.js +0 -291
- package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
- package/dist/adapters/supabase/analytics-gateway.js +0 -18
- package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
- package/dist/adapters/supabase/calendar-gateway.js +0 -48
- package/dist/adapters/supabase/calendar-gateway.js.map +0 -1
- package/dist/adapters/supabase/calendar-write-gateway.js +0 -35
- package/dist/adapters/supabase/calendar-write-gateway.js.map +0 -1
- package/dist/adapters/supabase/client.js +0 -136
- package/dist/adapters/supabase/client.js.map +0 -1
- package/dist/adapters/supabase/context-gateway.js +0 -23
- package/dist/adapters/supabase/context-gateway.js.map +0 -1
- package/dist/adapters/supabase/gateway.js +0 -26
- package/dist/adapters/supabase/gateway.js.map +0 -1
- package/dist/adapters/supabase/release-gateway.js +0 -61
- package/dist/adapters/supabase/release-gateway.js.map +0 -1
- package/dist/adapters/supabase/sprint-gateway.js +0 -59
- package/dist/adapters/supabase/sprint-gateway.js.map +0 -1
- package/dist/adapters/supabase/task-gateway.js +0 -533
- package/dist/adapters/supabase/task-gateway.js.map +0 -1
- package/dist/auth.js +0 -141
- package/dist/auth.js.map +0 -1
- package/dist/cli/commands/auth.js +0 -127
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/clean.js +0 -120
- package/dist/cli/commands/clean.js.map +0 -1
- package/dist/cli/commands/completion.js +0 -114
- package/dist/cli/commands/completion.js.map +0 -1
- package/dist/cli/commands/exec.js +0 -69
- package/dist/cli/commands/exec.js.map +0 -1
- package/dist/cli/commands/init/analyze-step.js +0 -21
- package/dist/cli/commands/init/analyze-step.js.map +0 -1
- package/dist/cli/commands/init/apply-answers.js +0 -122
- package/dist/cli/commands/init/apply-answers.js.map +0 -1
- package/dist/cli/commands/init/apply-step.js +0 -165
- package/dist/cli/commands/init/apply-step.js.map +0 -1
- package/dist/cli/commands/init/auth-step.js +0 -48
- package/dist/cli/commands/init/auth-step.js.map +0 -1
- package/dist/cli/commands/init/boilerplate-step.js +0 -20
- package/dist/cli/commands/init/boilerplate-step.js.map +0 -1
- package/dist/cli/commands/init/clients-step.js +0 -78
- package/dist/cli/commands/init/clients-step.js.map +0 -1
- package/dist/cli/commands/init/context-step.js +0 -81
- package/dist/cli/commands/init/context-step.js.map +0 -1
- package/dist/cli/commands/init/describe-step.js +0 -68
- package/dist/cli/commands/init/describe-step.js.map +0 -1
- package/dist/cli/commands/init/index.js +0 -98
- package/dist/cli/commands/init/index.js.map +0 -1
- package/dist/cli/commands/init/mode.js +0 -18
- package/dist/cli/commands/init/mode.js.map +0 -1
- package/dist/cli/commands/init/progress.js +0 -60
- package/dist/cli/commands/init/progress.js.map +0 -1
- package/dist/cli/commands/init/project-step.js +0 -133
- package/dist/cli/commands/init/project-step.js.map +0 -1
- package/dist/cli/commands/init/provision-step.js +0 -103
- package/dist/cli/commands/init/provision-step.js.map +0 -1
- package/dist/cli/commands/map.js +0 -18
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/plan.js +0 -45
- package/dist/cli/commands/plan.js.map +0 -1
- package/dist/cli/commands/skills.js +0 -23
- package/dist/cli/commands/skills.js.map +0 -1
- package/dist/cli/commands/sync.js +0 -319
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/validate-plan.js +0 -42
- package/dist/cli/commands/validate-plan.js.map +0 -1
- package/dist/cli/commands/wave.js +0 -57
- package/dist/cli/commands/wave.js.map +0 -1
- package/dist/cli/copy/auth.json +0 -6
- package/dist/cli/copy/flows.json +0 -6
- package/dist/cli/copy/init.json +0 -20
- package/dist/cli/copy/sync.json +0 -3
- package/dist/cli/copy.js +0 -23
- package/dist/cli/copy.js.map +0 -1
- package/dist/cli/flows/clients.js +0 -130
- package/dist/cli/flows/clients.js.map +0 -1
- package/dist/cli/flows/completion.js +0 -63
- package/dist/cli/flows/completion.js.map +0 -1
- package/dist/cli/flows/dependencies.js +0 -114
- package/dist/cli/flows/dependencies.js.map +0 -1
- package/dist/cli/flows/sections.js +0 -85
- package/dist/cli/flows/sections.js.map +0 -1
- package/dist/cli/flows/user-config.js +0 -37
- package/dist/cli/flows/user-config.js.map +0 -1
- package/dist/cli/ui/render.js +0 -239
- package/dist/cli/ui/render.js.map +0 -1
- package/dist/cli/ui/report.js +0 -130
- package/dist/cli/ui/report.js.map +0 -1
- package/dist/config.js +0 -289
- package/dist/config.js.map +0 -1
- package/dist/constants.js +0 -9
- package/dist/constants.js.map +0 -1
- package/dist/core/ports.js +0 -2
- package/dist/core/ports.js.map +0 -1
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +0 -1
- package/dist/database.types.js +0 -11
- package/dist/database.types.js.map +0 -1
- package/dist/lib/active-project.js +0 -28
- package/dist/lib/active-project.js.map +0 -1
- package/dist/lib/autopull.js +0 -13
- package/dist/lib/autopull.js.map +0 -1
- package/dist/lib/boilerplate-scaffold.js +0 -65
- package/dist/lib/boilerplate-scaffold.js.map +0 -1
- package/dist/lib/boilerplates.js +0 -61
- package/dist/lib/boilerplates.js.map +0 -1
- package/dist/lib/calendar-logic.js +0 -59
- package/dist/lib/calendar-logic.js.map +0 -1
- package/dist/lib/calendar-write-logic.js +0 -6
- package/dist/lib/calendar-write-logic.js.map +0 -1
- package/dist/lib/client-configs.js +0 -191
- package/dist/lib/client-configs.js.map +0 -1
- package/dist/lib/client-install.js +0 -40
- package/dist/lib/client-install.js.map +0 -1
- package/dist/lib/colors.js +0 -92
- package/dist/lib/colors.js.map +0 -1
- package/dist/lib/cowork-extension.js +0 -143
- package/dist/lib/cowork-extension.js.map +0 -1
- package/dist/lib/dates.js +0 -21
- package/dist/lib/dates.js.map +0 -1
- package/dist/lib/dependencies.js +0 -145
- package/dist/lib/dependencies.js.map +0 -1
- package/dist/lib/dependency-install.js +0 -163
- package/dist/lib/dependency-install.js.map +0 -1
- package/dist/lib/duration.js +0 -5
- package/dist/lib/duration.js.map +0 -1
- package/dist/lib/exec-delegate.js +0 -218
- package/dist/lib/exec-delegate.js.map +0 -1
- package/dist/lib/exec-engines.js +0 -90
- package/dist/lib/exec-engines.js.map +0 -1
- package/dist/lib/exec-events.js +0 -87
- package/dist/lib/exec-events.js.map +0 -1
- package/dist/lib/exec-translators.js +0 -198
- package/dist/lib/exec-translators.js.map +0 -1
- package/dist/lib/file-merge.js +0 -33
- package/dist/lib/file-merge.js.map +0 -1
- package/dist/lib/git-exposure.js +0 -35
- package/dist/lib/git-exposure.js.map +0 -1
- package/dist/lib/harness.js +0 -127
- package/dist/lib/harness.js.map +0 -1
- package/dist/lib/hooks.js +0 -216
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/patterns.js +0 -25
- package/dist/lib/patterns.js.map +0 -1
- package/dist/lib/pg-error.js +0 -53
- package/dist/lib/pg-error.js.map +0 -1
- package/dist/lib/plan-delegate.js +0 -117
- package/dist/lib/plan-delegate.js.map +0 -1
- package/dist/lib/project-context.js +0 -151
- package/dist/lib/project-context.js.map +0 -1
- package/dist/lib/prompts.js +0 -69
- package/dist/lib/prompts.js.map +0 -1
- package/dist/lib/provision-apply.js +0 -220
- package/dist/lib/provision-apply.js.map +0 -1
- package/dist/lib/provision-collect.js +0 -47
- package/dist/lib/provision-collect.js.map +0 -1
- package/dist/lib/provision.js +0 -45
- package/dist/lib/provision.js.map +0 -1
- package/dist/lib/release-logic.js +0 -10
- package/dist/lib/release-logic.js.map +0 -1
- package/dist/lib/repo-map.js +0 -176
- package/dist/lib/repo-map.js.map +0 -1
- package/dist/lib/require-config.js +0 -32
- package/dist/lib/require-config.js.map +0 -1
- package/dist/lib/rules.js +0 -146
- package/dist/lib/rules.js.map +0 -1
- package/dist/lib/sections.js +0 -89
- package/dist/lib/sections.js.map +0 -1
- package/dist/lib/skill-agent.js +0 -44
- package/dist/lib/skill-agent.js.map +0 -1
- package/dist/lib/skill-serve.js +0 -128
- package/dist/lib/skill-serve.js.map +0 -1
- package/dist/lib/skills-cache.js +0 -99
- package/dist/lib/skills-cache.js.map +0 -1
- package/dist/lib/skills.js +0 -237
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/sprint-deadline.js +0 -28
- package/dist/lib/sprint-deadline.js.map +0 -1
- package/dist/lib/sprint-logic.js +0 -31
- package/dist/lib/sprint-logic.js.map +0 -1
- package/dist/lib/targets.js +0 -150
- package/dist/lib/targets.js.map +0 -1
- package/dist/lib/task-history.js +0 -15
- package/dist/lib/task-history.js.map +0 -1
- package/dist/lib/telemetry.js +0 -51
- package/dist/lib/telemetry.js.map +0 -1
- package/dist/lib/tool-result.js +0 -15
- package/dist/lib/tool-result.js.map +0 -1
- package/dist/lib/validate-plan-delegate.js +0 -106
- package/dist/lib/validate-plan-delegate.js.map +0 -1
- package/dist/lib/version-check.js +0 -89
- package/dist/lib/version-check.js.map +0 -1
- package/dist/lib/wave-scheduler.js +0 -95
- package/dist/lib/wave-scheduler.js.map +0 -1
- package/dist/session-factory.js +0 -19
- package/dist/session-factory.js.map +0 -1
- package/dist/spinner.js +0 -12
- package/dist/spinner.js.map +0 -1
- package/dist/tools/activate-sprint.js +0 -44
- package/dist/tools/activate-sprint.js.map +0 -1
- package/dist/tools/add-checklist.js +0 -63
- package/dist/tools/add-checklist.js.map +0 -1
- package/dist/tools/add-holiday.js +0 -41
- package/dist/tools/add-holiday.js.map +0 -1
- package/dist/tools/add-home-office.js +0 -31
- package/dist/tools/add-home-office.js.map +0 -1
- package/dist/tools/add-vacation.js +0 -39
- package/dist/tools/add-vacation.js.map +0 -1
- package/dist/tools/attach-pr.js +0 -97
- package/dist/tools/attach-pr.js.map +0 -1
- package/dist/tools/comment-task.js +0 -72
- package/dist/tools/comment-task.js.map +0 -1
- package/dist/tools/create-release.js +0 -46
- package/dist/tools/create-release.js.map +0 -1
- package/dist/tools/create-sprint.js +0 -66
- package/dist/tools/create-sprint.js.map +0 -1
- package/dist/tools/create-task.js +0 -174
- package/dist/tools/create-task.js.map +0 -1
- package/dist/tools/delegate-exec.js +0 -63
- package/dist/tools/delegate-exec.js.map +0 -1
- package/dist/tools/end-allocation.js +0 -38
- package/dist/tools/end-allocation.js.map +0 -1
- package/dist/tools/end-sprint.js +0 -37
- package/dist/tools/end-sprint.js.map +0 -1
- package/dist/tools/end-task-allocation.js +0 -60
- package/dist/tools/end-task-allocation.js.map +0 -1
- package/dist/tools/exec-status.js +0 -45
- package/dist/tools/exec-status.js.map +0 -1
- package/dist/tools/finalize-release.js +0 -45
- package/dist/tools/finalize-release.js.map +0 -1
- package/dist/tools/get-active-allocation.js +0 -69
- package/dist/tools/get-active-allocation.js.map +0 -1
- package/dist/tools/get-calendar.js +0 -40
- package/dist/tools/get-calendar.js.map +0 -1
- package/dist/tools/get-context.js +0 -48
- package/dist/tools/get-context.js.map +0 -1
- package/dist/tools/get-sprint.js +0 -38
- package/dist/tools/get-sprint.js.map +0 -1
- package/dist/tools/get-task.js +0 -146
- package/dist/tools/get-task.js.map +0 -1
- package/dist/tools/index.js +0 -84
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/list-my-allocations.js +0 -71
- package/dist/tools/list-my-allocations.js.map +0 -1
- package/dist/tools/list-projects.js +0 -38
- package/dist/tools/list-projects.js.map +0 -1
- package/dist/tools/list-releases.js +0 -32
- package/dist/tools/list-releases.js.map +0 -1
- package/dist/tools/list-sprints.js +0 -30
- package/dist/tools/list-sprints.js.map +0 -1
- package/dist/tools/list-tasks.js +0 -95
- package/dist/tools/list-tasks.js.map +0 -1
- package/dist/tools/move-task.js +0 -82
- package/dist/tools/move-task.js.map +0 -1
- package/dist/tools/plan.js +0 -56
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/record-delivery.js +0 -100
- package/dist/tools/record-delivery.js.map +0 -1
- package/dist/tools/remove-holiday.js +0 -31
- package/dist/tools/remove-holiday.js.map +0 -1
- package/dist/tools/remove-home-office.js +0 -32
- package/dist/tools/remove-home-office.js.map +0 -1
- package/dist/tools/remove-vacation.js +0 -31
- package/dist/tools/remove-vacation.js.map +0 -1
- package/dist/tools/set-project.js +0 -52
- package/dist/tools/set-project.js.map +0 -1
- package/dist/tools/set-review.js +0 -132
- package/dist/tools/set-review.js.map +0 -1
- package/dist/tools/sprint-common.js +0 -13
- package/dist/tools/sprint-common.js.map +0 -1
- package/dist/tools/start-allocation.js +0 -32
- package/dist/tools/start-allocation.js.map +0 -1
- package/dist/tools/start-task-allocation.js +0 -83
- package/dist/tools/start-task-allocation.js.map +0 -1
- package/dist/tools/update-release.js +0 -58
- package/dist/tools/update-release.js.map +0 -1
- package/dist/tools/update-sprint.js +0 -56
- package/dist/tools/update-sprint.js.map +0 -1
- package/dist/tools/update-task.js +0 -183
- package/dist/tools/update-task.js.map +0 -1
- package/dist/tools/validate-plan.js +0 -58
- package/dist/tools/validate-plan.js.map +0 -1
- package/dist/version.js +0 -16
- package/dist/version.js.map +0 -1
package/dist/lib/hooks.js
DELETED
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, readdirSync, copyFileSync, rmSync, } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { readJson, writeJson } from './file-merge.js';
|
|
5
|
-
import { skillsDir } from './skills.js';
|
|
6
|
-
import { ensureDir } from './provision.js';
|
|
7
|
-
import { DEV_ROLE } from './sections.js';
|
|
8
|
-
/**
|
|
9
|
-
* Provisionamento de hooks (só Claude Code). Um hook é um script + um gatilho que
|
|
10
|
-
* precisa estar registrado no `settings.json` — então, além de copiar o script pro
|
|
11
|
-
* namespace `hooks/noclaf/`, o CLI faz merge não-destrutivo do binding. Fonte:
|
|
12
|
-
* `@noclaf/skills/hooks/hooks.json` (flat — hooks são sempre de dev).
|
|
13
|
-
*/
|
|
14
|
-
/** Namespace sob o targetDir onde os scripts do noclaf vivem. Marca "nossa" entrada. */
|
|
15
|
-
const HOOKS_NS = 'hooks/noclaf';
|
|
16
|
-
function defaultTargetDir() {
|
|
17
|
-
return join(homedir(), '.claude');
|
|
18
|
-
}
|
|
19
|
-
/** Lê e valida um `hooks.json`, devolvendo as entradas bem-formadas. */
|
|
20
|
-
function readManifest(path) {
|
|
21
|
-
let parsed;
|
|
22
|
-
try {
|
|
23
|
-
parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return [];
|
|
27
|
-
}
|
|
28
|
-
const list = parsed?.hooks;
|
|
29
|
-
if (!Array.isArray(list))
|
|
30
|
-
return [];
|
|
31
|
-
const out = [];
|
|
32
|
-
for (const raw of list) {
|
|
33
|
-
if (!raw || typeof raw !== 'object')
|
|
34
|
-
continue;
|
|
35
|
-
const e = raw;
|
|
36
|
-
if (typeof e.event !== 'string' || typeof e.script !== 'string')
|
|
37
|
-
continue;
|
|
38
|
-
out.push({
|
|
39
|
-
id: typeof e.id === 'number' ? e.id : undefined,
|
|
40
|
-
event: e.event,
|
|
41
|
-
matcher: typeof e.matcher === 'string' ? e.matcher : undefined,
|
|
42
|
-
description: typeof e.description === 'string' ? e.description : undefined,
|
|
43
|
-
script: e.script,
|
|
44
|
-
clients: Array.isArray(e.clients)
|
|
45
|
-
? e.clients.filter((c) => typeof c === 'string')
|
|
46
|
-
: undefined,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
return out;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Descobre e resolve os hooks aplicáveis: lê `hooks/hooks.json` (flat), filtra por
|
|
53
|
-
* cliente (`clients`), e devolve as entradas com o script de origem. Hooks são de
|
|
54
|
-
* código → só entram se a seleção incluir o role `dev` (ou sem seleção).
|
|
55
|
-
*/
|
|
56
|
-
function collectHooks(dir, surface, selection) {
|
|
57
|
-
if (selection && !selection.roles.includes(DEV_ROLE))
|
|
58
|
-
return [];
|
|
59
|
-
const hooksRoot = join(dir, 'hooks');
|
|
60
|
-
const manifestPath = join(hooksRoot, 'hooks.json');
|
|
61
|
-
if (!existsSync(manifestPath))
|
|
62
|
-
return [];
|
|
63
|
-
const out = [];
|
|
64
|
-
for (const entry of readManifest(manifestPath)) {
|
|
65
|
-
if (entry.clients && !entry.clients.includes(surface))
|
|
66
|
-
continue;
|
|
67
|
-
const srcAbs = join(hooksRoot, entry.script);
|
|
68
|
-
if (!existsSync(srcAbs))
|
|
69
|
-
continue;
|
|
70
|
-
out.push({
|
|
71
|
-
id: entry.id ?? null,
|
|
72
|
-
event: entry.event,
|
|
73
|
-
matcher: entry.matcher,
|
|
74
|
-
description: entry.description,
|
|
75
|
-
script: entry.script,
|
|
76
|
-
srcAbs,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
return out;
|
|
80
|
-
}
|
|
81
|
-
/** Uma entrada de comando é "nossa" se aponta pro namespace `hooks/noclaf/`. */
|
|
82
|
-
function isOurs(hook) {
|
|
83
|
-
const cmd = hook?.command;
|
|
84
|
-
return typeof cmd === 'string' && cmd.includes(`${HOOKS_NS}/`);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Remove todas as entradas do noclaf de um bloco de `hooks` do settings, deixando
|
|
88
|
-
* intactas as do usuário. Devolve o bloco limpo (eventos/grupos vazios removidos).
|
|
89
|
-
*/
|
|
90
|
-
function stripOurs(hooksCfg) {
|
|
91
|
-
const clean = {};
|
|
92
|
-
for (const [event, groups] of Object.entries(hooksCfg)) {
|
|
93
|
-
if (!Array.isArray(groups))
|
|
94
|
-
continue;
|
|
95
|
-
const keptGroups = [];
|
|
96
|
-
for (const group of groups) {
|
|
97
|
-
const list = Array.isArray(group?.hooks) ? group.hooks : [];
|
|
98
|
-
const kept = list.filter((h) => !isOurs(h));
|
|
99
|
-
if (kept.length > 0)
|
|
100
|
-
keptGroups.push({ ...group, hooks: kept });
|
|
101
|
-
}
|
|
102
|
-
if (keptGroups.length > 0)
|
|
103
|
-
clean[event] = keptGroups;
|
|
104
|
-
}
|
|
105
|
-
return clean;
|
|
106
|
-
}
|
|
107
|
-
/** Remove recursivamente arquivos órfãos sob o namespace, exceto os recém-escritos. */
|
|
108
|
-
function pruneScripts(scriptsDir, keep, dryRun, pruned) {
|
|
109
|
-
if (!existsSync(scriptsDir))
|
|
110
|
-
return;
|
|
111
|
-
const walk = (abs) => {
|
|
112
|
-
for (const entry of readdirSync(abs, { withFileTypes: true })) {
|
|
113
|
-
const childAbs = join(abs, entry.name);
|
|
114
|
-
if (entry.isDirectory()) {
|
|
115
|
-
walk(childAbs);
|
|
116
|
-
try {
|
|
117
|
-
if (readdirSync(childAbs).length === 0 && !dryRun)
|
|
118
|
-
rmSync(childAbs, { recursive: true });
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
/* ignore */
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else if (entry.isFile()) {
|
|
125
|
-
if (!keep.has(childAbs)) {
|
|
126
|
-
if (!dryRun)
|
|
127
|
-
rmSync(childAbs);
|
|
128
|
-
pruned.push(childAbs);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
walk(scriptsDir);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Provisiona os hooks do noclaf no Claude Code. Idempotente e não-destrutivo.
|
|
137
|
-
* No-op (installed vazio) se o pacote não tem `hooks/` ou nada casa a seleção.
|
|
138
|
-
*/
|
|
139
|
-
export function provisionHooks(options = {}) {
|
|
140
|
-
const dryRun = options.dryRun ?? false;
|
|
141
|
-
const dir = options.skillsDir ?? skillsDir();
|
|
142
|
-
const targetDir = options.targetDir ?? defaultTargetDir();
|
|
143
|
-
const surface = options.surface ?? 'claude-code';
|
|
144
|
-
const settingsPath = join(targetDir, 'settings.json');
|
|
145
|
-
const scriptsDir = join(targetDir, HOOKS_NS);
|
|
146
|
-
const resolved = collectHooks(dir, surface, options.selection);
|
|
147
|
-
const writtenScripts = new Set();
|
|
148
|
-
const installed = [];
|
|
149
|
-
for (const h of resolved) {
|
|
150
|
-
const destAbs = join(scriptsDir, h.script);
|
|
151
|
-
if (!dryRun) {
|
|
152
|
-
ensureDir(scriptsDir);
|
|
153
|
-
copyFileSync(h.srcAbs, destAbs);
|
|
154
|
-
}
|
|
155
|
-
writtenScripts.add(destAbs);
|
|
156
|
-
installed.push({
|
|
157
|
-
event: h.event,
|
|
158
|
-
matcher: h.matcher,
|
|
159
|
-
script: h.script,
|
|
160
|
-
description: h.description,
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
const prunedScripts = [];
|
|
164
|
-
pruneScripts(scriptsDir, writtenScripts, dryRun, prunedScripts);
|
|
165
|
-
// Merge no settings.json: tira as nossas entradas antigas, re-adiciona as atuais.
|
|
166
|
-
const settings = readJson(settingsPath) ?? {};
|
|
167
|
-
const currentHooks = settings.hooks ?? {};
|
|
168
|
-
const merged = stripOurs(currentHooks);
|
|
169
|
-
for (const h of resolved) {
|
|
170
|
-
const commandPath = join(scriptsDir, h.script).split('\\').join('/');
|
|
171
|
-
const ourHook = { type: 'command', command: `python3 "${commandPath}"` };
|
|
172
|
-
const groups = merged[h.event] ?? (merged[h.event] = []);
|
|
173
|
-
let group = groups.find((g) => g.matcher === h.matcher);
|
|
174
|
-
if (!group) {
|
|
175
|
-
group = h.matcher !== undefined ? { matcher: h.matcher, hooks: [] } : { hooks: [] };
|
|
176
|
-
groups.push(group);
|
|
177
|
-
}
|
|
178
|
-
group.hooks.push(ourHook);
|
|
179
|
-
}
|
|
180
|
-
if (!dryRun) {
|
|
181
|
-
if (Object.keys(merged).length > 0) {
|
|
182
|
-
settings.hooks = merged;
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
delete settings.hooks;
|
|
186
|
-
}
|
|
187
|
-
writeJson(settingsPath, settings);
|
|
188
|
-
}
|
|
189
|
-
return { settingsPath, scriptsDir, dryRun, installed, prunedScripts };
|
|
190
|
-
}
|
|
191
|
-
/** Remove tudo que o noclaf instalou de hooks (scripts + entradas do settings). */
|
|
192
|
-
export function uninstallHooks(options = {}) {
|
|
193
|
-
const dryRun = options.dryRun ?? false;
|
|
194
|
-
const targetDir = options.targetDir ?? defaultTargetDir();
|
|
195
|
-
const settingsPath = join(targetDir, 'settings.json');
|
|
196
|
-
const scriptsDir = join(targetDir, HOOKS_NS);
|
|
197
|
-
const removedScripts = [];
|
|
198
|
-
if (existsSync(scriptsDir)) {
|
|
199
|
-
if (!dryRun)
|
|
200
|
-
rmSync(scriptsDir, { recursive: true, force: true });
|
|
201
|
-
removedScripts.push(scriptsDir);
|
|
202
|
-
}
|
|
203
|
-
const settings = readJson(settingsPath);
|
|
204
|
-
if (settings && settings.hooks) {
|
|
205
|
-
const merged = stripOurs(settings.hooks);
|
|
206
|
-
if (!dryRun) {
|
|
207
|
-
if (Object.keys(merged).length > 0)
|
|
208
|
-
settings.hooks = merged;
|
|
209
|
-
else
|
|
210
|
-
delete settings.hooks;
|
|
211
|
-
writeJson(settingsPath, settings);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return { settingsPath, removedScripts, dryRun };
|
|
215
|
-
}
|
|
216
|
-
//# sourceMappingURL=hooks.js.map
|
package/dist/lib/hooks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/patterns.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { runSkillAgent, skillPrompt } from './skill-agent.js';
|
|
4
|
-
/**
|
|
5
|
-
* Patterns do harness — a parte que **precisa de IA**. O CLI não raciocina sobre o
|
|
6
|
-
* código, então dispara um agente **headless** (`claude -p` / `codex exec`), com
|
|
7
|
-
* consentimento, pra analisar o repo e escrever `docs/_patterns.md`. Best-effort.
|
|
8
|
-
*/
|
|
9
|
-
export const PATTERNS_REL = 'docs/_patterns.md';
|
|
10
|
-
export function patternsPath(cwd) {
|
|
11
|
-
return join(cwd, PATTERNS_REL);
|
|
12
|
-
}
|
|
13
|
-
export function patternsExist(cwd) {
|
|
14
|
-
return existsSync(patternsPath(cwd));
|
|
15
|
-
}
|
|
16
|
-
/** Prompt da análise: corpo da skill `detect-patterns` (fonte única) ou fallback embutido. */
|
|
17
|
-
const FALLBACK_PROMPT = `Analise ESTE repositório e escreva \`${PATTERNS_REL}\` (arquivo único, sobrescreva se existir) com os PADRÕES REAIS já usados no código: estrutura de pastas/camadas, convenções de naming, stack/libs e como são usadas, e padrões de estado/dados/erros/testes. Baseie-se SÓ no que existe — não invente nem recomende. Seja conciso (poucas dezenas de linhas): é contexto pra outros agentes, não pode inflar. Não toque em nenhum outro arquivo.`;
|
|
18
|
-
/**
|
|
19
|
-
* Roda a análise de patterns headless no `cwd` — saída do agente no stdout, como
|
|
20
|
-
* sempre (é o `sync` interativo que chama). Nunca lança.
|
|
21
|
-
*/
|
|
22
|
-
export function runPatternsAnalysis(cwd) {
|
|
23
|
-
return runSkillAgent(skillPrompt('detect-patterns', FALLBACK_PROMPT), { cwd });
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=patterns.js.map
|
package/dist/lib/patterns.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/lib/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAEjF;;;;GAIG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEhD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,8FAA8F;AAC9F,MAAM,eAAe,GAAG,wCAAwC,YAAY,mYAAmY,CAAC;AAIhd;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,aAAa,CAAC,WAAW,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACjF,CAAC"}
|
package/dist/lib/pg-error.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tradução de erro de constraint do Postgres em mensagem acionável.
|
|
3
|
-
*
|
|
4
|
-
* Quando uma invariante do banco barra a escrita, o driver devolve o nome
|
|
5
|
-
* interno da constraint (`violates check constraint "tasks_sprint_requires_end_date"`),
|
|
6
|
-
* que não diz ao cliente MCP o que fazer. A tradução aqui é por *classe* de
|
|
7
|
-
* constraint — nada de caso especial por nome, senão vira um `if` por invariante
|
|
8
|
-
* do banco.
|
|
9
|
-
*/
|
|
10
|
-
/** `tasks_sprint_requires_end_date` (tabela `tasks`) → `sprint requires end date`. Pura. */
|
|
11
|
-
function humanizeConstraint(name, table) {
|
|
12
|
-
const withoutTable = table && name.startsWith(`${table}_`) ? name.slice(table.length + 1) : name;
|
|
13
|
-
return withoutTable.replace(/_(check|key|fkey|excl)$/, '').replace(/_/g, ' ').trim();
|
|
14
|
-
}
|
|
15
|
-
const RULES = [
|
|
16
|
-
{
|
|
17
|
-
re: /(?:new row for relation|insert or update on table) "([^"]+)" violates check constraint "([^"]+)"/i,
|
|
18
|
-
text: (m) => `os dados enviados quebram a regra "${humanizeConstraint(m[2], m[1])}" da tabela ${m[1]} — ` +
|
|
19
|
-
'preencha/ajuste os campos que a regra cita e repita',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
re: /duplicate key value violates unique constraint "([^"]+)"/i,
|
|
23
|
-
text: (m) => `já existe um registro com esses valores (regra "${humanizeConstraint(m[1])}") — ` +
|
|
24
|
-
'use o registro existente ou mude o valor duplicado',
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
re: /(?:insert or update on table|update or delete on table) "([^"]+)" violates foreign key constraint "([^"]+)"/i,
|
|
28
|
-
text: (m) => `referência inválida em ${m[1]} (regra "${humanizeConstraint(m[2], m[1])}") — ` +
|
|
29
|
-
'o registro apontado não existe ou ainda tem dependentes',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
re: /null value in column "([^"]+)" of relation "([^"]+)" violates not-null constraint/i,
|
|
33
|
-
text: (m) => `o campo obrigatório "${m[1]}" de ${m[2]} veio vazio — preencha antes de repetir`,
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
re: /new row violates row-level security policy(?: for table "[^"]+")?/i,
|
|
37
|
-
text: () => 'sem permissão pra essa ação (seu papel não permite escrever aqui)',
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
/**
|
|
41
|
-
* Reescreve o trecho cru do Postgres dentro da mensagem, preservando o resto
|
|
42
|
-
* (o prefixo que a gateway pôs: "Erro ao criar tarefa: ..."). Mensagem sem
|
|
43
|
-
* erro de constraint passa intacta. Pura.
|
|
44
|
-
*/
|
|
45
|
-
export function humanizePgError(message) {
|
|
46
|
-
for (const rule of RULES) {
|
|
47
|
-
const m = message.match(rule.re);
|
|
48
|
-
if (m)
|
|
49
|
-
return message.replace(rule.re, () => rule.text(m));
|
|
50
|
-
}
|
|
51
|
-
return message;
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=pg-error.js.map
|
package/dist/lib/pg-error.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pg-error.js","sourceRoot":"","sources":["../../src/lib/pg-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,4FAA4F;AAC5F,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAc;IACtD,MAAM,YAAY,GAAG,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,OAAO,YAAY,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,KAAK,GAA4D;IACrE;QACE,EAAE,EAAE,mGAAmG;QACvG,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,sCAAsC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK;YAC5F,qDAAqD;KACxD;IACD;QACE,EAAE,EAAE,2DAA2D;QAC/D,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,mDAAmD,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;YAClF,oDAAoD;KACvD;IACD;QACE,EAAE,EAAE,8GAA8G;QAClH,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,0BAA0B,CAAC,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;YAC/E,yDAAyD;KAC5D;IACD;QACE,EAAE,EAAE,oFAAoF;QACxF,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,yCAAyC;KAC/F;IACD;QACE,EAAE,EAAE,oEAAoE;QACxE,IAAI,EAAE,GAAG,EAAE,CAAC,mEAAmE;KAChF;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { dirname, join } from 'node:path';
|
|
4
|
-
import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
|
|
5
|
-
/** Semente pré-SDD: estrutura mínima pro engine preencher na primeira rodada. */
|
|
6
|
-
export const PLAN_TEMPLATE = [
|
|
7
|
-
'# Plano',
|
|
8
|
-
'',
|
|
9
|
-
'## Contexto',
|
|
10
|
-
'',
|
|
11
|
-
'## Problema',
|
|
12
|
-
'',
|
|
13
|
-
'## Solução',
|
|
14
|
-
'',
|
|
15
|
-
'## Escopo',
|
|
16
|
-
'',
|
|
17
|
-
'### Fora de escopo',
|
|
18
|
-
'',
|
|
19
|
-
'## Decisões',
|
|
20
|
-
'',
|
|
21
|
-
'## Tarefas',
|
|
22
|
-
'',
|
|
23
|
-
].join('\n');
|
|
24
|
-
/** Consolidação sob `.noclaf/` — o plano mora junto de history e checkpoints. */
|
|
25
|
-
export function planPath(project) {
|
|
26
|
-
return join(project, '.noclaf', 'plan.md');
|
|
27
|
-
}
|
|
28
|
-
/** Compat: plano antigo na raiz vira `.noclaf/plan.md` — ninguém perde plano em andamento. */
|
|
29
|
-
export function migrateLegacyPlan(project) {
|
|
30
|
-
const target = planPath(project);
|
|
31
|
-
const legacy = join(project, 'plan.md');
|
|
32
|
-
if (existsSync(target) || !existsSync(legacy))
|
|
33
|
-
return;
|
|
34
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
35
|
-
renameSync(legacy, target);
|
|
36
|
-
}
|
|
37
|
-
/** Base do refino: conteúdo atual do `plan.md`, ou o template quando ainda não existe. */
|
|
38
|
-
export function planBase(project) {
|
|
39
|
-
try {
|
|
40
|
-
const current = readFileSync(planPath(project), 'utf8');
|
|
41
|
-
return current.trim() ? current : PLAN_TEMPLATE;
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return PLAN_TEMPLATE;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/** Preâmbulo de planejamento: ancora no harness e proíbe explicitamente escrever código. */
|
|
48
|
-
export function buildPlanPrompt(instruction, base) {
|
|
49
|
-
return [
|
|
50
|
-
'Você está RASCUNHANDO/REFINANDO um plano — não implemente nada.',
|
|
51
|
-
'Antes: leia AGENTS.md e docs/_rules/noclaf.md deste projeto e respeite o harness.',
|
|
52
|
-
'NÃO escreva código, NÃO edite arquivos, NÃO rode comandos.',
|
|
53
|
-
'Parta do plano atual abaixo e refine-o à luz da instrução; não descarte raciocínio já feito.',
|
|
54
|
-
'Responda APENAS com o markdown final do plan.md, sem cercas de código e sem comentários.',
|
|
55
|
-
'',
|
|
56
|
-
`## Instrução`,
|
|
57
|
-
instruction,
|
|
58
|
-
'',
|
|
59
|
-
'## Plano atual',
|
|
60
|
-
base,
|
|
61
|
-
].join('\n');
|
|
62
|
-
}
|
|
63
|
-
/** O engine às vezes embrulha a resposta em ```markdown — o arquivo não quer a cerca. */
|
|
64
|
-
export function stripFence(text) {
|
|
65
|
-
const t = text.trim();
|
|
66
|
-
const m = /^```[a-zA-Z]*\n([\s\S]*?)\n?```$/.exec(t);
|
|
67
|
-
return (m ? m[1] : t).trim();
|
|
68
|
-
}
|
|
69
|
-
/** Write-then-rename: o plano anterior sobrevive até a escrita concluir. */
|
|
70
|
-
function writeAtomic(project, content) {
|
|
71
|
-
const target = planPath(project);
|
|
72
|
-
const tmp = `${target}.tmp`;
|
|
73
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
74
|
-
writeFileSync(tmp, `${content}\n`, 'utf8');
|
|
75
|
-
renameSync(tmp, target);
|
|
76
|
-
return target;
|
|
77
|
-
}
|
|
78
|
-
function spawnPlan(bin, engine, prompt, project, echo) {
|
|
79
|
-
return new Promise((resolve) => {
|
|
80
|
-
const child = spawn(bin, engineArgs(engine, prompt), {
|
|
81
|
-
cwd: project,
|
|
82
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
83
|
-
});
|
|
84
|
-
let markdown = '';
|
|
85
|
-
child.stdout.on('data', (d) => (markdown += d.toString()));
|
|
86
|
-
child.stderr.on('data', (d) => echo && process.stderr.write(d.toString()));
|
|
87
|
-
const fail = (error) => {
|
|
88
|
-
resolve({ ok: false, path: planPath(project), engine, error });
|
|
89
|
-
};
|
|
90
|
-
child.on('error', (e) => fail(e.message));
|
|
91
|
-
child.on('close', (code) => {
|
|
92
|
-
if (code !== 0)
|
|
93
|
-
return fail(`engine ${engine} falhou (exit ${code})`);
|
|
94
|
-
const content = stripFence(markdown);
|
|
95
|
-
if (!content)
|
|
96
|
-
return fail(`engine ${engine} não devolveu markdown`);
|
|
97
|
-
resolve({ ok: true, path: writeAtomic(project, content), engine });
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
/** Bloqueante: roda o engine pensante e escreve o `plan.md`. `echo` streama log no stderr. */
|
|
102
|
-
export function runPlan(opts) {
|
|
103
|
-
const engine = opts.engine ?? PLAN_ENGINE;
|
|
104
|
-
const bin = resolveEngineBin(engine);
|
|
105
|
-
if (!bin) {
|
|
106
|
-
return Promise.resolve({
|
|
107
|
-
ok: false,
|
|
108
|
-
path: planPath(opts.project),
|
|
109
|
-
engine,
|
|
110
|
-
error: engineMissingError(engine),
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
migrateLegacyPlan(opts.project);
|
|
114
|
-
const prompt = buildPlanPrompt(opts.instruction, planBase(opts.project));
|
|
115
|
-
return spawnPlan(bin, engine, prompt, opts.project, opts.echo === true);
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=plan-delegate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan-delegate.js","sourceRoot":"","sources":["../../src/lib/plan-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { brand } from '../brand.js';
|
|
2
|
-
/**
|
|
3
|
-
* Erro com mensagem em pt-BR pronta pra mostrar ao usuário.
|
|
4
|
-
* Wrappers (tool MCP, CLI) só precisam pegar `.message`.
|
|
5
|
-
*/
|
|
6
|
-
export class ProjectContextError extends Error {
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Texto de "Sobre o projeto" pro harness (`AGENTS.md`), montado do `ai_context` do NOS —
|
|
10
|
-
* projeto + cada repo que tenha contexto. Determinístico (não usa LLM). `''` se nada.
|
|
11
|
-
*/
|
|
12
|
-
export function buildProjectOverview(ctx) {
|
|
13
|
-
const parts = [];
|
|
14
|
-
if (ctx.project.ai_context?.trim())
|
|
15
|
-
parts.push(ctx.project.ai_context.trim());
|
|
16
|
-
// Escopo pelo **repositório atribuído** (`repository_id`) quando há um selecionado — o
|
|
17
|
-
// harness vive dentro dele. Sem repo (binding no projeto) → todos, pra orquestração.
|
|
18
|
-
const repos = ctx.current_repository ? [ctx.current_repository] : ctx.repositories;
|
|
19
|
-
for (const r of repos) {
|
|
20
|
-
if (r.ai_context?.trim())
|
|
21
|
-
parts.push(`### ${r.name}\n\n${r.ai_context.trim()}`);
|
|
22
|
-
}
|
|
23
|
-
return parts.join('\n\n');
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Projetos **ativos em que o usuário é membro** (`project_members`). Duas queries
|
|
27
|
-
* (memberships → projetos) pra tipagem limpa e independente de RLS: mesmo que o
|
|
28
|
-
* usuário seja admin e o RLS deixe ver tudo, aqui recortamos pra atribuição real.
|
|
29
|
-
*/
|
|
30
|
-
export async function listMemberProjects(supabase, userId) {
|
|
31
|
-
const membersRes = await supabase
|
|
32
|
-
.from('project_members')
|
|
33
|
-
.select('project_id')
|
|
34
|
-
.eq('user_id', userId);
|
|
35
|
-
if (membersRes.error) {
|
|
36
|
-
throw new ProjectContextError(`Erro ao listar suas atribuições: ${membersRes.error.message}`);
|
|
37
|
-
}
|
|
38
|
-
const ids = [...new Set((membersRes.data ?? []).map((r) => r.project_id))];
|
|
39
|
-
if (ids.length === 0)
|
|
40
|
-
return [];
|
|
41
|
-
const projectsRes = await supabase
|
|
42
|
-
.from('projects')
|
|
43
|
-
.select('id, name')
|
|
44
|
-
.eq('is_active', true)
|
|
45
|
-
.in('id', ids)
|
|
46
|
-
.order('name');
|
|
47
|
-
if (projectsRes.error) {
|
|
48
|
-
throw new ProjectContextError(`Erro ao listar projetos: ${projectsRes.error.message}`);
|
|
49
|
-
}
|
|
50
|
-
return (projectsRes.data ?? []).map((p) => ({ id: p.id, name: p.name }));
|
|
51
|
-
}
|
|
52
|
-
export async function fetchProjectContext(supabase, config, user) {
|
|
53
|
-
const projectId = config.project_id;
|
|
54
|
-
const [projectRes, reposRes, sprintRes, membersRes] = await Promise.all([
|
|
55
|
-
supabase
|
|
56
|
-
.from('projects')
|
|
57
|
-
.select('id, name, color, monthly_hours, notes, ai_context')
|
|
58
|
-
.eq('id', projectId)
|
|
59
|
-
.maybeSingle(),
|
|
60
|
-
supabase
|
|
61
|
-
.from('repositories')
|
|
62
|
-
.select('id, project_id, name, url, default_branch, ai_context')
|
|
63
|
-
.eq('project_id', projectId)
|
|
64
|
-
.order('name'),
|
|
65
|
-
supabase
|
|
66
|
-
.from('sprints')
|
|
67
|
-
.select('id, name, start_date, end_date')
|
|
68
|
-
.eq('project_id', projectId)
|
|
69
|
-
.eq('status', 'ativa')
|
|
70
|
-
.maybeSingle(),
|
|
71
|
-
supabase
|
|
72
|
-
.from('project_members')
|
|
73
|
-
.select('user_id, profiles:profiles!inner(id, full_name, username, avatar_url)')
|
|
74
|
-
.eq('project_id', projectId),
|
|
75
|
-
]);
|
|
76
|
-
if (projectRes.error) {
|
|
77
|
-
throw new ProjectContextError(`Erro ao buscar projeto: ${projectRes.error.message}`);
|
|
78
|
-
}
|
|
79
|
-
if (!projectRes.data) {
|
|
80
|
-
throw new ProjectContextError(`Projeto ${projectId} não encontrado ou você não tem acesso. Rode \`${brand.name} init\` pra revincular.`);
|
|
81
|
-
}
|
|
82
|
-
if (reposRes.error) {
|
|
83
|
-
throw new ProjectContextError(`Erro ao buscar repositórios: ${reposRes.error.message}`);
|
|
84
|
-
}
|
|
85
|
-
if (sprintRes.error) {
|
|
86
|
-
throw new ProjectContextError(`Erro ao buscar sprint ativa: ${sprintRes.error.message}`);
|
|
87
|
-
}
|
|
88
|
-
if (membersRes.error) {
|
|
89
|
-
throw new ProjectContextError(`Erro ao buscar membros: ${membersRes.error.message}`);
|
|
90
|
-
}
|
|
91
|
-
const project = projectRes.data;
|
|
92
|
-
const allRepos = reposRes.data ?? [];
|
|
93
|
-
const sprint = sprintRes.data;
|
|
94
|
-
const memberRows = (membersRes.data ?? []);
|
|
95
|
-
let currentRepository = null;
|
|
96
|
-
if (config.repository_id) {
|
|
97
|
-
const match = allRepos.find((r) => r.id === config.repository_id);
|
|
98
|
-
if (match) {
|
|
99
|
-
currentRepository = {
|
|
100
|
-
id: match.id,
|
|
101
|
-
name: match.name,
|
|
102
|
-
url: match.url,
|
|
103
|
-
default_branch: match.default_branch,
|
|
104
|
-
ai_context: match.ai_context,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const members = memberRows.map((row) => {
|
|
109
|
-
const profile = Array.isArray(row.profiles) ? row.profiles[0] : row.profiles;
|
|
110
|
-
return {
|
|
111
|
-
user_id: row.user_id,
|
|
112
|
-
full_name: profile?.full_name ?? null,
|
|
113
|
-
username: profile?.username ?? null,
|
|
114
|
-
avatar_url: profile?.avatar_url ?? null,
|
|
115
|
-
};
|
|
116
|
-
});
|
|
117
|
-
return {
|
|
118
|
-
project: {
|
|
119
|
-
id: project.id,
|
|
120
|
-
name: project.name,
|
|
121
|
-
color: project.color,
|
|
122
|
-
monthly_hours: project.monthly_hours,
|
|
123
|
-
notes: project.notes,
|
|
124
|
-
ai_context: project.ai_context,
|
|
125
|
-
},
|
|
126
|
-
current_repository: currentRepository,
|
|
127
|
-
repositories: allRepos.map((r) => ({
|
|
128
|
-
id: r.id,
|
|
129
|
-
name: r.name,
|
|
130
|
-
url: r.url,
|
|
131
|
-
default_branch: r.default_branch,
|
|
132
|
-
ai_context: r.ai_context,
|
|
133
|
-
})),
|
|
134
|
-
active_sprint: sprint
|
|
135
|
-
? {
|
|
136
|
-
id: sprint.id,
|
|
137
|
-
name: sprint.name,
|
|
138
|
-
start_date: sprint.start_date,
|
|
139
|
-
end_date: sprint.end_date,
|
|
140
|
-
}
|
|
141
|
-
: null,
|
|
142
|
-
members,
|
|
143
|
-
current_user: {
|
|
144
|
-
id: user.id,
|
|
145
|
-
email: user.email,
|
|
146
|
-
full_name: user.full_name,
|
|
147
|
-
username: user.username,
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=project-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA+CpC;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG;AAEjD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,uFAAuF;IACvF,qFAAqF;IACrF,MAAM,KAAK,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;IACnF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAkB,EAClB,MAAc;IAEd,MAAM,UAAU,GAAG,MAAM,QAAQ;SAC9B,IAAI,CAAC,iBAAiB,CAAC;SACvB,MAAM,CAAC,YAAY,CAAC;SACpB,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACzB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAmB,CAAC,oCAAoC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,WAAW,GAAG,MAAM,QAAQ;SAC/B,IAAI,CAAC,UAAU,CAAC;SAChB,MAAM,CAAC,UAAU,CAAC;SAClB,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;SACrB,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;SACb,KAAK,CAAC,MAAM,CAAC,CAAC;IACjB,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,mBAAmB,CAAC,4BAA4B,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAkB,EAClB,MAAqB,EACrB,IAA4B;IAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;IAEpC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtE,QAAQ;aACL,IAAI,CAAC,UAAU,CAAC;aAChB,MAAM,CAAC,mDAAmD,CAAC;aAC3D,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;aACnB,WAAW,EAAE;QAChB,QAAQ;aACL,IAAI,CAAC,cAAc,CAAC;aACpB,MAAM,CAAC,uDAAuD,CAAC;aAC/D,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;aAC3B,KAAK,CAAC,MAAM,CAAC;QAChB,QAAQ;aACL,IAAI,CAAC,SAAS,CAAC;aACf,MAAM,CAAC,gCAAgC,CAAC;aACxC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;aAC3B,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;aACrB,WAAW,EAAE;QAChB,QAAQ;aACL,IAAI,CAAC,iBAAiB,CAAC;aACvB,MAAM,CAAC,uEAAuE,CAAC;aAC/E,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;KAC/B,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAmB,CAC3B,WAAW,SAAS,kDAAkD,KAAK,CAAC,IAAI,yBAAyB,CAC1G,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,gCAAgC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,mBAAmB,CAAC,gCAAgC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;IAY9B,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAA2B,CAAC;IAErE,IAAI,iBAAiB,GAA2C,IAAI,CAAC;IACrE,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,iBAAiB,GAAG;gBAClB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA2B,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7E,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YACrC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI;SACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B;QACD,kBAAkB,EAAE,iBAAiB;QACrC,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC;QACH,aAAa,EAAE,MAAM;YACnB,CAAC,CAAC;gBACE,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACH,CAAC,CAAC,IAAI;QACR,OAAO;QACP,YAAY,EAAE;YACZ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB;KACF,CAAC;AACJ,CAAC"}
|