From 5f711f562b9b5bf329e893869ea3d16b1e841555 Mon Sep 17 00:00:00 2001 From: LeoAnders Date: Mon, 26 Jan 2026 00:13:15 -0300 Subject: [PATCH] Docs: improve onboarding docs --- AGENTS.md | 73 ++++++++++++++++++++++ CONTRIBUTING.md | 90 ++++++++++++++------------- README.md | 10 +++ images/logo-consistem-horizontal.png | Bin 0 -> 8978 bytes src/AGENTS.md | 44 +++++++++++++ src/ccs/AGENTS.md | 72 +++++++++++++++++++++ 6 files changed, 247 insertions(+), 42 deletions(-) create mode 100644 AGENTS.md create mode 100644 images/logo-consistem-horizontal.png create mode 100644 src/AGENTS.md create mode 100644 src/ccs/AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..945d5ce6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,73 @@ +# Repository Guidelines + +## Quick Links + +- `package.json` (commands, settings, contributes) +- `src/extension.ts` (activation + registration hub) +- `src/ccs/index.ts` (Consistem fork entrypoints) + +## Project Structure & Module Organization + +- `src/`: TypeScript source for the VS Code extension. + - `src/commands/`, `src/providers/`, `src/explorer/`, `src/api/`, `src/utils/`: feature modules. + - `src/test/`: extension integration test harness. +- `src/ccs/`: **Consistem fork layer** (custom commands/providers/integrations kept isolated to reduce upstream merge conflicts). +- `syntaxes/` and `language-configuration*.json*`: language grammar + editor configuration for ObjectScript. +- `snippets/`: VS Code snippet definitions. +- `webview/`: webview assets used by the extension UI. +- `images/`: icons and documentation images. +- `test-fixtures/`: workspace fixtures used by integration tests. + +## Consistem Fork Notes (Merge-Safe Customizations) + +- Prefer implementing Consistem-only behavior inside `src/ccs/` and wiring it up from `src/extension.ts` (command registration, providers, settings). +- This fork talks to **two** server surfaces: + - Official upstream integration via Atelier (`/api/atelier/...`) for standard features. + - Consistem internal SourceControl API under `src/ccs/sourcecontrol/` (default base path: `/api/sourcecontrol/vscode`), derived from the active Atelier connection and optionally overridden via `objectscript.ccs.endpoint`. +- If you must change upstream-owned modules, keep the diff small and route Consistem logic through `src/ccs/` to make future upstream updates easier. + +## Hierarchical Agent Instructions + +This repo uses “Hierarchical Agent Instructions”: folders may contain their own `AGENTS.md` with **more specific** rules. + +- When working on files under a directory, follow the closest `AGENTS.md` in that directory tree. +- This repository keeps a minimal, common structure: + - Root `AGENTS.md` (general rules and contributor guide) + - `src/AGENTS.md` (TypeScript/VS Code extension conventions) + - `src/ccs/AGENTS.md` (Consistem fork layer conventions) + +## Build, Test, and Development Commands + +- `npm install`: installs dependencies (also runs `postinstall` to sync VS Code API typings). +- `npm run compile`: production build (`webpack` + `tsc`). +- `npm run webpack-dev`: development bundle in watch mode. +- `npm run watch`: TypeScript watch build (useful for typechecking). +- `npm test`: runs integration tests via `@vscode/test-electron` (downloads VS Code and installs dependent extensions). +- `npm run lint` / `npm run lint-fix`: runs ESLint on `src/**`. +- `npm run package`: produces a `.vsix` via `vsce package`. + +For interactive debugging, use VS Code’s `Run and Debug` launch config (see `.vscode/launch.json`) to start an “Extension Development Host”. + +## Dependency Changes + +- Prefer reusing existing dependencies; adding new runtime deps increases extension size and supply-chain surface area. +- When you do add/remove deps, keep `package.json` and `package-lock.json` in sync and ensure `npm run compile` stays clean. + +## Coding Style & Naming Conventions + +- Indentation: 2 spaces (see `.editorconfig`). +- Formatting: Prettier settings in `.prettierrc` (e.g., `printWidth: 120`). +- Linting: ESLint flat config in `eslint.config.mjs`; keep changes lint-clean. +- Prefer descriptive names; keep VS Code command IDs under the existing `vscode-objectscript.*` namespace. + +## Testing Guidelines + +- Framework: Mocha (TDD UI) running inside a VS Code test instance. +- Location/pattern: add tests in `src/test/suite/` using `*.test.ts` naming. +- Keep tests hermetic: rely on `test-fixtures/` instead of a real server when possible. + +## Commit & Pull Request Guidelines + +- Commit messages typically use an imperative subject and often include a PR reference, e.g. `Fix unit test failure (#73)`. +- Work on a branch (not `master`). PRs should include: problem statement, approach, testing notes, and screenshots for UI/webview changes. +- Keep CI green; governance requires PMC review/approvals (see `GOVERNANCE.md` and `CONTRIBUTING.md`). If a change is user-facing, update `CHANGELOG.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7b1e9d62..7943eb81 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,67 +1,73 @@ -# Contributing to the ObjectScript extension for Visual Studio Code +# Contribuindo para o `vscode-objectscript` (fork Consistem) -## Contributing a pull request +Este repositório é um fork do `intersystems-community/vscode-objectscript`. As customizações da Consistem devem, sempre que possível, ficar isoladas em `src/ccs/` para reduzir conflitos quando atualizarmos o upstream. -### Prerequisites +## Pré-requisitos 1. [Node.js](https://nodejs.org/) 18.x -1. Windows, macOS, or Linux -1. [Visual Studio Code](https://code.visualstudio.com/) -1. The following VS Code extensions: - - [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) - - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) - - [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) +2. Windows, macOS ou Linux +3. [Visual Studio Code](https://code.visualstudio.com/) +4. Extensões do VS Code: + - [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + - [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) -### Setup +## Setup -```shell -git clone https://github.com/intersystems-community/vscode-objectscript +```sh +git clone https://github.com/consistem/vscode-objectscript cd vscode-objectscript npm install ``` -### Errors and Warnings +## Fluxo de Desenvolvimento -TypeScript errors and warnings will be displayed in the `PROBLEMS` panel of Visual Studio Code. +- Abra a pasta do projeto no VS Code. +- Use `Run and Debug` → `Launch Extension` (ou `Launch Extension Alone`) para abrir um `[Extension Development Host]` e validar as mudanças. +- Erros/avisos TypeScript aparecem no painel `PROBLEMS`. -### Editing code snippets +Comandos úteis: -Code snippets are defined in files in the /snippets/ folder: - -* objectscript-class.json - snippets for class definition context -* objectscript.json - snippets for objectscript context -* objectscript.json - snippets for consistem objectscript context - -Snippets syntax is described [here](https://code.visualstudio.com/docs/editor/userdefinedsnippets). - -### Run dev build and validate your changes +```sh +npm run compile # build de produção (webpack + tsc) +npm run webpack-dev # build em watch (webpack) +npm run watch # typecheck em watch (tsc) +npm run lint # ESLint em src/** +npm test # testes de integração (VS Code + Mocha) +``` -To test changes, open the `vscode-objectscript` folder in VSCode. -Then, open the debug panel by clicking the `Run and Debug` icon on the Activity Bar, select the `Launch Extension` -option from the top menu, and click start. A new window will launch with the title -`[Extension Development Host]`. Do your testing here. +## Snippets -If you want to disable all other extensions when testing in the Extension Development Host, choose the `Launch Extension Alone` option instead. +Os snippets ficam em `snippets/`: -### Pull requests +- `snippets/objectscript-class.json`: contexto de definição de classes +- `snippets/objectscript.json`: ObjectScript (geral) +- `snippets/consistem-objectscript.json`: snippets específicos do fork Consistem -Work should be done on a unique branch -- not the master branch. Pull requests require the approval of two PMC members, as described in the [Governance document](GOVERNANCE.md). PMC review is often high level, so in addition to that, you should request a review by someone familiar with the technical details of your particular pull request. +Referência de sintaxe: https://code.visualstudio.com/docs/editor/userdefinedsnippets -We do expect CI to be passing for a pull request before we will consider merging it. CI executed by pull requests will produce a `vsix` file, which can be downloaded and installed manually to test proposed functionality. +## Customizações Consistem (src/ccs) -## Beta versions +- Implementações específicas devem morar em `src/ccs/` (comandos, providers e integrações internas). +- Conexões internas são derivadas da conexão ativa do Atelier, com override opcional por `objectscript.ccs.endpoint`. +- Quando uma feature “substitui” comportamento padrão (ex.: F12/Ctrl+Click), mantenha fallback para o comportamento nativo do VS Code quando a resolução interna falhar. -Any change to `master` branch will call CI, which will produce [beta release](https://github.com/intersystems-community/vscode-objectscript/releases), which can be manually installed. +## Branches, Commits e Pull Requests -## Local Build +- Trabalhe em uma branch (não faça commit direto em `master`). +- Branches principais: + - `master`: linha principal (CI e releases). + - `prerelease`: linha de pré-release (quando aplicável). +- Commits: siga o padrão do histórico do repositório (assunto imperativo; muitas vezes com referência `(#NN)`). +- PRs devem incluir: descrição objetiva, motivação, como testar (passos), e screenshots para alterações visuais (webview/UI). +- O CI precisa estar verde; PRs geram artefatos `.vsix` nos workflows do GitHub Actions para teste manual. -Steps to build the extension on your machine once you've cloned the repo: +## Build Local (VSIX) -```bash -> npm install -g vsce -# Perform the next steps in the vscode-objectscript folder. -> npm install -> npm run package +```sh +npm install -g vsce +npm install +npm run package ``` -Resulting in a `vscode-objectscript-$VERSION.vsix` file in your `vscode-objectscript` folder. +Isso gera um arquivo `vscode-objectscript-$VERSION.vsix` na raiz do projeto. diff --git a/README.md b/README.md index 94a6dacf..7ea3882d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +

+ Consistem +

+ +> **Fork Consistem:** esta extensão é um fork do projeto oficial [`intersystems-community/vscode-objectscript`](https://github.com/intersystems-community/vscode-objectscript). +> +> Ele preserva todas as funcionalidades do projeto original e adiciona integrações, ajustes e padrões internos adotados pela Consistem, com foco em atender necessidades específicas do nosso ecossistema de desenvolvimento. + +--- + [![Known Vulnerabilities](https://snyk.io/test/github/intersystems-community/vscode-objectscript/badge.svg)](https://snyk.io/test/github/intersystems-community/vscode-objectscript) ![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/intersystems-community.vscode-objectscript.svg) [![](https://img.shields.io/visual-studio-marketplace/i/intersystems-community.vscode-objectscript.svg)](https://marketplace.visualstudio.com/items?itemName=intersystems-community.vscode-objectscript) diff --git a/images/logo-consistem-horizontal.png b/images/logo-consistem-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..29b42c8bd3d805e51d83501511db37be44a93422 GIT binary patch literal 8978 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 d{W}*u_UzpVUk?L6=>iIwfsToGl_os){{T