Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
819ab9b
docs: 편집 사례에서 최소 문법과 조합 하이라키를 도출한다
Sep 7, 2026
c8570dc
docs: 역사적 범위 확장의 차이와 Host 조합 역할을 명확히 한다
Sep 7, 2026
412f512
docs: 기본 Profile의 편집 약속과 단축키 관습을 구체화한다
Sep 8, 2026
97405f7
docs: 기본 편집 계약표와 최소 코드 변경안을 구체화한다
Sep 8, 2026
62decf5
fix(keyboard): consume canonical default chord interpretation
Sep 8, 2026
34f5547
docs(site): 목표 책임 구조와 프로토콜·TBD를 정렬한다
Sep 9, 2026
dabbe80
ci: 전체 검증과 soak를 수동 실행으로 전환한다 (#742)
developer-1px Sep 9, 2026
19a9608
fix(calendar): 정본 편집 프로토콜과 입력 경로를 일치시킨다 (#744)
developer-1px Sep 9, 2026
1c9351d
fix(calendar): Document Type 정본 계약과 소비 경계를 보강한다 (#746)
developer-1px Sep 9, 2026
babdaea
feat(canvas): Object 정본 수직 슬라이스와 공통 아이콘 툴바를 구현한다 (#748)
developer-1px Sep 9, 2026
cd5608a
feat(affordance): 재사용 가능한 평면 Select 프로파일을 구현한다
Sep 9, 2026
8c494b5
feat(affordance): 평면 선택의 복제와 Clipboard 기본기를 연결한다
Sep 9, 2026
078bc95
feat(canvas): 외부 붙여넣기와 순서 보장 세션을 생태계에 연결한다
Sep 9, 2026
dc981ab
feat(clipboard): 이미지 준비 정본과 Composer 첨부 기본기를 연결한다
Sep 9, 2026
df9f3ab
feat(clipboard): HTML 이미지와 순서 있는 혼합 입력을 연결한다
Sep 9, 2026
ec524d7
fix(canvas): 생성 기본 크기가 드래그 전에 노출되는 문제를 고친다
Sep 9, 2026
ed116d8
feat(canvas): 변과 모서리의 고정 기준 resize를 완성한다 (#758)
developer-1px Sep 9, 2026
d8502c9
feat(canvas): 선택 스타일 편집을 정본 Object 계약으로 연결한다
Sep 9, 2026
e8a1e47
fix(canvas): 스타일 팔레트의 투명색과 배열을 구분한다
Sep 9, 2026
684919f
feat(canvas): 스티커 노트와 도형 본문을 같은 편집 계약으로 연결한다 (#762)
developer-1px Sep 10, 2026
28e6a3b
Merge pull request #750 from developer-1px/issue-749-planar-select
developer-1px Sep 10, 2026
ac0ba0d
Merge pull request #752 from developer-1px/issue-751-paste-basics
developer-1px Sep 10, 2026
8401a11
Merge pull request #754 from developer-1px/issue-753-html-paste
developer-1px Sep 10, 2026
a1a8e55
Merge pull request #756 from developer-1px/issue-755-canvas-create
developer-1px Sep 10, 2026
4d109d8
Merge pull request #760 from developer-1px/issue-759-canvas-style
developer-1px Sep 10, 2026
f79d3e5
merge: 최신 Canvas와 기본 단축키 계약을 통합한다
Sep 10, 2026
75a1f6d
Merge pull request #734 from developer-1px/issue-733-canonical-keyboard
developer-1px Sep 10, 2026
d84b2bd
merge: 편집 문법 도출과 이미지 붙여넣기 계약을 함께 보존한다
Sep 10, 2026
f92466f
Merge pull request #726 from developer-1px/issue-725-editing-grammar-…
developer-1px Sep 10, 2026
f9cbd1c
merge: 최신 정본 문서와 탐색 구조를 통합하고 목차 넘침을 수정한다
Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 3 additions & 83 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,68 +1,14 @@
name: CI

on:
pull_request:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read

jobs:
plan:
name: Plan
runs-on: ubuntu-latest
outputs:
full: ${{ steps.plan.outputs.full }}
package_required: ${{ steps.plan.outputs.package_required }}
package_workspaces: ${{ steps.plan.outputs.package_workspaces }}
browser_specs: ${{ steps.plan.outputs.browser_specs }}
docs: ${{ steps.plan.outputs.docs }}
site: ${{ steps.plan.outputs.site }}
standards: ${{ steps.plan.outputs.standards }}
external_kit: ${{ steps.plan.outputs.external_kit }}
reason: ${{ steps.plan.outputs.reason }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions/setup-node@v6
with:
node-version: "22"
- name: Select verification scope
id: plan
env:
EVENT_NAME: ${{ github.event_name }}
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
if [ "$EVENT_NAME" = "pull_request" ]; then
node scripts/ci-plan.mjs --base "$BASE_SHA" --head "$HEAD_SHA" >> "$GITHUB_OUTPUT"
else
node scripts/ci-plan.mjs --full >> "$GITHUB_OUTPUT"
fi
- name: Summarize verification scope
env:
PLAN_REASON: ${{ steps.plan.outputs.reason }}
PACKAGE_WORKSPACES: ${{ steps.plan.outputs.package_workspaces }}
BROWSER_SPECS: ${{ steps.plan.outputs.browser_specs }}
EXTERNAL_KIT: ${{ steps.plan.outputs.external_kit }}
run: |
{
echo "## CI 검증 계획"
echo "- 판단: $PLAN_REASON"
echo "- 패키지: $PACKAGE_WORKSPACES"
echo "- 브라우저: $BROWSER_SPECS"
echo "- 외부 kit: $EXTERNAL_KIT"
} >> "$GITHUB_STEP_SUMMARY"
- name: Verify workspace contract and planner
run: npm run workspace:check && npm run ci:plan:test

package:
name: Package
needs: plan
if: needs.plan.outputs.package_required == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand All @@ -71,31 +17,15 @@ jobs:
node-version: "22"
- name: Install dependencies
run: npm ci --no-audit --no-fund
- name: Verify planner commands
run: npm run ci:plan:test
- name: Verify full release graph
if: needs.plan.outputs.full == 'true'
env:
npm_config_cache: ${{ runner.temp }}/npm-cache
run: npm run release:check
- name: Verify affected libraries
if: needs.plan.outputs.full != 'true' && needs.plan.outputs.package_workspaces != '[]'
env:
AFFECTED_WORKSPACES: ${{ needs.plan.outputs.package_workspaces }}
run: >-
node --input-type=module --eval
'import { spawnSync } from "node:child_process";
const workspaces = JSON.parse(process.env.AFFECTED_WORKSPACES);
const result = spawnSync("node", ["scripts/workspace-tasks.mjs", "verify", ...workspaces], { stdio: "inherit" });
process.exit(result.status ?? 1);'
- name: Verify standards
if: needs.plan.outputs.full != 'true' && needs.plan.outputs.standards == 'true'
run: npm run standard:check
- name: Verify documentation
if: needs.plan.outputs.full != 'true' && needs.plan.outputs.docs == 'true'
run: npm run docs:evaluate

playground-site:
name: Site
needs: plan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand All @@ -107,22 +37,12 @@ jobs:
- name: Install Rich Text browser engines
run: npx playwright install --with-deps firefox webkit
- name: Verify site
if: needs.plan.outputs.site == 'true'
run: npm run typecheck -w @interactive-os/json-document-site && npm test -w @interactive-os/json-document-site && npm run site:verify:pages
- name: Verify browser behavior
env:
BROWSER_SPECS: ${{ needs.plan.outputs.browser_specs }}
run: >-
node --input-type=module --eval
'import { spawnSync } from "node:child_process";
const specs = JSON.parse(process.env.BROWSER_SPECS);
const result = spawnSync("npm", ["run", "browser:test", "--", ...specs], { stdio: "inherit" });
process.exit(result.status ?? 1);'
run: npm run browser:test

external-kit:
name: External kit
needs: plan
if: needs.plan.outputs.external_kit == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/collaboration-soak.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ name: Collaboration Soak

on:
workflow_dispatch:
schedule:
- cron: "0 19 * * 1"

permissions:
contents: read
Expand Down
16 changes: 16 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
# Repository agent instructions

## Local verification and remote workflows

This is a solo-maintained project. Agents own change-scoped local verification
before handoff: run the relevant tests, type checks, builds, and browser flows.
Report the commands, results, and any unexecuted or failing checks separately.
An absent remote check must not be reported as a pass.

Pull requests do not automatically run full CI. Main pushes run the Pages
build/deploy workflow; release tags retain package verification on a clean
runner. Full CI and the extended collaboration soak are manual workflows.
Do not wait for automatic PR checks or routinely dispatch manual CI to recreate
the removed gate. Use remote full verification when deliberately requested.

Keep product tests and verification commands available. The local workflow and
manual commands are documented in the root README's development section.

## Canonical module principle

This repository follows **the same role, the same responsibility, the same
Expand Down
59 changes: 51 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,14 @@ stateless JSON Patch

| 목적 | 위치 |
| --- | --- |
| 빠른 사용 예제 | [docs/public/quickstart.md](docs/public/quickstart.md) |
| 빠른 사용 예제 | [Intent guide](docs/public/intent-guide.md) |
| 목표 구조와 TBD | [Concept Map](docs/public/concepts.md), [Foundation](docs/public/foundation.md) |
| JSON Document 개념 | [docs/public/overview.md](docs/public/overview.md) |
| JSON Document API | [docs/public/api.md](docs/public/api.md) |
| JSON Document Protocol | [docs/public/api.md](docs/public/api.md) |
| Editing Protocol | [docs/public/editing.md](docs/public/editing.md) |
| Document Types · TBD | [후보와 완료 조건](docs/public/document-types.md) |
| Official Hands · TBD | [Profile의 목표와 현재 증거](docs/public/official-hands.md) |
| Building Blocks | [독립적인 네 책임](docs/public/building-blocks.md) |
| 편집 개념 | [docs/public/selection.md](docs/public/selection.md), [history](docs/public/history.md), [clipboard](docs/public/clipboard.md), [topology](docs/public/topology.md) |
| Adapter | [docs/public/adapters.md](docs/public/adapters.md) |
| Connector | [docs/public/connectors.md](docs/public/connectors.md) |
Expand Down Expand Up @@ -68,7 +73,10 @@ Editing, Adapter, Connector와 collaboration package는 독립 version과 releas
lifecycle을 가집니다. Selection, clipboard, history는 editing companion이
제공하는 headless lifecycle 위에서 도메인별 모델을 조합합니다. 플랫폼 계약은
공식 Adapter가 맡고, external framework와 schema의 반복 glue는 공식 Connector가
맡으며, persistence와 제품별 UI 의미는 host가 소유합니다.
맡습니다. Host는 조합·실행 순서·제품 정책 값·copy·fixture·layout과 구체
persistence 인스턴스 주입을 소유합니다. 재사용 모델·연산·투영·UI 행동은 각
정본 모듈에 둡니다. Document Type 후보와 Official Hands의 전체 Profile은
아직 TBD이며 기존 package/API의 존재만으로 완료를 선언하지 않습니다.
일반 DOM과 Input Events 정규화가 필요한 제품은 별도 수명 주기의
`@interactive-os/editable`도 검토할 수 있습니다.

Expand All @@ -89,12 +97,15 @@ optional editing companion이 제공하는 것:
- range-set과 set-selection transition family
- Document·Order·Sheet·Object·Tree domain slice와 selection-restoring history

편집 제품이 계속 소유하는 것:
Application/Host가 소유하는 것:

- rendering, DOM focus, keyboard, drag/drop UI와 geometry hit-test
- DOM focus, system clipboard와 제품별 interaction policy
- formula engine과 제품별 grid projection 정책
- product command 이름, layout, route, remote protocol
- 정본 모듈의 조합과 실행 순서
- 제품의 권한·기본값·copy·fixture·layout·route
- 구체 persistence·network 인스턴스와 제품별 정책 값의 주입

문서 의미·formula·grid projection은 해당 의미 owner에, DOM focus·keyboard·
clipboard·geometry 관찰은 Adapter에, 조작 수명주기와 재사용 UI는 Affordance·
Connector·UI Primitives에 둡니다. Core 밖의 책임이 모두 Host 책임은 아닙니다.

공식 Adapter가 제공하는 것:

Expand Down Expand Up @@ -124,3 +135,35 @@ npm test -w @interactive-os/json-document
npm run typecheck -w @interactive-os/json-document
npm run build -w @interactive-os/json-document
```

### 검증 운영

1인 개발과 agent의 로컬 검증을 기본으로 합니다. 개발·PR에서는 변경 범위에 맞는
테스트·타입·빌드·브라우저 검증을 수행하고, 실행 명령과 결과를 인계합니다.
실행하지 못한 검사와 실패한 검사는 통과와 구분합니다. 자동 CI가 없다는 사실을
검증 완료로 간주하지 않습니다.

| 시점 | 원격 실행 |
| --- | --- |
| PR 생성·갱신 | 자동 전체 CI 없음 |
| main push | Pages 빌드·배포와 live 확인 |
| 릴리스 tag | 깨끗한 runner에서 기존 패키지 검증 후 publish |
| 필요 시 | 전체 CI와 장시간 collaboration soak 수동 실행 |

전체 검증이 필요하면 기존 명령을 사용합니다. 제품 테스트와 검사 CLI는 유지하며,
변경 영향도 선택기 CLI는 자동 CI의 gate로 사용하지 않습니다.

```sh
npm run verify
npm run release:check
npm run external-kit:verify
npm run test:collaboration:soak
```

원격의 깨끗한 환경에서 확인하려면 GitHub Actions의 해당 workflow에서
`Run workflow`를 선택하거나 아래 명령으로 명시적으로 실행합니다.

```sh
gh workflow run ci.yml --ref main
gh workflow run collaboration-soak.yml --ref main
```
Loading