@cccarv82/freya 2.5.3 → 2.5.5
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/cli/web-ui.js +80 -13
- package/cli/web.js +67 -34
- package/package.json +1 -1
package/cli/web-ui.js
CHANGED
|
@@ -1905,11 +1905,13 @@
|
|
|
1905
1905
|
}
|
|
1906
1906
|
}
|
|
1907
1907
|
|
|
1908
|
+
state.slugRules = []; // Store the active project rules
|
|
1909
|
+
|
|
1908
1910
|
async function reloadSlugRules() {
|
|
1909
1911
|
try {
|
|
1910
1912
|
const r = await api('/api/project-slug-map/get', { dir: dirOrDefault() });
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
+
state.slugRules = (r.map && Array.isArray(r.map.rules)) ? r.map.rules : [];
|
|
1914
|
+
renderSlugRules();
|
|
1913
1915
|
setPill('ok', 'rules loaded');
|
|
1914
1916
|
setTimeout(() => setPill('ok', 'pronto'), 800);
|
|
1915
1917
|
} catch (e) {
|
|
@@ -1918,18 +1920,82 @@
|
|
|
1918
1920
|
}
|
|
1919
1921
|
}
|
|
1920
1922
|
|
|
1923
|
+
function renderSlugRules() {
|
|
1924
|
+
const container = $('slugListContainer');
|
|
1925
|
+
if (!container) return;
|
|
1926
|
+
|
|
1927
|
+
if (state.slugRules.length === 0) {
|
|
1928
|
+
container.innerHTML = '<div class="help" style="margin-bottom: 10px;">Nenhuma regra cadastrada no momento.</div>';
|
|
1929
|
+
return;
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
let html = '<div style="display:flex; flex-direction:column; gap:8px; margin-bottom: 16px;">';
|
|
1933
|
+
state.slugRules.forEach((rule, index) => {
|
|
1934
|
+
html += `
|
|
1935
|
+
<div style="display:flex; align-items:center; justify-content:space-between; background: var(--bg2); padding: 10px 14px; border-radius: 6px; border: 1px solid var(--border);">
|
|
1936
|
+
<div style="display:flex; gap: 12px; align-items:center; flex-wrap: wrap;">
|
|
1937
|
+
<span style="font-size: 13px;"><span style="color:var(--text-muted); font-size:12px;">Se o texto contiver a palavra:</span> <b style="color: var(--primary);">${escapeHtml(rule.contains)}</b></span>
|
|
1938
|
+
<span style="color:var(--text-muted)">→</span>
|
|
1939
|
+
<span style="font-size: 13px;"><span style="color:var(--text-muted); font-size:12px;">Atribuir ao projeto:</span> <code class="md-inline">${escapeHtml(rule.slug)}</code></span>
|
|
1940
|
+
</div>
|
|
1941
|
+
<button class="btn small" type="button" onclick="window.removeSlugRule(${index})" title="Remover regra">Excluir</button>
|
|
1942
|
+
</div>
|
|
1943
|
+
`;
|
|
1944
|
+
});
|
|
1945
|
+
html += '</div>';
|
|
1946
|
+
container.innerHTML = html;
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
function addSlugRule() {
|
|
1950
|
+
const kw = $('newSlugKeyword');
|
|
1951
|
+
const tg = $('newSlugTarget');
|
|
1952
|
+
if (!kw || !tg) return;
|
|
1953
|
+
const contains = kw.value.trim().toLowerCase();
|
|
1954
|
+
const slug = tg.value.trim().toLowerCase();
|
|
1955
|
+
|
|
1956
|
+
if (!contains || !slug) {
|
|
1957
|
+
setPill('err', 'Preencha ambos os campos');
|
|
1958
|
+
setTimeout(() => setPill('ok', 'pronto'), 1500);
|
|
1959
|
+
return;
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1962
|
+
// Check for duplicates
|
|
1963
|
+
if (state.slugRules.some(r => r.contains === contains)) {
|
|
1964
|
+
setPill('err', 'Palavra-chave já existe');
|
|
1965
|
+
setTimeout(() => setPill('ok', 'pronto'), 1500);
|
|
1966
|
+
return;
|
|
1967
|
+
}
|
|
1968
|
+
|
|
1969
|
+
state.slugRules.push({ contains, slug });
|
|
1970
|
+
kw.value = '';
|
|
1971
|
+
tg.value = '';
|
|
1972
|
+
renderSlugRules();
|
|
1973
|
+
|
|
1974
|
+
// Auto-save when adding
|
|
1975
|
+
saveSlugRules();
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
function removeSlugRule(index) {
|
|
1979
|
+
if (index >= 0 && index < state.slugRules.length) {
|
|
1980
|
+
state.slugRules.splice(index, 1);
|
|
1981
|
+
renderSlugRules();
|
|
1982
|
+
// Auto-save when removing
|
|
1983
|
+
saveSlugRules();
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
|
|
1921
1987
|
async function saveSlugRules() {
|
|
1922
1988
|
try {
|
|
1923
|
-
const el = $('slugRules');
|
|
1924
|
-
if (!el) return;
|
|
1925
|
-
const raw = String(el.value || '').trim();
|
|
1926
|
-
if (!raw) throw new Error('Rules JSON is empty');
|
|
1927
|
-
let map;
|
|
1928
|
-
try { map = JSON.parse(raw); } catch (e) { throw new Error('Invalid JSON: ' + (e.message || e)); }
|
|
1929
|
-
|
|
1930
1989
|
setPill('run', 'saving rules…');
|
|
1990
|
+
const map = { rules: state.slugRules };
|
|
1931
1991
|
const r = await api('/api/project-slug-map/save', { dir: dirOrDefault(), map });
|
|
1932
|
-
|
|
1992
|
+
|
|
1993
|
+
// Update state with confirmed save
|
|
1994
|
+
if (r.map && Array.isArray(r.map.rules)) {
|
|
1995
|
+
state.slugRules = r.map.rules;
|
|
1996
|
+
renderSlugRules();
|
|
1997
|
+
}
|
|
1998
|
+
|
|
1933
1999
|
setPill('ok', 'rules saved');
|
|
1934
2000
|
setTimeout(() => setPill('ok', 'pronto'), 800);
|
|
1935
2001
|
} catch (e) {
|
|
@@ -2046,7 +2112,7 @@
|
|
|
2046
2112
|
setPill('run', 'applying…');
|
|
2047
2113
|
await applyPlan();
|
|
2048
2114
|
const a = state.lastApplied || {};
|
|
2049
|
-
setPill('ok', `applied
|
|
2115
|
+
setPill('ok', `applied(${a.tasks || 0}t, ${a.blockers || 0}b)`);
|
|
2050
2116
|
if (state.autoRunReports) {
|
|
2051
2117
|
await runSuggestedReports();
|
|
2052
2118
|
}
|
|
@@ -2082,7 +2148,7 @@
|
|
|
2082
2148
|
let out = '## Ran suggested reports\n\n';
|
|
2083
2149
|
for (const name of uniq) {
|
|
2084
2150
|
const r = await api('/api/report', { dir: dirOrDefault(), script: name === 'status' ? 'status' : name });
|
|
2085
|
-
out += `### ${name}\n` + (r.reportPath ?
|
|
2151
|
+
out += `### ${name} \n` + (r.reportPath ? ` - file: ${r.reportPath} \n` : '') + '\n';
|
|
2086
2152
|
}
|
|
2087
2153
|
|
|
2088
2154
|
setOut(out);
|
|
@@ -2233,11 +2299,12 @@
|
|
|
2233
2299
|
window.pickDir = pickDir;
|
|
2234
2300
|
window.runReport = runReport;
|
|
2235
2301
|
window.publish = publish;
|
|
2236
|
-
window.saveSettings = saveSettings;
|
|
2237
2302
|
window.refreshReports = refreshReports;
|
|
2238
2303
|
window.refreshToday = refreshToday;
|
|
2239
2304
|
window.reloadSlugRules = reloadSlugRules;
|
|
2240
2305
|
window.saveSlugRules = saveSlugRules;
|
|
2306
|
+
window.addSlugRule = addSlugRule;
|
|
2307
|
+
window.removeSlugRule = removeSlugRule;
|
|
2241
2308
|
window.exportObsidian = exportObsidian;
|
|
2242
2309
|
window.rebuildIndex = rebuildIndex;
|
|
2243
2310
|
window.renderReportsList = renderReportsList;
|
package/cli/web.js
CHANGED
|
@@ -1045,38 +1045,65 @@ function buildDocsHtml(safeDefault, appVersion) {
|
|
|
1045
1045
|
|
|
1046
1046
|
<div class="centerBody">
|
|
1047
1047
|
<div class="docs-content">
|
|
1048
|
+
|
|
1048
1049
|
<div class="docs-card">
|
|
1049
|
-
<h1 class="docs-h1">📚
|
|
1050
|
-
<p>
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1050
|
+
<h1 class="docs-h1">📚 Bem-vindo à FREYA</h1>
|
|
1051
|
+
<p>A FREYA (<strong class="docs-strong">Fast Reporting & Executive Yield Assistant</strong>) é a sua assistente executiva local-first. Ela utiliza Inteligência Artificial e a sua base local de metadados para automatizar a extração de tarefas, gerar relatórios, manter o histórico de projetos alinhado e responder dúvidas contextuais sem depender de nuvens externas para a soberania de seus dados sensíveis.</p>
|
|
1052
|
+
</div>
|
|
1053
|
+
|
|
1054
|
+
<div class="docs-card" id="docs-dashboard">
|
|
1055
|
+
<h2 class="docs-h2" style="margin-top:0;">🏠 Dashboard & Inbox</h2>
|
|
1056
|
+
<p>O coração do sistema. Aqui você insere seus apontamentos do dia a dia de forma natural e livre usando a <strong>Inbox Central</strong>.</p>
|
|
1054
1057
|
<ul class="docs-ul">
|
|
1055
|
-
<li><
|
|
1056
|
-
<li><
|
|
1057
|
-
<li><
|
|
1058
|
-
<li><code class="docs-code">freya daily</code>: Abre seu log diário para edição.</li>
|
|
1058
|
+
<li><strong class="docs-strong">Prompt Inteligente:</strong> Ao colar um texto (ex: <i>"hoje finalizei a issue PTI123 mas fiquei bloqueado pelo time de banco"</i>) e enviar, a FREYA analisa e extrai tarefas pertinentes e registra impedimentos automaticamente.</li>
|
|
1059
|
+
<li><strong class="docs-strong">Oráculo (RAG):</strong> Um campo de chat conectado com o LLM de IA avançado. Pergunte <i>"O que eu informei ontem sobre o projeto X?"</i> e a FREYA consultará toda a varredura da base local para formular uma resposta consolidada mantendo formatação rica em HTML/Markdown.</li>
|
|
1060
|
+
<li><strong class="docs-strong">Tarefas (DO NOW / SCHEDULE):</strong> Acompanhe rapidamente as pendências cruciais para o seu dia. Resolução rápida com apenas um clique.</li>
|
|
1059
1061
|
</ul>
|
|
1062
|
+
<div class="docs-pre">Dica de Input: "Reunião de kickoff do projeto Trato. Preciso cobrar a permissão de acesso amanhã."<br><br>Resultado Mágico: A FREYA cria uma pendência de "cobrança de acesso" atrelada ao projeto automaticamente!</div>
|
|
1063
|
+
</div>
|
|
1060
1064
|
|
|
1061
|
-
|
|
1065
|
+
<div class="docs-card" id="docs-reports">
|
|
1066
|
+
<h2 class="docs-h2" style="margin-top:0;">📊 Relatórios (Reports)</h2>
|
|
1067
|
+
<p>Geração instantânea de consolidados Markdown com base nos seus últimos logs, métricas e projetos.</p>
|
|
1062
1068
|
<ul class="docs-ul">
|
|
1063
|
-
<li><strong class="docs-strong">
|
|
1064
|
-
<li><strong class="docs-strong">
|
|
1065
|
-
<li><strong class="docs-strong">
|
|
1069
|
+
<li><strong class="docs-strong">Executive Status:</strong> Resumo executivo para visão holística em cima de tudo que aconteceu.</li>
|
|
1070
|
+
<li><strong class="docs-strong">SM Weekly:</strong> Um consolidado sob a ótica de Scrum Master para reportar fluxo e timeline.</li>
|
|
1071
|
+
<li><strong class="docs-strong">Blockers:</strong> Visão tática de impedimentos e gargalos estruturais divididos por severidade.</li>
|
|
1072
|
+
<li><strong class="docs-strong">Clipboard Fácil:</strong> Edite o Markdown gerado usando o painel integrado e copie rapidamente para uso no Outlook ou Confluence.</li>
|
|
1066
1073
|
</ul>
|
|
1074
|
+
</div>
|
|
1067
1075
|
|
|
1068
|
-
|
|
1069
|
-
<
|
|
1076
|
+
<div class="docs-card" id="docs-projects">
|
|
1077
|
+
<h2 class="docs-h2" style="margin-top:0;">📂 Projetos (Projects) & Grafo (Graph)</h2>
|
|
1078
|
+
<p>A central de clientes e iniciativas. Cada projeto (referenciado por seu <i>slug</i>, ex: <code>vivo/5g</code>) possui um histórico cronológico organizado.</p>
|
|
1070
1079
|
<ul class="docs-ul">
|
|
1071
|
-
<li><strong class="docs-strong">
|
|
1072
|
-
<li><strong class="docs-strong">
|
|
1073
|
-
<li><strong class="docs-strong">Blockers</strong>: Lista focada em impedimentos.</li>
|
|
1080
|
+
<li><strong class="docs-strong">Histórico Consolidado:</strong> Através da Inbox, as ações e status mapeados para um projeto alimentam essa visão com linha do tempo automaticamente.</li>
|
|
1081
|
+
<li><strong class="docs-strong">Grafo de Conhecimento (Graph):</strong> Todos os slugs, tarefas, clientes e datas formam nós interativos de uma rede. Permite descobrir dinâmicas ocultas e ver visualmente clientes demandando mais esforço.</li>
|
|
1074
1082
|
</ul>
|
|
1075
|
-
|
|
1083
|
+
</div>
|
|
1076
1084
|
|
|
1077
|
-
|
|
1078
|
-
<
|
|
1085
|
+
<div class="docs-card" id="docs-settings">
|
|
1086
|
+
<h2 class="docs-h2" style="margin-top:0;">⚙️ Configurações & Mapeamento Smart</h2>
|
|
1087
|
+
<p>Customize sua experiência e treine a IA para catalogar seus clientes de forma rígida usando o <strong>Mapeamento Inteligente de Projetos</strong>.</p>
|
|
1088
|
+
<ul class="docs-ul">
|
|
1089
|
+
<li>Embora a FREYA utilize o Copilot para criar novos <code>Slugs</code> on-the-fly de forma inteligente (ex: deduzir <code>vale/trato</code> da palavra Trato), você pode forçar regras pelo painel.</li>
|
|
1090
|
+
<li><strong class="docs-strong">Formato JSON de Regras:</strong><br>
|
|
1091
|
+
<code>{ "contains": "fideliza", "slug": "vivo/fidelizacao" }</code><br>
|
|
1092
|
+
<i>Toda vez que um update citar a palavra-chave, a FREYA garantirá que ele caia na pasta padronizada.</i></li>
|
|
1093
|
+
</ul>
|
|
1079
1094
|
</div>
|
|
1095
|
+
|
|
1096
|
+
<div class="docs-card">
|
|
1097
|
+
<h2 class="docs-h2" style="margin-top:0;">⌨️ CLI (Terminal)</h2>
|
|
1098
|
+
<p>O poder nativo pelo console, caso você perca a conexão da Web UI ou prefira o velho bash.</p>
|
|
1099
|
+
<ul class="docs-ul">
|
|
1100
|
+
<li><code class="docs-code">freya task "Revisar logs do servidor"</code>: Cria uma nova task rápida.</li>
|
|
1101
|
+
<li><code class="docs-code">freya blocker "Queda no link"</code>: Registra entrada na lista de problemas.</li>
|
|
1102
|
+
<li><code class="docs-code">freya status "Fase 2 aprovada!" --project acme/beta</code>: Injeta direto no banco de projetos.</li>
|
|
1103
|
+
<li><code class="docs-code">freya web</code>: Sobe o servidor back-end do Dashboard Mágico!</li>
|
|
1104
|
+
</ul>
|
|
1105
|
+
</div>
|
|
1106
|
+
|
|
1080
1107
|
</div>
|
|
1081
1108
|
</div>
|
|
1082
1109
|
</main>
|
|
@@ -3973,25 +4000,31 @@ function buildSettingsHtml(safeDefault, appVersion) {
|
|
|
3973
4000
|
|
|
3974
4001
|
<div class="devGrid" style="grid-template-columns: 1fr;">
|
|
3975
4002
|
<div class="panel">
|
|
3976
|
-
<div class="panelHead"
|
|
4003
|
+
<div class="panelHead" style="display:flex; justify-content:space-between; align-items:center;">
|
|
4004
|
+
<b>Mapeamento Inteligente de Projetos (Slugs)</b>
|
|
4005
|
+
<span class="chip" style="font-weight:normal; font-size:11px;">Rules</span>
|
|
4006
|
+
</div>
|
|
3977
4007
|
<div class="panelBody">
|
|
3978
4008
|
<p style="margin-top: 0; color: #666; font-size: 13px;">
|
|
3979
|
-
A FREYA tenta adivinhar automaticamente a qual projeto uma tarefa pertence.
|
|
3980
|
-
Se você quiser
|
|
4009
|
+
A FREYA tenta adivinhar automaticamente a qual projeto uma tarefa pertence com base no LLM.
|
|
4010
|
+
Se você quiser <b>garantir</b> que uma palavra sempre caia em um projeto específico, adicione uma regra abaixo.
|
|
3981
4011
|
</p>
|
|
3982
4012
|
|
|
3983
|
-
<div style="
|
|
3984
|
-
<
|
|
3985
|
-
|
|
3986
|
-
|
|
4013
|
+
<div class="slug-adder" style="display: flex; gap: 8px; margin-bottom: 24px; align-items: flex-end; background: var(--bg2); padding: 12px; border-radius: 8px; border: 1px solid var(--border);">
|
|
4014
|
+
<div style="flex: 1;">
|
|
4015
|
+
<label style="font-size: 12px; color: var(--text-muted); margin-bottom: 4px; display: block;">Palavra-chave (ex: fideliza)</label>
|
|
4016
|
+
<input type="text" id="newSlugKeyword" placeholder="Palavra a buscar..." style="width: 100%;" />
|
|
4017
|
+
</div>
|
|
4018
|
+
<div style="flex: 1;">
|
|
4019
|
+
<label style="font-size: 12px; color: var(--text-muted); margin-bottom: 4px; display: block;">Projeto Alvo (ex: vivo/fidelizacao)</label>
|
|
4020
|
+
<input type="text" id="newSlugTarget" placeholder="Slug do projeto..." style="width: 100%;" />
|
|
4021
|
+
</div>
|
|
4022
|
+
<button class="btn primary" type="button" onclick="window.addSlugRule()" style="height: 36px;">Adicionar Regra</button>
|
|
3987
4023
|
</div>
|
|
3988
4024
|
|
|
3989
|
-
<
|
|
3990
|
-
<
|
|
3991
|
-
|
|
3992
|
-
<div class="stack" style="margin-top:20px; flex-direction: row; justify-content: flex-end;">
|
|
3993
|
-
<button class="btn" type="button" onclick="window.reloadSlugRules()">Restaurar</button>
|
|
3994
|
-
<button class="btn primary" type="button" onclick="window.saveSlugRules()">Salvar Regras</button>
|
|
4025
|
+
<h3 style="font-size: 14px; margin-top: 24px; margin-bottom: 12px;">Regras Ativas</h3>
|
|
4026
|
+
<div id="slugListContainer">
|
|
4027
|
+
<div class="help">Carregando regras...</div>
|
|
3995
4028
|
</div>
|
|
3996
4029
|
</div>
|
|
3997
4030
|
</div>
|
package/package.json
CHANGED