experienceos 0.7.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- experienceos-0.7.2/.gitignore +39 -0
- experienceos-0.7.2/CHANGELOG.md +273 -0
- experienceos-0.7.2/LICENSE +21 -0
- experienceos-0.7.2/PKG-INFO +334 -0
- experienceos-0.7.2/README.md +271 -0
- experienceos-0.7.2/docs/AI_AGENT_AUDIT.md +104 -0
- experienceos-0.7.2/docs/ARCHITECTURE.md +224 -0
- experienceos-0.7.2/docs/DEMO.md +115 -0
- experienceos-0.7.2/docs/ROADMAP.md +110 -0
- experienceos-0.7.2/docs/assets/workbench-brief.png +0 -0
- experienceos-0.7.2/docs/assets/workbench-history.png +0 -0
- experienceos-0.7.2/docs/assets/workbench-timeline.png +0 -0
- experienceos-0.7.2/docs/issues/README.md +26 -0
- experienceos-0.7.2/docs/issues/m0-foundation.md +43 -0
- experienceos-0.7.2/docs/issues/m1-import.md +110 -0
- experienceos-0.7.2/docs/issues/m2-intelligence.md +93 -0
- experienceos-0.7.2/docs/issues/m3-output.md +44 -0
- experienceos-0.7.2/docs/issues/m4-platform.md +53 -0
- experienceos-0.7.2/docs/issues/m5-hardening.md +74 -0
- experienceos-0.7.2/docs/issues/m6-workbench.md +78 -0
- experienceos-0.7.2/evals/README.md +20 -0
- experienceos-0.7.2/evals/experience_brief.jsonl +9 -0
- experienceos-0.7.2/evals/manifest.json +23 -0
- experienceos-0.7.2/examples/README.md +43 -0
- experienceos-0.7.2/examples/agent_demo.py +91 -0
- experienceos-0.7.2/examples/experience.example.json +51 -0
- experienceos-0.7.2/pyproject.toml +112 -0
- experienceos-0.7.2/src/experienceos/__init__.py +36 -0
- experienceos-0.7.2/src/experienceos/__main__.py +6 -0
- experienceos-0.7.2/src/experienceos/ai/__init__.py +52 -0
- experienceos-0.7.2/src/experienceos/ai/demo.py +60 -0
- experienceos-0.7.2/src/experienceos/ai/enrich.py +137 -0
- experienceos-0.7.2/src/experienceos/ai/evaluation.py +389 -0
- experienceos-0.7.2/src/experienceos/ai/extraction.py +284 -0
- experienceos-0.7.2/src/experienceos/ai/factory.py +18 -0
- experienceos-0.7.2/src/experienceos/ai/interview.py +78 -0
- experienceos-0.7.2/src/experienceos/ai/mock.py +34 -0
- experienceos-0.7.2/src/experienceos/ai/prompts.py +126 -0
- experienceos-0.7.2/src/experienceos/ai/provider.py +264 -0
- experienceos-0.7.2/src/experienceos/ai/reporting.py +92 -0
- experienceos-0.7.2/src/experienceos/ai/responses.py +175 -0
- experienceos-0.7.2/src/experienceos/ai/schemas.py +36 -0
- experienceos-0.7.2/src/experienceos/ai/tools.py +153 -0
- experienceos-0.7.2/src/experienceos/ai/transport.py +367 -0
- experienceos-0.7.2/src/experienceos/ai/workflow.py +305 -0
- experienceos-0.7.2/src/experienceos/api/__init__.py +5 -0
- experienceos-0.7.2/src/experienceos/api/app.py +191 -0
- experienceos-0.7.2/src/experienceos/cli/__init__.py +5 -0
- experienceos-0.7.2/src/experienceos/cli/app.py +1536 -0
- experienceos-0.7.2/src/experienceos/cli/render.py +124 -0
- experienceos-0.7.2/src/experienceos/config.py +132 -0
- experienceos-0.7.2/src/experienceos/connectors/__init__.py +49 -0
- experienceos-0.7.2/src/experienceos/connectors/base.py +124 -0
- experienceos-0.7.2/src/experienceos/connectors/github.py +390 -0
- experienceos-0.7.2/src/experienceos/connectors/gitrepo.py +250 -0
- experienceos-0.7.2/src/experienceos/connectors/languages.py +98 -0
- experienceos-0.7.2/src/experienceos/connectors/projectfiles.py +171 -0
- experienceos-0.7.2/src/experienceos/connectors/registry.py +54 -0
- experienceos-0.7.2/src/experienceos/connectors/resume/__init__.py +18 -0
- experienceos-0.7.2/src/experienceos/connectors/resume/extractor.py +189 -0
- experienceos-0.7.2/src/experienceos/connectors/resume/parser.py +384 -0
- experienceos-0.7.2/src/experienceos/core/__init__.py +54 -0
- experienceos-0.7.2/src/experienceos/core/draft.py +67 -0
- experienceos-0.7.2/src/experienceos/core/errors.py +74 -0
- experienceos-0.7.2/src/experienceos/core/fsutil.py +43 -0
- experienceos-0.7.2/src/experienceos/core/guardrails.py +105 -0
- experienceos-0.7.2/src/experienceos/core/models.py +269 -0
- experienceos-0.7.2/src/experienceos/core/ulid.py +50 -0
- experienceos-0.7.2/src/experienceos/exporters/__init__.py +29 -0
- experienceos-0.7.2/src/experienceos/exporters/base.py +46 -0
- experienceos-0.7.2/src/experienceos/exporters/html.py +119 -0
- experienceos-0.7.2/src/experienceos/exporters/json_resume.py +168 -0
- experienceos-0.7.2/src/experienceos/exporters/markdown.py +118 -0
- experienceos-0.7.2/src/experienceos/exporters/registry.py +47 -0
- experienceos-0.7.2/src/experienceos/exporters/templates/profile.html.tpl +46 -0
- experienceos-0.7.2/src/experienceos/exporters/templates/profile.md.tpl +10 -0
- experienceos-0.7.2/src/experienceos/exporters/templates/timeline.md.tpl +9 -0
- experienceos-0.7.2/src/experienceos/plugins.py +93 -0
- experienceos-0.7.2/src/experienceos/presentation.py +86 -0
- experienceos-0.7.2/src/experienceos/py.typed +0 -0
- experienceos-0.7.2/src/experienceos/services/__init__.py +9 -0
- experienceos-0.7.2/src/experienceos/services/experiences.py +153 -0
- experienceos-0.7.2/src/experienceos/services/homeops.py +151 -0
- experienceos-0.7.2/src/experienceos/services/ingest.py +69 -0
- experienceos-0.7.2/src/experienceos/services/verify.py +207 -0
- experienceos-0.7.2/src/experienceos/stats.py +119 -0
- experienceos-0.7.2/src/experienceos/storage/__init__.py +6 -0
- experienceos-0.7.2/src/experienceos/storage/fts.py +200 -0
- experienceos-0.7.2/src/experienceos/storage/locking.py +85 -0
- experienceos-0.7.2/src/experienceos/storage/migrations.py +83 -0
- experienceos-0.7.2/src/experienceos/storage/query.py +144 -0
- experienceos-0.7.2/src/experienceos/storage/store.py +251 -0
- experienceos-0.7.2/src/experienceos/web/__init__.py +1 -0
- experienceos-0.7.2/src/experienceos/web/demo.py +138 -0
- experienceos-0.7.2/src/experienceos/web/server.py +341 -0
- experienceos-0.7.2/src/experienceos/web/static/app.js +251 -0
- experienceos-0.7.2/src/experienceos/web/static/index.html +73 -0
- experienceos-0.7.2/src/experienceos/web/static/style.css +243 -0
- experienceos-0.7.2/tests/conftest.py +47 -0
- experienceos-0.7.2/tests/fixtures/github_api.json +74 -0
- experienceos-0.7.2/tests/fixtures/golden_profile.md +38 -0
- experienceos-0.7.2/tests/fixtures/golden_timeline.md +19 -0
- experienceos-0.7.2/tests/fixtures/resume_cn.md +34 -0
- experienceos-0.7.2/tests/fixtures/resume_empty.md +13 -0
- experienceos-0.7.2/tests/fixtures/resume_en.md +28 -0
- experienceos-0.7.2/tests/test_agent.py +370 -0
- experienceos-0.7.2/tests/test_ai.py +383 -0
- experienceos-0.7.2/tests/test_api.py +160 -0
- experienceos-0.7.2/tests/test_cli.py +376 -0
- experienceos-0.7.2/tests/test_config.py +82 -0
- experienceos-0.7.2/tests/test_connectors.py +217 -0
- experienceos-0.7.2/tests/test_enrich.py +206 -0
- experienceos-0.7.2/tests/test_export_html.py +92 -0
- experienceos-0.7.2/tests/test_export_json_resume.py +155 -0
- experienceos-0.7.2/tests/test_export_markdown.py +217 -0
- experienceos-0.7.2/tests/test_fts.py +269 -0
- experienceos-0.7.2/tests/test_github_connector.py +298 -0
- experienceos-0.7.2/tests/test_gitrepo_connector.py +331 -0
- experienceos-0.7.2/tests/test_guardrails.py +133 -0
- experienceos-0.7.2/tests/test_ingest.py +61 -0
- experienceos-0.7.2/tests/test_interview.py +276 -0
- experienceos-0.7.2/tests/test_layering.py +82 -0
- experienceos-0.7.2/tests/test_migrations.py +155 -0
- experienceos-0.7.2/tests/test_models.py +146 -0
- experienceos-0.7.2/tests/test_plugins.py +194 -0
- experienceos-0.7.2/tests/test_projectfiles.py +148 -0
- experienceos-0.7.2/tests/test_query.py +124 -0
- experienceos-0.7.2/tests/test_resume_connector.py +278 -0
- experienceos-0.7.2/tests/test_stats_profile.py +161 -0
- experienceos-0.7.2/tests/test_storage_durability.py +84 -0
- experienceos-0.7.2/tests/test_store.py +184 -0
- experienceos-0.7.2/tests/test_sync_backup.py +163 -0
- experienceos-0.7.2/tests/test_ulid.py +36 -0
- experienceos-0.7.2/tests/test_verify.py +237 -0
- experienceos-0.7.2/tests/test_web.py +201 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
build/
|
|
6
|
+
dist/
|
|
7
|
+
.eggs/
|
|
8
|
+
|
|
9
|
+
# Virtual environments
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
env/
|
|
13
|
+
|
|
14
|
+
# Tooling caches
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.ruff_cache/
|
|
17
|
+
.mypy_cache/
|
|
18
|
+
.coverage
|
|
19
|
+
htmlcov/
|
|
20
|
+
|
|
21
|
+
# Editors
|
|
22
|
+
.idea/
|
|
23
|
+
.vscode/
|
|
24
|
+
*.swp
|
|
25
|
+
|
|
26
|
+
# OS
|
|
27
|
+
.DS_Store
|
|
28
|
+
Thumbs.db
|
|
29
|
+
|
|
30
|
+
# ExperienceOS runtime data (never commit a personal knowledge base)
|
|
31
|
+
.experienceos/
|
|
32
|
+
.experienceos-demo/
|
|
33
|
+
|
|
34
|
+
# ZCode session-local tool state
|
|
35
|
+
.zcode/
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# screenshot/demo scratch home
|
|
39
|
+
.experienceos-shots/
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.7.2] - 2026-09-12
|
|
11
|
+
|
|
12
|
+
First PyPI-distributed release: `pip install experienceos` now works,
|
|
13
|
+
via the tag-driven trusted-publishing pipeline.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- README quickstart installs from PyPI (`pip install experienceos`);
|
|
18
|
+
a PyPI version badge joins the badge row.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- Eval dataset manifest pins the LF digest: the sha256 was computed
|
|
23
|
+
over CRLF working-tree bytes, which never matches the `eol=lf`
|
|
24
|
+
checkouts every CI platform uses.
|
|
25
|
+
- Codecov upload works: the coverage job now grants the
|
|
26
|
+
`id-token: write` permission the OIDC tokenless upload needs.
|
|
27
|
+
|
|
28
|
+
## [0.7.1] - 2026-09-12
|
|
29
|
+
|
|
30
|
+
Durability, index resilience and AI-prompt governance: closing the gap
|
|
31
|
+
between "atomic" as an aspiration and as a verifiable property.
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Durable atomic writes: records, workflow checkpoints and shareable
|
|
36
|
+
reports are fsynced before `os.replace`, and the rename itself is
|
|
37
|
+
persisted on POSIX — a crash can no longer truncate *or* lose a write.
|
|
38
|
+
- Cross-process write locking: the CLI, REST API and workbench may run
|
|
39
|
+
side by side; every store mutation holds an exclusive lock file lock
|
|
40
|
+
(Windows `msvcrt` / POSIX `flock`) so two writers cannot silently drop
|
|
41
|
+
each other's updates. Readers stay lock-free.
|
|
42
|
+
- FTS resilience: index connections set a busy timeout instead of
|
|
43
|
+
failing instantly on a concurrent writer, and the query path detects
|
|
44
|
+
a silently stale index (row count drifted from the record files) and
|
|
45
|
+
rebuilds it from the source of truth.
|
|
46
|
+
- Prompt governance: the evidence-brief system prompt is registered
|
|
47
|
+
with a version like every other template; checkpoints and sanitized
|
|
48
|
+
run reports record `prompt_versions`, and evaluation reports carry
|
|
49
|
+
them for attribution (`report_version` 3).
|
|
50
|
+
- Schema-repair round: a final answer failing local schema validation
|
|
51
|
+
goes back to the model exactly once with the validation error before
|
|
52
|
+
the workflow pauses; a second invalid answer still pauses.
|
|
53
|
+
- Governance files: SECURITY.md (threat model + disclosure policy) and
|
|
54
|
+
a Contributor Covenant CODE_OF_CONDUCT.md; CI uploads coverage to
|
|
55
|
+
Codecov.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- README's hardcoded test-count badge showed a stale number (the CI
|
|
60
|
+
badge is authoritative); CHANGELOG compare links pointed at a
|
|
61
|
+
non-existent organization and version tags were incomplete.
|
|
62
|
+
- Packaging classifiers claimed Python 3.11 support, which the CI
|
|
63
|
+
matrix never tested.
|
|
64
|
+
|
|
65
|
+
## [0.7.0] - 2026-09-11
|
|
66
|
+
|
|
67
|
+
Workbench milestone (M6): the evidence-brief workflow, its evaluation
|
|
68
|
+
harness, and a zero-dependency local browser workbench — plus network
|
|
69
|
+
verification of evidence claims and a print-ready HTML export.
|
|
70
|
+
|
|
71
|
+
### Added
|
|
72
|
+
|
|
73
|
+
- Evidence-brief workflow (#032): a checkpointed model/tool loop — the model
|
|
74
|
+
must *read* records through three read-only tools before making claims;
|
|
75
|
+
citations are validated against evidence loaded during the run; every
|
|
76
|
+
round persists an atomic checkpoint so a paused run resumes exactly where
|
|
77
|
+
it stopped. Provider-neutral (OpenAI-compatible chat and the Responses API
|
|
78
|
+
ship with the box), with sanitized run reports (operational metrics only,
|
|
79
|
+
never prompts) and request metrics with optional per-model cost rates.
|
|
80
|
+
- Evaluation harness (#032): `experienceos ai eval` replays a 9-case
|
|
81
|
+
labelled dataset (tool-sequence, schema-validity, citation-grounding and
|
|
82
|
+
expected-content assertions over deterministic recorded turns), writes
|
|
83
|
+
redacted shareable reports, and supports `--live` for real-model runs on
|
|
84
|
+
the same cases. Dataset ships with a signed-sha256 manifest that states
|
|
85
|
+
what the numbers are *not* valid for.
|
|
86
|
+
- Local workbench (#033): `experienceos web` serves a zero-dependency
|
|
87
|
+
loopback-only browser UI for browsing experiences, running the brief
|
|
88
|
+
workflow (offline demo mode with synthetic data, or a configured live
|
|
89
|
+
model), inspecting tool-call timelines, and resuming paused runs.
|
|
90
|
+
Hardened by default: Host/Origin/Sec-Fetch-Site checks, strict CSP,
|
|
91
|
+
no request logging, errors kept off the wire.
|
|
92
|
+
- Workbench run-history dropdown (#034): replaced the bare `<select>` with
|
|
93
|
+
a custom listbox showing each run's question, status dot (running/
|
|
94
|
+
paused/completed), mode and relative time; keyboard-navigable with
|
|
95
|
+
outside-click/Escape dismissal.
|
|
96
|
+
- Evidence verification: `experienceos verify [id-prefix]` checks GitHub-
|
|
97
|
+
backed evidence against the REST API — repositories, commits (with
|
|
98
|
+
author/date) and pull requests (author/state/merged). Non-GitHub URLs
|
|
99
|
+
get an existence probe; local paths are skipped. `--json` writes a
|
|
100
|
+
machine-readable report; exit code 1 on anything missing, so it can
|
|
101
|
+
gate CI like `lint`.
|
|
102
|
+
- HTML exporter: `experienceos export html` renders a self-contained,
|
|
103
|
+
print-ready profile page (inline stylesheet, evidence links, escaped
|
|
104
|
+
verbatim content) — "Print → PDF" with no extra tooling.
|
|
105
|
+
- Release engineering: tag-driven workflow builds sdist+wheel, smoke-tests
|
|
106
|
+
the wheel outside the repository, creates the GitHub Release, and
|
|
107
|
+
publishes to PyPI via trusted publishing when `PYPI_PUBLISH=true`.
|
|
108
|
+
|
|
109
|
+
### Changed
|
|
110
|
+
|
|
111
|
+
- `AIProviderError` now carries sanitized request `metadata`; the AI
|
|
112
|
+
config gained explicit retry-budget and cost-rate fields
|
|
113
|
+
(`ai.timeout_seconds` replaces `ai.timeout`). The layering guard now
|
|
114
|
+
allows ai's read-only tool seam to import storage (downward, acyclic).
|
|
115
|
+
|
|
116
|
+
## [0.6.0] - 2026-08-30
|
|
117
|
+
|
|
118
|
+
Architecture-hardening release: a full-codebase review whose findings were
|
|
119
|
+
fixed structurally (no special-case patches). Details in
|
|
120
|
+
`docs/issues/m5-hardening.md`.
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
|
|
124
|
+
- Project-files connector (#027): `experienceos import /path/to/folder`
|
|
125
|
+
turns a non-git project directory into one honest draft — title from the
|
|
126
|
+
folder name, description verbatim from the README, languages from the
|
|
127
|
+
shared extension map, explicit undated period, empty contributions.
|
|
128
|
+
Walk safety: junk/build dirs pruned, directory symlinks never followed,
|
|
129
|
+
file-count cap.
|
|
130
|
+
- Shared language module `connectors/languages.py` (#027): one curated
|
|
131
|
+
extension→language map now serves both git-repo and project-files.
|
|
132
|
+
- Injection protocols (#028): `MaterialDraftExtractor` /
|
|
133
|
+
`AcceptsMaterialExtractor` in `connectors.base`; the AI extraction
|
|
134
|
+
pipeline (`ai.extraction.AIExtraction`) is wired by the composition
|
|
135
|
+
root, so any connector can use AI reading without importing the ai tier.
|
|
136
|
+
- Layering guard tests (#028): `tests/test_layering.py` parses every
|
|
137
|
+
module's imports (AST) and fails when a tier reaches where it must not.
|
|
138
|
+
- Interview confirmation now includes `evidence` (#030): AI-harvested
|
|
139
|
+
evidence candidates pass the same keep/drop gate as every other field.
|
|
140
|
+
|
|
141
|
+
### Changed
|
|
142
|
+
|
|
143
|
+
- **Breaking (internal API)**: `ExperienceDraft` moved to
|
|
144
|
+
`core.draft` (re-exported from `connectors.base`); the material→draft
|
|
145
|
+
pipeline moved from `ai.interview` to `ai.extraction` (names re-exported);
|
|
146
|
+
`ResumeExtractor(provider=..., model=...)` replaced by
|
|
147
|
+
`ResumeExtractor(material_extractor)` / `set_material_extractor()`.
|
|
148
|
+
- Unified query path (#029): `services.query_results` is the single
|
|
149
|
+
entry point for CLI and API; the FTS index only pre-filters candidates
|
|
150
|
+
while the in-memory engine always does final filtering and scoring —
|
|
151
|
+
scores and ranking are now identical with and without an index (the
|
|
152
|
+
FTS path previously discarded both).
|
|
153
|
+
- `SourceOrigin` gained `project_files`; `UNDATED_START` is defined once
|
|
154
|
+
in `core.models`; GitHub User-Agent reports the package version.
|
|
155
|
+
|
|
156
|
+
### Fixed
|
|
157
|
+
|
|
158
|
+
- Stale `import --help` text still claiming PDF resumes were not supported.
|
|
159
|
+
|
|
160
|
+
## [0.5.0] - 2026-08-29
|
|
161
|
+
|
|
162
|
+
### Added
|
|
163
|
+
|
|
164
|
+
- Service layer + FastAPI (#018): `services/` holds the use cases (CLI and
|
|
165
|
+
API are thin shells); optional `[api]` extra serves read endpoints
|
|
166
|
+
(/experiences, /search, /stats, /lint) plus draft-only creation via
|
|
167
|
+
`experienceos-serve`.
|
|
168
|
+
- Plugin system (#019): built-ins declared as entry points; third-party
|
|
169
|
+
packages register connectors/exporters by declaring their own;
|
|
170
|
+
`experienceos plugins list` shows source, version and load state.
|
|
171
|
+
- Schema migrations (#020): ordered version steps, transparent read-path
|
|
172
|
+
migration with backup under `<home>/backup/`, `migrate --check`.
|
|
173
|
+
- Sync & backup (#021): `experienceos sync [--init|--push REMOTE]` commits
|
|
174
|
+
the home with git; `experienceos backup` writes a restore-ready zip.
|
|
175
|
+
- FTS index (#022): rebuildable SQLite FTS5 index (CJK unigram split);
|
|
176
|
+
text queries use it only above the record threshold; files stay the
|
|
177
|
+
source of truth. Benchmark script included.
|
|
178
|
+
|
|
179
|
+
## [0.4.0] - 2026-08-29
|
|
180
|
+
|
|
181
|
+
Output milestone (M3): faithful projections of confirmed records.
|
|
182
|
+
|
|
183
|
+
### Added
|
|
184
|
+
|
|
185
|
+
- Exporter framework (#014): `Exporter` protocol, name-keyed registry and the
|
|
186
|
+
`experienceos export <name>` command with SearchQuery-backed filters;
|
|
187
|
+
defaults to active records so drafts never leak into artifacts.
|
|
188
|
+
- Markdown exporter (#015): time-sorted profile with STAR structure and
|
|
189
|
+
evidence lists, plus an `--timeline` by-year view; stdlib
|
|
190
|
+
`string.Template` keeps it dependency-free; golden-file tests pin output.
|
|
191
|
+
- JSON Resume exporter (#016): jsonresume.org-compatible mapping
|
|
192
|
+
(work/projects, technology -> keywords, url evidence -> url) validated by
|
|
193
|
+
strict pydantic models; unexportable fields are dropped and itemized on
|
|
194
|
+
stderr instead of being rewritten.
|
|
195
|
+
- Skill profile (#017): `experienceos profile` (technology timeline,
|
|
196
|
+
co-occurrence Top-N, per-year evidence coverage) and machine-readable
|
|
197
|
+
`stats --json`, backed by a shared pure-function stats module.
|
|
198
|
+
|
|
199
|
+
## [0.3.0] - 2026-08-29
|
|
200
|
+
|
|
201
|
+
Intelligence milestone (M2): provider wiring and AI-assisted drafting.
|
|
202
|
+
|
|
203
|
+
### Added
|
|
204
|
+
|
|
205
|
+
- LLM provider wiring (#010): `OpenAICompatibleProvider` completes the M0 skeleton — configurable timeout (`ai.timeout`), exactly one retry for network-class errors, and 429/5xx responses surfaced as `AIProviderError` with a response-body summary. New `experienceos config get/set/list` subcommands edit config.toml (secrets stay in env vars), `experienceos ai check` verifies the endpoint end to end (`--mock` targets the scripted provider), and `MockProvider` moves into the core `ai` package for tests and `--dry-run` modes.
|
|
206
|
+
|
|
207
|
+
## [0.2.0] - 2026-08-29
|
|
208
|
+
|
|
209
|
+
Import milestone (M1): every connector produces drafts only, with provenance.
|
|
210
|
+
|
|
211
|
+
### Added
|
|
212
|
+
|
|
213
|
+
- Resume importer (#009): rule-based (no LLM) parsing of Markdown/plain-text
|
|
214
|
+
resumes into experience drafts — common CN/EN section headings, entry
|
|
215
|
+
splitting on headings/bold/date lines, `YYYY-MM` period parsing (incl.
|
|
216
|
+
`至今/present`, year-only ranges), curated technology keywords plus inline
|
|
217
|
+
code spans, verbatim descriptions, and the source file attached as `file`
|
|
218
|
+
evidence with `source.ref`. Undated entries carry an explicit `1970-01`
|
|
219
|
+
placeholder tagged `undated`; PDF input is rejected until the M2 AI
|
|
220
|
+
extraction path (#012).
|
|
221
|
+
- Local git repository analyzer (#008): read-only `git log` analysis of a
|
|
222
|
+
local checkout — activity window, author-attributed commit count and
|
|
223
|
+
median change size, extension-based language composition (built-in map,
|
|
224
|
+
no linguist), repo-path evidence plus the GitHub URL when an `origin`
|
|
225
|
+
remote points at github.com. `--author` defaults to the repository's
|
|
226
|
+
`git config user.email`; non-git directories, submodules and shallow
|
|
227
|
+
clones fail or degrade with readable errors.
|
|
228
|
+
- GitHub importer (#007): authenticated-user or explicit-author activity
|
|
229
|
+
import, repository languages, paginated commits/PRs/issues, evidence-backed
|
|
230
|
+
drafts, actionable authentication/rate-limit errors, and offline API fixtures.
|
|
231
|
+
- Connector framework (#006): `Extractor` protocol, `ExperienceDraft`
|
|
232
|
+
(forced `status=draft` + mandatory provenance), `scheme:payload` source
|
|
233
|
+
routing with Windows-drive-letter safety, name-keyed registry, and the
|
|
234
|
+
`experienceos import` command (preview confirmation, never overwrites
|
|
235
|
+
existing records).
|
|
236
|
+
|
|
237
|
+
### Fixed
|
|
238
|
+
|
|
239
|
+
- Experience detail rendering now uses ASCII-safe list/evidence markers and
|
|
240
|
+
folds long evidence URLs correctly on Windows GBK consoles.
|
|
241
|
+
|
|
242
|
+
## [0.1.0] - 2026-08-25
|
|
243
|
+
|
|
244
|
+
First public foundation release (Milestone 0).
|
|
245
|
+
|
|
246
|
+
### Added
|
|
247
|
+
|
|
248
|
+
- Core `Experience` domain model (pydantic v2) with strict validation,
|
|
249
|
+
schema versioning, evidence and provenance (`source`) sub-models.
|
|
250
|
+
- Time-sortable ULID identifier generation (stdlib only).
|
|
251
|
+
- Local-first file storage layer: one JSON file per experience, atomic
|
|
252
|
+
writes, corruption-tolerant listing, `validate` reporting.
|
|
253
|
+
- In-memory search engine: weighted full-text matching plus filters by
|
|
254
|
+
type / tag / technology / status / period overlap.
|
|
255
|
+
- CLI (`experienceos`): `init`, `add`, `list`, `show`, `search`, `set`,
|
|
256
|
+
`add-item`, `edit`, `delete`, `stats`, `validate`, `path`.
|
|
257
|
+
- AI layer scaffolding: `LLMProvider` protocol, OpenAI-compatible provider
|
|
258
|
+
skeleton (optional `[ai]` extra), versioned prompt templates.
|
|
259
|
+
- Project docs: README (zh-CN), ARCHITECTURE, ROADMAP, CONTRIBUTING and a
|
|
260
|
+
GitHub-ready issue backlog split by milestone.
|
|
261
|
+
- CI workflow (GitHub Actions: ruff + pytest on Python 3.10-3.13,
|
|
262
|
+
Ubuntu + Windows).
|
|
263
|
+
|
|
264
|
+
[Unreleased]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.7.2...HEAD
|
|
265
|
+
[0.7.2]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.7.1...v0.7.2
|
|
266
|
+
[0.7.1]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.7.0...v0.7.1
|
|
267
|
+
[0.7.0]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.6.0...v0.7.0
|
|
268
|
+
[0.6.0]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.5.0...v0.6.0
|
|
269
|
+
[0.5.0]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.4.0...v0.5.0
|
|
270
|
+
[0.4.0]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.3.0...v0.4.0
|
|
271
|
+
[0.3.0]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.2.0...v0.3.0
|
|
272
|
+
[0.2.0]: https://github.com/guomengjia618-dot/ExperienceOS/compare/v0.1.0...v0.2.0
|
|
273
|
+
[0.1.0]: https://github.com/guomengjia618-dot/ExperienceOS/releases/tag/v0.1.0
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ExperienceOS Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: experienceos
|
|
3
|
+
Version: 0.7.2
|
|
4
|
+
Summary: ExperienceOS - an open-source personal experience operating system. Never forget what you have built.
|
|
5
|
+
Project-URL: Homepage, https://github.com/guomengjia618-dot/ExperienceOS
|
|
6
|
+
Project-URL: Documentation, https://github.com/guomengjia618-dot/ExperienceOS/tree/main/docs
|
|
7
|
+
Author: ExperienceOS Contributors
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2026 ExperienceOS Contributors
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
License-File: LICENSE
|
|
30
|
+
Keywords: ai-agent,career,experience,knowledge-base,personal-os
|
|
31
|
+
Classifier: Development Status :: 3 - Alpha
|
|
32
|
+
Classifier: Environment :: Console
|
|
33
|
+
Classifier: Intended Audience :: Developers
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Programming Language :: Python :: 3
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
39
|
+
Classifier: Topic :: Office/Business
|
|
40
|
+
Classifier: Typing :: Typed
|
|
41
|
+
Requires-Python: >=3.10
|
|
42
|
+
Requires-Dist: pydantic>=2.7
|
|
43
|
+
Requires-Dist: rich>=13.7
|
|
44
|
+
Requires-Dist: tomli>=2.0; python_version < '3.11'
|
|
45
|
+
Requires-Dist: typer>=0.12
|
|
46
|
+
Provides-Extra: ai
|
|
47
|
+
Requires-Dist: httpx>=0.27; extra == 'ai'
|
|
48
|
+
Provides-Extra: api
|
|
49
|
+
Requires-Dist: fastapi>=0.100; extra == 'api'
|
|
50
|
+
Requires-Dist: uvicorn>=0.30; extra == 'api'
|
|
51
|
+
Provides-Extra: dev
|
|
52
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
53
|
+
Requires-Dist: fastapi>=0.100; extra == 'dev'
|
|
54
|
+
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
56
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
57
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
58
|
+
Provides-Extra: github
|
|
59
|
+
Requires-Dist: httpx>=0.27; extra == 'github'
|
|
60
|
+
Provides-Extra: pdf
|
|
61
|
+
Requires-Dist: pypdf>=4.0; extra == 'pdf'
|
|
62
|
+
Description-Content-Type: text/markdown
|
|
63
|
+
|
|
64
|
+
# ExperienceOS
|
|
65
|
+
|
|
66
|
+
[English](README.en.md) | 简体中文
|
|
67
|
+
|
|
68
|
+
[](https://github.com/guomengjia618-dot/ExperienceOS/actions/workflows/ci.yml)
|
|
69
|
+
[](https://codecov.io/gh/guomengjia618-dot/ExperienceOS)
|
|
70
|
+
[](https://pypi.org/project/experienceos/)
|
|
71
|
+

|
|
72
|
+

|
|
73
|
+
[](#工程质量)
|
|
74
|
+
|
|
75
|
+
> **Never forget what you have built.** 把你做过的每一件事,变成有证据支撑的经历资产。
|
|
76
|
+
>
|
|
77
|
+
> **English abstract** — ExperienceOS is an open-source personal experience
|
|
78
|
+
> operating system for developers. It turns fragmented traces of what you
|
|
79
|
+
> have built (code, repositories, GitHub activity, resumes, conversations)
|
|
80
|
+
> into structured, evidence-backed *Experience Assets* that live on your
|
|
81
|
+
> machine, under your control. It is **not** a resume generator.
|
|
82
|
+
|
|
83
|
+
ExperienceOS 是一个开源的 **AI 个人经历操作系统**(Personal Experience
|
|
84
|
+
Operating System)。它帮助开发者记录、整理、理解和沉淀自己参与过的所有
|
|
85
|
+
项目与创造经历,建立长期的个人经历知识库。
|
|
86
|
+
|
|
87
|
+
很多开发者都有类似的困境:做过大量项目,几年后却想不起细节;GitHub
|
|
88
|
+
仓库一堆,却没有结构化的整理;到了面试或跳槽才临时抱佛脚。项目的真实
|
|
89
|
+
价值散落在代码、commit、文档和个人记忆的碎片里。
|
|
90
|
+
|
|
91
|
+
ExperienceOS 要做的事情只有一件:**把这些碎片转化为有证据支撑的结构化
|
|
92
|
+
经历资产(Experience Asset)**。
|
|
93
|
+
|
|
94
|
+

|
|
95
|
+
|
|
96
|
+
## 核心理念
|
|
97
|
+
|
|
98
|
+
1. **发现、整理、保存真实经历** —— 而不是创造经历。ExperienceOS 不是
|
|
99
|
+
简历生成器,不做包装,不夸大事实。
|
|
100
|
+
2. **能力描述尽可能关联证据**。每条 contribution / result 都可以挂上
|
|
101
|
+
repo、commit、PR、文档等 Evidence。
|
|
102
|
+
3. **AI 只辅助表达,不代替事实**。AI 产出永远是「提案」,经用户确认才
|
|
103
|
+
入库,并且 `source.created_by` 会如实记录内容来自用户还是 `ai:<model>`。
|
|
104
|
+
4. **本地优先(Local-first)**。你的经历库是纯 JSON 文件,存放在
|
|
105
|
+
`~/.experienceos/`,人可读、可 git 版本化、永远属于你。
|
|
106
|
+
|
|
107
|
+
## 5 分钟上手
|
|
108
|
+
|
|
109
|
+
### 0) 先看效果:离线工作台(无需任何配置)
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pip install experienceos # 或从源码安装:pip install -e .
|
|
113
|
+
experienceos web # 浏览器打开 http://127.0.0.1:8765
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
工作台自带 **离线演示模式**:3 条合成示例经历 + 确定性回放模型,完整演示
|
|
117
|
+
AI 取证流程——检索经历 → 逐条读取 → 证据统计 → 生成带引用的证据简报,
|
|
118
|
+
还可以模拟「模型中断」并从检查点恢复。全程不联网、不访问你的真实数据。
|
|
119
|
+
|
|
120
|
+
### 1) 录入真实经历
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
experienceos init # 初始化 ~/.experienceos
|
|
124
|
+
experienceos add # 交互式录入第一条经历
|
|
125
|
+
experienceos import . # 或直接把当前项目导入为草稿(见下文)
|
|
126
|
+
experienceos list # 浏览全部经历
|
|
127
|
+
experienceos search "搜索引擎 inverted index"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 2) 接上真实模型(可选)
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
experienceos config set ai.model glm-4.7 # GLM / DeepSeek / OpenAI / Ollama 均可
|
|
134
|
+
experienceos ai check # 结构化输出连通性自检
|
|
135
|
+
experienceos ai eval --live # 用真实模型跑同一套评测集
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## 导入:把碎片变成草稿
|
|
139
|
+
|
|
140
|
+
所有导入器只产 `status=draft` 草稿,预览确认后才入库;`source` 字段
|
|
141
|
+
如实记录来源。
|
|
142
|
+
|
|
143
|
+
| 来源 | 命令 | 说明 |
|
|
144
|
+
| --- | --- | --- |
|
|
145
|
+
| GitHub | `experienceos import github:owner/repo --author username` | 公开仓库无需 token;私有活动用 `GITHUB_TOKEN`(只读环境变量) |
|
|
146
|
+
| 本地 Git 仓库 | `experienceos import /path/to/repo` | 只读 `git log` 分析:时间窗、语言构成、贡献摘要 |
|
|
147
|
+
| 普通文件夹 | `experienceos import /path/to/folder` | 无版本控制的项目包;没有可信时间线就诚实留白 |
|
|
148
|
+
| 旧简历 | `experienceos import resume:cv.md` | 纯规则解析(不用 LLM),原句不改写,原文挂为证据 |
|
|
149
|
+
|
|
150
|
+
## AI 证据简报工作流
|
|
151
|
+
|
|
152
|
+
`experienceos ai brief "…"` 是这个项目的核心创新:**模型不允许凭空作答**。
|
|
153
|
+
|
|
154
|
+
- 模型必须先通过三个只读工具检查本地档案——`search_experiences` →
|
|
155
|
+
`get_experience` → `get_evidence_stats`;
|
|
156
|
+
- 简报中的每一条**引用必须对应本次运行中实际读取到的证据位置**,
|
|
157
|
+
引用不接地(grounding failure)会被判暂停而不是输出幻觉;
|
|
158
|
+
- 每一轮对话都持久化为**原子检查点**(fsync 背书),checkpoint 记录
|
|
159
|
+
prompt 版本,模型中断/网络失败后从保存的进度精确恢复;最终输出
|
|
160
|
+
schema 不合法时先做**一轮修复重试**,仍不合法才判暂停;
|
|
161
|
+
- 运行报告默认**脱敏**:只有延迟、token、重试、prompt 版本等运营指标,
|
|
162
|
+
绝无 prompt 内容与个人数据。
|
|
163
|
+
|
|
164
|
+
**可检验的 AI 质量**——不靠感觉,靠评测集:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
$ experienceos ai eval
|
|
168
|
+
Evaluation (recorded): 9/9 expectations passed (100%)
|
|
169
|
+
tool sequence 100% · schema 100% · grounding 100% · completion 100% · recovery 100%
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
9 条带标签的评测用例断言工具调用序列、schema 合法性、引用接地和错误恢复;
|
|
173
|
+
`--live` 可用真实模型跑同一数据集。数据集附 sha256 manifest,并明确声明
|
|
174
|
+
这些数字**不**可用于模型准确率宣传。诚实边界:接地校验是**存在性校验**
|
|
175
|
+
(引用的证据确实在本次运行中被读取过),不等于语义蕴含——它保证结论的
|
|
176
|
+
出处可回溯,不能替代人对结论的判断。
|
|
177
|
+
|
|
178
|
+
**证据可以自动核验**——`experienceos verify` 把每条 GitHub 证据拿去
|
|
179
|
+
REST API 对证:仓库、commit(含作者与日期)、PR(作者/状态/是否合并),
|
|
180
|
+
非 GitHub 链接做存在性探测,本地路径如实跳过;发现失效证据以退出码 1
|
|
181
|
+
报告,可接入 CI。
|
|
182
|
+
|
|
183
|
+

|
|
184
|
+
|
|
185
|
+
## 平台与导出
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
experienceos sync --init # home 目录 git 化(--push origin 推送,注意私有仓库)
|
|
189
|
+
experienceos backup # 全量打包成 zip(含 config)
|
|
190
|
+
experienceos index rebuild # 可选 FTS 索引(大库加速,可随时删除重建)
|
|
191
|
+
experienceos plugins list # entry-points 插件(第三方 connector/exporter)
|
|
192
|
+
pip install 'experienceos[api]' && experienceos-serve # 本地 REST API(只读)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
导出物永远是经历的忠实投影,默认只导出 `active` 记录(draft 不外泄):
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
experienceos export markdown # 个人档案(STAR + evidence)
|
|
199
|
+
experienceos export markdown --timeline # 按年分组的简表
|
|
200
|
+
experienceos export html # 自包含网页档案(打印即 PDF)
|
|
201
|
+
experienceos export json-resume # jsonresume.org 兼容格式
|
|
202
|
+
experienceos profile # 技能时间线 / 共现 Top-N / 覆盖趋势
|
|
203
|
+
experienceos stats --json # 机器可读统计
|
|
204
|
+
experienceos verify # 联网核验 GitHub 证据(可接 CI)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 架构
|
|
208
|
+
|
|
209
|
+
```mermaid
|
|
210
|
+
flowchart TB
|
|
211
|
+
subgraph composition["组合根(不受分层限制)"]
|
|
212
|
+
CLI["cli (typer)"]
|
|
213
|
+
API["api (FastAPI, 只读)"]
|
|
214
|
+
WEB["web (stdlib http.server, loopback)"]
|
|
215
|
+
end
|
|
216
|
+
subgraph intelligence["ai 层"]
|
|
217
|
+
WF["evidence-brief workflow<br/>检查点 + 引用接地校验"]
|
|
218
|
+
TOOLS["只读工具注册表"]
|
|
219
|
+
EVAL["评测集 + 回放 harness"]
|
|
220
|
+
PROVIDER["provider 协议<br/>openai-compat / responses"]
|
|
221
|
+
end
|
|
222
|
+
SERVICES["services 用例层"]
|
|
223
|
+
subgraph data["数据层"]
|
|
224
|
+
CONN["connectors<br/>github / git / folder / resume"]
|
|
225
|
+
EXP["exporters<br/>markdown / json-resume"]
|
|
226
|
+
STORE["storage<br/>JSON source of truth + FTS5 索引"]
|
|
227
|
+
end
|
|
228
|
+
CORE["core 领域模型<br/>Experience / Evidence / ULID / 错误体系"]
|
|
229
|
+
|
|
230
|
+
CLI --> SERVICES
|
|
231
|
+
API --> SERVICES
|
|
232
|
+
WEB --> WF
|
|
233
|
+
WF --> TOOLS --> STORE
|
|
234
|
+
WF --> PROVIDER
|
|
235
|
+
EVAL --> WF
|
|
236
|
+
SERVICES --> CONN
|
|
237
|
+
SERVICES --> EXP
|
|
238
|
+
SERVICES --> STORE
|
|
239
|
+
CONN --> CORE
|
|
240
|
+
EXP --> CORE
|
|
241
|
+
STORE --> CORE
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
分层由 **AST 守卫测试**强制执行(`tests/test_layering.py`):core 不依赖
|
|
245
|
+
任何上层;ai 永远不碰 connectors;services 编排一切;cli/api/web 是组合根。
|
|
246
|
+
|
|
247
|
+
## Experience 数据模型
|
|
248
|
+
|
|
249
|
+
每个经历是一个统一的 `Experience` 抽象——不只是代码项目,还包括毕业设计、
|
|
250
|
+
课程实践、竞赛、实习、开源贡献、个人作品和研究项目。
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"id": "exp_01J...",
|
|
255
|
+
"schema_version": 1,
|
|
256
|
+
"title": "Campus Search Engine",
|
|
257
|
+
"type": "course_project",
|
|
258
|
+
"period": { "start": "2023-01", "end": "2023-06" },
|
|
259
|
+
"context": "数据库课程大作业,三人小组",
|
|
260
|
+
"role": "检索引擎负责人",
|
|
261
|
+
"description": "为校园文档构建的轻量搜索引擎",
|
|
262
|
+
"technology": ["Python", "Whoosh"],
|
|
263
|
+
"contribution": ["设计倒排索引与查询流水线"],
|
|
264
|
+
"challenge": ["中文分词在长文档上召回率低"],
|
|
265
|
+
"solution": ["引入 jieba 自定义词典 + 混合 BM25 排序"],
|
|
266
|
+
"result": ["课程演示中 top-10 命中率 92%"],
|
|
267
|
+
"reflection": "第一次体会到评测集对检索系统的重要性。",
|
|
268
|
+
"evidence": [
|
|
269
|
+
{ "kind": "repo", "location": "github.com/you/campus-search" }
|
|
270
|
+
],
|
|
271
|
+
"tags": ["ir", "backend"],
|
|
272
|
+
"status": "active",
|
|
273
|
+
"source": { "origin": "manual", "created_by": "user" }
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
完整字段说明见 `docs/ARCHITECTURE.md`。
|
|
278
|
+
|
|
279
|
+
## 工程质量
|
|
280
|
+
|
|
281
|
+
- **448 个测试全绿(覆盖率约 90%)**:领域、存储(含 FTS 与迁移)、连接器、
|
|
282
|
+
AI 工作流与评测、web 服务端到端;
|
|
283
|
+
- **崩溃安全与并发写保护**:所有落盘写入先 fsync 再原子替换,跨进程写入
|
|
284
|
+
由文件锁串行化(CLI / API / 工作台可并存),FTS 索引陈旧自动重建;
|
|
285
|
+
- **CI 矩阵**:Ubuntu + Windows × Python 3.10/3.12/3.13,外加 wheel 打包
|
|
286
|
+
在仓库外安装验证(`ai eval` 从安装产物内运行),覆盖率上报 Codecov;
|
|
287
|
+
- **AST 分层守卫**:依赖方向由测试而非约定保证;
|
|
288
|
+
- **AI 评测集**:确定性回归 + 可选真模型评测,checkpoint 与报告记录
|
|
289
|
+
prompt 版本,报告默认脱敏。
|
|
290
|
+
|
|
291
|
+
## 路线图
|
|
292
|
+
|
|
293
|
+
| Milestone | 主题 | 版本 | 状态 |
|
|
294
|
+
| --- | --- | --- | --- |
|
|
295
|
+
| M0 | 基础:数据模型 + 本地存储 + CLI | 0.1.0 | ✅ |
|
|
296
|
+
| M1 | 导入:GitHub / 本地仓库 / 简历 Connector | 0.2.0 | ✅ |
|
|
297
|
+
| M2 | 智能:AI 面试录入、enrich 提案、证据护栏 | 0.3.0 | ✅ |
|
|
298
|
+
| M3 | 输出:Markdown 档案 / JSON Resume 导出 | 0.4.0 | ✅ |
|
|
299
|
+
| M4 | 平台:API 服务、插件系统、FTS 索引 | 0.5.0 | ✅ |
|
|
300
|
+
| M5 | 加固:项目文件夹导入、分层守卫、查询语义统一 | 0.6.0 | ✅ |
|
|
301
|
+
| M6 | 工作台:证据简报工作流、评测集、本地浏览器工作台 | 0.7.0 | ✅ |
|
|
302
|
+
|
|
303
|
+
第一阶段的目标用户是开发者(应届程序员、软件工程师、AI 工程师、开源
|
|
304
|
+
贡献者);Experience 抽象刻意保持职业中立,未来可扩展到**设计师**、
|
|
305
|
+
**研究人员**与**创作者**(扩展路径见 `docs/ROADMAP.md` 的「未来用户」)。
|
|
306
|
+
|
|
307
|
+
详见 `docs/ROADMAP.md` 与 `docs/issues/`(GitHub-ready 的 Issue 拆分)。
|
|
308
|
+
|
|
309
|
+
## 项目结构
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
src/experienceos/
|
|
313
|
+
core/ # 领域模型:Experience / Evidence / Source + ULID + 错误体系
|
|
314
|
+
storage/ # 文件存储层(原子写、损坏容忍、stat 缓存)+ 查询引擎 + FTS 索引
|
|
315
|
+
connectors/ # GitHub / 本地 Git / 项目文件夹 / 简历等导入器
|
|
316
|
+
ai/ # 证据简报工作流 + 只读工具 + 评测 harness + Provider + 版本化 Prompt
|
|
317
|
+
services/ # 用例层:CLI 与 API 复用的查询 / 导入 / 统计逻辑
|
|
318
|
+
exporters/ # Markdown / JSON Resume 导出
|
|
319
|
+
web/ # 本地浏览器工作台(零依赖 http.server + 静态前端)
|
|
320
|
+
api/ # FastAPI 只读 REST API
|
|
321
|
+
cli/ # typer 命令行界面
|
|
322
|
+
config.py # home 目录与 config.toml
|
|
323
|
+
evals/ # 9 条带标签的 AI 评测用例 + sha256 manifest
|
|
324
|
+
examples/ # 可运行的离线 agent 演示脚本
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## 参与贡献
|
|
328
|
+
|
|
329
|
+
欢迎 Issue / PR。开发环境、提交规范与评审流程见
|
|
330
|
+
[CONTRIBUTING.md](CONTRIBUTING.md)。
|
|
331
|
+
|
|
332
|
+
## License
|
|
333
|
+
|
|
334
|
+
[MIT](LICENSE) © ExperienceOS Contributors
|