diff --git a/.cspell.json b/.cspell.json index 6509d4e..fc7a37e 100644 --- a/.cspell.json +++ b/.cspell.json @@ -103,6 +103,7 @@ "джобу", "диспатч", "диспатча", + "доставки", "екшн", "еміт", "еміти", @@ -111,6 +112,7 @@ "ескальовано", "ескалювати", "заготовками", + "залежнісного", "залогінений", "запропонуючи", "запускувані", @@ -141,11 +143,13 @@ "мапінгом", "маршрутизуються", "машинно", + "мейнтейнера", "метаключ", "метаключі", "монтирує", "напівналаштованих", "напр", + "недовірений", "нездекларований", "нездекларованих", "неіснуючого", @@ -209,6 +213,7 @@ "скоупу", "спавнені", "спавнячи", + "стрімоване", "таймаут", "таймзони", "таймлайну", diff --git a/.github/workflows/lint-ga.yml b/.github/workflows/lint-ga.yml index 6eb4734..0f20085 100644 --- a/.github/workflows/lint-ga.yml +++ b/.github/workflows/lint-ga.yml @@ -12,6 +12,9 @@ on: branches: - dev - main + paths: + - '.github/actions/**' + - '.github/workflows/**' concurrency: group: ${{ github.ref }}-${{ github.workflow }} diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml index 4549656..7f63e18 100644 --- a/.github/workflows/lint-js.yml +++ b/.github/workflows/lint-js.yml @@ -18,6 +18,16 @@ on: branches: - dev - main + paths: + - '**/*.js' + - '**/*.mjs' + - '**/*.cjs' + - '**/*.jsx' + - '**/*.ts' + - '**/*.tsx' + - '**/*.vue' + - '**/eslint.config.*' + - '**/.oxlintrc.json' concurrency: group: ${{ github.ref }}-${{ github.workflow }} diff --git a/.github/workflows/lint-text.yml b/.github/workflows/lint-text.yml index 7dc242c..d386005 100644 --- a/.github/workflows/lint-text.yml +++ b/.github/workflows/lint-text.yml @@ -32,6 +32,28 @@ on: branches: - dev - main + paths: + - '**/*.js' + - '**/*.ts' + - '**/*.vue' + - '**/*.html' + - '**/*.css' + - '**/*.scss' + - '**/*.less' + - '**/*.json' + - '**/*.jsonc' + - '**/*.yaml' + - '**/*.yml' + - '**/*.toml' + - '**/*.xml' + - '**/*.md' + - '**/*.mdc' + - '**/*.mdс' + - '**/*.txt' + - '**/*.go' + - '**/*.py' + - '**/*.php' + - '**/*.sh' concurrency: group: ${{ github.ref }}-${{ github.workflow }} diff --git a/app/.changes/260727-1713.md b/app/.changes/260727-1713.md new file mode 100644 index 0000000..e442b8d --- /dev/null +++ b/app/.changes/260727-1713.md @@ -0,0 +1,5 @@ +--- +bump: patch +section: Fixed +--- +oxfmt-форматування PullRequestsDialog.vue / TaskGraph.vue (частина repo-wide CI фіксів) diff --git a/app/src/components/PullRequestsDialog.vue b/app/src/components/PullRequestsDialog.vue index dbdda47..ba08a02 100644 --- a/app/src/components/PullRequestsDialog.vue +++ b/app/src/components/PullRequestsDialog.vue @@ -12,13 +12,7 @@ - + @@ -29,14 +23,24 @@
{{ errorMessage }}
No pull requests in this group
-
+
- +
{{ pr.title }}
{{ pr.repository }} #{{ pr.number }} · {{ formatRelativeTime(pr.updated_at) }}
{{ pr.action }}
-
CI: {{ pr.failed_checks.join(', ') }}
+
+ CI: {{ pr.failed_checks.join(', ') }} +
Review: {{ pr.reviewers.join(', ') }}
{{ summaries[summaryKey(pr)] }}
-
{{ summaryErrors[summaryKey(pr)] }}
+
+ {{ summaryErrors[summaryKey(pr)] }} +
- {{ roleLabel(pr.role) }} + + {{ roleLabel(pr.role) }} +
@@ -99,12 +107,14 @@ const filteredPullRequests = computed(() => * @returns {{ icon: string, color: string, quasarColor: string }} visual configuration */ function categoryConfig(category) { - return { - needs_my_action: { icon: 'sym_o_error', color: '#ff453a', quasarColor: 'negative' }, - needs_my_review: { icon: 'sym_o_rate_review', color: '#ff9f0a', quasarColor: 'warning' }, - waiting_for_others: { icon: 'sym_o_schedule', color: '#0a84ff', quasarColor: 'primary' }, - assigned_to_me: { icon: 'sym_o_assignment', color: '#bf5af2', quasarColor: 'purple' } - }[category] ?? { icon: 'sym_o_help', color: '#8e8e93', quasarColor: 'grey' } + return ( + { + needs_my_action: { icon: 'sym_o_error', color: '#ff453a', quasarColor: 'negative' }, + needs_my_review: { icon: 'sym_o_rate_review', color: '#ff9f0a', quasarColor: 'warning' }, + waiting_for_others: { icon: 'sym_o_schedule', color: '#0a84ff', quasarColor: 'primary' }, + assigned_to_me: { icon: 'sym_o_assignment', color: '#bf5af2', quasarColor: 'purple' } + }[category] ?? { icon: 'sym_o_help', color: '#8e8e93', quasarColor: 'grey' } + ) } /** @@ -190,17 +200,82 @@ watch(open, isOpen => { diff --git a/app/src/components/TaskGraph.vue b/app/src/components/TaskGraph.vue index e772db3..6e93966 100644 --- a/app/src/components/TaskGraph.vue +++ b/app/src/components/TaskGraph.vue @@ -3,7 +3,14 @@
Tasks - + diff --git a/app/src/components/docs/PullRequestsDialog.md b/app/src/components/docs/PullRequestsDialog.md index 4c711c7..a8631b0 100644 --- a/app/src/components/docs/PullRequestsDialog.md +++ b/app/src/components/docs/PullRequestsDialog.md @@ -3,23 +3,32 @@ type: Vue Component title: PullRequestsDialog.vue resource: app/src/components/PullRequestsDialog.vue docgen: - crc: 14000b60 + crc: 1ee6811f + model: openai-codex/gpt-5.5 + tier: cloud-avg + score: 100 + issues: judge-refine:kept-original,judge:inaccurate:0.98 + judgeModel: openai-codex/gpt-5.4-mini --- ## Огляд -Діалог показує глобальний PR Inbox з локального GitHub CLI. Він групує pull requests за тим, чи потрібна дія автора, review користувача, дія іншої особи або робота за призначенням. +Компонент показує керований ззовні діалог зі списком pull request: `modelValue` визначає його стан, а `update:modelValue` повідомляє про зміну цього стану. Він звертається до мережі для отримання актуальних даних і використовує `agent`, щоб допомогти користувачу опрацювати вибраний pull request. У файлі немає власних операцій запису у ФС або БД. ## Поведінка -- Під час відкриття викликає Tauri-команду `list_pull_requests` і показує loading або помилку. -- Фільтрує отримані PR за категоріями без повторного мережевого запиту. -- Показує наступну дію, провалені CI checks і запитаних reviewer, якщо вони є. -- Відкриває вибраний PR у браузері користувача. -- За натисканням `LLM summary` передає read-only контекст PR у налаштований ACP-agent та показує стрімоване резюме. +Діалог керується через `modelValue`: зовнішній стан відкриття визначає, коли користувач бачить список pull request. Зміна видимості повертається назовні через `update:modelValue`, щоб батьківський компонент залишався джерелом істини для відкриття й закриття. + +Після відкриття компонент завантажує актуальні факти про pull request з локального GitHub CLI, доповнює їх візуальними категоріями й короткими ролями для карток, а посилання на вибраний pull request передає в браузер користувача. Дані можуть походити з мережі через GitHub CLI; власних записів у файлову систему або базу даних компонент не виконує. + +`agent` використовується лише для створення стислого українського підсумку вибраного pull request. Дані GitHub передаються як недовірений довідковий текст без інструкцій змінювати pull request або викликати інструменти; результат зберігається у стані конкретного pull request і показується в діалозі. + +## Публічний API + +- modelValue — визначає поточний вибраний стан, який компонент показує користувачу. +- agent — надає дані агента, потрібні для відображення його в інтерфейсі; компонент може звертатися до мережі для отримання пов’язаних даних. +- update:modelValue — повідомляє зовнішній код про зміну вибраного стану. ## Гарантії поведінки -- Компонент не змінює стан PR на GitHub. -- Категорія та дія приходять із детермінованого backend, а не генеруються в UI. -- Prompt забороняє агенту викликати інструменти й трактує body, review та comments PR як недовірений текст. +- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати. diff --git a/app/src/components/docs/TaskGraph.md b/app/src/components/docs/TaskGraph.md index 9387c2a..3e64624 100644 --- a/app/src/components/docs/TaskGraph.md +++ b/app/src/components/docs/TaskGraph.md @@ -3,32 +3,29 @@ type: Vue Component title: TaskGraph.vue resource: app/src/components/TaskGraph.vue docgen: - crc: 8366f979 - model: omlx/gemma-4-e4b-it-OptiQ-4bit + crc: 7742e2a2 + model: openai-codex/gpt-5.4-mini + tier: cloud-min + score: 100 + issues: judge-refine:kept-original,judge:inaccurate:0.98 + judgeModel: openai-codex/gpt-5.4-mini --- -Компонент відображає візуальне дерево завдань (Task Graph) для різних робочих просторів (workspaces). Він надає панель для керування, підсумковий звіт про стан завдань та деталі для вибору одного вузла графа. +## Огляд + +Файл показує робочі простори, їхні дерева задач і пов’язані артефакти, щоб перегляд графа відповідав поточному стану даних у проєкті. Також він дає окремі подання для залежностей, ledger і pipeline, щоб співвідносити вузол із його зв’язками, деталями та станом доставки. ## Поведінка -1. При ініціалізації компонента викликається функція `scanAll`, яка отримує список робочих просторів і сканує кожен із них, заповнюючи дані про вузли завдання. -2. Відстежуються зміни в файловій системі (через подію `mt-changed`); при їх отриманні запускається відкладений повторний сканування графа. -3. На панелі відображаються кнопки для дії: PR Inbox (`pullRequestsOpen`), перегляд журналу (`auditOpen`), звернення до агента (`agentOpen`), створення нового завдання (`createOpen`) та оновлення графа (`scanAll`). -4. Відображається інформація про помилки (`error`), якщо процес сканування не вдався. -5. Відображається зведений підсумок (`stateCounts`), що показує кількість завдань у кожному стані. -6. Відображається розділ "Needs attention" (`attention`), який виділяє вузли, що вимагають уваги користувача. -7. Відображаються окремо для кожного робочого простору (`workspaces`) графічні елементи завдань (`TaskNodeItem`). -8. При кліку на вузол або його залежність (`onSelect`/`onSelectDep`) відкривається детальний діалог. -9. У детальному діалозі: - - Відображається загальна інформація про вибране завдання та його стан. - - Доступні дії для вузла (`NodeActions`). - - Відображається "ланцюг артефактів" (`ArtifactChain`). - - При виборі артефакта завантажується його вміст (`taskContent`) та відображається у вікні з Markdown-рендерингом. -10. При зміні стану вузла (`onNodeChanged`) або після створення нового завдання (`onCreated`), графа та стан вибраного вузла автоматично оновлюються шляхом повторного сканування. +1. Завантажує перелік робочих просторів і їхні дерева задач, після чого оновлює граф так, щоб у ньому були видимі актуальні вузли для кожного простору. +2. Піднімає живе спостереження за файлами в активних робочих просторах, щоб зміни одразу запускали повторне сканування й граф не відставав від стану на диску. +3. Після зміни стану вузла перевідкриває його деталі вже на свіжій версії, щоб показати актуальний стан, доступні дії та ланцюжок артефактів. +4. Дозволяє відкрити деталі конкретного вузла, переглянути його артефакти та перейти від залежності до відповідного вузла в загальному дереві задач. +5. Дає змогу відкривати окремі робочі подання для залежнісного графа, ledger і статусу pipeline, щоб швидко оцінювати зв’язки, витрати часу й стан доставки. +6. Запускає одноразовий batch-прохід для вузлів, що очікують на автоматичну обробку, а результат підсумовує після завершення перевірки файлової системи. +7. Після створення нової задачі одразу оновлює граф, щоб новий вузол з’явився без ручного перезавантаження. +8. Поведінка залежить від конфігурацій у `.mt.json`, які визначають, які робочі простори та пов’язані з ними дані входять у перегляд. ## Гарантії поведінки -- Компонент гарантує, що дані про стан завдань та їх залежності відображаються з урахуванням актуальних даних після сканування. -- При відсутності робочих просторів або помилках, компонент відображає відповідні повідомлення. -- При виборі вузла, детальний перегляд містить вміст артефакту, який коректно парситься як Markdown. -- Обробляються як прямі виклики, так і зміни, спричинені зовнішніми подрами файлової системи. +- (специфічних машинно-виведених гарантій немає) diff --git a/app/src/components/docs/index.md b/app/src/components/docs/index.md index d71a525..ff58e8a 100644 --- a/app/src/components/docs/index.md +++ b/app/src/components/docs/index.md @@ -14,5 +14,6 @@ resource: app/src/components/ | [NodeActions.vue](NodeActions.md) | Vue Component | | [PipelineRunDetailsDialog.vue](PipelineRunDetailsDialog.md) | Vue Component | | [PipelineStatusDialog.vue](PipelineStatusDialog.md) | Vue Component | +| [PullRequestsDialog.vue](PullRequestsDialog.md) | Vue Component | | [TaskGraph.vue](TaskGraph.md) | Vue Component | | [TaskNodeItem.vue](TaskNodeItem.md) | Vue Component | diff --git a/k8s/teleport/ingress.yaml b/k8s/teleport/networkpolicy.yaml similarity index 81% rename from k8s/teleport/ingress.yaml rename to k8s/teleport/networkpolicy.yaml index 8b3dd87..6bce8da 100644 --- a/k8s/teleport/ingress.yaml +++ b/k8s/teleport/networkpolicy.yaml @@ -3,6 +3,8 @@ kind: NetworkPolicy metadata: name: teleport namespace: teleport + annotations: + nitra.dev/workload-kind: StatefulSet spec: podSelector: matchLabels: @@ -13,6 +15,10 @@ spec: ingress: - from: - podSelector: {} + # intra-replica (StatefulSet pod ↔ pod у тому ж namespace) + - from: + - podSelector: + matchLabels: {} egress: - to: - namespaceSelector: @@ -65,3 +71,7 @@ spec: port: 4317 - protocol: TCP port: 4318 + # intra-replica (StatefulSet pod ↔ pod у тому ж namespace) + - to: + - podSelector: + matchLabels: {} diff --git a/knip.json b/knip.json index ab71abe..eab8126 100644 --- a/knip.json +++ b/knip.json @@ -1,7 +1,7 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", "project": ["**/*.{js,mjs,cjs,jsx,ts,tsx,mts,cts}"], - "ignore": ["**/__fixtures__/**", ".pi/extensions/n-cursor-adr/**", "app/src-tauri/target/**"], + "ignore": ["**/__fixtures__/**", ".pi/extensions/**", "app/src-tauri/target/**"], "ignoreDependencies": [ "@nitra/cspell-dict", "/@cspell\\/dict-.+/", @@ -9,7 +9,10 @@ "@nitra/stylelint-config", "@stryker-mutator/command-runner", "@vue/compiler-sfc", - "@vue/test-utils" + "@vue/test-utils", + "@7n/rules-ci-github", + "@7n/rules-lang-js", + "@7n/rules-lang-rust" ], "ignoreExportsUsedInFile": true, "ignoreBinaries": [