diff --git a/agent-ops/roadmap/ROADMAP.md b/agent-ops/roadmap/ROADMAP.md index b855232..ec73061 100644 --- a/agent-ops/roadmap/ROADMAP.md +++ b/agent-ops/roadmap/ROADMAP.md @@ -4,58 +4,58 @@ NomadCode는 Flutter 기반 앱, core 서비스, 공유 계약, agent-operation 규칙을 하나의 원레포로 묶어 AI-assisted development workflow를 조율하는 프로젝트다. -현재 로드맵은 기존 `services/core/README.md`의 단계별 다음 작업을 `agent-ops/roadmap/` 구조로 옮긴 뒤, 클라이언트 전략을 Flutter-first로 재정렬한 것이다. React/Vite 웹 콘솔 제거와 Flutter 앱 기준 클라이언트 정리, provider-neutral work item pipeline 설계는 완료되었다. 현재는 Flutter 앱에 섞인 Mattermost push notification migration을 별도 `mattermost-push-plugin` Flutter plugin repo로 분리하는 작업을 최상위 진행 항목으로 둔다. 이후 core 백엔드 오케스트레이션의 workflow 상태 전이 안정화, 외부 통합, Flutter-first 프로젝트 제어 UX를 이어간다. IOP 연결은 NomadCode가 직접 모델 런타임을 소유하지 않고 IOP의 외부 입력 표면을 호출하는 방향으로 정리한다. +현재 로드맵은 `ROADMAP.md -> phase//PHASE.md -> phase//milestones/.md` scaffold를 기준으로 관리한다. React/Vite 웹 콘솔 제거, 서버/Plane/provider 기반 작업, Flutter-first 클라이언트 정리는 완료되었고, Mattermost push plugin extraction은 사용자 완료 확인과 archive 승인 전의 검토중 상태다. 이후 core workflow 안정화, 외부 통합, Flutter-first 프로젝트 제어 UX를 이어간다. ## Phase 흐름 -- Client Platform Consolidation: React/Vite 웹 콘솔을 제품 UI 경로에서 걷어내고 Flutter 앱을 NomadCode 클라이언트 source of truth로 정리한다. -- Mattermost Push Plugin Extraction: Flutter 앱에 직접 들어간 Mattermost push notification Dart/API, Android native service, Room DB, notification resource를 `../mattermost-push-plugin` Flutter plugin repo로 분리하고 앱 통합 경계를 정리한다. -- Server Skeleton: 서버 실행 골격, task 저장 구조, 비동기 job 실행, Adapter stub을 구성한다. -- Plane Communication Foundation: Plane self-hosted 인스턴스와 통신하기 위한 인증, API client, 외부 참조 저장, smoke 검증 토대를 만든다. -- Work Item Provider Pipeline Design: Plane/Jira 등 work item provider와 core task 사이의 생성, enqueue, 상태 투영, 결과 발행 계약을 provider-neutral하게 정리한다. -- Workflow Core: Plane task pipeline 설계가 정리된 뒤 상태 전이, retry, timeout, notification event의 기본 구조를 안정화한다. -- External Integration: Plane 통신 토대와 workflow core 이후 Mattermost, Agent Integrator, IOP OpenAI API Responses-compatible 호출을 실제 통합 흐름으로 확장한다. -- Project Workspace Management UX: Flutter-first 클라이언트 구조 위에서 Project/Session/Workspace 방향을 유지하면서 앱 기반 프로젝트 단위 제어 화면을 정리한다. +위에서 아래로 진행된 순서와 예정 흐름을 나타낸다. +완료된 Phase도 로드맵에서 제거하지 않고, archive의 Phase 문서로 연결한다. +검토중 또는 진행중 Phase는 계획 Phase보다 위에 두어, 아래로 갈수록 미래 계획에 가까워지게 정렬한다. -## Milestone 목록 - -### Mattermost Push Plugin Extraction - -- [Mattermost Push Plugin Extraction](milestones/mattermost-push-plugin-extraction.md) - 상태: 진행 중; 목표: Flutter 앱에 섞인 Mattermost push notification migration을 `../mattermost-push-plugin` 독립 Flutter plugin repo로 분리하고 NomadCode 앱은 plugin consumer로 전환한다. - -### Workflow Core - -- [Workflow Core](milestones/workflow-core.md) - 상태: 진행 중; 목표: 실제 e2e 흐름을 기준으로 task lifecycle, retry, timeout, notification event를 안정화한다. - -### External Integration - -- [External Integration](milestones/external-integration.md) - 상태: 계획; 목표: Plane 확장, Mattermost, Agent Integrator, IOP OpenAI API Responses-compatible 호출을 실제 통합 흐름으로 확장한다. - -### Project Workspace Management UX - -- [Project Workspace Management UX](milestones/project-workspace-management-ux.md) - 상태: 계획; 목표: Flutter-first 클라이언트 구조 위에서 프로젝트 단위 제어 UX를 앱 기반 desktop/mobile layout 기준으로 정리한다. - -## 아카이브 Milestone 요약 - -- Server Skeleton - 상태: 완료; 아카이브일: 2026-05-24; 요약: core 서버 실행 골격, task 저장, 비동기 job, 초기 외부 Adapter stub을 구성했다.; 핵심 산출물/근거: 모든 필수 기능과 완료 기준이 체크되어 있으며 server 실행, task API/storage, River job, Plane/Mattermost stub이 기록되어 있다.; 후속 영향: Plane Communication Foundation과 후속 workflow/provider 작업의 기반이 되었다. -- Plane Communication Foundation - 상태: 완료; 아카이브일: 2026-05-24; 요약: Plane self-hosted 인스턴스와의 인증/API 통신, 외부 참조 저장, 수동 smoke 검증 토대를 만들었다.; 핵심 산출물/근거: 모든 필수 기능과 완료 기준이 체크되어 있으며 Plane adapter 테스트, external ref 저장, 실제 comment/state smoke, README/운영 문서 근거가 기록되어 있다.; 후속 영향: Work Item Provider Pipeline Design과 Workflow Core의 선행 기반이 되었다. -- Flutter-first Client Consolidation - 상태: 완료; 아카이브일: 2026-05-25; 요약: Flutter 앱을 제품 UI 기준 구현으로 세우고 React/Vite 웹 콘솔 scaffold를 제거했다.; 핵심 산출물/근거: `apps/web` 제거, root `bin/*`의 Flutter-first 검증 흐름, Flutter code-server 직접 실행 표면, `packages/contracts` 계약 후보 문서가 반영되어 있다.; 후속 영향: Project Workspace Management UX와 사용자-facing task state UX의 기반이 되었다. -- Work Item Provider Pipeline Design - 상태: 완료; 아카이브일: 2026-05-25; 요약: Plane/Jira 등 work item provider와 core task 사이의 생성, enqueue, 상태 투영, 결과 발행 계약을 provider-neutral하게 정리했다.; 핵심 산출물/근거: 모든 필수 기능과 완료 기준이 체크되어 있으며 provider-neutral adapter, task mapper, pipeline service, projection/idempotency/retry 정책이 기록되어 있다.; 후속 영향: Workflow Core가 상태 전이 구현을 시작할 수 있는 기준이 되었다. +- [완료] Server Skeleton + - 경로: `agent-ops/roadmap/archive/phase/server-skeleton/PHASE.md` + - 요약: core 서버 실행 골격, task 저장 구조, 비동기 job 실행, Adapter stub을 구성했다. +- [완료] Plane Communication Foundation + - 경로: `agent-ops/roadmap/archive/phase/plane-communication-foundation/PHASE.md` + - 요약: Plane self-hosted 인스턴스와 통신하기 위한 인증, API client, 외부 참조 저장, smoke 검증 토대를 만들었다. +- [완료] Client Platform Consolidation + - 경로: `agent-ops/roadmap/archive/phase/client-platform-consolidation/PHASE.md` + - 요약: React/Vite 웹 콘솔을 제품 UI 경로에서 걷어내고 Flutter 앱을 NomadCode 클라이언트 source of truth로 정리했다. +- [완료] Work Item Provider Pipeline Design + - 경로: `agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/PHASE.md` + - 요약: Plane/Jira 등 work item provider와 core task 사이의 생성, enqueue, 상태 투영, 결과 발행 계약을 provider-neutral하게 정리했다. +- [검토중] Mattermost Push Plugin Extraction + - 경로: `agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md` + - 요약: Flutter 앱에 섞인 Mattermost push notification migration을 `../mattermost-push-plugin` Flutter plugin repo로 분리했고, 사용자 완료 확인과 archive 승인을 기다린다. +- [진행중] Workflow Core + - 경로: `agent-ops/roadmap/phase/workflow-core/PHASE.md` + - 요약: 실제 e2e 흐름을 기준으로 task lifecycle, retry, timeout, notification event를 안정화한다. +- [계획] External Integration + - 경로: `agent-ops/roadmap/phase/external-integration/PHASE.md` + - 요약: Plane 확장, Mattermost, Agent Integrator, IOP OpenAI API Responses-compatible 호출을 실제 통합 흐름으로 확장한다. +- [계획] Project Workspace Management UX + - 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md` + - 요약: Flutter-first 클라이언트 구조 위에서 프로젝트 단위 제어 UX를 앱 기반 desktop/mobile layout 기준으로 정리한다. ## 로딩 정책 - 일반 작업에서는 `agent-ops/roadmap/ROADMAP.md`를 매번 읽지 않는다. - 기능 추가, 구조 변경, 스킬 추가/수정, 문서 구조 변경 작업을 수행할 때는 `agent-ops/roadmap/current.md`를 먼저 읽는다. -- `current.md`는 현재 작업 위치가 아니라 활성 Milestone 후보 목록이다. +- `current.md`는 현재 작업 위치가 아니라 활성 Phase와 활성 Milestone 후보 목록이다. - `current.md`에는 개인별 현재 작업 위치나 완료 상태를 기록하지 않는다. -- `current.md`의 활성 Milestone은 `agent-ops/roadmap/milestones/` 하위 문서만 가리키며, `agent-ops/roadmap/archive/**`는 포함하지 않는다. -- 요청 내용, 현재 브랜치, 변경 파일, 관련 코드 경로를 보고 가장 관련 있는 활성 Milestone 문서를 같은 세션에서 1회 읽는다. -- 활성 Milestone 밖의 작업이면 이 문서의 Milestone 목록을 확인하고 사용자에게 진행 또는 전환 여부를 확인한다. -- 이 문서는 로드맵 생성/갱신, Phase 전환, Milestone 추가/수정 요청이 있을 때만 읽는다. -- 상세 작업과 완료 기준은 각 Milestone 문서의 체크리스트로 관리한다. -- 완료 또는 폐기되어 아카이브된 Milestone은 이 문서의 `아카이브 Milestone 요약`에 당시 요약만 남기고, 아카이브 문서 링크나 상세 경로는 남기지 않는다. -- 상세 문서가 있는 `agent-ops/roadmap/archive/**`는 사용자가 명시적으로 요청한 경우에만 읽는다. -- 아카이브된 Milestone 문서는 최신 템플릿이나 스킬 규약에 맞춰 재포맷하지 않는다. +- `current.md`의 활성 Phase는 `agent-ops/roadmap/phase//PHASE.md`를 가리킨다. +- `current.md`의 활성 Milestone은 `agent-ops/roadmap/phase//milestones/.md`를 가리킨다. +- `current.md`는 `agent-ops/roadmap/archive/**` 경로를 활성 항목으로 포함하지 않는다. +- 요청 내용, 현재 브랜치, 변경 파일, 관련 코드 경로를 보고 가장 관련 있는 활성 Phase와 Milestone 문서를 같은 세션에서 1회 읽는다. +- 활성 Phase 또는 Milestone 밖의 작업이면 이 문서의 Phase 흐름을 확인하고 사용자에게 진행 또는 전환 여부를 확인한다. +- 이 문서는 로드맵 생성/갱신, Phase 전환, Phase 추가/수정, 전체 구조 변경 요청이 있을 때만 읽는다. +- 상세 작업과 완료 기준은 각 Milestone 문서의 `필수 기능`, `완료 기준`으로 관리한다. +- 모든 필수 작업과 완료 기준이 충족된 Milestone은 먼저 `[검토중]`으로 두고, 사용자 완료 확인과 archive 승인을 받은 뒤 `[완료]`로 전환한다. +- 완료된 Phase는 `agent-ops/roadmap/archive/phase//PHASE.md`로 이동하고, 하위 Milestone도 같은 archive Phase scaffold 아래에 둔다. +- 진행중 Phase 안에서 완료된 Milestone은 활성 Phase 문서에 짧은 링크를 남기고, 상세 문서는 `agent-ops/roadmap/archive/phase//milestones/`로 이동한다. +- archive `PHASE.md`는 Phase 자체가 완료 또는 폐기될 때만 만들며, 진행중 Phase의 완료 Milestone만 archive된 경우 archive Phase 디렉터리에 `milestones/`만 있을 수 있다. +- `agent-ops/roadmap/archive/**`는 일반 작업에서 읽지 않는다. 과거 완료 내용, 완료 근거, 복원, 비교가 필요한 경우에만 `ROADMAP.md` 또는 `PHASE.md`의 archive 링크를 따라가서 읽는다. +- 아카이브된 Phase/Milestone 문서는 최신 템플릿이나 스킬 규약에 맞춰 재포맷하지 않는다. - 선택된 Milestone의 `구현 잠금` 섹션이 없거나 상태가 `잠금`이면 코드 구현, `agent-task` 구현 계획 생성, 세부 API/파일 구조 확정을 시작하기 전에 현재 요청에 직접 영향을 주는 `결정 필요` 항목만 확인한다. - 현재 요청과 직접 관련 없는 미정 항목은 잠금 상태로 남겨도 되며, 기존 구조/도메인 rule/플랫폼 관례로 정할 수 있는 작업은 표준선으로 기록하고 진행할 수 있다. - Milestone 전체에서 사용자만 결정할 항목이 더 이상 없고 에이전트가 표준선에 따라 실행하면 되는 상태라면 `구현 잠금` 상태를 `해제`로 둔다. diff --git a/agent-ops/roadmap/archive/phase/client-platform-consolidation/PHASE.md b/agent-ops/roadmap/archive/phase/client-platform-consolidation/PHASE.md new file mode 100644 index 0000000..2b64361 --- /dev/null +++ b/agent-ops/roadmap/archive/phase/client-platform-consolidation/PHASE.md @@ -0,0 +1,20 @@ +# Phase: Client Platform Consolidation + +## 상태 + +[완료] + +## 목표 + +React/Vite 웹 콘솔을 제품 UI 경로에서 제거하고 Flutter 앱을 NomadCode 클라이언트 source of truth로 정리한다. + +## Milestone 흐름 + +- [완료] Flutter-first Client Consolidation + - 경로: `agent-ops/roadmap/archive/phase/client-platform-consolidation/milestones/flutter-first-client-consolidation.md` + - 요약: `apps/web` 제거, root `bin/*` Flutter-first 검증 흐름, Flutter code-server 실행 표면, `packages/contracts` 계약 후보 문서를 반영했다. + +## Phase 경계 + +- 이 문서는 기존 archive Milestone을 새 Phase scaffold에 연결하기 위한 archive index다. +- 상세 완료 근거는 하위 archive Milestone 스냅샷을 따른다. diff --git a/agent-ops/roadmap/archive/2026/05/flutter-first-client-consolidation.md b/agent-ops/roadmap/archive/phase/client-platform-consolidation/milestones/flutter-first-client-consolidation.md similarity index 100% rename from agent-ops/roadmap/archive/2026/05/flutter-first-client-consolidation.md rename to agent-ops/roadmap/archive/phase/client-platform-consolidation/milestones/flutter-first-client-consolidation.md diff --git a/agent-ops/roadmap/archive/phase/plane-communication-foundation/PHASE.md b/agent-ops/roadmap/archive/phase/plane-communication-foundation/PHASE.md new file mode 100644 index 0000000..ddad62c --- /dev/null +++ b/agent-ops/roadmap/archive/phase/plane-communication-foundation/PHASE.md @@ -0,0 +1,20 @@ +# Phase: Plane Communication Foundation + +## 상태 + +[완료] + +## 목표 + +Plane self-hosted 인스턴스와의 인증/API 통신, 외부 참조 저장, 수동 smoke 검증 토대를 만든다. + +## Milestone 흐름 + +- [완료] Plane Thin E2E Loop + - 경로: `agent-ops/roadmap/archive/phase/plane-communication-foundation/milestones/plane-thin-e2e-loop.md` + - 요약: Plane adapter 테스트, external ref 저장, comment/state smoke, README/운영 문서 근거를 완료했다. + +## Phase 경계 + +- 이 문서는 기존 archive Milestone을 새 Phase scaffold에 연결하기 위한 archive index다. +- 상세 완료 근거는 하위 archive Milestone 스냅샷을 따른다. diff --git a/agent-ops/roadmap/archive/2026/05/plane-thin-e2e-loop.md b/agent-ops/roadmap/archive/phase/plane-communication-foundation/milestones/plane-thin-e2e-loop.md similarity index 100% rename from agent-ops/roadmap/archive/2026/05/plane-thin-e2e-loop.md rename to agent-ops/roadmap/archive/phase/plane-communication-foundation/milestones/plane-thin-e2e-loop.md diff --git a/agent-ops/roadmap/archive/phase/server-skeleton/PHASE.md b/agent-ops/roadmap/archive/phase/server-skeleton/PHASE.md new file mode 100644 index 0000000..0587039 --- /dev/null +++ b/agent-ops/roadmap/archive/phase/server-skeleton/PHASE.md @@ -0,0 +1,20 @@ +# Phase: Server Skeleton + +## 상태 + +[완료] + +## 목표 + +core 서버 실행 골격, task 저장 구조, 비동기 job 실행, Adapter stub을 구성해 후속 Plane 통신과 workflow/provider 작업의 기반을 만든다. + +## Milestone 흐름 + +- [완료] Server Skeleton + - 경로: `agent-ops/roadmap/archive/phase/server-skeleton/milestones/server-skeleton.md` + - 요약: core 서버 실행, task API/storage, River job, Plane/Mattermost stub 기반을 완료했다. + +## Phase 경계 + +- 이 문서는 기존 archive Milestone을 새 Phase scaffold에 연결하기 위한 archive index다. +- 상세 완료 근거는 하위 archive Milestone 스냅샷을 따른다. diff --git a/agent-ops/roadmap/archive/2026/05/server-skeleton.md b/agent-ops/roadmap/archive/phase/server-skeleton/milestones/server-skeleton.md similarity index 100% rename from agent-ops/roadmap/archive/2026/05/server-skeleton.md rename to agent-ops/roadmap/archive/phase/server-skeleton/milestones/server-skeleton.md diff --git a/agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/PHASE.md b/agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/PHASE.md new file mode 100644 index 0000000..e98e720 --- /dev/null +++ b/agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/PHASE.md @@ -0,0 +1,20 @@ +# Phase: Work Item Provider Pipeline Design + +## 상태 + +[완료] + +## 목표 + +Plane/Jira 등 work item provider와 core task 사이의 생성, enqueue, 상태 투영, 결과 발행 계약을 provider-neutral하게 정리한다. + +## Milestone 흐름 + +- [완료] Plane Task Pipeline Design + - 경로: `agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/milestones/plane-task-pipeline-design.md` + - 요약: provider-neutral adapter, task mapper, pipeline service, projection/idempotency/retry 정책을 완료했다. + +## Phase 경계 + +- 이 문서는 기존 archive Milestone을 새 Phase scaffold에 연결하기 위한 archive index다. +- 상세 완료 근거는 하위 archive Milestone 스냅샷을 따른다. diff --git a/agent-ops/roadmap/archive/2026/05/plane-task-pipeline-design.md b/agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/milestones/plane-task-pipeline-design.md similarity index 100% rename from agent-ops/roadmap/archive/2026/05/plane-task-pipeline-design.md rename to agent-ops/roadmap/archive/phase/work-item-provider-pipeline-design/milestones/plane-task-pipeline-design.md diff --git a/agent-ops/roadmap/current.md b/agent-ops/roadmap/current.md index cb67b8e..ba1c266 100644 --- a/agent-ops/roadmap/current.md +++ b/agent-ops/roadmap/current.md @@ -1,14 +1,31 @@ # 현재 로드맵 컨텍스트 +## 활성 Phase + +- [검토중] Mattermost Push Plugin Extraction + - 경로: `agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md` +- [진행중] Workflow Core + - 경로: `agent-ops/roadmap/phase/workflow-core/PHASE.md` + ## 활성 Milestone -- Mattermost Push Plugin Extraction: agent-ops/roadmap/milestones/mattermost-push-plugin-extraction.md +- [검토중] Mattermost Push Plugin Extraction + - Phase: `agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md` + - 경로: `agent-ops/roadmap/phase/mattermost-push-plugin-extraction/milestones/mattermost-push-plugin-extraction.md` +- [진행중] Workflow Core + - Phase: `agent-ops/roadmap/phase/workflow-core/PHASE.md` + - 경로: `agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md` ## 선택 규칙 -- 이 문서는 활성 Milestone 후보 목록이며, 개인별 현재 작업 위치나 완료 상태를 기록하지 않는다. -- 활성 Milestone은 `agent-ops/roadmap/milestones/` 하위 문서만 가리키며, `agent-ops/roadmap/archive/**`는 포함하지 않는다. -- 요청 내용, 현재 브랜치, 변경 파일, 관련 코드 경로를 보고 가장 관련 있는 Milestone을 선택하고 같은 세션에서 1회 읽는다. -- 활성 Milestone 둘 이상에 걸치면 필요한 Milestone 문서를 모두 읽고 작업 범위를 좁힌다. -- 활성 Milestone 밖의 작업이면 `agent-ops/roadmap/ROADMAP.md`의 Milestone 목록을 확인하고 사용자에게 진행 또는 전환 여부를 확인한다. +- 이 문서는 활성 Phase와 활성 Milestone 후보 목록이며, 개인별 현재 작업 위치나 완료 상태를 기록하지 않는다. +- 활성 Phase는 `agent-ops/roadmap/phase//PHASE.md`를 가리킨다. +- 활성 Milestone은 `agent-ops/roadmap/phase//milestones/.md`를 가리킨다. +- 활성 항목은 아카이브 경로를 포함하지 않는다. +- `[검토중]` 항목은 사용자 완료 확인 전까지 활성 항목으로 남길 수 있다. +- `[완료]` 또는 `[폐기]` 항목은 archive 링크를 남긴 뒤 활성 항목에서 제거한다. +- 요청 내용, 현재 브랜치, 변경 파일, 관련 코드 경로를 보고 가장 관련 있는 Phase와 Milestone을 선택하고 같은 세션에서 1회 읽는다. +- 활성 Phase 또는 Milestone 둘 이상에 걸치면 필요한 문서를 모두 읽고 작업 범위를 좁힌다. +- 활성 범위 밖의 작업이면 `agent-ops/roadmap/ROADMAP.md`의 Phase 흐름을 확인하고 사용자에게 진행 또는 전환 여부를 확인한다. +- 완료된 과거 내용이 필요할 때만 `ROADMAP.md` 또는 `PHASE.md`에 있는 archive 링크를 따라가서 읽는다. - 선택된 Milestone의 `구현 잠금` 섹션이 없거나 상태가 `잠금`이면 구현이나 구현 계획을 시작하기 전에 현재 요청에 직접 영향을 주는 `결정 필요` 항목만 확인한다. 관련 결정이 없고 표준선으로 처리 가능하면 잠금을 유지한 채 진행할 수 있으며, Milestone 전체에서 사용자만 결정할 항목이 더 이상 없을 때만 `구현 잠금` 상태를 `해제`로 둔다. diff --git a/agent-ops/roadmap/milestones/mattermost-push-plugin-extraction.md b/agent-ops/roadmap/milestones/mattermost-push-plugin-extraction.md deleted file mode 100644 index dc6230b..0000000 --- a/agent-ops/roadmap/milestones/mattermost-push-plugin-extraction.md +++ /dev/null @@ -1,70 +0,0 @@ -# Mattermost Push Plugin Extraction - -## 목표 - -Flutter 앱 내부에 직접 이식된 Mattermost push notification 기능을 `../mattermost-push-plugin` 독립 Flutter plugin repo로 분리한다. NomadCode 앱은 Firebase 설정, 로그인/라우팅, 제품 UI만 유지하고, Mattermost push 수신/표시/답장/ACK/토큰 저장 경계는 plugin API를 통해 소비하도록 전환한다. - -## 단계 - -Mattermost Push Plugin Extraction - -## 상태 - -진행 중 - -## 구현 잠금 - -- 상태: 해제 -- 결정 필요: 없음 - -## 범위 - -- `../mattermost-push-plugin` repo를 Flutter plugin 프로젝트로 구성 -- `apps/mobile/lib/services/push_notification_service.dart`의 public Dart facade를 plugin API로 승격 -- Android native FCM service, notification builder, reply/dismiss receiver, ACK delivery, Room DB helper, network helper, notification resource를 plugin 소유로 이동 -- 앱 `MainActivity`와 `MainApplication` 직접 의존을 제거하고 Flutter plugin 등록/초기화 경계로 전환 -- NomadCode 앱은 plugin path dependency, Firebase project 설정, Mattermost 로그인/credential 관리, 알림 클릭 라우팅만 보유 -- 현재 Android-first 구현을 기준으로 하되 iOS/macOS는 no-op 또는 후속 확장 지점을 명확히 둠 -- 기존 `push-notification-todo.md`의 남은 Android DB stub과 singleton DB close 위험을 plugin extraction 과정에서 추적 가능한 작업으로 재배치 - -## 필수 기능 - -- [ ] [plugin-scaffold] `../mattermost-push-plugin`을 `mattermost_push_plugin` Flutter plugin repo로 구성한다. -- [ ] [dart-api] push 초기화, 알림 stream, opened event, device token, auth token, signing key 저장 API를 plugin Dart surface로 정의한다. -- [ ] [android-native] Android FCM service, notification builder, ACK, inline reply, dismiss, Room DB, network helper, notification resource를 plugin Android implementation으로 이동한다. -- [ ] [host-boundary] `MainActivity`/`MainApplication` 직접 참조를 제거하고 launch intent, lifecycle, channel registration, DB/channel 초기화를 plugin-safe 방식으로 정리한다. -- [ ] [app-consumer] `apps/mobile`을 plugin consumer로 전환하고 앱에는 Firebase 설정, Mattermost auth flow, 라우팅 콜백만 남긴다. -- [ ] [risk-hardening] Room DB singleton close, `PushNotificationDataHelper` DAO stub, Firebase Messaging manifest 충돌 같은 extraction 위험을 처리하거나 명시적 follow-up으로 남긴다. -- [ ] [docs-verify] plugin README, host app 통합 메모, 검증 명령과 수동 smoke 기준을 작성한다. - -## 완료 기준 - -- [ ] `../mattermost-push-plugin`에 Flutter plugin 구조, Dart API, Android implementation, Android manifest/resource/dependency가 존재한다. -- [ ] `apps/mobile`은 Mattermost push 관련 native service/helper/resource를 직접 소유하지 않고 plugin path dependency로 연동한다. -- [ ] Android 알림 수신, 시스템 알림 표시, 알림 탭 event, inline reply, ACK, device/auth/signing key 저장 경계가 plugin API 또는 plugin native 구현으로 닫힌다. -- [ ] host 앱이 유지해야 하는 Firebase 설정, `google-services.json`, Mattermost login/credential, 라우팅 callback 책임이 문서화되어 있다. -- [ ] `apps/mobile`의 `flutter test`가 통과하고, Android build 또는 명시한 대체 검증으로 plugin 통합이 깨지지 않음을 확인한다. -- [ ] iOS/macOS 지원 범위가 no-op인지 후속 구현인지 문서에 명확히 남아 있다. - -## 범위 제외 - -- Mattermost 서버 push gateway 또는 server-side plugin 구현 -- pub.dev 공개 배포, semantic versioning, release automation -- iOS/macOS native push full implementation -- NomadCode project/workspace UX 화면 재설계 -- Mattermost auth 제품 UI 완성 -- core service notification event 또는 Mattermost adapter 구현 - -## 작업 컨텍스트 - -- 관련 경로: `apps/mobile/`, `../mattermost-push-plugin/` -- 현재 plugin repo: `../mattermost-push-plugin`은 사용자가 생성한 빈 git repo다. -- 표준선(선택): repo명은 `mattermost-push-plugin`, Dart package name은 `mattermost_push_plugin`으로 둔다. 첫 구현은 Android-first Flutter plugin으로 잡고, host app이 Firebase project 설정과 Mattermost login/라우팅을 소유한다. -- 선행 작업: Flutter-first Client Consolidation -- 후속 작업: Project Workspace Management UX, External Integration의 Mattermost 사용자-facing 흐름 -- 분석 근거: - - `apps/mobile/lib/services/push_notification_service.dart`는 EventChannel/MethodChannel과 FCM token facade를 제공한다. - - `apps/mobile/android/app/src/main/java/com/tokilabs/mattermost/MattermostFirebaseMessagingService.kt`는 native FCM 수신, signature verification, ACK, notification build, EventChannel 전달을 수행한다. - - `apps/mobile/android/app/src/main/java/com/tokilabs/mattermost/MainActivity.kt`와 `MainApplication.kt`는 현재 plugin으로 옮겨야 할 channel registration, DB init, notification channel init, lifecycle tracker를 직접 보유한다. - - `apps/mobile/android/app/build.gradle.kts`는 Firebase Messaging, JJWT, OkHttp, coroutines, Room/kapt 의존성을 앱에 직접 둔다. -- 확인 필요: 없음 diff --git a/agent-ops/roadmap/phase/external-integration/PHASE.md b/agent-ops/roadmap/phase/external-integration/PHASE.md new file mode 100644 index 0000000..7c5ab8c --- /dev/null +++ b/agent-ops/roadmap/phase/external-integration/PHASE.md @@ -0,0 +1,24 @@ +# Phase: External Integration + +## 상태 + +[계획] + +## 목표 + +Work Item Provider Pipeline Design과 Workflow Core 이후 Plane/Jira 확장, Mattermost, Agent Integrator, IOP OpenAI API Responses-compatible 호출을 실제 통합 흐름으로 확장한다. NomadCode가 직접 모델 런타임을 소유하지 않고 IOP의 외부 입력 표면을 호출하는 방향을 유지한다. + +## Milestone 흐름 + +완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다. +완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. + +- [계획] External Integration + - 경로: `agent-ops/roadmap/phase/external-integration/milestones/external-integration.md` + - 요약: Plane/Jira/Mattermost/Agent Integrator/IOP 호출 경계를 실제 통합 adapter 흐름으로 확장한다. + +## Phase 경계 + +- 외부 provider 세부 구현은 adapter 경계 밖으로 새지 않게 한다. +- IOP 내부 모델 라우팅, 모델 프로파일, RAG, MCP, output validation, fallback 정책은 NomadCode 범위에서 제외한다. +- A2A 도입 시점과 Agent Integrator 유지 여부는 사용자 결정이 필요하다. diff --git a/agent-ops/roadmap/milestones/external-integration.md b/agent-ops/roadmap/phase/external-integration/milestones/external-integration.md similarity index 88% rename from agent-ops/roadmap/milestones/external-integration.md rename to agent-ops/roadmap/phase/external-integration/milestones/external-integration.md index 28a9042..555a1f0 100644 --- a/agent-ops/roadmap/milestones/external-integration.md +++ b/agent-ops/roadmap/phase/external-integration/milestones/external-integration.md @@ -1,16 +1,17 @@ -# External Integration +# Milestone: External Integration + +## 위치 + +- Roadmap: `agent-ops/roadmap/ROADMAP.md` +- Phase: `agent-ops/roadmap/phase/external-integration/PHASE.md` ## 목표 Work Item Provider Pipeline Design과 workflow core 이후 남은 Plane/Jira 확장, Mattermost, Agent Integrator, IOP 연결을 stub 또는 호환 호출 경로에서 실제 통합 흐름으로 확장한다. IOP 호출은 현재 단계에서 OpenAI API Responses-compatible 경로를 기본으로 하며, NomadCode가 직접 모델 런타임을 호출하거나 IOP native protocol을 외부 호출 표면으로 사용하지 않는다. -## 단계 - -External Integration - ## 상태 -계획 +[계획] ## 구현 잠금 @@ -32,6 +33,10 @@ External Integration ## 필수 기능 +### Epic: [external-integration] Provider and execution adapters + +외부 work item provider, 협업 도구, 실행 표면을 adapter 경계 안에서 실제 통합 흐름으로 확장한다. + - [ ] [plane-adapter-expand] Plane issue 생성, comment, status update adapter 확장 - [ ] [jira-adapter] Jira issue 조회, comment, status transition adapter 구현 - [ ] [mattermost-adapter] Mattermost 메시지 발송 adapter 구현 @@ -49,6 +54,16 @@ External Integration - [x] NomadCode의 기본 실행 경로가 직접 모델 호출이 아니라 IOP 경유 호출임이 로드맵과 운영 문서에서 일관되게 읽힌다. - [ ] 외부 provider별 세부 구현이 adapter 경계 밖으로 새지 않는다. +## 완료 리뷰 + +- 상태: 없음 +- 요청일: 없음 +- 완료 근거: 없음 +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: 없음 + ## 범위 제외 - Outline / Forgejo / Nextcloud 연동 diff --git a/agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md b/agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md new file mode 100644 index 0000000..3dc32b6 --- /dev/null +++ b/agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md @@ -0,0 +1,24 @@ +# Phase: Mattermost Push Plugin Extraction + +## 상태 + +[검토중] + +## 목표 + +Flutter 앱에 직접 들어간 Mattermost push notification Dart/API, Android native service, Room DB, notification resource를 `../mattermost-push-plugin` Flutter plugin repo로 분리한다. NomadCode 앱은 Firebase 설정, Mattermost auth, 라우팅 callback만 소유하는 plugin consumer로 정리한다. + +## Milestone 흐름 + +완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다. +완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. + +- [검토중] Mattermost Push Plugin Extraction + - 경로: `agent-ops/roadmap/phase/mattermost-push-plugin-extraction/milestones/mattermost-push-plugin-extraction.md` + - 요약: `apps/mobile`의 native push 소유권을 plugin으로 옮기고 host 앱은 path dependency, Firebase/auth, routing 경계만 유지하도록 정리했다. + +## Phase 경계 + +- Mattermost push 수신, 표시, inline reply, dismiss, ACK, token/signing key 저장은 plugin 소유로 둔다. +- Host 앱은 Firebase project 설정, Mattermost login/credential, 앱 navigation callback만 소유한다. +- iOS/macOS native push full implementation, server-side Mattermost plugin, pub.dev 배포는 이 Phase 범위에서 제외한다. diff --git a/agent-ops/roadmap/phase/mattermost-push-plugin-extraction/milestones/mattermost-push-plugin-extraction.md b/agent-ops/roadmap/phase/mattermost-push-plugin-extraction/milestones/mattermost-push-plugin-extraction.md new file mode 100644 index 0000000..e5af0a6 --- /dev/null +++ b/agent-ops/roadmap/phase/mattermost-push-plugin-extraction/milestones/mattermost-push-plugin-extraction.md @@ -0,0 +1,94 @@ +# Milestone: Mattermost Push Plugin Extraction + +## 위치 + +- Roadmap: `agent-ops/roadmap/ROADMAP.md` +- Phase: `agent-ops/roadmap/phase/mattermost-push-plugin-extraction/PHASE.md` + +## 목표 + +Flutter 앱 내부에 직접 이식된 Mattermost push notification 기능을 `../mattermost-push-plugin` 독립 Flutter plugin repo로 분리한다. NomadCode 앱은 Firebase 설정, 로그인/라우팅, 제품 UI만 유지하고, Mattermost push 수신/표시/답장/ACK/토큰 저장 경계는 plugin API를 통해 소비하도록 전환한다. + +## 상태 + +[검토중] + +## 구현 잠금 + +- 상태: 해제 +- 결정 필요: 없음 + +## 범위 + +- `../mattermost-push-plugin` repo를 Flutter plugin 프로젝트로 구성 +- `apps/mobile/lib/services/push_notification_service.dart`의 public Dart facade를 plugin API로 승격 +- Android native FCM service, notification builder, reply/dismiss receiver, ACK delivery, Room DB helper, network helper, notification resource를 plugin 소유로 이동 +- 앱 `MainActivity`와 `MainApplication` 직접 의존을 제거하고 Flutter plugin 등록/초기화 경계로 전환 +- NomadCode 앱은 plugin path dependency, Firebase project 설정, Mattermost 로그인/credential 관리, 알림 클릭 라우팅만 보유 +- 현재 Android-first 구현을 기준으로 하되 iOS/macOS는 no-op 또는 후속 확장 지점을 명확히 둠 +- 기존 `push-notification-todo.md`의 남은 Android DB stub과 singleton DB close 위험을 plugin extraction 과정에서 추적 가능한 작업으로 재배치 + +## 필수 기능 + +### Epic: [extraction] Plugin extraction boundary + +Flutter host 앱에 있던 Mattermost push domain을 독립 plugin repo와 host consumer 경계로 분리한다. + +- [x] [plugin-scaffold] `../mattermost-push-plugin`을 `mattermost_push_plugin` Flutter plugin repo로 구성했다. +- [x] [dart-api] push 초기화, 알림 stream, opened event, device token, auth token, signing key 저장 API를 plugin Dart surface로 정의했다. +- [x] [android-native] Android FCM service, notification builder, ACK, inline reply, dismiss, Room DB, network helper, notification resource를 plugin Android implementation으로 이동했다. +- [x] [host-boundary] `MainActivity`/`MainApplication` 직접 참조를 제거하고 launch intent, lifecycle, channel registration, DB/channel 초기화를 plugin-safe 방식으로 정리했다. +- [x] [app-consumer] `apps/mobile`을 plugin consumer로 전환하고 앱에는 Firebase 설정, Mattermost auth flow, 라우팅 콜백만 남겼다. +- [x] [risk-hardening] Room DB singleton close, `PushNotificationDataHelper` DAO stub, Firebase Messaging manifest 충돌 위험을 처리하거나 명시적 follow-up으로 남겼다. +- [x] [docs-verify] plugin README, host app 통합 메모, 검증 명령과 수동 smoke 기준을 작성했다. + +## 완료 기준 + +- [x] `../mattermost-push-plugin`에 Flutter plugin 구조, Dart API, Android implementation, Android manifest/resource/dependency가 존재한다. +- [x] `apps/mobile`은 Mattermost push 관련 native service/helper/resource를 직접 소유하지 않고 plugin path dependency로 연동한다. +- [x] Android 알림 수신, 시스템 알림 표시, 알림 탭 event, inline reply, ACK, device/auth/signing key 저장 경계가 plugin API 또는 plugin native 구현으로 닫힌다. +- [x] host 앱이 유지해야 하는 Firebase 설정, `google-services.json`, Mattermost login/credential, 라우팅 callback 책임이 문서화되어 있다. +- [x] `apps/mobile`의 `flutter test`가 통과하고, Android build 또는 명시한 대체 검증으로 plugin 통합이 깨지지 않음을 확인한다. 대체 검증은 plugin/app `flutter test`와 host/plugin boundary 파일 확인으로 남겼으며, Android SDK가 있는 환경의 debug APK/device smoke는 최종 리뷰 확인 항목으로 둔다. +- [x] iOS/macOS 지원 범위가 no-op인지 후속 구현인지 문서에 명확히 남아 있다. + +## 완료 리뷰 + +- 상태: 요청됨 +- 요청일: 2026-05-25 +- 완료 근거: + - `../mattermost-push-plugin` sibling repo에 Flutter plugin scaffold, Dart API, Android FCM service/receiver/helper/Room/resource, iOS/macOS no-op scaffold가 존재한다. + - `apps/mobile` 미커밋 변경에서 direct push service/native service/resource를 제거하고 `mattermost_push_plugin` path dependency와 host auth/routing 경계로 전환했다. + - `flutter test`는 `../mattermost-push-plugin`과 `apps/mobile`에서 모두 통과했다. `flutter build apk --debug`는 현재 환경에 Android SDK가 없어 실행되지 않았다. +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: Android SDK 또는 실제 device가 있는 환경에서 debug APK/FCM 수동 smoke를 추가 확인할지 최종 리뷰에서 결정한다. + +## 범위 제외 + +- Mattermost 서버 push gateway 또는 server-side plugin 구현 +- pub.dev 공개 배포, semantic versioning, release automation +- iOS/macOS native push full implementation +- NomadCode project/workspace UX 화면 재설계 +- Mattermost auth 제품 UI 완성 +- core service notification event 또는 Mattermost adapter 구현 + +## 작업 컨텍스트 + +- 관련 경로: `apps/mobile/`, `../mattermost-push-plugin/` +- 현재 plugin repo: `../mattermost-push-plugin`은 사용자가 생성한 별도 git repo이며, 현재 HEAD는 `678302b initial commit: mattermost-push-plugin`이고 working tree는 clean 상태다. +- 표준선(선택): repo명은 `mattermost-push-plugin`, Dart package name은 `mattermost_push_plugin`으로 둔다. 첫 구현은 Android-first Flutter plugin으로 잡고, host app이 Firebase project 설정과 Mattermost login/라우팅을 소유한다. +- 선행 작업: Flutter-first Client Consolidation +- 후속 작업: Project Workspace Management UX, External Integration의 Mattermost 사용자-facing 흐름 +- 현재 반영 근거: + - `../mattermost-push-plugin/lib/src/mattermost_push_plugin.dart`는 EventChannel/MethodChannel과 FCM token facade를 plugin API로 제공한다. + - `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/MattermostFirebaseMessagingService.kt`는 native FCM 수신, signature verification, ACK, notification build, EventChannel 전달을 수행한다. + - `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/MattermostPushPlugin.kt`는 channel registration, DB init, notification channel init, lifecycle tracker, launch intent event를 plugin 경계로 소유한다. + - `apps/mobile/android/app/src/main/java/com/tokilabs/mattermost/MainActivity.kt`는 FlutterActivity fullscreen 설정만 남기고 native push channel 직접 등록을 제거했다. + - `apps/mobile/pubspec.yaml`은 `mattermost_push_plugin` path dependency를 사용하고 `firebase_messaging`, `flutter_local_notifications` 직접 dependency를 제거했다. + - `apps/mobile/push-notification-todo.md`는 host app 내 native push 파일을 직접 수정하지 않는 handoff 문서로 축소되었다. +- 검증: + - `flutter test` in `../mattermost-push-plugin`: 통과 + - `flutter test` in `apps/mobile`: 통과 + - `flutter build apk --debug` in `apps/mobile`: 실패, `ANDROID_HOME` 미설정으로 Android SDK를 찾지 못함 +- 확인 필요: 사용자 완료 확인과 archive 이동 승인. diff --git a/agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md b/agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md new file mode 100644 index 0000000..8dc9313 --- /dev/null +++ b/agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md @@ -0,0 +1,24 @@ +# Phase: Project Workspace Management UX + +## 상태 + +[계획] + +## 목표 + +Flutter-first 클라이언트 구조 위에서 기존 Project/Session/Workspace 방향을 유지하면서 프로젝트 단위 제어 UX를 앱 기반 desktop과 mobile layout으로 정리한다. Desktop은 mobile에서 가능한 프로젝트 관리 기능을 포함하고 code-server와 Agent Chat을 다루는 프로젝트 제어 확장 표면으로 정리한다. + +## Milestone 흐름 + +완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다. +완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. + +- [계획] Project Workspace Management UX + - 경로: `agent-ops/roadmap/phase/project-workspace-management-ux/milestones/project-workspace-management-ux.md` + - 요약: 프로젝트 단위 제어 UX의 desktop/mobile 역할, parity 기준, IOP/task 결과 표시 기준을 정리한다. + +## Phase 경계 + +- 기존 Project/Session/Workspace 방향을 대체하지 않고 보강한다. +- IOP 내부 모델 라우팅, 외부 agent 추가 흐름, 상세 화면/API/DB schema 확정은 이 Phase의 결정 전 범위에서 제외한다. +- UX 책임 경계와 우선순위는 사용자 결정이 필요한 잠금 항목으로 유지한다. diff --git a/agent-ops/roadmap/milestones/project-workspace-management-ux.md b/agent-ops/roadmap/phase/project-workspace-management-ux/milestones/project-workspace-management-ux.md similarity index 85% rename from agent-ops/roadmap/milestones/project-workspace-management-ux.md rename to agent-ops/roadmap/phase/project-workspace-management-ux/milestones/project-workspace-management-ux.md index cb04c3a..3a62e16 100644 --- a/agent-ops/roadmap/milestones/project-workspace-management-ux.md +++ b/agent-ops/roadmap/phase/project-workspace-management-ux/milestones/project-workspace-management-ux.md @@ -1,16 +1,17 @@ -# Project Workspace Management UX +# Milestone: Project Workspace Management UX + +## 위치 + +- Roadmap: `agent-ops/roadmap/ROADMAP.md` +- Phase: `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md` ## 목표 Flutter-first 클라이언트 구조 위에서 기존 Project/Session/Workspace 방향을 유지하면서 프로젝트 단위 제어 UX를 앱 기반 desktop과 mobile layout으로 정리한다. Mobile에서 가능한 프로젝트 관리 기능은 desktop에도 포함하고, desktop은 프로젝트 단위 확장 표면을 code-server와 Agent Chat을 다루는 앱 shell로 정리한다. -## 단계 - -Project Workspace Management UX - ## 상태 -계획 +[계획] ## 구현 잠금 @@ -31,6 +32,10 @@ Project Workspace Management UX ## 필수 기능 +### Epic: [workspace-ux] Project workspace UX definition + +Flutter-first 앱에서 project/session/workspace 제어 표면과 desktop/mobile 역할 경계를 정의한다. + - [ ] [common-capability] 프로젝트 단위 제어 화면의 공통 capability를 정의한다. - [ ] [mobile-tabs] mobile 상단탭 기반 프로젝트 관리 구조를 정의한다. - [ ] [desktop-tabs] Flutter 앱 desktop 탭 기반 프로젝트 관리 구조를 정의한다. @@ -46,6 +51,16 @@ Project Workspace Management UX - [ ] IOP 실행 결과, task 상태, 파일 변경 결과가 NomadCode UX에서 어떻게 보이는지 최소 기준이 정리되어 있다. - [ ] 기존 Project/Session/Workspace 방향을 대체하지 않고 보강하는 Milestone으로 읽힌다. +## 완료 리뷰 + +- 상태: 없음 +- 요청일: 없음 +- 완료 근거: 없음 +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: 없음 + ## 범위 제외 - IOP 내부 모델 라우팅, 모델 프로파일, RAG, MCP, output validation 구현 diff --git a/agent-ops/roadmap/phase/workflow-core/PHASE.md b/agent-ops/roadmap/phase/workflow-core/PHASE.md new file mode 100644 index 0000000..4aa114b --- /dev/null +++ b/agent-ops/roadmap/phase/workflow-core/PHASE.md @@ -0,0 +1,24 @@ +# Phase: Workflow Core + +## 상태 + +[진행중] + +## 목표 + +Plane 통신 토대와 provider-neutral pipeline 설계 이후 실제 상태 변화를 기준으로 task lifecycle, enqueue/running/completed/failed 흐름을 안정화한다. retry, timeout, notification event의 최소 구조를 추가해 core workflow의 운영 기준을 만든다. + +## Milestone 흐름 + +완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다. +완료, 검토중, 진행중, 계획 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. + +- [진행중] Workflow Core + - 경로: `agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md` + - 요약: task lifecycle, 상태 전이 책임, 실패 정책, retry/timeout, notification event 모델을 안정화한다. + +## Phase 경계 + +- Workflow Core는 canonical task lifecycle, retry/timeout envelope, heartbeat, terminal 상태 기록을 소유한다. +- 외부 협업 도구 notification 발송, provider별 실제 comment/status 전송, 복잡한 workflow DSL은 후속 Phase로 넘긴다. +- IOP/A2A/model runtime 내부 정책은 외부 실행 표면 또는 adapter 책임으로 둔다. diff --git a/agent-ops/roadmap/milestones/workflow-core.md b/agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md similarity index 85% rename from agent-ops/roadmap/milestones/workflow-core.md rename to agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md index b5307ec..8035b18 100644 --- a/agent-ops/roadmap/milestones/workflow-core.md +++ b/agent-ops/roadmap/phase/workflow-core/milestones/workflow-core.md @@ -1,16 +1,17 @@ -# Workflow Core +# Milestone: Workflow Core + +## 위치 + +- Roadmap: `agent-ops/roadmap/ROADMAP.md` +- Phase: `agent-ops/roadmap/phase/workflow-core/PHASE.md` ## 목표 Plane 통신 토대와 별도 pipeline 설계가 정리된 뒤 실제 상태 변화를 기준으로 task 상태 전이를 정리하고 enqueue / running / completed / failed 흐름을 안정화한다. retry, timeout, notification event의 기본 구조를 추가해 core workflow의 운영 기준을 만든다. -## 단계 - -Workflow Core - ## 상태 -진행 중 +[진행중] ## 구현 잠금 @@ -27,6 +28,10 @@ Workflow Core ## 필수 기능 +### Epic: [workflow-core] Workflow lifecycle stability + +Core task lifecycle과 상태 전이 책임, 실패/재시도/timeout/notification event 기준을 안정화한다. + - [ ] [lifecycle-model] task lifecycle 상태 모델 점검 - [ ] [transition-ownership] scheduler와 workflow service의 상태 전이 책임 정리 - [ ] [failure-policy] 실패 task 처리 기준 @@ -40,6 +45,16 @@ Workflow Core - [ ] retry 정책의 최소 동작 방식이 구현되거나 명확히 문서화된다. - [ ] notification event가 workflow 상태 변화와 연결된다. +## 완료 리뷰 + +- 상태: 없음 +- 요청일: 없음 +- 완료 근거: 없음 +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: 없음 + ## 범위 제외 - 실제 외부 협업 도구로 notification 발송 diff --git a/apps/mobile/README.md b/apps/mobile/README.md index 0f621ef..342f706 100644 --- a/apps/mobile/README.md +++ b/apps/mobile/README.md @@ -1,6 +1,28 @@ # nomadcode-app -nomadcode-app Flutter project. +The Flutter-first NomadCode client application. + +## Mattermost Push Notification Integration + +Mattermost push notification delivery is implemented via the local `mattermost_push_plugin` path dependency. + +### Architecture & Responsibility Split + +To maintain a clean and maintainable codebase, the responsibilities are split between the host application and the plugin as follows: + +#### Host Application (`apps/mobile`) Responsibilities: +- **Firebase Configuration**: Contains the standard Firebase configuration files (`android/app/google-services.json`) and performs the standard `Firebase.initializeApp()` call in Dart main. +- **Mattermost Authentication**: Handles login and session lifecycles, and securely registers the user authentication token and server signing key to the plugin by calling `MattermostPushPlugin.instance.setAuthToken()` and `MattermostPushPlugin.instance.setSigningKey()`. +- **Navigation Callbacks**: Registers standard Flutter navigation callbacks `onNavigateToChannel` and `onNavigateToThread` to handle workspace channel and CRT thread routing upon user interaction. +- **FCM Token Sync**: Listens to device token registrations via `onDeviceTokenReady` and registers the token with the Mattermost server. + +#### Mattermost Push Plugin (`mattermost_push_plugin`) Responsibilities: +- **Native Android FCM Service**: Intercepts background/foreground FCM notifications securely via a custom Kotlin FCM service. +- **Signature Verification**: Validates incoming push payload signatures against stored public signing keys (using `JJWT`). +- **System Notification Builder**: Displays structured notifications with local avatar caches, thread summaries, and action buttons. +- **Inline Reply / Dismiss Actions**: Receives native background actions, records responses in a Room database, and forwards replies/ACKs directly to the Mattermost API via custom OkHttp adapters. + +--- ## Getting Started diff --git a/apps/mobile/android/app/build.gradle.kts b/apps/mobile/android/app/build.gradle.kts index 4d8ff2f..897e0c9 100644 --- a/apps/mobile/android/app/build.gradle.kts +++ b/apps/mobile/android/app/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("com.android.application") id("kotlin-android") - id("kotlin-kapt") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") id("com.google.gms.google-services") @@ -48,25 +47,4 @@ flutter { dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") - // Firebase BOM (버전 통합 관리) - implementation(platform("com.google.firebase:firebase-bom:33.7.0")) - implementation("com.google.firebase:firebase-messaging") - - // JWT 서명 검증 (mattermost와 동일 버전) - implementation("io.jsonwebtoken:jjwt-api:0.12.5") - runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5") - runtimeOnly("io.jsonwebtoken:jjwt-orgjson:0.12.5") { - exclude(group = "org.json", module = "json") - } - - // HTTP 클라이언트 - implementation("com.squareup.okhttp3:okhttp:4.12.0") - - // Kotlin Coroutines - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") - - // Room DB (로컬 캐시용, Kotlin 2.2.0 지원을 위해 최신 RC 버전 사용) - implementation("androidx.room:room-runtime:2.7.0-rc01") - implementation("androidx.room:room-ktx:2.7.0-rc01") - kapt("androidx.room:room-compiler:2.7.0-rc01") } diff --git a/apps/mobile/android/app/src/main/AndroidManifest.xml b/apps/mobile/android/app/src/main/AndroidManifest.xml index b4856ef..9755218 100644 --- a/apps/mobile/android/app/src/main/AndroidManifest.xml +++ b/apps/mobile/android/app/src/main/AndroidManifest.xml @@ -1,13 +1,8 @@ - + - - - - - - - - - - - - - - - - - - - - - -