invos 1.0.0 → 2.0.1
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 +21 -28
- package/bin/invos.js +33 -27
- package/kit/.agents/skills/abrir/SKILL.md +41 -0
- package/kit/.agents/skills/analisar-dados/SKILL.md +95 -0
- package/kit/.agents/skills/anuncio-google/SKILL.md +174 -0
- package/kit/.agents/skills/aprovar-post/SKILL.md +151 -0
- package/kit/.agents/skills/atualizar/SKILL.md +57 -0
- package/kit/.agents/skills/canvas-design/LICENSE.txt +202 -0
- package/kit/.agents/skills/canvas-design/SKILL.md +134 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/kit/.agents/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/kit/.agents/skills/carrossel/SKILL.md +272 -0
- package/kit/.agents/skills/email-profissional/SKILL.md +70 -0
- package/kit/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/kit/.agents/skills/frontend-design/SKILL.md +55 -0
- package/kit/.agents/skills/instalar/SKILL.md +170 -0
- package/kit/.agents/skills/mapear-rotinas/SKILL.md +75 -0
- package/kit/.agents/skills/notion/SKILL.md +134 -0
- package/kit/.agents/skills/novo-projeto/SKILL.md +94 -0
- package/kit/.agents/skills/publicar-tema/SKILL.md +154 -0
- package/kit/.agents/skills/relatorio-ads/SKILL.md +163 -0
- package/kit/.agents/skills/responder-avaliacoes/SKILL.md +100 -0
- package/kit/.agents/skills/salvar/SKILL.md +49 -0
- package/kit/.agents/skills/seo/SKILL.md +310 -0
- package/kit/.agents/skills/youtube-summarizer/SKILL.md +223 -0
- package/kit/.agents/squads/README.md +84 -0
- package/kit/.agents/squads/hormozi-squad/README.md +1 -2
- package/kit/AGENTS.md +95 -137
- package/kit/INVOS.json +25 -17
- package/kit/LICENSE +54 -0
- package/kit/README.md +63 -384
- package/kit/_memoria/empresa.md +15 -0
- package/kit/_memoria/estrategia.md +13 -0
- package/kit/_memoria/preferencias.md +12 -0
- package/kit/dados/README.md +15 -0
- package/kit/marca/design-guide.md +59 -0
- package/kit/marketing/README.md +44 -0
- package/kit/saidas/README.md +29 -0
- package/kit/scripts/README.md +51 -0
- package/kit/templates/perfis/agents-agencia.md +70 -0
- package/kit/templates/perfis/agents-empresa.md +75 -0
- package/kit/templates/perfis/agents-freelancer.md +68 -0
- package/kit/templates/perfis/agents-solopreneur.md +68 -0
- package/package.json +7 -13
- package/src/commands/doctor.js +46 -79
- package/src/commands/init.js +35 -24
- package/src/commands/install.js +16 -20
- package/src/commands/update.js +28 -66
- package/src/lock.js +9 -11
- package/src/manifest.js +1 -1
- package/src/resolve-kit.js +11 -10
- package/src/symlinks.js +34 -52
- package/src/utils.js +38 -65
- package/kit/.agents/skills/apple/DESCRIPTION.md +0 -2
- package/kit/.agents/skills/apple/apple-notes/SKILL.md +0 -90
- package/kit/.agents/skills/apple/apple-reminders/SKILL.md +0 -130
- package/kit/.agents/skills/audit/SKILL.md +0 -177
- package/kit/.agents/skills/design-marca/SKILL.md +0 -92
- package/kit/.agents/skills/instagram-carrossel/SKILL.md +0 -79
- package/kit/.agents/skills/instagram-carrossel/references/fetch-assets.md +0 -77
- package/kit/.agents/skills/instagram-carrossel/references/publish.md +0 -48
- package/kit/.agents/skills/instagram-carrossel/references/render-png.md +0 -147
- package/kit/.agents/skills/instagram-carrossel/scripts/publish.js +0 -165
- package/kit/.agents/skills/llm-wiki/SKILL.md +0 -507
- package/kit/.agents/skills/onboard/SKILL.md +0 -152
- package/kit/.agents/skills/pd-ikigai/SKILL.md +0 -269
- package/kit/.agents/skills/productivity/DESCRIPTION.md +0 -3
- package/kit/.agents/skills/productivity/google-workspace/SKILL.md +0 -335
- package/kit/.agents/skills/productivity/google-workspace/references/gmail-search-syntax.md +0 -63
- package/kit/.agents/skills/productivity/google-workspace/scripts/_hermes_home.py +0 -42
- package/kit/.agents/skills/productivity/google-workspace/scripts/google_api.py +0 -1225
- package/kit/.agents/skills/productivity/google-workspace/scripts/gws_bridge.py +0 -111
- package/kit/.agents/skills/productivity/google-workspace/scripts/setup.py +0 -481
- package/kit/.agents/skills/productivity/nano-pdf/SKILL.md +0 -52
- package/kit/.agents/skills/productivity/notion/SKILL.md +0 -448
- package/kit/.agents/skills/productivity/notion/references/block-types.md +0 -112
- package/kit/.agents/skills/productivity/ocr-and-documents/DESCRIPTION.md +0 -3
- package/kit/.agents/skills/productivity/ocr-and-documents/SKILL.md +0 -172
- package/kit/.agents/skills/productivity/ocr-and-documents/scripts/extract_marker.py +0 -87
- package/kit/.agents/skills/productivity/ocr-and-documents/scripts/extract_pymupdf.py +0 -98
- package/kit/.agents/skills/productivity/powerpoint/LICENSE.txt +0 -30
- package/kit/.agents/skills/productivity/powerpoint/SKILL.md +0 -237
- package/kit/.agents/skills/productivity/powerpoint/editing.md +0 -205
- package/kit/.agents/skills/productivity/powerpoint/pptxgenjs.md +0 -420
- package/kit/.agents/skills/productivity/powerpoint/scripts/__init__.py +0 -0
- package/kit/.agents/skills/productivity/powerpoint/scripts/add_slide.py +0 -195
- package/kit/.agents/skills/productivity/powerpoint/scripts/clean.py +0 -286
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/helpers/__init__.py +0 -0
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/helpers/merge_runs.py +0 -199
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/helpers/simplify_redlines.py +0 -197
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/pack.py +0 -159
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-contentTypes.xsd +0 -42
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-coreProperties.xsd +0 -50
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-digSig.xsd +0 -49
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-relationships.xsd +0 -33
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/mce/mc.xsd +0 -75
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/kit/.agents/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/kit/.agents/skills/proposta/SKILL.md +0 -159
- package/kit/.agents/skills/proposta/references/proposta-avancada.md +0 -17
- package/kit/.agents/skills/proposta/references/proposta.html +0 -187
- package/kit/.agents/skills/session-checkpoint/SKILL.md +0 -80
- package/kit/.agents/skills/session-end/SKILL.md +0 -166
- package/kit/.agents/skills/session-start/SKILL.md +0 -149
- package/kit/.agents/skills/social-content/SKILL.md +0 -119
- package/kit/.agents/skills/stop-slop/CHANGELOG.md +0 -24
- package/kit/.agents/skills/stop-slop/LICENSE +0 -21
- package/kit/.agents/skills/stop-slop/README.md +0 -62
- package/kit/.agents/skills/stop-slop/SKILL.md +0 -68
- package/kit/.agents/skills/stop-slop/references/examples.md +0 -59
- package/kit/.agents/skills/stop-slop/references/phrases.md +0 -128
- package/kit/.agents/skills/stop-slop/references/structures.md +0 -134
- package/kit/.agents/squads/index.md +0 -14
- package/kit/.agents/squads/instagram-carrossel/DEPENDENCIES.md +0 -75
- package/kit/.agents/squads/instagram-carrossel/README.md +0 -52
- package/kit/.agents/squads/instagram-carrossel/RUN.md +0 -115
- package/kit/.agents/squads/instagram-carrossel/_memory/memories.md +0 -16
- package/kit/.agents/squads/instagram-carrossel/agents/copywriter/tasks/create-slides.md +0 -96
- package/kit/.agents/squads/instagram-carrossel/agents/copywriter/tasks/generate-angles.md +0 -111
- package/kit/.agents/squads/instagram-carrossel/agents/copywriter/tasks/optimize-copy.md +0 -81
- package/kit/.agents/squads/instagram-carrossel/agents/copywriter.custom.md +0 -73
- package/kit/.agents/squads/instagram-carrossel/agents/image-designer/tasks/create-slides.md +0 -132
- package/kit/.agents/squads/instagram-carrossel/agents/image-designer/tasks/propose-visual-identities.md +0 -89
- package/kit/.agents/squads/instagram-carrossel/agents/image-designer/tasks/render-export.md +0 -100
- package/kit/.agents/squads/instagram-carrossel/agents/image-designer.custom.md +0 -47
- package/kit/.agents/squads/instagram-carrossel/agents/publisher/tasks/validate-publish.md +0 -50
- package/kit/.agents/squads/instagram-carrossel/agents/publisher.custom.md +0 -26
- package/kit/.agents/squads/instagram-carrossel/agents/researcher/tasks/find-and-rank-news.md +0 -105
- package/kit/.agents/squads/instagram-carrossel/agents/researcher.custom.md +0 -46
- package/kit/.agents/squads/instagram-carrossel/agents/reviewer/tasks/generate-feedback.md +0 -91
- package/kit/.agents/squads/instagram-carrossel/agents/reviewer/tasks/score-content.md +0 -103
- package/kit/.agents/squads/instagram-carrossel/agents/reviewer.custom.md +0 -53
- package/kit/.agents/squads/instagram-carrossel/output/.gitkeep +0 -0
- package/kit/.agents/squads/instagram-carrossel/output/slides/.gitkeep +0 -0
- package/kit/.agents/squads/instagram-carrossel/output/slides/rendered/.gitkeep +0 -0
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/anti-patterns.md +0 -125
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/domain-framework.md +0 -92
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/instagram-feed-best-practices.md +0 -235
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/output-examples.md +0 -244
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/quality-criteria.md +0 -120
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/research-brief.md +0 -135
- package/kit/.agents/squads/instagram-carrossel/pipeline/data/tone-of-voice.md +0 -32
- package/kit/.agents/squads/instagram-carrossel/pipeline/pipeline.yaml +0 -136
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-01-input-content.md +0 -38
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-02-find-news.md +0 -42
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-03-select-story.md +0 -59
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-04-generate-angles.md +0 -45
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-05-select-angle.md +0 -64
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-06-create-copy.md +0 -51
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-07-approve-copy.md +0 -52
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-08-propose-visuals.md +0 -42
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-09-select-visual.md +0 -61
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-10-create-slides.md +0 -55
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-11-approve-images.md +0 -60
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-12-review.md +0 -55
- package/kit/.agents/squads/instagram-carrossel/pipeline/steps/step-13-publish.md +0 -79
- package/kit/.agents/squads/instagram-carrossel/squad-party.csv +0 -6
- package/kit/.agents/squads/instagram-carrossel/squad.yaml +0 -70
- package/kit/COMECE-AQUI.md +0 -207
- package/kit/MEMORY.md +0 -31
- package/kit/SECURITY.md +0 -39
- package/kit/clientes/README.md +0 -72
- package/kit/clientes/_index.md +0 -32
- package/kit/clientes/_template/arquivos/.gitkeep +0 -0
- package/kit/clientes/_template/contexto.md +0 -21
- package/kit/clientes/_template/entregas.md +0 -20
- package/kit/clientes/_template/perfil.md +0 -47
- package/kit/clientes/_template/propostas/.gitkeep +0 -0
- package/kit/conteudo/README.md +0 -12
- package/kit/conteudo/_fila.md +0 -12
- package/kit/conteudo/carrosseis/.gitkeep +0 -0
- package/kit/conteudo/publicados/.gitkeep +0 -0
- package/kit/docs/audit-enxugamento-sieve.md +0 -187
- package/kit/docs/cli.md +0 -62
- package/kit/docs/hotmart-webhook.md +0 -96
- package/kit/docs/lab-user.md +0 -35
- package/kit/docs/prd-invos-cli.md +0 -264
- package/kit/integracoes/README.md +0 -31
- package/kit/integracoes/composio/README.md +0 -128
- package/kit/integracoes/composio/marketing-tools.md +0 -61
- package/kit/marca/README.md +0 -13
- package/kit/marca/assets/.gitkeep +0 -0
- package/kit/marca/marca.md +0 -57
- package/kit/memoria/ativo.md +0 -18
- package/kit/memoria/decisoes.md +0 -26
- package/kit/memoria/empresa.md +0 -46
- package/kit/memoria/historico/README.md +0 -8
- package/kit/memoria/insights.md +0 -11
- package/kit/memoria/perfil.md +0 -29
- package/kit/memoria/projetos.md +0 -27
- package/kit/memoria/regras/_TEMPLATE-exemplo.md +0 -15
- package/kit/memoria/regras/task-com-dono.md +0 -18
- package/kit/scripts/smoke-estado.sh +0 -32
- package/kit/scripts/validar.sh +0 -206
package/src/commands/install.js
CHANGED
|
@@ -1,41 +1,37 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
collectFiles, copyFileWithDirs, shouldCopyOnInstall, isDevPath,
|
|
5
|
+
} from '../utils.js';
|
|
4
6
|
import { buildLock, readLock, writeLock } from '../lock.js';
|
|
5
7
|
import { syncClaudeSymlinks } from '../symlinks.js';
|
|
6
8
|
|
|
7
|
-
export async function install(kit, kitRoot, targetDir
|
|
8
|
-
|
|
9
|
-
const allFiles = collectFiles(kitRoot, '', true);
|
|
10
|
-
const files = allFiles.filter(f => !isDevPath(f.relPath));
|
|
9
|
+
export async function install(kit, kitRoot, targetDir) {
|
|
10
|
+
const files = collectFiles(kitRoot, '', true).filter(f => !isDevPath(f.relPath));
|
|
11
11
|
let copied = 0;
|
|
12
12
|
let skipped = 0;
|
|
13
13
|
|
|
14
14
|
for (const f of files) {
|
|
15
15
|
const dest = resolve(targetDir, f.relPath);
|
|
16
|
-
if (shouldCopyOnInstall(dest)) {
|
|
17
|
-
if (!existsSync(dest)) {
|
|
18
|
-
ensureDir(dest.substring(0, dest.lastIndexOf('/')) || dest);
|
|
19
|
-
}
|
|
16
|
+
if (shouldCopyOnInstall(dest) && !existsSync(dest)) {
|
|
20
17
|
copyFileWithDirs(f.fullPath, dest);
|
|
21
18
|
copied++;
|
|
22
|
-
} else {
|
|
19
|
+
} else if (existsSync(dest) && !shouldCopyOnInstall(dest)) {
|
|
20
|
+
skipped++;
|
|
21
|
+
} else if (existsSync(dest)) {
|
|
23
22
|
skipped++;
|
|
23
|
+
} else {
|
|
24
|
+
copyFileWithDirs(f.fullPath, dest);
|
|
25
|
+
copied++;
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
if (existingLock) {
|
|
31
|
-
lock.installedAt = existingLock.installedAt;
|
|
32
|
-
lock.custom = existingLock.custom || {};
|
|
33
|
-
}
|
|
29
|
+
const existing = readLock(targetDir);
|
|
30
|
+
const lock = buildLock(kitRoot, kit.version || '2.0.0', existing?.custom || {});
|
|
31
|
+
if (existing?.installedAt) lock.installedAt = existing.installedAt;
|
|
34
32
|
writeLock(targetDir, lock);
|
|
35
|
-
|
|
36
|
-
// Symlinks
|
|
37
33
|
syncClaudeSymlinks(kitRoot, targetDir);
|
|
38
34
|
|
|
39
|
-
console.log(`✓ invos install — ${copied}
|
|
35
|
+
console.log(`✓ invos install — ${copied} new, ${skipped} kept`);
|
|
40
36
|
console.log(' Run: npx invos doctor');
|
|
41
37
|
}
|
package/src/commands/update.js
CHANGED
|
@@ -1,70 +1,53 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
collectFiles, copyFileWithDirs, shouldOverwriteOnUpdate,
|
|
5
|
+
sha256File, isDenylisted, isDevPath,
|
|
6
|
+
} from '../utils.js';
|
|
4
7
|
import { readLock, updateLockShipped, writeLock } from '../lock.js';
|
|
5
8
|
import { syncClaudeSymlinks } from '../symlinks.js';
|
|
6
9
|
|
|
7
10
|
export async function update(kit, kitRoot, targetDir, args) {
|
|
8
11
|
const dryRun = args.includes('--dry-run');
|
|
9
12
|
const lock = readLock(targetDir);
|
|
10
|
-
|
|
11
13
|
if (!lock) {
|
|
12
|
-
console.error('INVOS-LOCK.json
|
|
14
|
+
console.error('INVOS-LOCK.json missing. Run: npx invos install');
|
|
13
15
|
process.exit(1);
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
console.log(` source: ${kitRoot} (bundled/local — no token)`);
|
|
19
|
+
|
|
20
|
+
const files = collectFiles(kitRoot, '', true).filter(f => !isDevPath(f.relPath));
|
|
17
21
|
let updated = 0;
|
|
18
22
|
let skipped = 0;
|
|
19
|
-
let
|
|
23
|
+
let agentsNote = false;
|
|
20
24
|
|
|
21
25
|
for (const f of files) {
|
|
22
|
-
const dest = resolve(targetDir, f.relPath);
|
|
23
26
|
const rel = f.relPath;
|
|
27
|
+
const dest = resolve(targetDir, rel);
|
|
24
28
|
|
|
25
|
-
// USER denylist check
|
|
26
29
|
if (isDenylisted(rel)) {
|
|
27
30
|
skipped++;
|
|
28
31
|
continue;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
|
-
// Special: AGENTS.md custom handling
|
|
32
34
|
if (rel === 'AGENTS.md' && existsSync(dest)) {
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (customDecision === 'skip') {
|
|
35
|
+
const a = sha256File(f.fullPath);
|
|
36
|
+
const b = sha256File(dest);
|
|
37
|
+
if (a !== b) {
|
|
38
|
+
const decision = lock.custom?.['AGENTS.md'];
|
|
39
|
+
if (decision === 'replace') {
|
|
39
40
|
if (!dryRun) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
console.warn('⚠️ AGENTS.md custom — backup em AGENTS.md.shipped.bak (respecting skip lock)');
|
|
43
|
-
agentsBackedUp = true;
|
|
44
|
-
}
|
|
45
|
-
skipped++;
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
if (customDecision === 'replace' || !existsSync(dest)) {
|
|
49
|
-
// Replace: just overwrite (handled below)
|
|
50
|
-
if (!dryRun) {
|
|
51
|
-
const bakPath = resolve(targetDir, 'AGENTS.md.shipped.bak');
|
|
52
|
-
writeFileSync(bakPath, readFileSync(dest));
|
|
53
|
-
console.warn('⚠️ AGENTS.md custom — backup em AGENTS.md.shipped.bak (replacing)');
|
|
54
|
-
agentsBackedUp = true;
|
|
41
|
+
writeFileSync(resolve(targetDir, 'AGENTS.md.local.bak'), readFileSync(dest));
|
|
42
|
+
console.warn('⚠️ AGENTS.md → replace (local.bak)');
|
|
55
43
|
}
|
|
56
44
|
} else {
|
|
57
|
-
// First time seeing divergence — warn and skip
|
|
58
45
|
if (!dryRun) {
|
|
59
|
-
|
|
60
|
-
writeFileSync(bakPath, readFileSync(f.fullPath));
|
|
61
|
-
console.warn('⚠️ AGENTS.md custom — backup em AGENTS.md.shipped.bak');
|
|
62
|
-
console.warn(' Next update will respect lock. Run again with --dry-run after setting:');
|
|
63
|
-
console.warn(' "invos update" → replace | "invos update --skip-agents" → skip');
|
|
64
|
-
|
|
65
|
-
// Write to lock: ask user decision
|
|
46
|
+
writeFileSync(resolve(targetDir, 'AGENTS.md.shipped.bak'), readFileSync(f.fullPath));
|
|
66
47
|
lock.custom = lock.custom || {};
|
|
67
|
-
lock.custom['AGENTS.md'] = 'skip';
|
|
48
|
+
lock.custom['AGENTS.md'] = 'skip';
|
|
49
|
+
console.warn('⚠️ AGENTS.md custom — shipped.bak; skip (lock)');
|
|
50
|
+
agentsNote = true;
|
|
68
51
|
}
|
|
69
52
|
skipped++;
|
|
70
53
|
continue;
|
|
@@ -72,42 +55,21 @@ export async function update(kit, kitRoot, targetDir, args) {
|
|
|
72
55
|
}
|
|
73
56
|
}
|
|
74
57
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
skipped++;
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Overwrite PRODUCT files
|
|
82
|
-
if (!existsSync(dest) || shouldOverwriteOnUpdate(rel, dest, lock)) {
|
|
83
|
-
if (!dryRun) {
|
|
84
|
-
copyFileWithDirs(f.fullPath, dest);
|
|
85
|
-
}
|
|
58
|
+
if (!existsSync(dest) || shouldOverwriteOnUpdate(rel, dest)) {
|
|
59
|
+
if (!dryRun) copyFileWithDirs(f.fullPath, dest);
|
|
86
60
|
updated++;
|
|
87
61
|
} else {
|
|
88
62
|
skipped++;
|
|
89
63
|
}
|
|
90
64
|
}
|
|
91
65
|
|
|
92
|
-
// Update lock
|
|
93
66
|
if (!dryRun) {
|
|
94
|
-
updateLockShipped(kitRoot, lock);
|
|
67
|
+
updateLockShipped(kitRoot, lock, kit.version);
|
|
95
68
|
writeLock(targetDir, lock);
|
|
96
69
|
syncClaudeSymlinks(kitRoot, targetDir);
|
|
97
70
|
}
|
|
98
71
|
|
|
99
|
-
console.log(`✓ invos update${dryRun ? ' (dry-run)' : ''} — ${updated}
|
|
100
|
-
|
|
101
|
-
if (
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function shouldSkipSeedPlaceholder(rel, destPath) {
|
|
105
|
-
// Only skip template files that are STILL placeholders
|
|
106
|
-
const templateFiles = ['marca/marca.md', 'memoria/perfil.md', 'memoria/empresa.md'];
|
|
107
|
-
if (!templateFiles.includes(rel)) return false;
|
|
108
|
-
|
|
109
|
-
const content = readFileSync(destPath, 'utf-8');
|
|
110
|
-
const templateMarkers = ['[o que', '[seu nome]', 'PREENCHA', 'primeira sessão'];
|
|
111
|
-
const lower = content.toLowerCase();
|
|
112
|
-
return !templateMarkers.some(m => lower.includes(m));
|
|
72
|
+
console.log(`✓ invos update${dryRun ? ' (dry-run)' : ''} — ${updated} updated, ${skipped} skipped (USER ok)`);
|
|
73
|
+
console.log(` kit ${kit.version || '?'}`);
|
|
74
|
+
if (agentsNote) console.log(' set INVOS-LOCK custom.AGENTS.md=replace to force AGENTS');
|
|
113
75
|
}
|
package/src/lock.js
CHANGED
|
@@ -1,38 +1,35 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import { sha256File, collectFiles
|
|
4
|
-
import { loadManifest } from './manifest.js';
|
|
3
|
+
import { sha256File, collectFiles } from './utils.js';
|
|
5
4
|
|
|
6
5
|
export function readLock(targetDir) {
|
|
7
6
|
const path = resolve(targetDir, 'INVOS-LOCK.json');
|
|
8
7
|
if (!existsSync(path)) return null;
|
|
9
8
|
try {
|
|
10
|
-
return JSON.parse(readFileSync(path, '
|
|
9
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
11
10
|
} catch {
|
|
12
11
|
return null;
|
|
13
12
|
}
|
|
14
13
|
}
|
|
15
14
|
|
|
16
15
|
export function writeLock(targetDir, data) {
|
|
17
|
-
|
|
18
|
-
writeFileSync(path, JSON.stringify(data, null, 2) + '\n');
|
|
16
|
+
writeFileSync(resolve(targetDir, 'INVOS-LOCK.json'), JSON.stringify(data, null, 2) + '\n');
|
|
19
17
|
}
|
|
20
18
|
|
|
21
19
|
export function computeShippedSha(kitRoot) {
|
|
22
|
-
const files = collectFiles(kitRoot, '', true);
|
|
23
20
|
const shipped = {};
|
|
24
|
-
// INVOS.json itself
|
|
25
21
|
shipped['INVOS.json'] = sha256File(resolve(kitRoot, 'INVOS.json'));
|
|
26
|
-
for (const f of
|
|
22
|
+
for (const f of collectFiles(kitRoot, '', true)) {
|
|
23
|
+
if (f.relPath.startsWith('packages/')) continue;
|
|
27
24
|
shipped[f.relPath] = sha256File(f.fullPath);
|
|
28
25
|
}
|
|
29
26
|
return shipped;
|
|
30
27
|
}
|
|
31
28
|
|
|
32
|
-
export function buildLock(kitRoot,
|
|
29
|
+
export function buildLock(kitRoot, kitVersion = '2.0.0', custom = {}) {
|
|
33
30
|
const now = new Date().toISOString();
|
|
34
31
|
return {
|
|
35
|
-
version:
|
|
32
|
+
version: kitVersion,
|
|
36
33
|
shippedSha: computeShippedSha(kitRoot),
|
|
37
34
|
custom,
|
|
38
35
|
installedAt: now,
|
|
@@ -40,8 +37,9 @@ export function buildLock(kitRoot, targetDir, custom = {}) {
|
|
|
40
37
|
};
|
|
41
38
|
}
|
|
42
39
|
|
|
43
|
-
export function updateLockShipped(kitRoot, lock) {
|
|
40
|
+
export function updateLockShipped(kitRoot, lock, kitVersion) {
|
|
44
41
|
lock.shippedSha = computeShippedSha(kitRoot);
|
|
45
42
|
lock.updatedAt = new Date().toISOString();
|
|
43
|
+
if (kitVersion) lock.version = kitVersion;
|
|
46
44
|
return lock;
|
|
47
45
|
}
|
package/src/manifest.js
CHANGED
package/src/resolve-kit.js
CHANGED
|
@@ -5,29 +5,30 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 3. Monorepo layout: packages/cli → invos root
|
|
8
|
+
* 1. INVOS_KIT_PATH
|
|
9
|
+
* 2. packages/cli/kit (bundled — npm)
|
|
10
|
+
* 3. parent InvOS.v2 root (dev)
|
|
12
11
|
*/
|
|
13
12
|
export function resolveKitRoot() {
|
|
14
13
|
if (process.env.INVOS_KIT_PATH) {
|
|
15
14
|
const p = resolve(process.env.INVOS_KIT_PATH);
|
|
16
15
|
if (existsSync(resolve(p, 'INVOS.json'))) return p;
|
|
17
|
-
console.error('INVOS_KIT_PATH
|
|
16
|
+
console.error('INVOS_KIT_PATH without INVOS.json:', p);
|
|
18
17
|
process.exit(1);
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
const bundled = resolve(__dirname, '../kit');
|
|
22
21
|
if (existsSync(resolve(bundled, 'INVOS.json'))) return bundled;
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
// packages/cli → ../.. = InvOS.v2 root
|
|
24
|
+
const v2 = resolve(__dirname, '../..');
|
|
25
|
+
if (existsSync(resolve(v2, 'INVOS.json'))) return v2;
|
|
26
26
|
|
|
27
27
|
console.error(`
|
|
28
|
-
INVOS
|
|
29
|
-
-
|
|
30
|
-
-
|
|
28
|
+
Kit INVOS v2 não encontrado.
|
|
29
|
+
- Dev: rode a partir de InvOS.v2 (tem INVOS.json na raiz)
|
|
30
|
+
- Publish: npm run bundle-kit
|
|
31
|
+
- Override: export INVOS_KIT_PATH=/path/to/InvOS.v2
|
|
31
32
|
`);
|
|
32
33
|
process.exit(1);
|
|
33
34
|
}
|
package/src/symlinks.js
CHANGED
|
@@ -1,78 +1,60 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
existsSync, mkdirSync, symlinkSync, unlinkSync, readlinkSync,
|
|
3
|
+
readdirSync, statSync,
|
|
4
|
+
} from 'node:fs';
|
|
2
5
|
import { resolve, dirname } from 'node:path';
|
|
3
6
|
|
|
4
|
-
const
|
|
7
|
+
const REL = '../../.agents/skills';
|
|
5
8
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const skills = manifest.seed?.skills || [];
|
|
9
|
+
function listSkills(agentsDir) {
|
|
10
|
+
if (!existsSync(agentsDir)) return [];
|
|
11
|
+
return readdirSync(agentsDir).filter(e => {
|
|
12
|
+
const p = resolve(agentsDir, e);
|
|
13
|
+
try {
|
|
14
|
+
return statSync(p).isDirectory() && existsSync(resolve(p, 'SKILL.md'));
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
18
20
|
|
|
21
|
+
export function syncClaudeSymlinks(_kitRoot, targetRoot) {
|
|
22
|
+
const agentsDir = resolve(targetRoot, '.agents', 'skills');
|
|
23
|
+
const claudeDir = resolve(targetRoot, '.claude', 'skills');
|
|
24
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
19
25
|
mkdirSync(claudeDir, { recursive: true });
|
|
20
26
|
|
|
21
|
-
for (const skill of
|
|
22
|
-
const target = resolve(agentsDir, skill);
|
|
27
|
+
for (const skill of listSkills(agentsDir)) {
|
|
23
28
|
const linkPath = resolve(claudeDir, skill);
|
|
24
|
-
|
|
25
|
-
if (!existsSync(target)) continue;
|
|
26
|
-
|
|
27
29
|
if (existsSync(linkPath)) {
|
|
28
30
|
try {
|
|
29
|
-
|
|
30
|
-
if (existing === `${CLAUDE_SKILLS_RELPATH}/${skill}`) continue;
|
|
31
|
+
if (readlinkSync(linkPath) === `${REL}/${skill}`) continue;
|
|
31
32
|
unlinkSync(linkPath);
|
|
32
33
|
} catch {
|
|
33
|
-
unlinkSync(linkPath);
|
|
34
|
+
try { unlinkSync(linkPath); } catch { /* ignore */ }
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
-
symlinkSync(`${CLAUDE_SKILLS_RELPATH}/${skill}`, linkPath);
|
|
37
|
+
symlinkSync(`${REL}/${skill}`, linkPath);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export function checkClaudeSymlinks(targetRoot) {
|
|
42
|
+
const agentsDir = resolve(targetRoot, '.agents', 'skills');
|
|
42
43
|
const claudeDir = resolve(targetRoot, '.claude', 'skills');
|
|
43
|
-
|
|
44
|
+
const expected = listSkills(agentsDir);
|
|
45
|
+
if (!expected.length) return { ok: false, errors: ['.agents/skills empty'] };
|
|
46
|
+
if (!existsSync(claudeDir)) return { ok: false, errors: ['.claude/skills missing'] };
|
|
44
47
|
|
|
45
48
|
const errors = [];
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
entries = readdirSync(claudeDir);
|
|
49
|
-
} catch { return { ok: false, errors: ['.claude/skills/ unreadable'] }; }
|
|
50
|
-
|
|
51
|
-
for (const entry of entries) {
|
|
52
|
-
const linkPath = resolve(claudeDir, entry);
|
|
49
|
+
for (const s of expected) {
|
|
50
|
+
const link = resolve(claudeDir, s);
|
|
53
51
|
try {
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
// Resolve target — must exist and be a dir with SKILL.md
|
|
58
|
-
if (!existsSync(absTarget)) {
|
|
59
|
-
errors.push(`${entry}: target missing (${target})`);
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
const st = statSync(absTarget);
|
|
63
|
-
if (!st.isDirectory()) {
|
|
64
|
-
errors.push(`${entry}: target not a directory (${target})`);
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
// Nested skills like apple-notes → ../../.agents/skills/apple/apple-notes
|
|
68
|
-
// are valid if the resolved target has SKILL.md
|
|
69
|
-
if (!existsSync(resolve(absTarget, 'SKILL.md'))) {
|
|
70
|
-
errors.push(`${entry}: target has no SKILL.md (${target})`);
|
|
71
|
-
}
|
|
52
|
+
const t = readlinkSync(link);
|
|
53
|
+
const abs = resolve(dirname(link), t);
|
|
54
|
+
if (!existsSync(resolve(abs, 'SKILL.md'))) errors.push(`${s}: broken`);
|
|
72
55
|
} catch {
|
|
73
|
-
errors.push(`${
|
|
56
|
+
errors.push(`${s}: not a symlink`);
|
|
74
57
|
}
|
|
75
58
|
}
|
|
76
|
-
|
|
77
59
|
return { ok: errors.length === 0, errors };
|
|
78
60
|
}
|
package/src/utils.js
CHANGED
|
@@ -1,87 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
existsSync, statSync, readdirSync, readFileSync,
|
|
3
|
+
mkdirSync, copyFileSync, rmSync, unlinkSync,
|
|
4
|
+
} from 'node:fs';
|
|
5
|
+
import { resolve, dirname } from 'node:path';
|
|
3
6
|
import { createHash } from 'node:crypto';
|
|
4
7
|
|
|
5
|
-
function
|
|
6
|
-
// Skip hidden system files, keep essential dot dirs
|
|
8
|
+
function skipDot(name) {
|
|
7
9
|
if (name === '.agents') return false;
|
|
8
|
-
if (name === '.gitignore' || name === '.env.example') return false;
|
|
9
|
-
if (name === '.gitkeep') return false;
|
|
10
|
-
// .claude is managed via symlinks only, never copy
|
|
10
|
+
if (name === '.gitignore' || name === '.env.example' || name === '.gitkeep') return false;
|
|
11
11
|
if (name === '.claude') return true;
|
|
12
12
|
return name.startsWith('.');
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/** USER — never overwrite on update */
|
|
15
16
|
export function isDenylisted(relPath) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
if (
|
|
22
|
-
if (
|
|
23
|
-
if (
|
|
24
|
-
if (
|
|
25
|
-
if (
|
|
26
|
-
if (parts[0] === 'packages') return true;
|
|
27
|
-
if (parts[0] === 'docs' && parts[1] === 'prd-invos-cli.md') return true;
|
|
28
|
-
// .claude/skills is managed via symlinks only
|
|
29
|
-
if (parts[0] === '.claude') return true;
|
|
17
|
+
const p = relPath.split('/');
|
|
18
|
+
if (p[0] === '.git' || p[0] === 'node_modules' || p[0] === 'packages') return true;
|
|
19
|
+
if (p[0] === 'INVOS-LOCK.json' || p[0] === '.env' || p[0] === '.claude') return true;
|
|
20
|
+
if (p[0] === '_memoria' || p[0] === 'memoria') return true;
|
|
21
|
+
if (p[0] === 'clientes') return true;
|
|
22
|
+
if (p[0] === 'conteudo') return true;
|
|
23
|
+
if (p[0] === 'marketing' && p.length > 1 && p[1] !== 'README.md') return true;
|
|
24
|
+
if (p[0] === 'saidas' && p.length > 1 && p[1] !== 'README.md') return true;
|
|
25
|
+
if (p[0] === 'dados' && p.length > 1 && p[1] !== 'README.md') return true;
|
|
26
|
+
if (p[0] === 'marca' && p[1] && p[1] !== 'README.md') return true;
|
|
30
27
|
return false;
|
|
31
28
|
}
|
|
32
29
|
|
|
33
|
-
// Paths that belong to dev infrastructure, never to be installed into a user dir
|
|
34
30
|
export function isDevPath(relPath) {
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
if (
|
|
38
|
-
if (
|
|
39
|
-
if (parts[0] === '.claude') return true;
|
|
40
|
-
if (parts[0] === 'docs' && parts[1] === 'prd-invos-cli.md') return true;
|
|
31
|
+
const p = relPath.split('/');
|
|
32
|
+
if (p[0] === 'packages' || p[0] === 'node_modules' || p[0] === '.git') return true;
|
|
33
|
+
if (p[0] === '.claude') return true;
|
|
34
|
+
if (p[0] === 'kit') return true;
|
|
41
35
|
return false;
|
|
42
36
|
}
|
|
43
37
|
|
|
44
|
-
export function isTemplatePlaceholder(content) {
|
|
45
|
-
if (!content || content.trim().length === 0) return true;
|
|
46
|
-
const lines = content.trim().split('\n').filter(l => l.trim());
|
|
47
|
-
if (lines.length === 0) return true;
|
|
48
|
-
// Check common template markers
|
|
49
|
-
const templateMarkers = ['[o que', '[seu nome]', 'PREENCHA', 'primeira sessão'];
|
|
50
|
-
const firstLines = lines.slice(0, 3).join(' ').toLowerCase();
|
|
51
|
-
return templateMarkers.some(m => firstLines.includes(m));
|
|
52
|
-
}
|
|
53
|
-
|
|
54
38
|
export function shouldCopyOnInstall(destPath) {
|
|
55
39
|
if (!existsSync(destPath)) return true;
|
|
56
|
-
// If it's a directory, always copy contents (deep merge)
|
|
57
40
|
if (statSync(destPath).isDirectory()) return true;
|
|
58
41
|
return false;
|
|
59
42
|
}
|
|
60
43
|
|
|
61
|
-
export function shouldOverwriteOnUpdate(relPath, destPath
|
|
44
|
+
export function shouldOverwriteOnUpdate(relPath, destPath) {
|
|
62
45
|
if (!existsSync(destPath)) return true;
|
|
63
|
-
// Denylist never overwrites
|
|
64
46
|
if (isDenylisted(relPath)) return false;
|
|
65
47
|
return true;
|
|
66
48
|
}
|
|
67
49
|
|
|
68
50
|
export function collectFiles(sourceDir, prefix = '', skipDenylist = false) {
|
|
69
|
-
const
|
|
70
|
-
if (!existsSync(sourceDir)) return
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
results.push(...collectFiles(fullPath, relPath, skipDenylist));
|
|
51
|
+
const out = [];
|
|
52
|
+
if (!existsSync(sourceDir)) return out;
|
|
53
|
+
for (const entry of readdirSync(sourceDir)) {
|
|
54
|
+
if (skipDot(entry)) continue;
|
|
55
|
+
const full = resolve(sourceDir, entry);
|
|
56
|
+
const rel = prefix ? `${prefix}/${entry}` : entry;
|
|
57
|
+
if (!skipDenylist && isDenylisted(rel)) continue;
|
|
58
|
+
if (statSync(full).isDirectory()) {
|
|
59
|
+
if (entry === 'node_modules' || entry === 'packages' || entry === 'kit') continue;
|
|
60
|
+
out.push(...collectFiles(full, rel, skipDenylist));
|
|
80
61
|
} else {
|
|
81
|
-
|
|
62
|
+
out.push({ relPath: rel, fullPath: full });
|
|
82
63
|
}
|
|
83
64
|
}
|
|
84
|
-
return
|
|
65
|
+
return out;
|
|
85
66
|
}
|
|
86
67
|
|
|
87
68
|
export function copyFileWithDirs(src, dest) {
|
|
@@ -90,8 +71,7 @@ export function copyFileWithDirs(src, dest) {
|
|
|
90
71
|
}
|
|
91
72
|
|
|
92
73
|
export function sha256File(filePath) {
|
|
93
|
-
|
|
94
|
-
return createHash('sha256').update(data).digest('hex');
|
|
74
|
+
return createHash('sha256').update(readFileSync(filePath)).digest('hex');
|
|
95
75
|
}
|
|
96
76
|
|
|
97
77
|
export function ensureDir(dir) {
|
|
@@ -101,13 +81,6 @@ export function ensureDir(dir) {
|
|
|
101
81
|
export function removeIfExists(path) {
|
|
102
82
|
if (!existsSync(path)) return;
|
|
103
83
|
const s = statSync(path);
|
|
104
|
-
if (s.isDirectory()) {
|
|
105
|
-
|
|
106
|
-
} else {
|
|
107
|
-
unlinkSync(path);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function isClaudeProject(root) {
|
|
112
|
-
return existsSync(resolve(root, 'CLAUDE.md'));
|
|
84
|
+
if (s.isDirectory()) rmSync(path, { recursive: true, force: true });
|
|
85
|
+
else unlinkSync(path);
|
|
113
86
|
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: apple-notes
|
|
3
|
-
description: "Manage Apple Notes via memo CLI: create, search, edit."
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
author: Hermes Agent
|
|
6
|
-
license: MIT
|
|
7
|
-
platforms: [macos]
|
|
8
|
-
metadata:
|
|
9
|
-
hermes:
|
|
10
|
-
tags: [Notes, Apple, macOS, note-taking]
|
|
11
|
-
related_skills: [obsidian]
|
|
12
|
-
prerequisites:
|
|
13
|
-
commands: [memo]
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# Apple Notes
|
|
17
|
-
|
|
18
|
-
Use `memo` to manage Apple Notes directly from the terminal. Notes sync across all Apple devices via iCloud.
|
|
19
|
-
|
|
20
|
-
## Prerequisites
|
|
21
|
-
|
|
22
|
-
- **macOS** with Notes.app
|
|
23
|
-
- Install: `brew tap antoniorodr/memo && brew install antoniorodr/memo/memo`
|
|
24
|
-
- Grant Automation access to Notes.app when prompted (System Settings → Privacy → Automation)
|
|
25
|
-
|
|
26
|
-
## When to Use
|
|
27
|
-
|
|
28
|
-
- User asks to create, view, or search Apple Notes
|
|
29
|
-
- Saving information to Notes.app for cross-device access
|
|
30
|
-
- Organizing notes into folders
|
|
31
|
-
- Exporting notes to Markdown/HTML
|
|
32
|
-
|
|
33
|
-
## When NOT to Use
|
|
34
|
-
|
|
35
|
-
- Obsidian vault management → use the `obsidian` skill
|
|
36
|
-
- Bear Notes → separate app (not supported here)
|
|
37
|
-
- Quick agent-only notes → use the `memory` tool instead
|
|
38
|
-
|
|
39
|
-
## Quick Reference
|
|
40
|
-
|
|
41
|
-
### View Notes
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
memo notes # List all notes
|
|
45
|
-
memo notes -f "Folder Name" # Filter by folder
|
|
46
|
-
memo notes -s "query" # Search notes (fuzzy)
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Create Notes
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
memo notes -a # Interactive editor
|
|
53
|
-
memo notes -a "Note Title" # Quick add with title
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Edit Notes
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
memo notes -e # Interactive selection to edit
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Delete Notes
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
memo notes -d # Interactive selection to delete
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Move Notes
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
memo notes -m # Move note to folder (interactive)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Export Notes
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
memo notes -ex # Export to HTML/Markdown
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Limitations
|
|
81
|
-
|
|
82
|
-
- Cannot edit notes containing images or attachments
|
|
83
|
-
- Interactive prompts require terminal access (use pty=true if needed)
|
|
84
|
-
- macOS only — requires Apple Notes.app
|
|
85
|
-
|
|
86
|
-
## Rules
|
|
87
|
-
|
|
88
|
-
1. Prefer Apple Notes when user wants cross-device sync (iPhone/iPad/Mac)
|
|
89
|
-
2. Use the `memory` tool for agent-internal notes that don't need to sync
|
|
90
|
-
3. Use the `obsidian` skill for Markdown-native knowledge management
|