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.
Files changed (135) hide show
  1. experienceos-0.7.2/.gitignore +39 -0
  2. experienceos-0.7.2/CHANGELOG.md +273 -0
  3. experienceos-0.7.2/LICENSE +21 -0
  4. experienceos-0.7.2/PKG-INFO +334 -0
  5. experienceos-0.7.2/README.md +271 -0
  6. experienceos-0.7.2/docs/AI_AGENT_AUDIT.md +104 -0
  7. experienceos-0.7.2/docs/ARCHITECTURE.md +224 -0
  8. experienceos-0.7.2/docs/DEMO.md +115 -0
  9. experienceos-0.7.2/docs/ROADMAP.md +110 -0
  10. experienceos-0.7.2/docs/assets/workbench-brief.png +0 -0
  11. experienceos-0.7.2/docs/assets/workbench-history.png +0 -0
  12. experienceos-0.7.2/docs/assets/workbench-timeline.png +0 -0
  13. experienceos-0.7.2/docs/issues/README.md +26 -0
  14. experienceos-0.7.2/docs/issues/m0-foundation.md +43 -0
  15. experienceos-0.7.2/docs/issues/m1-import.md +110 -0
  16. experienceos-0.7.2/docs/issues/m2-intelligence.md +93 -0
  17. experienceos-0.7.2/docs/issues/m3-output.md +44 -0
  18. experienceos-0.7.2/docs/issues/m4-platform.md +53 -0
  19. experienceos-0.7.2/docs/issues/m5-hardening.md +74 -0
  20. experienceos-0.7.2/docs/issues/m6-workbench.md +78 -0
  21. experienceos-0.7.2/evals/README.md +20 -0
  22. experienceos-0.7.2/evals/experience_brief.jsonl +9 -0
  23. experienceos-0.7.2/evals/manifest.json +23 -0
  24. experienceos-0.7.2/examples/README.md +43 -0
  25. experienceos-0.7.2/examples/agent_demo.py +91 -0
  26. experienceos-0.7.2/examples/experience.example.json +51 -0
  27. experienceos-0.7.2/pyproject.toml +112 -0
  28. experienceos-0.7.2/src/experienceos/__init__.py +36 -0
  29. experienceos-0.7.2/src/experienceos/__main__.py +6 -0
  30. experienceos-0.7.2/src/experienceos/ai/__init__.py +52 -0
  31. experienceos-0.7.2/src/experienceos/ai/demo.py +60 -0
  32. experienceos-0.7.2/src/experienceos/ai/enrich.py +137 -0
  33. experienceos-0.7.2/src/experienceos/ai/evaluation.py +389 -0
  34. experienceos-0.7.2/src/experienceos/ai/extraction.py +284 -0
  35. experienceos-0.7.2/src/experienceos/ai/factory.py +18 -0
  36. experienceos-0.7.2/src/experienceos/ai/interview.py +78 -0
  37. experienceos-0.7.2/src/experienceos/ai/mock.py +34 -0
  38. experienceos-0.7.2/src/experienceos/ai/prompts.py +126 -0
  39. experienceos-0.7.2/src/experienceos/ai/provider.py +264 -0
  40. experienceos-0.7.2/src/experienceos/ai/reporting.py +92 -0
  41. experienceos-0.7.2/src/experienceos/ai/responses.py +175 -0
  42. experienceos-0.7.2/src/experienceos/ai/schemas.py +36 -0
  43. experienceos-0.7.2/src/experienceos/ai/tools.py +153 -0
  44. experienceos-0.7.2/src/experienceos/ai/transport.py +367 -0
  45. experienceos-0.7.2/src/experienceos/ai/workflow.py +305 -0
  46. experienceos-0.7.2/src/experienceos/api/__init__.py +5 -0
  47. experienceos-0.7.2/src/experienceos/api/app.py +191 -0
  48. experienceos-0.7.2/src/experienceos/cli/__init__.py +5 -0
  49. experienceos-0.7.2/src/experienceos/cli/app.py +1536 -0
  50. experienceos-0.7.2/src/experienceos/cli/render.py +124 -0
  51. experienceos-0.7.2/src/experienceos/config.py +132 -0
  52. experienceos-0.7.2/src/experienceos/connectors/__init__.py +49 -0
  53. experienceos-0.7.2/src/experienceos/connectors/base.py +124 -0
  54. experienceos-0.7.2/src/experienceos/connectors/github.py +390 -0
  55. experienceos-0.7.2/src/experienceos/connectors/gitrepo.py +250 -0
  56. experienceos-0.7.2/src/experienceos/connectors/languages.py +98 -0
  57. experienceos-0.7.2/src/experienceos/connectors/projectfiles.py +171 -0
  58. experienceos-0.7.2/src/experienceos/connectors/registry.py +54 -0
  59. experienceos-0.7.2/src/experienceos/connectors/resume/__init__.py +18 -0
  60. experienceos-0.7.2/src/experienceos/connectors/resume/extractor.py +189 -0
  61. experienceos-0.7.2/src/experienceos/connectors/resume/parser.py +384 -0
  62. experienceos-0.7.2/src/experienceos/core/__init__.py +54 -0
  63. experienceos-0.7.2/src/experienceos/core/draft.py +67 -0
  64. experienceos-0.7.2/src/experienceos/core/errors.py +74 -0
  65. experienceos-0.7.2/src/experienceos/core/fsutil.py +43 -0
  66. experienceos-0.7.2/src/experienceos/core/guardrails.py +105 -0
  67. experienceos-0.7.2/src/experienceos/core/models.py +269 -0
  68. experienceos-0.7.2/src/experienceos/core/ulid.py +50 -0
  69. experienceos-0.7.2/src/experienceos/exporters/__init__.py +29 -0
  70. experienceos-0.7.2/src/experienceos/exporters/base.py +46 -0
  71. experienceos-0.7.2/src/experienceos/exporters/html.py +119 -0
  72. experienceos-0.7.2/src/experienceos/exporters/json_resume.py +168 -0
  73. experienceos-0.7.2/src/experienceos/exporters/markdown.py +118 -0
  74. experienceos-0.7.2/src/experienceos/exporters/registry.py +47 -0
  75. experienceos-0.7.2/src/experienceos/exporters/templates/profile.html.tpl +46 -0
  76. experienceos-0.7.2/src/experienceos/exporters/templates/profile.md.tpl +10 -0
  77. experienceos-0.7.2/src/experienceos/exporters/templates/timeline.md.tpl +9 -0
  78. experienceos-0.7.2/src/experienceos/plugins.py +93 -0
  79. experienceos-0.7.2/src/experienceos/presentation.py +86 -0
  80. experienceos-0.7.2/src/experienceos/py.typed +0 -0
  81. experienceos-0.7.2/src/experienceos/services/__init__.py +9 -0
  82. experienceos-0.7.2/src/experienceos/services/experiences.py +153 -0
  83. experienceos-0.7.2/src/experienceos/services/homeops.py +151 -0
  84. experienceos-0.7.2/src/experienceos/services/ingest.py +69 -0
  85. experienceos-0.7.2/src/experienceos/services/verify.py +207 -0
  86. experienceos-0.7.2/src/experienceos/stats.py +119 -0
  87. experienceos-0.7.2/src/experienceos/storage/__init__.py +6 -0
  88. experienceos-0.7.2/src/experienceos/storage/fts.py +200 -0
  89. experienceos-0.7.2/src/experienceos/storage/locking.py +85 -0
  90. experienceos-0.7.2/src/experienceos/storage/migrations.py +83 -0
  91. experienceos-0.7.2/src/experienceos/storage/query.py +144 -0
  92. experienceos-0.7.2/src/experienceos/storage/store.py +251 -0
  93. experienceos-0.7.2/src/experienceos/web/__init__.py +1 -0
  94. experienceos-0.7.2/src/experienceos/web/demo.py +138 -0
  95. experienceos-0.7.2/src/experienceos/web/server.py +341 -0
  96. experienceos-0.7.2/src/experienceos/web/static/app.js +251 -0
  97. experienceos-0.7.2/src/experienceos/web/static/index.html +73 -0
  98. experienceos-0.7.2/src/experienceos/web/static/style.css +243 -0
  99. experienceos-0.7.2/tests/conftest.py +47 -0
  100. experienceos-0.7.2/tests/fixtures/github_api.json +74 -0
  101. experienceos-0.7.2/tests/fixtures/golden_profile.md +38 -0
  102. experienceos-0.7.2/tests/fixtures/golden_timeline.md +19 -0
  103. experienceos-0.7.2/tests/fixtures/resume_cn.md +34 -0
  104. experienceos-0.7.2/tests/fixtures/resume_empty.md +13 -0
  105. experienceos-0.7.2/tests/fixtures/resume_en.md +28 -0
  106. experienceos-0.7.2/tests/test_agent.py +370 -0
  107. experienceos-0.7.2/tests/test_ai.py +383 -0
  108. experienceos-0.7.2/tests/test_api.py +160 -0
  109. experienceos-0.7.2/tests/test_cli.py +376 -0
  110. experienceos-0.7.2/tests/test_config.py +82 -0
  111. experienceos-0.7.2/tests/test_connectors.py +217 -0
  112. experienceos-0.7.2/tests/test_enrich.py +206 -0
  113. experienceos-0.7.2/tests/test_export_html.py +92 -0
  114. experienceos-0.7.2/tests/test_export_json_resume.py +155 -0
  115. experienceos-0.7.2/tests/test_export_markdown.py +217 -0
  116. experienceos-0.7.2/tests/test_fts.py +269 -0
  117. experienceos-0.7.2/tests/test_github_connector.py +298 -0
  118. experienceos-0.7.2/tests/test_gitrepo_connector.py +331 -0
  119. experienceos-0.7.2/tests/test_guardrails.py +133 -0
  120. experienceos-0.7.2/tests/test_ingest.py +61 -0
  121. experienceos-0.7.2/tests/test_interview.py +276 -0
  122. experienceos-0.7.2/tests/test_layering.py +82 -0
  123. experienceos-0.7.2/tests/test_migrations.py +155 -0
  124. experienceos-0.7.2/tests/test_models.py +146 -0
  125. experienceos-0.7.2/tests/test_plugins.py +194 -0
  126. experienceos-0.7.2/tests/test_projectfiles.py +148 -0
  127. experienceos-0.7.2/tests/test_query.py +124 -0
  128. experienceos-0.7.2/tests/test_resume_connector.py +278 -0
  129. experienceos-0.7.2/tests/test_stats_profile.py +161 -0
  130. experienceos-0.7.2/tests/test_storage_durability.py +84 -0
  131. experienceos-0.7.2/tests/test_store.py +184 -0
  132. experienceos-0.7.2/tests/test_sync_backup.py +163 -0
  133. experienceos-0.7.2/tests/test_ulid.py +36 -0
  134. experienceos-0.7.2/tests/test_verify.py +237 -0
  135. 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
+ [![CI](https://github.com/guomengjia618-dot/ExperienceOS/actions/workflows/ci.yml/badge.svg)](https://github.com/guomengjia618-dot/ExperienceOS/actions/workflows/ci.yml)
69
+ [![codecov](https://codecov.io/gh/guomengjia618-dot/ExperienceOS/graph/badge.svg)](https://codecov.io/gh/guomengjia618-dot/ExperienceOS)
70
+ [![PyPI](https://img.shields.io/pypi/v/experienceos)](https://pypi.org/project/experienceos/)
71
+ ![Python](https://img.shields.io/badge/python-3.10%20%7C%203.12%20%7C%203.13-blue)
72
+ ![License](https://img.shields.io/badge/license-MIT-green)
73
+ [![Coverage](https://img.shields.io/badge/tests-448%20passed-brightgreen)](#工程质量)
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
+ ![ExperienceOS 本地工作台](docs/assets/workbench-brief.png)
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
+ ![工作台的运行记录时间线:检索 → 逐条读取 → 证据统计 → 校验通过](docs/assets/workbench-timeline.png)
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