Release v2.1.2: Chronicle Repair & Context Stability improvements
This commit is contained in:
@@ -3,15 +3,15 @@
|
|||||||
<!-- ASTRA:AUTO-START -->
|
<!-- ASTRA:AUTO-START -->
|
||||||
|
|
||||||
## Snapshot
|
## Snapshot
|
||||||
- **Workspace**: `ConnectAI` `v2.1.0` _(absolute path varies by environment; resolved from the active VS Code workspace)_
|
- **Workspace**: `ConnectAI` `v2.1.2` _(absolute path varies by environment; resolved from the active VS Code workspace)_
|
||||||
- **Description**: The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.
|
- **Description**: The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.
|
||||||
- **Stack**: TypeScript, Node.js, VS Code Extension, LM Studio SDK, Test runner
|
- **Stack**: TypeScript, Node.js, VS Code Extension, LM Studio SDK, Test runner
|
||||||
- **Stats**: 202 source files, ~35,762 lines across 5 top-level modules.
|
- **Stats**: 203 source files, ~35,950 lines across 5 top-level modules.
|
||||||
|
|
||||||
## Last Refresh
|
## Last Refresh
|
||||||
- **Time**: 2026-05-13T16:54:00.117Z
|
- **Time**: 2026-05-13T17:37:28.091Z
|
||||||
- **Files newly analysed**: 5
|
- **Files newly analysed**: 3
|
||||||
- **Files reused from cache**: 197
|
- **Files reused from cache**: 200
|
||||||
|
|
||||||
## Directory Map
|
## Directory Map
|
||||||
```mermaid
|
```mermaid
|
||||||
@@ -41,7 +41,7 @@ flowchart LR
|
|||||||
media["media/<br/>6 files"]
|
media["media/<br/>6 files"]
|
||||||
tests["tests/<br/>27 files"]
|
tests["tests/<br/>27 files"]
|
||||||
core_py["core_py/<br/>6 files"]
|
core_py["core_py/<br/>6 files"]
|
||||||
docs["docs/<br/>63 files"]
|
docs["docs/<br/>64 files"]
|
||||||
tests --> src
|
tests --> src
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ flowchart LR
|
|||||||
|
|
||||||
## Modules
|
## Modules
|
||||||
|
|
||||||
### `src/` — 100 files, ~23,711 lines
|
### `src/` — 100 files, ~23,874 lines
|
||||||
|
|
||||||
**Sub-directories**
|
**Sub-directories**
|
||||||
- `src/features/` (28) — The 9-agent roster for 1인 기업 모드. Each entry is a static description — persona, role, specialty — used to build the speci
|
- `src/features/` (28) — The 9-agent roster for 1인 기업 모드. Each entry is a static description — persona, role, specialty — used to build the speci
|
||||||
@@ -85,7 +85,7 @@ flowchart LR
|
|||||||
- `src/config.ts` (216 lines)
|
- `src/config.ts` (216 lines)
|
||||||
- `src/features/company/types.ts` (150 lines) — Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
|
- `src/features/company/types.ts` (150 lines) — Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
|
||||||
- `src/lib/paths.ts` (151 lines)
|
- `src/lib/paths.ts` (151 lines)
|
||||||
- `src/sidebarProvider.ts` (2934 lines)
|
- `src/sidebarProvider.ts` (3026 lines)
|
||||||
- `src/features/company/agents.ts` (136 lines) — The 9-agent roster for 1인 기업 모드. Each entry is a static description — persona, role, specialty — used to build the specialist's system prompt at dispatch time. The set was adopted from Connectorigin's
|
- `src/features/company/agents.ts` (136 lines) — The 9-agent roster for 1인 기업 모드. Each entry is a static description — persona, role, specialty — used to build the specialist's system prompt at dispatch time. The set was adopted from Connectorigin's
|
||||||
- `src/memory/types.ts` (126 lines) — Memory Type Definitions (메모리 타입 정의) Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다. ① Short-Term ② Long-Term ③ Project ④ Procedural ⑤ Episodic
|
- `src/memory/types.ts` (126 lines) — Memory Type Definitions (메모리 타입 정의) Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다. ① Short-Term ② Long-Term ③ Project ④ Procedural ⑤ Episodic
|
||||||
- `src/retrieval/scoring.ts` (518 lines) — Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다.
|
- `src/retrieval/scoring.ts` (518 lines) — Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다.
|
||||||
@@ -100,7 +100,7 @@ flowchart LR
|
|||||||
- `src/features/projectArchitecture/scanner.ts` (644 lines) — Deep static analyser for the Project Architecture Context generator. Walks the project tree (skipping the usual nodemodules / out / dist noise), pulls the role of each interesting file from its leadin
|
- `src/features/projectArchitecture/scanner.ts` (644 lines) — Deep static analyser for the Project Architecture Context generator. Walks the project tree (skipping the usual nodemodules / out / dist noise), pulls the role of each interesting file from its leadin
|
||||||
- `src/lib/contextManager.ts` (275 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
|
- `src/lib/contextManager.ts` (275 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
|
||||||
- `src/core/astraPath.ts` (50 lines) — Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토리를 해결하여, 사용자 프로젝트 루트가 아닌 ConnectAI 패키지 내부에 데이터를 저장합니다. 이 모듈은 AAL(Astra Autonomou
|
- `src/core/astraPath.ts` (50 lines) — Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토리를 해결하여, 사용자 프로젝트 루트가 아닌 ConnectAI 패키지 내부에 데이터를 저장합니다. 이 모듈은 AAL(Astra Autonomou
|
||||||
- `src/extension.ts` (945 lines)
|
- `src/extension.ts` (966 lines)
|
||||||
- `src/features/projectChronicle/types.ts` (118 lines)
|
- `src/features/projectChronicle/types.ts` (118 lines)
|
||||||
- `src/lmstudio/client.ts` (147 lines)
|
- `src/lmstudio/client.ts` (147 lines)
|
||||||
- `src/retrieval/brainIndex.ts` (325 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 <brainPath>/.astra/brain-index.json 에
|
- `src/retrieval/brainIndex.ts` (325 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 <brainPath>/.astra/brain-index.json 에
|
||||||
@@ -160,10 +160,10 @@ flowchart LR
|
|||||||
- `core_py/optimizer.py` (55 lines)
|
- `core_py/optimizer.py` (55 lines)
|
||||||
- `core_py/queue_worker.py` (82 lines)
|
- `core_py/queue_worker.py` (82 lines)
|
||||||
|
|
||||||
### `docs/` — 63 files, ~2,605 lines
|
### `docs/` — 64 files, ~2,630 lines
|
||||||
|
|
||||||
**Sub-directories**
|
**Sub-directories**
|
||||||
- `docs/records/` (51) — Astra Project Chronicle Records
|
- `docs/records/` (52) — Astra Project Chronicle Records
|
||||||
- `docs/docs/` (5) — docs Chronicle Records
|
- `docs/docs/` (5) — docs Chronicle Records
|
||||||
|
|
||||||
**Key files**
|
**Key files**
|
||||||
@@ -172,7 +172,7 @@ flowchart LR
|
|||||||
- `docs/EXPERIENCE_MEMORY_PLAN.md` (122 lines) — Experience Memory (Mistake / Lesson Loop) — Implementation Plan
|
- `docs/EXPERIENCE_MEMORY_PLAN.md` (122 lines) — Experience Memory (Mistake / Lesson Loop) — Implementation Plan
|
||||||
- `docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview
|
- `docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview
|
||||||
- `docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview
|
- `docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview
|
||||||
- `docs/records/ConnectAI/timeline.md` (125 lines) — Project Timeline
|
- `docs/records/ConnectAI/timeline.md` (128 lines) — Project Timeline
|
||||||
- `docs/Advanced_Features_Implementation_Guide.md` (40 lines) — Advanced Features Implementation Guide
|
- `docs/Advanced_Features_Implementation_Guide.md` (40 lines) — Advanced Features Implementation Guide
|
||||||
- `docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md` (43 lines) — Project Chronicle Guard: Search Engine Roadmap
|
- `docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md` (43 lines) — Project Chronicle Guard: Search Engine Roadmap
|
||||||
- `docs/UX_UI_Consistency_Guidelines.md` (44 lines) — UX/UI Consistency Guidelines
|
- `docs/UX_UI_Consistency_Guidelines.md` (44 lines) — UX/UI Consistency Guidelines
|
||||||
@@ -307,7 +307,7 @@ Astra는 대표님의 명시적인 승인 하에 로컬 시스템의 강력한
|
|||||||
**Designed for High-Performance Decision Making.**
|
**Designed for High-Performance Decision Making.**
|
||||||
Copyright (C) **g1nation**. All rights reserved.
|
Copyright (C) **g1nation**. All rights reserved.
|
||||||
|
|
||||||
_Last auto-scan: 2026-05-13T16:54:00.117Z · signature `2c245387`_
|
_Last auto-scan: 2026-05-13T17:37:28.091Z · signature `b3e670ea`_
|
||||||
<!-- ASTRA:AUTO-END -->
|
<!-- ASTRA:AUTO-END -->
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"generatedAt": "2026-05-13T16:54:00.128Z",
|
"generatedAt": "2026-05-13T17:37:28.099Z",
|
||||||
"files": {
|
"files": {
|
||||||
"src/agent.ts": {
|
"src/agent.ts": {
|
||||||
"mtimeMs": 1778683690000,
|
"mtimeMs": 1778683690000,
|
||||||
@@ -249,9 +249,9 @@
|
|||||||
"imports": []
|
"imports": []
|
||||||
},
|
},
|
||||||
"src/extension.ts": {
|
"src/extension.ts": {
|
||||||
"mtimeMs": 1778687229000,
|
"mtimeMs": 1778693606000,
|
||||||
"size": 49361,
|
"size": 50539,
|
||||||
"lines": 945,
|
"lines": 966,
|
||||||
"role": "",
|
"role": "",
|
||||||
"imports": [
|
"imports": [
|
||||||
"src/utils",
|
"src/utils",
|
||||||
@@ -462,9 +462,9 @@
|
|||||||
"imports": []
|
"imports": []
|
||||||
},
|
},
|
||||||
"src/features/projectArchitecture/index.ts": {
|
"src/features/projectArchitecture/index.ts": {
|
||||||
"mtimeMs": 1778684164000,
|
"mtimeMs": 1778691699000,
|
||||||
"size": 23147,
|
"size": 25373,
|
||||||
"lines": 523,
|
"lines": 573,
|
||||||
"role": "Project Architecture Context (Feature 2) Builds a markdown document that captures the durable facts about a project — its purpose, modules, key files, constraints, decisions — so Astra can attach it t",
|
"role": "Project Architecture Context (Feature 2) Builds a markdown document that captures the durable facts about a project — its purpose, modules, key files, constraints, decisions — so Astra can attach it t",
|
||||||
"imports": [
|
"imports": [
|
||||||
"src/utils",
|
"src/utils",
|
||||||
@@ -923,9 +923,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/sidebarProvider.ts": {
|
"src/sidebarProvider.ts": {
|
||||||
"mtimeMs": 1778690954000,
|
"mtimeMs": 1778693581000,
|
||||||
"size": 127595,
|
"size": 132228,
|
||||||
"lines": 2934,
|
"lines": 3026,
|
||||||
"role": "",
|
"role": "",
|
||||||
"imports": [
|
"imports": [
|
||||||
"src/utils",
|
"src/utils",
|
||||||
@@ -1508,7 +1508,7 @@
|
|||||||
"imports": []
|
"imports": []
|
||||||
},
|
},
|
||||||
"docs/records/ConnectAI/chronicle.config.json": {
|
"docs/records/ConnectAI/chronicle.config.json": {
|
||||||
"mtimeMs": 1778690673000,
|
"mtimeMs": 1778693841000,
|
||||||
"size": 416,
|
"size": 416,
|
||||||
"lines": 11,
|
"lines": 11,
|
||||||
"role": "JSON configuration",
|
"role": "JSON configuration",
|
||||||
@@ -1710,6 +1710,13 @@
|
|||||||
"role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
|
"role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
|
||||||
"imports": []
|
"imports": []
|
||||||
},
|
},
|
||||||
|
"docs/records/ConnectAI/development/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업할거야_implementation.md": {
|
||||||
|
"mtimeMs": 1778691256000,
|
||||||
|
"size": 990,
|
||||||
|
"lines": 22,
|
||||||
|
"role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업할거야",
|
||||||
|
"imports": []
|
||||||
|
},
|
||||||
"docs/records/ConnectAI/development/2026-05-13_너는-분석-요청하거나-내가-작업-요청을-할때-connectai-architecture-md-문서를-참고하고-_implementation.md": {
|
"docs/records/ConnectAI/development/2026-05-13_너는-분석-요청하거나-내가-작업-요청을-할때-connectai-architecture-md-문서를-참고하고-_implementation.md": {
|
||||||
"mtimeMs": 1778678912000,
|
"mtimeMs": 1778678912000,
|
||||||
"size": 1738,
|
"size": 1738,
|
||||||
@@ -1774,9 +1781,9 @@
|
|||||||
"imports": []
|
"imports": []
|
||||||
},
|
},
|
||||||
"docs/records/ConnectAI/timeline.md": {
|
"docs/records/ConnectAI/timeline.md": {
|
||||||
"mtimeMs": 1778690673000,
|
"mtimeMs": 1778691256000,
|
||||||
"size": 8318,
|
"size": 8485,
|
||||||
"lines": 125,
|
"lines": 128,
|
||||||
"role": "Project Timeline",
|
"role": "Project Timeline",
|
||||||
"imports": []
|
"imports": []
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
|
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
|
||||||
"createdAt": 1778691140353,
|
"createdAt": 1778693761992,
|
||||||
"modelVersion": "unknown"
|
"modelVersion": "unknown"
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
|
"result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
|
||||||
"createdAt": 1778691140352,
|
"createdAt": 1778693761991,
|
||||||
"modelVersion": "unknown"
|
"modelVersion": "unknown"
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"result": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.",
|
"result": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.",
|
||||||
"createdAt": 1778691140352,
|
"createdAt": 1778693761991,
|
||||||
"modelVersion": "unknown"
|
"modelVersion": "unknown"
|
||||||
}
|
}
|
||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"result": "---\nid: stress_conflict_1778691140340\ndate: 2026-05-13T16:52:20.353Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\nFinal report with inconsistencies. This should be long enough to pass validation.\n\nFinal report with inconsistencies. This should be long enough to pass validation.\n\n---\n## 💡 Astra의 선제적 제안 (Proactive Next Actions)\nFinal report with inconsistencies. This should be long enough to pass validation.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `60/100` | ⚠️ Medium |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[PLANNER]** 전략 수립 중... (12ms)\n- **[RESEARCHER]** 핵심 정보 수집 및 분석 중... (0ms)\n- **[WRITER]** 최종 리포트 작성 및 편집 중... (0ms)\n",
|
"result": "---\nid: stress_conflict_1778693761978\ndate: 2026-05-13T17:36:01.992Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\nFinal report with inconsistencies. This should be long enough to pass validation.\n\nFinal report with inconsistencies. This should be long enough to pass validation.\n\n---\n## 💡 Astra의 선제적 제안 (Proactive Next Actions)\nFinal report with inconsistencies. This should be long enough to pass validation.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `60/100` | ⚠️ Medium |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[PLANNER]** 전략 수립 중... (12ms)\n- **[RESEARCHER]** 핵심 정보 수집 및 분석 중... (1ms)\n- **[WRITER]** 최종 리포트 작성 및 편집 중... (1ms)\n",
|
||||||
"createdAt": 1778691140353,
|
"createdAt": 1778693761992,
|
||||||
"modelVersion": "unknown"
|
"modelVersion": "unknown"
|
||||||
}
|
}
|
||||||
+10
-10
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"missionId": "stress_conflict_1778691140340",
|
"missionId": "stress_conflict_1778693761978",
|
||||||
"status": "completed",
|
"status": "completed",
|
||||||
"startTime": "2026-05-13T16:52:20.340Z",
|
"startTime": "2026-05-13T17:36:01.978Z",
|
||||||
"totalElapsedMs": 13,
|
"totalElapsedMs": 14,
|
||||||
"results": {
|
"results": {
|
||||||
"planner": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.",
|
"planner": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.",
|
||||||
"researcher": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
|
"researcher": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
|
||||||
@@ -18,28 +18,28 @@
|
|||||||
"to": "planner",
|
"to": "planner",
|
||||||
"durationMs": 12,
|
"durationMs": 12,
|
||||||
"message": "전략 수립 중...",
|
"message": "전략 수립 중...",
|
||||||
"ts": "2026-05-13T16:52:20.352Z"
|
"ts": "2026-05-13T17:36:01.990Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"from": "planner",
|
"from": "planner",
|
||||||
"to": "researcher",
|
"to": "researcher",
|
||||||
"durationMs": 0,
|
"durationMs": 1,
|
||||||
"message": "핵심 정보 수집 및 분석 중...",
|
"message": "핵심 정보 수집 및 분석 중...",
|
||||||
"ts": "2026-05-13T16:52:20.352Z"
|
"ts": "2026-05-13T17:36:01.991Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"from": "researcher",
|
"from": "researcher",
|
||||||
"to": "writer",
|
"to": "writer",
|
||||||
"durationMs": 0,
|
"durationMs": 1,
|
||||||
"message": "최종 리포트 작성 및 편집 중...",
|
"message": "최종 리포트 작성 및 편집 중...",
|
||||||
"ts": "2026-05-13T16:52:20.352Z"
|
"ts": "2026-05-13T17:36:01.992Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"from": "writer",
|
"from": "writer",
|
||||||
"to": "completed",
|
"to": "completed",
|
||||||
"durationMs": 1,
|
"durationMs": 0,
|
||||||
"message": "미션 완료",
|
"message": "미션 완료",
|
||||||
"ts": "2026-05-13T16:52:20.353Z"
|
"ts": "2026-05-13T17:36:01.992Z"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"resilienceMetrics": {
|
"resilienceMetrics": {
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
# Astra Patch Notes
|
# Astra Patch Notes
|
||||||
|
|
||||||
|
## v2.1.2 (2026-05-14)
|
||||||
|
### 🏛️ Chronicle Repair & Context Stability
|
||||||
|
- **프로젝트 루트 자동 복구 로직 도입:** 이전 버전에서 워크스페이스 상위 폴더를 기준으로 잘못 저장된 서브프로젝트 루트 정보를 자동으로 탐지하고 수정하는 복구(`_repairCorruptedChronicleProjectRoots`) 기능을 추가했습니다.
|
||||||
|
- **컨텍스트 전환 정교화:** 에디터 포커스 기반의 자동 프로젝트 전환 로직을 개선하여, 사용자가 수동으로 지정한 프로젝트 컨텍스트가 의도치 않게 초기화되지 않도록 안정성을 강화했습니다.
|
||||||
|
- **아키텍처 인지 고도화:** 서브프로젝트 인식 실패 시 워크스페이스 루트로 폴백하는 동작을 보완하여 다중 프로젝트 환경에서의 일관성을 확보했습니다.
|
||||||
|
- **신규 패키징:** `astra-2.1.2.vsix` 패키지를 통해 더욱 안정화된 프로젝트 관리 환경을 배포합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
## v2.1.1 (2026-05-14)
|
## v2.1.1 (2026-05-14)
|
||||||
### 🏛️ Multi-Subproject Awareness & Context Precision
|
### 🏛️ Multi-Subproject Awareness & Context Precision
|
||||||
|
|||||||
@@ -7,5 +7,5 @@
|
|||||||
"corePurpose": "",
|
"corePurpose": "",
|
||||||
"detailLevel": "standard",
|
"detailLevel": "standard",
|
||||||
"createdAt": "2026-05-13T13:09:33.788Z",
|
"createdAt": "2026-05-13T13:09:33.788Z",
|
||||||
"updatedAt": "2026-05-13T16:54:16.995Z"
|
"updatedAt": "2026-05-13T17:37:21.922Z"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+2
-7
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "astra",
|
"name": "astra",
|
||||||
"version": "2.80.43",
|
"version": "2.1.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "astra",
|
"name": "astra",
|
||||||
"version": "2.80.43",
|
"version": "2.1.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lmstudio/sdk": "^1.5.0",
|
"@lmstudio/sdk": "^1.5.0",
|
||||||
@@ -57,7 +57,6 @@
|
|||||||
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
|
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.29.0",
|
"@babel/code-frame": "^7.29.0",
|
||||||
"@babel/generator": "^7.29.0",
|
"@babel/generator": "^7.29.0",
|
||||||
@@ -1956,7 +1955,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"baseline-browser-mapping": "^2.10.12",
|
"baseline-browser-mapping": "^2.10.12",
|
||||||
"caniuse-lite": "^1.0.30001782",
|
"caniuse-lite": "^1.0.30001782",
|
||||||
@@ -2850,7 +2848,6 @@
|
|||||||
"integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
|
"integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jest/core": "^29.7.0",
|
"@jest/core": "^29.7.0",
|
||||||
"@jest/types": "^29.6.3",
|
"@jest/types": "^29.6.3",
|
||||||
@@ -4403,7 +4400,6 @@
|
|||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
@@ -4636,7 +4632,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
|
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
|
||||||
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/colinhacks"
|
"url": "https://github.com/sponsors/colinhacks"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
"name": "astra",
|
"name": "astra",
|
||||||
"displayName": "Astra",
|
"displayName": "Astra",
|
||||||
"description": "The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.",
|
"description": "The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.",
|
||||||
"version": "2.1.1",
|
"version": "2.1.2",
|
||||||
"publisher": "g1nation",
|
"publisher": "g1nation",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"icon": "assets/icon.png",
|
"icon": "assets/icon.png",
|
||||||
|
|||||||
@@ -150,6 +150,13 @@ export async function activate(context: vscode.ExtensionContext) {
|
|||||||
activity: activityTracker,
|
activity: activityTracker,
|
||||||
loadedModels: () => lmStudioClient.listLoadedCached(),
|
loadedModels: () => lmStudioClient.listLoadedCached(),
|
||||||
});
|
});
|
||||||
|
// One-time repair: rewrite any chronicle projects that were saved with the
|
||||||
|
// workspace parent as their `projectRoot` (a side-effect of the old
|
||||||
|
// pre-multi-subproject activation code). Idempotent and silent when there's
|
||||||
|
// nothing to fix.
|
||||||
|
void provider._repairCorruptedChronicleProjectRoots().catch((e: any) => {
|
||||||
|
logError('architecture: chronicle repair failed.', { error: e?.message ?? String(e) });
|
||||||
|
});
|
||||||
context.subscriptions.push(
|
context.subscriptions.push(
|
||||||
vscode.commands.registerCommand('g1nation.openChat', () => {
|
vscode.commands.registerCommand('g1nation.openChat', () => {
|
||||||
provider!.openAsPanel(vscode.ViewColumn.Three);
|
provider!.openAsPanel(vscode.ViewColumn.Three);
|
||||||
|
|||||||
+72
-3
@@ -982,6 +982,64 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn
|
|||||||
await this._context.globalState.update(SidebarChatProvider.chronicleProjectsStateKey, projects);
|
await this._context.globalState.update(SidebarChatProvider.chronicleProjectsStateKey, projects);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* One-time repair for chronicle projects that were stored before the
|
||||||
|
* multi-subproject fix landed.
|
||||||
|
*
|
||||||
|
* Old activation code always treated `workspaceFolders[0]` (= the open
|
||||||
|
* parent folder, e.g. `/.../Antigravity`) as the project root, so every
|
||||||
|
* subproject the user activated (`ConnectAI`, `Datacollector_MAC`,
|
||||||
|
* `Skybound`, …) ended up with `projectRoot === <parent>` in globalState.
|
||||||
|
* That breaks reload: `_ensureActiveProjectForWorkspace` case 2 matches
|
||||||
|
* the corrupted entry on every boot and force-switches the active
|
||||||
|
* project to whichever bad row it found first.
|
||||||
|
*
|
||||||
|
* The repair: for each chronicle project whose `projectName` does NOT
|
||||||
|
* match the basename of its stored `projectRoot` (i.e. it can't actually
|
||||||
|
* be the project root), and where a same-name subfolder exists under
|
||||||
|
* the current workspace, retarget the entry to that subfolder. Idempotent
|
||||||
|
* — re-running it after the first pass changes nothing.
|
||||||
|
*/
|
||||||
|
async _repairCorruptedChronicleProjectRoots(): Promise<void> {
|
||||||
|
const wsRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
|
||||||
|
if (!wsRoot) return;
|
||||||
|
const projects = this._getChronicleProjects();
|
||||||
|
if (projects.length === 0) return;
|
||||||
|
const norm = (p: string | undefined) => (p || '').replace(/[\\/]+$/, '').toLowerCase();
|
||||||
|
const wsRootNorm = norm(wsRoot);
|
||||||
|
let changed = false;
|
||||||
|
const repaired = projects.map((p) => {
|
||||||
|
if (!p.projectName || !p.projectRoot) return p;
|
||||||
|
const rootBase = path.basename(p.projectRoot).toLowerCase();
|
||||||
|
const nameMatches = rootBase === p.projectName.toLowerCase();
|
||||||
|
if (nameMatches) return p; // root basename agrees with name → trust it
|
||||||
|
// Only repair entries that look like they were silently captured at
|
||||||
|
// the workspace parent. Anything else (different machine, custom
|
||||||
|
// path) we leave alone.
|
||||||
|
if (norm(p.projectRoot) !== wsRootNorm) return p;
|
||||||
|
const candidate = path.join(wsRoot, p.projectName);
|
||||||
|
try {
|
||||||
|
if (!fs.existsSync(candidate) || !fs.statSync(candidate).isDirectory()) return p;
|
||||||
|
} catch {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
const newDocPath = path.join(candidate, '.astra', 'project-context', 'architecture.md');
|
||||||
|
changed = true;
|
||||||
|
return {
|
||||||
|
...p,
|
||||||
|
projectRoot: candidate,
|
||||||
|
recordRoot: path.join(candidate, 'docs', 'records', p.projectName),
|
||||||
|
architectureDocPath: fs.existsSync(newDocPath) ? newDocPath : p.architectureDocPath,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
if (!changed) return;
|
||||||
|
await this._putChronicleProjects(repaired);
|
||||||
|
const fixedCount = repaired.filter((p, i) => p !== projects[i]).length;
|
||||||
|
logInfo('architecture: repaired chronicle projects with wrong projectRoot.', {
|
||||||
|
wsRoot, count: fixedCount,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// ─── Project Architecture Context (Feature 2) ──────────────────────────────
|
// ─── Project Architecture Context (Feature 2) ──────────────────────────────
|
||||||
//
|
//
|
||||||
// Activation flow:
|
// Activation flow:
|
||||||
@@ -1225,10 +1283,21 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn
|
|||||||
// always reporting the parent.
|
// always reporting the parent.
|
||||||
const hint = vscode.window.activeTextEditor?.document.uri.fsPath
|
const hint = vscode.window.activeTextEditor?.document.uri.fsPath
|
||||||
?? vscode.window.visibleTextEditors[0]?.document.uri.fsPath;
|
?? vscode.window.visibleTextEditors[0]?.document.uri.fsPath;
|
||||||
const workspaceRoot = resolveActiveSubprojectRoot(wsRoot, hint);
|
const resolved = resolveActiveSubprojectRoot(wsRoot, hint);
|
||||||
const projects = this._getChronicleProjects();
|
|
||||||
const active = this._getActiveChronicleProject();
|
|
||||||
const norm = (p: string | undefined) => (p || '').replace(/[\\/]+$/, '').toLowerCase();
|
const norm = (p: string | undefined) => (p || '').replace(/[\\/]+$/, '').toLowerCase();
|
||||||
|
const active = this._getActiveChronicleProject();
|
||||||
|
const projects = this._getChronicleProjects();
|
||||||
|
// Did the editor hint actually point at a nested subproject? If the
|
||||||
|
// resolver fell back to the workspace root (no nested marker, or the
|
||||||
|
// Astra sidebar itself was focused so no editor existed), we must NOT
|
||||||
|
// clobber the user's current active project — they may have set it by
|
||||||
|
// hand via the project picker, or by typing a project intent. Auto-
|
||||||
|
// switching is only safe when there is a clear editor-driven signal.
|
||||||
|
const isNestedHit = !!resolved && norm(resolved) !== norm(wsRoot);
|
||||||
|
if (!isNestedHit && active) {
|
||||||
|
return active;
|
||||||
|
}
|
||||||
|
const workspaceRoot = isNestedHit ? resolved : wsRoot;
|
||||||
if (active && active.projectRoot && norm(active.projectRoot) === norm(workspaceRoot)) {
|
if (active && active.projectRoot && norm(active.projectRoot) === norm(workspaceRoot)) {
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user