invos 2.0.1 → 2.0.2
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/kit/AGENTS.md +1 -0
- package/kit/INVOS.json +6 -6
- package/kit/LICENSE +21 -54
- package/kit/README.md +88 -79
- package/kit/_memoria/empresa.md +12 -9
- package/kit/_memoria/estrategia.md +14 -2
- package/package.json +5 -4
- package/src/commands/doctor.js +20 -2
- package/src/resolve-kit.js +17 -3
- package/src/symlinks.js +4 -3
- package/src/utils.js +8 -4
package/kit/AGENTS.md
CHANGED
|
@@ -125,6 +125,7 @@ Carrossel IG = skill **`/carrossel`**. Não use advisory/hormozi pra “fazer o
|
|
|
125
125
|
- Não commit/push sozinho — skill **`salvar`** quando o user pedir.
|
|
126
126
|
- Não vazar secrets.
|
|
127
127
|
- Mudança **mínima** que resolve.
|
|
128
|
+
- Projeto open-source sob MIT. Contribuições são bem-vindas via PR.
|
|
128
129
|
|
|
129
130
|
---
|
|
130
131
|
|
package/kit/INVOS.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.0.
|
|
3
|
-
"manifest": "
|
|
2
|
+
"version": "2.0.2",
|
|
3
|
+
"manifest": "OPEN_SOURCE",
|
|
4
4
|
"product": {
|
|
5
5
|
"name": "invos",
|
|
6
|
-
"type": "
|
|
7
|
-
"distribution": "
|
|
8
|
-
"
|
|
6
|
+
"type": "framework",
|
|
7
|
+
"distribution": "public",
|
|
8
|
+
"license": "MIT",
|
|
9
9
|
"cli": "npx invos",
|
|
10
|
-
"github": "felipenalves/
|
|
10
|
+
"github": "felipenalves/InvOS"
|
|
11
11
|
},
|
|
12
12
|
"seed": {
|
|
13
13
|
"skills": [
|
package/kit/LICENSE
CHANGED
|
@@ -1,54 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
You may NOT, without prior written permission from the Licensor:
|
|
23
|
-
|
|
24
|
-
1. Resell, sublicense, or redistribute the Product (or a substantial
|
|
25
|
-
portion of it) as a competing kit, course, or template.
|
|
26
|
-
2. Publish the full kit, private skills pack, or source tree as open
|
|
27
|
-
source or public mirror.
|
|
28
|
-
3. Remove or alter this license notice or product branding in a way
|
|
29
|
-
that presents the Product as someone else's work.
|
|
30
|
-
4. Use the Product to build a commercial "AI operating system" kit that
|
|
31
|
-
is sold as a substitute for INVOS.
|
|
32
|
-
|
|
33
|
-
## What stays yours
|
|
34
|
-
|
|
35
|
-
- Your `_memoria/`, client data, brand assets, and any skills you create
|
|
36
|
-
for your business remain yours.
|
|
37
|
-
- Deliverables you produce with the Product for your clients remain yours
|
|
38
|
-
(or your clients'), subject to your agreements with them.
|
|
39
|
-
|
|
40
|
-
## Disclaimer
|
|
41
|
-
|
|
42
|
-
THE PRODUCT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. THE
|
|
43
|
-
LICENSOR IS NOT LIABLE FOR BUSINESS LOSSES, DATA LOSS, OR DAMAGES ARISING
|
|
44
|
-
FROM USE OF THE PRODUCT.
|
|
45
|
-
|
|
46
|
-
## Contact
|
|
47
|
-
|
|
48
|
-
Questions about licensing: use the support channel of your purchase
|
|
49
|
-
or contact the Licensor via the official INV / Documente.club channels.
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
Licença proprietária. Compra autorizada = uso no seu negócio.
|
|
54
|
-
Redistribuição do kit como produto = proibido.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Felipe Alves
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/kit/README.md
CHANGED
|
@@ -1,113 +1,122 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
<pre align="center">
|
|
2
|
+
╔══════════════════════════════════════════════════════╗
|
|
3
|
+
║ ║
|
|
4
|
+
║ ██╗███╗ ██╗██╗ ██╗ ██████╗ ███████╗ ║
|
|
5
|
+
║ ██║████╗ ██║██║ ██║██╔═══██╗██╔════╝ ║
|
|
6
|
+
║ ██║██╔██╗ ██║██║ ██║██║ ██║███████╗ ║
|
|
7
|
+
║ ██║██║╚██╗██║╚██╗ ██╔╝██║ ██║╚════██║ ║
|
|
8
|
+
║ ██║██║ ╚████║ ╚████╔╝ ╚██████╔╝███████║ ║
|
|
9
|
+
║ ╚═╝╚═╝ ╚═══╝ ╚═══╝ ╚═════╝ ╚══════╝ ║
|
|
10
|
+
║ ║
|
|
11
|
+
║ your AI co-founder ║
|
|
12
|
+
║ ║
|
|
13
|
+
╚══════════════════════════════════════════════════════╝
|
|
14
|
+
</pre>
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<b>Seu cofundador artificial — memória do negócio + habilidades que executam, em qualquer agente de IA.</b>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="https://github.com/felipenalves/InvOS/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
|
|
22
|
+
<a href="https://www.npmjs.com/package/invos"><img src="https://img.shields.io/npm/v/invos.svg" alt="npm version"></a>
|
|
23
|
+
<a href="https://github.com/felipenalves/InvOS"><img src="https://img.shields.io/github/stars/felipenalves/InvOS?style=social" alt="GitHub stars"></a>
|
|
24
|
+
</p>
|
|
8
25
|
|
|
9
26
|
---
|
|
10
27
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Abre o Claude Code em qualquer pasta e cola:
|
|
28
|
+
INVOS transforma qualquer agente de IA no **cofundador que você sempre quis**.
|
|
29
|
+
Ele não só entende seu negócio — ele **executa**. Prioriza o dia, rascunha
|
|
30
|
+
proposta no teu tom, audita posicionamento, cria conteúdo.
|
|
16
31
|
|
|
17
|
-
|
|
18
|
-
Clona o repositório do INVOS na pasta atual, entra nela e roda o /instalar.
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
(Quando o `npx invos` estiver no ar, o fluxo vira um comando só — install + update.)
|
|
32
|
+
---
|
|
22
33
|
|
|
23
|
-
|
|
34
|
+
## Como funciona (o fluxo)
|
|
24
35
|
|
|
36
|
+
**1. CLI cria seu projeto**
|
|
25
37
|
```bash
|
|
26
38
|
npx invos@latest init --name meu-negocio
|
|
27
|
-
cd meu-negocio
|
|
28
|
-
# abre no Claude / Cursor / Grok e roda:
|
|
29
|
-
/instalar
|
|
30
39
|
```
|
|
40
|
+
Isso gera uma pasta com a estrutura completa: memória, skills, templates.
|
|
31
41
|
|
|
32
|
-
|
|
42
|
+
**2. Você abre essa pasta no seu agente de IA favorito**
|
|
43
|
+
Claude Code, Cursor, OpenCode, Codex, Grok — qualquer um que leia
|
|
44
|
+
`AGENTS.md`. Dentro do chat do agente, roda:
|
|
33
45
|
|
|
34
|
-
```
|
|
35
|
-
|
|
46
|
+
```
|
|
47
|
+
/instalar
|
|
36
48
|
```
|
|
37
49
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
perfil (solopreneur, freela, agência, empresa). Depois é uso diário.
|
|
42
|
-
|
|
43
|
-
Quando terminar, renomeia a pasta pro nome do **teu** negócio — não fica
|
|
44
|
-
"invos" pra sempre.
|
|
50
|
+
O agente lê o `AGENTS.md`, faz uma entrevista de 5 minutos e monta a
|
|
51
|
+
memória do seu negócio: quem você é, o que vende, tom de voz,
|
|
52
|
+
prioridades da semana.
|
|
45
53
|
|
|
46
|
-
|
|
54
|
+
**3. Pronto. Seu cofundador já sabe quem você é.**
|
|
47
55
|
|
|
48
|
-
|
|
56
|
+
Agora é uso diário. Abre o projeto no agente, roda `/abrir` e ele carrega
|
|
57
|
+
o contexto. Pede o que precisar:
|
|
49
58
|
|
|
50
|
-
| Comando |
|
|
51
|
-
|
|
52
|
-
| `/abrir` | Carrega
|
|
59
|
+
| Comando | O que faz |
|
|
60
|
+
|---------|-----------|
|
|
61
|
+
| `/abrir` | Carrega seu contexto no início da sessão |
|
|
62
|
+
| `/carrossel` | Cria post educativo pro Instagram |
|
|
53
63
|
| `/salvar` | Commit + push no GitHub |
|
|
54
|
-
| `/atualizar` |
|
|
55
|
-
| `/
|
|
56
|
-
| `/
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
| `/atualizar` | Sincroniza contexto com mudanças recentes |
|
|
65
|
+
| `/analisar-dados` | Planilha → relatório com insights |
|
|
66
|
+
| `/email-profissional` | Escreve e-mail no seu tom |
|
|
67
|
+
| `/anuncio-google` | Estrutura campanha de Google Ads |
|
|
68
|
+
| `/seo` | Audita e sugere melhorias de SEO |
|
|
69
|
+
| `/mapear-rotinas` | Transforma tarefas repetitivas em skills |
|
|
70
|
+
| `/novo-projeto` | Cria pasta isolada por cliente |
|
|
71
|
+
|
|
72
|
+
Atualizar skills sem perder sua memória:
|
|
73
|
+
```bash
|
|
74
|
+
npx invos@latest update
|
|
75
|
+
```
|
|
66
76
|
|
|
67
77
|
---
|
|
68
78
|
|
|
69
|
-
##
|
|
79
|
+
## A estrutura que seu agente enxerga
|
|
70
80
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
81
|
+
```
|
|
82
|
+
projeto/
|
|
83
|
+
├── AGENTS.md ← Instruções: diz ao agente que ele é um cofundador
|
|
84
|
+
├── CLAUDE.md ← Só redireciona pra AGENTS.md (multi-harness)
|
|
85
|
+
├── _memoria/ ← Quem você é: empresa, tom de voz, foco da semana
|
|
86
|
+
├── .agents/skills/ ← Habilidades: carrossel, humanizer, ads, SEO…
|
|
87
|
+
├── marca/ ← Cores, fontes, logo (pra posts visuais)
|
|
88
|
+
├── marketing/ ← Conteúdo e campanhas que as skills geram
|
|
89
|
+
├── saidas/ ← Documentos, propostas, relatórios prontos
|
|
90
|
+
├── templates/ ← Perfis pré-formatados (solopreneur, agência…)
|
|
91
|
+
└── packages/cli/ ← Código do CLI (`npx invos`)
|
|
92
|
+
```
|
|
79
93
|
|
|
80
|
-
|
|
81
|
-
abertos (faz → esquece → reexplica).
|
|
94
|
+
Tudo em **Markdown puro** — portável, editável no VS Code, versionado no Git.
|
|
82
95
|
|
|
83
96
|
---
|
|
84
97
|
|
|
85
|
-
##
|
|
98
|
+
## Por que INVOS?
|
|
86
99
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
npx invos update
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Isso puxa o que é **kit** (skills, templates, docs de versão) e **não**
|
|
96
|
-
sobrescreve a tua memória real (`_memoria/`, clientes, marca).
|
|
97
|
-
|
|
98
|
-
Changelog / o que mudou em cada versão: pasta ou página de release
|
|
99
|
-
(comunidade + `CHANGELOG` no pack) — anuncia lá, roda o update.
|
|
100
|
+
- **Cofundador, não ferramenta:** ele sabe quem você é, o que importa hoje, e executa — prioridade, proposta, conteúdo, decisão
|
|
101
|
+
- **Funciona em qualquer agente:** Claude, Cursor, Grok, Codex, OpenCode — o cofundador te acompanha
|
|
102
|
+
- **Skills plugáveis:** carrossel de Instagram, análise de dados, humanizer, auditoria de posicionamento — ative só o que precisa
|
|
103
|
+
- **Memória viva:** seus dados ficam em Markdown no seu repo, não num banco externo. Portável, editável, sua
|
|
104
|
+
- **Grátis:** MIT. Sem lock-in, sem surpresa, sem mensalidade
|
|
100
105
|
|
|
101
106
|
---
|
|
102
107
|
|
|
103
108
|
## Licença
|
|
104
109
|
|
|
105
|
-
|
|
106
|
-
Teu negócio, teus dados, tuas skills personalizadas: teus.
|
|
107
|
-
Revender o kit como produto: não.
|
|
110
|
+
MIT — use, estude, modifique, compartilhe. Construído por [Felipe Natanael](https://github.com/felipenalves).
|
|
108
111
|
|
|
109
112
|
---
|
|
110
113
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
+
<p align="center">
|
|
115
|
+
<a href="https://github.com/felipenalves/InvOS">GitHub</a>
|
|
116
|
+
·
|
|
117
|
+
<a href="https://www.npmjs.com/package/invos">npm</a>
|
|
118
|
+
·
|
|
119
|
+
<a href="https://github.com/felipenalves/InvOS/issues">Reportar bug</a>
|
|
120
|
+
·
|
|
121
|
+
<a href="https://github.com/felipenalves/InvOS/discussions">Discussões</a>
|
|
122
|
+
</p>
|
package/kit/_memoria/empresa.md
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
# Empresa
|
|
2
2
|
|
|
3
3
|
> Memória central do negócio. O Claude lê esse arquivo antes de cada resposta.
|
|
4
|
-
> Preenchido pelo `/instalar` — você pode editar a qualquer momento.
|
|
5
4
|
|
|
6
|
-
**Nome:**
|
|
7
|
-
**Negócio:**
|
|
8
|
-
**O que faz:**
|
|
9
|
-
**Perfil:**
|
|
10
|
-
**Atende clientes:**
|
|
11
|
-
**Equipe:**
|
|
12
|
-
**Ferramentas:**
|
|
13
|
-
**Principais entregas:**
|
|
5
|
+
**Nome:** INVOS
|
|
6
|
+
**Negócio:** Framework open-source de memória + skills pra agentes de IA
|
|
7
|
+
**O que faz:** Transforma qualquer agente (Claude, Codex, Grok, OpenCode) num assistente que entende o contexto do usuário
|
|
8
|
+
**Perfil:** Open-source community project
|
|
9
|
+
**Atende clientes:** Não. Comunidade.
|
|
10
|
+
**Equipe:** Felipe Alves (founder)
|
|
11
|
+
**Ferramentas:** GitHub, npm, Claude Code, Cursor, OpenCode
|
|
12
|
+
**Principais entregas:** CLI (`npx invos`), skills pack, templates de perfil, documentação
|
|
14
13
|
|
|
15
14
|
## Contexto adicional
|
|
15
|
+
|
|
16
|
+
Projeto nasceu como produto pago (v2). Migrou pra open-source (MIT) em julho
|
|
17
|
+
2026 pra gerar audiência e comunidade. Sem intenção de monetizar diretamente —
|
|
18
|
+
o valor é construir marca e autoridade no ecossistema de agentes de IA.
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
# Estratégia
|
|
2
2
|
|
|
3
3
|
> O que importa agora. Prioridades, metas, prazos.
|
|
4
|
-
> O Claude usa isso pra decidir o que sugerir primeiro e o que adiar.
|
|
5
|
-
> Atualize sempre que as prioridades mudarem.
|
|
6
4
|
|
|
7
5
|
## Fase
|
|
8
6
|
|
|
7
|
+
Open-source launch — transição de produto pago pra framework público.
|
|
8
|
+
|
|
9
9
|
## Prioridade principal
|
|
10
10
|
|
|
11
|
+
Gerar audiência e adoção. INVOS não é mais produto vendido — é open-source
|
|
12
|
+
que constrói marca e comunidade em torno do trabalho do Felipe.
|
|
13
|
+
|
|
11
14
|
## O que pode esperar
|
|
12
15
|
|
|
16
|
+
- Estratégia de monetização direta (não vai ter)
|
|
17
|
+
- Checkout / paywall / restrição de acesso
|
|
18
|
+
- Suporte pago como produto
|
|
19
|
+
|
|
13
20
|
## Contexto com prazo
|
|
21
|
+
|
|
22
|
+
- Trocar licença de proprietária pra MIT ✓
|
|
23
|
+
- Ajustar README, package.json, manifesto ✓
|
|
24
|
+
- Comunicar mudança nas redes
|
|
25
|
+
- Atrair primeiros contribuidores e usuários
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "invos",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "INVOS
|
|
3
|
+
"version": "2.0.2",
|
|
4
|
+
"description": "INVOS — OS do negócio em arquivos. Open-source. CLI: init, install, update, doctor.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"invos": "bin/invos.js"
|
|
@@ -23,10 +23,11 @@
|
|
|
23
23
|
"invos",
|
|
24
24
|
"ai-agents",
|
|
25
25
|
"memory",
|
|
26
|
-
"business-os"
|
|
26
|
+
"business-os",
|
|
27
|
+
"open-source"
|
|
27
28
|
],
|
|
28
29
|
"author": "Felipe Alves",
|
|
29
|
-
"license": "
|
|
30
|
+
"license": "MIT",
|
|
30
31
|
"private": false,
|
|
31
32
|
"repository": {
|
|
32
33
|
"type": "git",
|
package/src/commands/doctor.js
CHANGED
|
@@ -4,6 +4,19 @@ import { loadManifest } from '../manifest.js';
|
|
|
4
4
|
import { readLock } from '../lock.js';
|
|
5
5
|
import { checkClaudeSymlinks, syncClaudeSymlinks } from '../symlinks.js';
|
|
6
6
|
|
|
7
|
+
async function askFix(hasWarnings) {
|
|
8
|
+
if (!hasWarnings) return true;
|
|
9
|
+
try {
|
|
10
|
+
const rl = await import('node:readline/promises');
|
|
11
|
+
const r = rl.createInterface({ input: process.stdin, output: process.stdout });
|
|
12
|
+
const ans = await r.question('⚠️ Doctor found issues. Apply --fix? (y/N) ');
|
|
13
|
+
r.close();
|
|
14
|
+
return ans.toLowerCase().startsWith('y');
|
|
15
|
+
} catch {
|
|
16
|
+
return false; // non-TTY — fail safe
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
export async function doctor(kit, kitRoot, targetDir, args) {
|
|
8
21
|
const fix = args.includes('--fix');
|
|
9
22
|
let ok = true;
|
|
@@ -46,8 +59,13 @@ export async function doctor(kit, kitRoot, targetDir, args) {
|
|
|
46
59
|
}
|
|
47
60
|
|
|
48
61
|
if (fix) {
|
|
49
|
-
|
|
50
|
-
|
|
62
|
+
const confirmed = await askFix(!ok);
|
|
63
|
+
if (!confirmed) {
|
|
64
|
+
r.push(' --fix: skipped (not confirmed)');
|
|
65
|
+
} else {
|
|
66
|
+
syncClaudeSymlinks(kitRoot, targetDir);
|
|
67
|
+
r.push(' --fix: symlinks');
|
|
68
|
+
}
|
|
51
69
|
}
|
|
52
70
|
|
|
53
71
|
const sym = checkClaudeSymlinks(targetDir);
|
package/src/resolve-kit.js
CHANGED
|
@@ -3,6 +3,18 @@ import { dirname, resolve } from 'node:path';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
|
|
5
5
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const INVOS_KIT_ALLOWED_DIRS = ['.']; // Only current dir or explicit path from dev
|
|
7
|
+
|
|
8
|
+
function validateKitPath(p) {
|
|
9
|
+
if (!p || typeof p !== 'string') return false;
|
|
10
|
+
const resolved = resolve(p);
|
|
11
|
+
if (!existsSync(resolved)) {
|
|
12
|
+
console.error('INVOS_KIT_PATH directory does not exist:', resolved);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (!existsSync(resolve(resolved, 'INVOS.json'))) return false;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
6
18
|
|
|
7
19
|
/**
|
|
8
20
|
* 1. INVOS_KIT_PATH
|
|
@@ -11,10 +23,12 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
11
23
|
*/
|
|
12
24
|
export function resolveKitRoot() {
|
|
13
25
|
if (process.env.INVOS_KIT_PATH) {
|
|
26
|
+
if (!validateKitPath(process.env.INVOS_KIT_PATH)) {
|
|
27
|
+
console.error('INVOS_KIT_PATH points to invalid kit directory:', process.env.INVOS_KIT_PATH);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
14
30
|
const p = resolve(process.env.INVOS_KIT_PATH);
|
|
15
|
-
|
|
16
|
-
console.error('INVOS_KIT_PATH without INVOS.json:', p);
|
|
17
|
-
process.exit(1);
|
|
31
|
+
return p;
|
|
18
32
|
}
|
|
19
33
|
|
|
20
34
|
const bundled = resolve(__dirname, '../kit');
|
package/src/symlinks.js
CHANGED
|
@@ -12,7 +12,8 @@ function listSkills(agentsDir) {
|
|
|
12
12
|
const p = resolve(agentsDir, e);
|
|
13
13
|
try {
|
|
14
14
|
return statSync(p).isDirectory() && existsSync(resolve(p, 'SKILL.md'));
|
|
15
|
-
} catch {
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.error('listSkills: skipping', e, err.message);
|
|
16
17
|
return false;
|
|
17
18
|
}
|
|
18
19
|
});
|
|
@@ -30,8 +31,8 @@ export function syncClaudeSymlinks(_kitRoot, targetRoot) {
|
|
|
30
31
|
try {
|
|
31
32
|
if (readlinkSync(linkPath) === `${REL}/${skill}`) continue;
|
|
32
33
|
unlinkSync(linkPath);
|
|
33
|
-
} catch {
|
|
34
|
-
|
|
34
|
+
} catch (err) {
|
|
35
|
+
console.error('syncClaudeSymlinks: failed to update', skill, err.message);
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
symlinkSync(`${REL}/${skill}`, linkPath);
|
package/src/utils.js
CHANGED
|
@@ -79,8 +79,12 @@ export function ensureDir(dir) {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
export function removeIfExists(path) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
try {
|
|
83
|
+
if (!existsSync(path)) return;
|
|
84
|
+
const s = statSync(path);
|
|
85
|
+
if (s.isDirectory()) rmSync(path, { recursive: true });
|
|
86
|
+
else unlinkSync(path);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
console.error('removeIfExists: could not remove', path, err.message);
|
|
89
|
+
}
|
|
86
90
|
}
|