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": [