people-context 0.1.1__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.
- people_context-0.1.1/.claude-plugin/marketplace.json +36 -0
- people_context-0.1.1/.claude-plugin/mcp.json +14 -0
- people_context-0.1.1/.claude-plugin/plugin.json +22 -0
- people_context-0.1.1/.codegraph/.gitignore +5 -0
- people_context-0.1.1/.codegraph/config.json +143 -0
- people_context-0.1.1/.github/dependabot.yml +41 -0
- people_context-0.1.1/.github/workflows/ci.yml +51 -0
- people_context-0.1.1/.github/workflows/claude-plugin-validate.yml +61 -0
- people_context-0.1.1/.github/workflows/package-publish.yml +76 -0
- people_context-0.1.1/.github/workflows/release.yml +91 -0
- people_context-0.1.1/.github/workflows/scorecard.yml +48 -0
- people_context-0.1.1/.gitignore +29 -0
- people_context-0.1.1/AGENTS.md +39 -0
- people_context-0.1.1/LICENSE +21 -0
- people_context-0.1.1/PKG-INFO +242 -0
- people_context-0.1.1/README.md +213 -0
- people_context-0.1.1/SECURITY.md +53 -0
- people_context-0.1.1/compat/people-context-mcp/README.md +14 -0
- people_context-0.1.1/compat/people-context-mcp/pyproject.toml +31 -0
- people_context-0.1.1/compat/people-context-mcp/src/people_context_mcp_compat/__init__.py +1 -0
- people_context-0.1.1/docs/architecture.md +213 -0
- people_context-0.1.1/docs/claude-code-plugin.md +117 -0
- people_context-0.1.1/docs/cli.md +111 -0
- people_context-0.1.1/docs/communication-guidance.md +96 -0
- people_context-0.1.1/docs/data-model.md +124 -0
- people_context-0.1.1/docs/decisions/0001-python.md +48 -0
- people_context-0.1.1/docs/decisions/0002-sqlite.md +59 -0
- people_context-0.1.1/docs/decisions/0003-hexagonal-architecture.md +51 -0
- people_context-0.1.1/docs/decisions/0004-changelog-vs-audit-log.md +62 -0
- people_context-0.1.1/docs/decisions/0005-conflict-resolution-strategy.md +60 -0
- people_context-0.1.1/docs/design/sync.md +523 -0
- people_context-0.1.1/docs/identity-resolution.md +68 -0
- people_context-0.1.1/docs/import.md +128 -0
- people_context-0.1.1/docs/mcp-interface.md +141 -0
- people_context-0.1.1/docs/privacy-and-safety.md +174 -0
- people_context-0.1.1/docs/relationship-graph.md +136 -0
- people_context-0.1.1/docs/releasing.md +67 -0
- people_context-0.1.1/docs/roadmap.md +275 -0
- people_context-0.1.1/docs/specs/m10-agent-utilization.md +168 -0
- people_context-0.1.1/docs/specs/m11-sync-bundle-and-bootstrap-restore.md +342 -0
- people_context-0.1.1/docs/specs/m12-trust-stability-v1.md +189 -0
- people_context-0.1.1/docs/specs/m13-daily-utility.md +214 -0
- people_context-0.1.1/docs/specs/m14-ecosystem-interop.md +197 -0
- people_context-0.1.1/docs/specs/m15-data-quality-and-credibility.md +174 -0
- people_context-0.1.1/docs/specs/m8-distribution-and-reach.md +165 -0
- people_context-0.1.1/docs/specs/m9-cold-start-and-onboarding.md +218 -0
- people_context-0.1.1/docs/vault-export.md +101 -0
- people_context-0.1.1/openclaw-plugin/README.md +138 -0
- people_context-0.1.1/openclaw-plugin/dist/index.d.ts +13 -0
- people_context-0.1.1/openclaw-plugin/dist/index.js +213 -0
- people_context-0.1.1/openclaw-plugin/openclaw.plugin.json +38 -0
- people_context-0.1.1/openclaw-plugin/package-lock.json +6786 -0
- people_context-0.1.1/openclaw-plugin/package.json +71 -0
- people_context-0.1.1/openclaw-plugin/src/index.test.ts +60 -0
- people_context-0.1.1/openclaw-plugin/src/index.ts +318 -0
- people_context-0.1.1/openclaw-plugin/tsconfig.json +18 -0
- people_context-0.1.1/openclaw-plugin/typebox.d.ts +4 -0
- people_context-0.1.1/openclaw-plugin/vitest.config.ts +8 -0
- people_context-0.1.1/pyproject.toml +62 -0
- people_context-0.1.1/src/people_context/__init__.py +3 -0
- people_context-0.1.1/src/people_context/__main__.py +8 -0
- people_context-0.1.1/src/people_context/adapters/__init__.py +1 -0
- people_context-0.1.1/src/people_context/adapters/email_import.py +170 -0
- people_context-0.1.1/src/people_context/adapters/filesystem/__init__.py +9 -0
- people_context-0.1.1/src/people_context/adapters/filesystem/vault_writer.py +236 -0
- people_context-0.1.1/src/people_context/adapters/mcp/__init__.py +7 -0
- people_context-0.1.1/src/people_context/adapters/mcp/security.py +17 -0
- people_context-0.1.1/src/people_context/adapters/mcp/server.py +306 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/__init__.py +24 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/graph.py +40 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/imports.py +64 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/lifecycle.py +47 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/m2.py +301 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/people.py +160 -0
- people_context-0.1.1/src/people_context/adapters/mcp/tools/portability.py +33 -0
- people_context-0.1.1/src/people_context/adapters/model2vec_embeddings.py +96 -0
- people_context-0.1.1/src/people_context/adapters/semantic_indexing.py +206 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/__init__.py +59 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/audit_log.py +83 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/changelog.py +108 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/context_reader.py +219 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/db.py +87 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/export_reader.py +89 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/graph_reader.py +206 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/hlc.py +74 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/import_staging.py +66 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/lifecycle.py +581 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/migrations/001_initial.sql +170 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/migrations/002_sync_foundations.sql +41 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/migrations/003_relationship_vocabulary.sql +52 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/migrations/004_curation_indexes.sql +11 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/migrations/__init__.py +1 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/record_store.py +421 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/relationship_store.py +103 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/relationship_vocabulary.py +77 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/repository.py +237 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/semantic.py +253 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/unit_of_work.py +35 -0
- people_context-0.1.1/src/people_context/adapters/sqlite/vault_reader.py +116 -0
- people_context-0.1.1/src/people_context/adapters/vcard_import.py +277 -0
- people_context-0.1.1/src/people_context/app/__init__.py +207 -0
- people_context-0.1.1/src/people_context/app/add_alias.py +67 -0
- people_context-0.1.1/src/people_context/app/add_relationship_type.py +105 -0
- people_context-0.1.1/src/people_context/app/complete_reminder.py +77 -0
- people_context-0.1.1/src/people_context/app/correct_record.py +141 -0
- people_context-0.1.1/src/people_context/app/edit_person.py +89 -0
- people_context-0.1.1/src/people_context/app/export_data.py +42 -0
- people_context-0.1.1/src/people_context/app/export_vault.py +37 -0
- people_context-0.1.1/src/people_context/app/forget.py +143 -0
- people_context-0.1.1/src/people_context/app/get_communication_guidance.py +115 -0
- people_context-0.1.1/src/people_context/app/get_person_context.py +178 -0
- people_context-0.1.1/src/people_context/app/import_content.py +546 -0
- people_context-0.1.1/src/people_context/app/list_reminders.py +33 -0
- people_context-0.1.1/src/people_context/app/merge_people.py +137 -0
- people_context-0.1.1/src/people_context/app/normalize_relationships.py +128 -0
- people_context-0.1.1/src/people_context/app/person_context_models.py +40 -0
- people_context-0.1.1/src/people_context/app/record.py +172 -0
- people_context-0.1.1/src/people_context/app/record_fact.py +76 -0
- people_context-0.1.1/src/people_context/app/record_interaction.py +74 -0
- people_context-0.1.1/src/people_context/app/record_observation.py +70 -0
- people_context-0.1.1/src/people_context/app/record_trait.py +73 -0
- people_context-0.1.1/src/people_context/app/reindex_people.py +25 -0
- people_context-0.1.1/src/people_context/app/reindex_semantic.py +54 -0
- people_context-0.1.1/src/people_context/app/relationship_graph.py +183 -0
- people_context-0.1.1/src/people_context/app/relationship_policy.py +71 -0
- people_context-0.1.1/src/people_context/app/resolve_person.py +174 -0
- people_context-0.1.1/src/people_context/app/search_people.py +27 -0
- people_context-0.1.1/src/people_context/app/semantic_indexing.py +40 -0
- people_context-0.1.1/src/people_context/app/semantic_search.py +172 -0
- people_context-0.1.1/src/people_context/app/set_affiliation.py +108 -0
- people_context-0.1.1/src/people_context/app/set_communication_philosophy.py +56 -0
- people_context-0.1.1/src/people_context/app/set_relationship.py +168 -0
- people_context-0.1.1/src/people_context/app/set_reminder.py +77 -0
- people_context-0.1.1/src/people_context/app/write_support.py +212 -0
- people_context-0.1.1/src/people_context/cli.py +600 -0
- people_context-0.1.1/src/people_context/config.py +136 -0
- people_context-0.1.1/src/people_context/domain/__init__.py +48 -0
- people_context-0.1.1/src/people_context/domain/fact.py +23 -0
- people_context-0.1.1/src/people_context/domain/interaction.py +21 -0
- people_context-0.1.1/src/people_context/domain/observation.py +20 -0
- people_context-0.1.1/src/people_context/domain/organization.py +30 -0
- people_context-0.1.1/src/people_context/domain/person.py +54 -0
- people_context-0.1.1/src/people_context/domain/preferences.py +18 -0
- people_context-0.1.1/src/people_context/domain/relationship.py +23 -0
- people_context-0.1.1/src/people_context/domain/relationship_graph.py +39 -0
- people_context-0.1.1/src/people_context/domain/relationship_vocabulary.py +46 -0
- people_context-0.1.1/src/people_context/domain/reminder.py +39 -0
- people_context-0.1.1/src/people_context/domain/shared.py +78 -0
- people_context-0.1.1/src/people_context/domain/trait.py +35 -0
- people_context-0.1.1/src/people_context/domain/vault.py +81 -0
- people_context-0.1.1/src/people_context/ports/__init__.py +64 -0
- people_context-0.1.1/src/people_context/ports/audit_log.py +38 -0
- people_context-0.1.1/src/people_context/ports/changelog.py +41 -0
- people_context-0.1.1/src/people_context/ports/clock.py +20 -0
- people_context-0.1.1/src/people_context/ports/context.py +52 -0
- people_context-0.1.1/src/people_context/ports/export.py +30 -0
- people_context-0.1.1/src/people_context/ports/graph.py +18 -0
- people_context-0.1.1/src/people_context/ports/hlc.py +30 -0
- people_context-0.1.1/src/people_context/ports/imports.py +76 -0
- people_context-0.1.1/src/people_context/ports/lifecycle.py +63 -0
- people_context-0.1.1/src/people_context/ports/records.py +71 -0
- people_context-0.1.1/src/people_context/ports/relationship_vocabulary.py +46 -0
- people_context-0.1.1/src/people_context/ports/repository.py +47 -0
- people_context-0.1.1/src/people_context/ports/semantic.py +98 -0
- people_context-0.1.1/src/people_context/ports/unit_of_work.py +35 -0
- people_context-0.1.1/src/people_context/ports/vault.py +26 -0
- people_context-0.1.1/tests/__init__.py +0 -0
- people_context-0.1.1/tests/adapters/test_agent_staging.py +196 -0
- people_context-0.1.1/tests/adapters/test_email_import.py +290 -0
- people_context-0.1.1/tests/adapters/test_followup_fixes.py +186 -0
- people_context-0.1.1/tests/adapters/test_http_e2e.py +116 -0
- people_context-0.1.1/tests/adapters/test_m7_review_regressions.py +305 -0
- people_context-0.1.1/tests/adapters/test_mcp_entrypoint.py +55 -0
- people_context-0.1.1/tests/adapters/test_mcp_relationship_graph.py +58 -0
- people_context-0.1.1/tests/adapters/test_mcp_server.py +600 -0
- people_context-0.1.1/tests/adapters/test_model2vec_embeddings.py +57 -0
- people_context-0.1.1/tests/adapters/test_relationship_graph.py +102 -0
- people_context-0.1.1/tests/adapters/test_relationship_vocabulary.py +161 -0
- people_context-0.1.1/tests/adapters/test_review_fixes.py +202 -0
- people_context-0.1.1/tests/adapters/test_semantic_index.py +167 -0
- people_context-0.1.1/tests/adapters/test_sqlite_changelog.py +328 -0
- people_context-0.1.1/tests/adapters/test_sqlite_context_reader.py +185 -0
- people_context-0.1.1/tests/adapters/test_sqlite_export.py +102 -0
- people_context-0.1.1/tests/adapters/test_sqlite_lifecycle.py +247 -0
- people_context-0.1.1/tests/adapters/test_sqlite_record_store.py +156 -0
- people_context-0.1.1/tests/adapters/test_sqlite_repository.py +274 -0
- people_context-0.1.1/tests/adapters/test_sqlite_sync_foundations.py +77 -0
- people_context-0.1.1/tests/adapters/test_sqlite_unit_of_work.py +47 -0
- people_context-0.1.1/tests/adapters/test_stdio_e2e.py +385 -0
- people_context-0.1.1/tests/adapters/test_vault_export.py +199 -0
- people_context-0.1.1/tests/adapters/test_vcard_import.py +268 -0
- people_context-0.1.1/tests/app/__init__.py +0 -0
- people_context-0.1.1/tests/app/fakes.py +327 -0
- people_context-0.1.1/tests/app/test_communication_guidance.py +161 -0
- people_context-0.1.1/tests/app/test_get_person_context.py +250 -0
- people_context-0.1.1/tests/app/test_m2_writes.py +289 -0
- people_context-0.1.1/tests/app/test_record.py +143 -0
- people_context-0.1.1/tests/app/test_reindex_semantic.py +88 -0
- people_context-0.1.1/tests/app/test_relationship_policy.py +45 -0
- people_context-0.1.1/tests/app/test_resolve_person.py +433 -0
- people_context-0.1.1/tests/app/test_semantic_search.py +133 -0
- people_context-0.1.1/tests/domain/test_person.py +79 -0
- people_context-0.1.1/tests/domain/test_shared.py +72 -0
- people_context-0.1.1/tests/test_cli.py +375 -0
- people_context-0.1.1/tests/test_cli_relationships.py +46 -0
- people_context-0.1.1/tests/test_config.py +96 -0
- people_context-0.1.1/tests/test_packaging_metadata.py +38 -0
- people_context-0.1.1/uv.lock +1706 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "people-context-plugins",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Jinyang Wang"
|
|
5
|
+
},
|
|
6
|
+
"description": "Local-first Claude Code integrations for people-context-mcp.",
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "people-context",
|
|
10
|
+
"displayName": "People Context",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"source": ".",
|
|
13
|
+
"description": "Give Claude Code local, durable context about the people in your life through an automatically managed stdio MCP server.",
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "Jinyang Wang"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/JinyangWang27/people-context/blob/main/docs/claude-code-plugin.md",
|
|
18
|
+
"repository": "https://github.com/JinyangWang27/people-context",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"people",
|
|
23
|
+
"context",
|
|
24
|
+
"memory",
|
|
25
|
+
"local-first"
|
|
26
|
+
],
|
|
27
|
+
"category": "productivity",
|
|
28
|
+
"tags": [
|
|
29
|
+
"mcp",
|
|
30
|
+
"personal-knowledge",
|
|
31
|
+
"local-first"
|
|
32
|
+
],
|
|
33
|
+
"strict": true
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
|
+
"name": "people-context",
|
|
4
|
+
"displayName": "People Context",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"description": "Give Claude Code local, durable context about the people in your life through people-context-mcp.",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Jinyang Wang",
|
|
9
|
+
"url": "https://github.com/JinyangWang27"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/JinyangWang27/people-context/blob/main/docs/claude-code-plugin.md",
|
|
12
|
+
"repository": "https://github.com/JinyangWang27/people-context",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"mcp",
|
|
16
|
+
"people",
|
|
17
|
+
"context",
|
|
18
|
+
"memory",
|
|
19
|
+
"local-first"
|
|
20
|
+
],
|
|
21
|
+
"mcpServers": "./mcp.json"
|
|
22
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"include": [
|
|
4
|
+
"**/*.ts",
|
|
5
|
+
"**/*.tsx",
|
|
6
|
+
"**/*.js",
|
|
7
|
+
"**/*.jsx",
|
|
8
|
+
"**/*.py",
|
|
9
|
+
"**/*.go",
|
|
10
|
+
"**/*.rs",
|
|
11
|
+
"**/*.java",
|
|
12
|
+
"**/*.c",
|
|
13
|
+
"**/*.h",
|
|
14
|
+
"**/*.cpp",
|
|
15
|
+
"**/*.hpp",
|
|
16
|
+
"**/*.cc",
|
|
17
|
+
"**/*.cxx",
|
|
18
|
+
"**/*.cs",
|
|
19
|
+
"**/*.php",
|
|
20
|
+
"**/*.rb",
|
|
21
|
+
"**/*.swift",
|
|
22
|
+
"**/*.kt",
|
|
23
|
+
"**/*.kts",
|
|
24
|
+
"**/*.dart",
|
|
25
|
+
"**/*.svelte",
|
|
26
|
+
"**/*.vue",
|
|
27
|
+
"**/*.liquid",
|
|
28
|
+
"**/*.pas",
|
|
29
|
+
"**/*.dpr",
|
|
30
|
+
"**/*.dpk",
|
|
31
|
+
"**/*.lpr",
|
|
32
|
+
"**/*.dfm",
|
|
33
|
+
"**/*.fmx",
|
|
34
|
+
"**/*.scala",
|
|
35
|
+
"**/*.sc"
|
|
36
|
+
],
|
|
37
|
+
"exclude": [
|
|
38
|
+
"**/.git/**",
|
|
39
|
+
"**/node_modules/**",
|
|
40
|
+
"**/vendor/**",
|
|
41
|
+
"**/Pods/**",
|
|
42
|
+
"**/dist/**",
|
|
43
|
+
"**/build/**",
|
|
44
|
+
"**/out/**",
|
|
45
|
+
"**/bin/**",
|
|
46
|
+
"**/obj/**",
|
|
47
|
+
"**/target/**",
|
|
48
|
+
"**/*.min.js",
|
|
49
|
+
"**/*.bundle.js",
|
|
50
|
+
"**/.next/**",
|
|
51
|
+
"**/.nuxt/**",
|
|
52
|
+
"**/.svelte-kit/**",
|
|
53
|
+
"**/.output/**",
|
|
54
|
+
"**/.turbo/**",
|
|
55
|
+
"**/.cache/**",
|
|
56
|
+
"**/.parcel-cache/**",
|
|
57
|
+
"**/.vite/**",
|
|
58
|
+
"**/.astro/**",
|
|
59
|
+
"**/.docusaurus/**",
|
|
60
|
+
"**/.gatsby/**",
|
|
61
|
+
"**/.webpack/**",
|
|
62
|
+
"**/.nx/**",
|
|
63
|
+
"**/.yarn/cache/**",
|
|
64
|
+
"**/.pnpm-store/**",
|
|
65
|
+
"**/storybook-static/**",
|
|
66
|
+
"**/.expo/**",
|
|
67
|
+
"**/web-build/**",
|
|
68
|
+
"**/ios/Pods/**",
|
|
69
|
+
"**/ios/build/**",
|
|
70
|
+
"**/android/build/**",
|
|
71
|
+
"**/android/.gradle/**",
|
|
72
|
+
"**/__pycache__/**",
|
|
73
|
+
"**/.venv/**",
|
|
74
|
+
"**/venv/**",
|
|
75
|
+
"**/site-packages/**",
|
|
76
|
+
"**/dist-packages/**",
|
|
77
|
+
"**/.pytest_cache/**",
|
|
78
|
+
"**/.mypy_cache/**",
|
|
79
|
+
"**/.ruff_cache/**",
|
|
80
|
+
"**/.tox/**",
|
|
81
|
+
"**/.nox/**",
|
|
82
|
+
"**/*.egg-info/**",
|
|
83
|
+
"**/.eggs/**",
|
|
84
|
+
"**/go/pkg/mod/**",
|
|
85
|
+
"**/target/debug/**",
|
|
86
|
+
"**/target/release/**",
|
|
87
|
+
"**/.gradle/**",
|
|
88
|
+
"**/.m2/**",
|
|
89
|
+
"**/generated-sources/**",
|
|
90
|
+
"**/.kotlin/**",
|
|
91
|
+
"**/.dart_tool/**",
|
|
92
|
+
"**/.vs/**",
|
|
93
|
+
"**/.nuget/**",
|
|
94
|
+
"**/artifacts/**",
|
|
95
|
+
"**/publish/**",
|
|
96
|
+
"**/cmake-build-*/**",
|
|
97
|
+
"**/CMakeFiles/**",
|
|
98
|
+
"**/bazel-*/**",
|
|
99
|
+
"**/vcpkg_installed/**",
|
|
100
|
+
"**/.conan/**",
|
|
101
|
+
"**/Debug/**",
|
|
102
|
+
"**/Release/**",
|
|
103
|
+
"**/x64/**",
|
|
104
|
+
"**/.pio/**",
|
|
105
|
+
"**/release/**",
|
|
106
|
+
"**/*.app/**",
|
|
107
|
+
"**/*.asar",
|
|
108
|
+
"**/DerivedData/**",
|
|
109
|
+
"**/.build/**",
|
|
110
|
+
"**/.swiftpm/**",
|
|
111
|
+
"**/xcuserdata/**",
|
|
112
|
+
"**/Carthage/Build/**",
|
|
113
|
+
"**/SourcePackages/**",
|
|
114
|
+
"**/__history/**",
|
|
115
|
+
"**/__recovery/**",
|
|
116
|
+
"**/*.dcu",
|
|
117
|
+
"**/.composer/**",
|
|
118
|
+
"**/storage/framework/**",
|
|
119
|
+
"**/bootstrap/cache/**",
|
|
120
|
+
"**/.bundle/**",
|
|
121
|
+
"**/tmp/cache/**",
|
|
122
|
+
"**/public/assets/**",
|
|
123
|
+
"**/public/packs/**",
|
|
124
|
+
"**/.yardoc/**",
|
|
125
|
+
"**/coverage/**",
|
|
126
|
+
"**/htmlcov/**",
|
|
127
|
+
"**/.nyc_output/**",
|
|
128
|
+
"**/test-results/**",
|
|
129
|
+
"**/.coverage/**",
|
|
130
|
+
"**/.idea/**",
|
|
131
|
+
"**/logs/**",
|
|
132
|
+
"**/tmp/**",
|
|
133
|
+
"**/temp/**",
|
|
134
|
+
"**/_build/**",
|
|
135
|
+
"**/docs/_build/**",
|
|
136
|
+
"**/site/**"
|
|
137
|
+
],
|
|
138
|
+
"languages": [],
|
|
139
|
+
"frameworks": [],
|
|
140
|
+
"maxFileSize": 1048576,
|
|
141
|
+
"extractDocstrings": true,
|
|
142
|
+
"trackCallSites": true
|
|
143
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
updates:
|
|
4
|
+
- package-ecosystem: "uv"
|
|
5
|
+
directory: "/"
|
|
6
|
+
schedule:
|
|
7
|
+
interval: "weekly"
|
|
8
|
+
day: "monday"
|
|
9
|
+
time: "04:00"
|
|
10
|
+
timezone: "Asia/Dubai"
|
|
11
|
+
open-pull-requests-limit: 5
|
|
12
|
+
groups:
|
|
13
|
+
python-dependencies:
|
|
14
|
+
patterns:
|
|
15
|
+
- "*"
|
|
16
|
+
|
|
17
|
+
- package-ecosystem: "npm"
|
|
18
|
+
directory: "/openclaw-plugin"
|
|
19
|
+
schedule:
|
|
20
|
+
interval: "weekly"
|
|
21
|
+
day: "monday"
|
|
22
|
+
time: "04:15"
|
|
23
|
+
timezone: "Asia/Dubai"
|
|
24
|
+
open-pull-requests-limit: 5
|
|
25
|
+
groups:
|
|
26
|
+
openclaw-plugin-dependencies:
|
|
27
|
+
patterns:
|
|
28
|
+
- "*"
|
|
29
|
+
|
|
30
|
+
- package-ecosystem: "github-actions"
|
|
31
|
+
directory: "/"
|
|
32
|
+
schedule:
|
|
33
|
+
interval: "weekly"
|
|
34
|
+
day: "monday"
|
|
35
|
+
time: "04:30"
|
|
36
|
+
timezone: "Asia/Dubai"
|
|
37
|
+
open-pull-requests-limit: 5
|
|
38
|
+
groups:
|
|
39
|
+
github-actions:
|
|
40
|
+
patterns:
|
|
41
|
+
- "*"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
id-token: write
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout repository
|
|
20
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
21
|
+
with:
|
|
22
|
+
persist-credentials: false
|
|
23
|
+
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: uv sync --locked --all-extras
|
|
29
|
+
|
|
30
|
+
- name: Run Ruff
|
|
31
|
+
run: uv run --locked ruff check .
|
|
32
|
+
|
|
33
|
+
- name: Verify package distributions
|
|
34
|
+
run: |
|
|
35
|
+
uv lock --check
|
|
36
|
+
uv build
|
|
37
|
+
(cd compat/people-context-mcp && uv build --out-dir "$GITHUB_WORKSPACE/dist-legacy")
|
|
38
|
+
uvx --from twine==6.2.0 twine check dist/* dist-legacy/*
|
|
39
|
+
|
|
40
|
+
- name: Run tests with coverage
|
|
41
|
+
run: uv run --locked --with pytest-cov==7.1.0 pytest --cov=people_context --cov-report=xml -q
|
|
42
|
+
|
|
43
|
+
- name: Upload coverage to Codecov
|
|
44
|
+
if: >-
|
|
45
|
+
github.actor != 'dependabot[bot]' &&
|
|
46
|
+
(github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)
|
|
47
|
+
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
|
48
|
+
with:
|
|
49
|
+
files: ./coverage.xml
|
|
50
|
+
fail_ci_if_error: false
|
|
51
|
+
use_oidc: true
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Validate Claude Code plugin
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
paths:
|
|
6
|
+
- ".claude-plugin/**"
|
|
7
|
+
- "docs/claude-code-plugin.md"
|
|
8
|
+
- ".github/workflows/claude-plugin-validate.yml"
|
|
9
|
+
- "pyproject.toml"
|
|
10
|
+
- "uv.lock"
|
|
11
|
+
- "src/**"
|
|
12
|
+
- "tests/adapters/test_mcp_server.py"
|
|
13
|
+
- "tests/adapters/test_email_import.py"
|
|
14
|
+
push:
|
|
15
|
+
branches:
|
|
16
|
+
- main
|
|
17
|
+
paths:
|
|
18
|
+
- ".claude-plugin/**"
|
|
19
|
+
- "docs/claude-code-plugin.md"
|
|
20
|
+
- ".github/workflows/claude-plugin-validate.yml"
|
|
21
|
+
- "pyproject.toml"
|
|
22
|
+
- "uv.lock"
|
|
23
|
+
- "src/**"
|
|
24
|
+
- "tests/adapters/test_mcp_server.py"
|
|
25
|
+
- "tests/adapters/test_email_import.py"
|
|
26
|
+
|
|
27
|
+
permissions: read-all
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
validate:
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
|
|
33
|
+
steps:
|
|
34
|
+
- name: Checkout repository
|
|
35
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
36
|
+
with:
|
|
37
|
+
persist-credentials: false
|
|
38
|
+
|
|
39
|
+
- name: Set up Node.js
|
|
40
|
+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
41
|
+
with:
|
|
42
|
+
node-version: "22"
|
|
43
|
+
package-manager-cache: false
|
|
44
|
+
|
|
45
|
+
- name: Install Claude Code
|
|
46
|
+
run: npm install --global @anthropic-ai/claude-code@2.1.214
|
|
47
|
+
|
|
48
|
+
- name: Validate marketplace and plugin
|
|
49
|
+
run: claude plugin validate . --strict
|
|
50
|
+
|
|
51
|
+
- name: Install uv
|
|
52
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
53
|
+
|
|
54
|
+
- name: Verify local MCP entry point
|
|
55
|
+
run: uv run --locked people-context-mcp --help
|
|
56
|
+
|
|
57
|
+
- name: Verify security boundaries
|
|
58
|
+
run: >-
|
|
59
|
+
uv run --locked pytest -q
|
|
60
|
+
tests/adapters/test_mcp_server.py
|
|
61
|
+
tests/adapters/test_email_import.py
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
name: Publish OpenClaw plugin
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
paths:
|
|
6
|
+
- "openclaw-plugin/**"
|
|
7
|
+
- ".github/workflows/package-publish.yml"
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions: read-all
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
verify-dist:
|
|
14
|
+
if: github.event_name == 'pull_request'
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
defaults:
|
|
19
|
+
run:
|
|
20
|
+
working-directory: ./openclaw-plugin
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout repository
|
|
23
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
|
|
27
|
+
- name: Set up Node.js
|
|
28
|
+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
29
|
+
with:
|
|
30
|
+
node-version: "22"
|
|
31
|
+
package-manager-cache: false
|
|
32
|
+
|
|
33
|
+
- name: Install dependencies
|
|
34
|
+
run: npm ci --no-audit --no-fund
|
|
35
|
+
|
|
36
|
+
- name: Rebuild dist
|
|
37
|
+
run: npm run build
|
|
38
|
+
|
|
39
|
+
- name: Fail if committed dist is stale
|
|
40
|
+
run: |
|
|
41
|
+
if ! git diff --quiet -- dist; then
|
|
42
|
+
echo "::error::Committed openclaw-plugin/dist is out of sync with src. Run 'npm run build' and commit the result."
|
|
43
|
+
git --no-pager diff --stat -- dist
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
- name: Run plugin tests
|
|
48
|
+
run: npm test
|
|
49
|
+
|
|
50
|
+
dry-run:
|
|
51
|
+
if: github.event_name == 'pull_request'
|
|
52
|
+
permissions:
|
|
53
|
+
actions: read
|
|
54
|
+
contents: read
|
|
55
|
+
id-token: write
|
|
56
|
+
# Pinned to the v0.12.0 commit SHA (mutable tags can be re-pointed at malicious code).
|
|
57
|
+
uses: openclaw/clawhub/.github/workflows/package-publish.yml@a230d962db64019462c2c8ee400755eb92169908
|
|
58
|
+
with:
|
|
59
|
+
source: ./openclaw-plugin
|
|
60
|
+
owner: jinyangwang27
|
|
61
|
+
dry_run: true
|
|
62
|
+
|
|
63
|
+
publish:
|
|
64
|
+
if: github.event_name == 'workflow_dispatch'
|
|
65
|
+
permissions:
|
|
66
|
+
actions: read
|
|
67
|
+
contents: read
|
|
68
|
+
id-token: write
|
|
69
|
+
# Pinned to the v0.12.0 commit SHA (mutable tags can be re-pointed at malicious code).
|
|
70
|
+
uses: openclaw/clawhub/.github/workflows/package-publish.yml@a230d962db64019462c2c8ee400755eb92169908
|
|
71
|
+
with:
|
|
72
|
+
source: ./openclaw-plugin
|
|
73
|
+
owner: jinyangwang27
|
|
74
|
+
dry_run: false
|
|
75
|
+
secrets:
|
|
76
|
+
clawhub_token: ${{ secrets.CLAWHUB_TOKEN }}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types:
|
|
6
|
+
- published
|
|
7
|
+
|
|
8
|
+
permissions: read-all
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build distributions
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout repository
|
|
16
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
17
|
+
with:
|
|
18
|
+
persist-credentials: false
|
|
19
|
+
|
|
20
|
+
- name: Install uv
|
|
21
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
22
|
+
|
|
23
|
+
- name: Verify lockfile
|
|
24
|
+
run: uv lock --check
|
|
25
|
+
|
|
26
|
+
- name: Build primary distribution
|
|
27
|
+
run: uv build
|
|
28
|
+
|
|
29
|
+
- name: Build legacy compatibility distribution
|
|
30
|
+
run: |
|
|
31
|
+
cd compat/people-context-mcp
|
|
32
|
+
uv build --out-dir "$GITHUB_WORKSPACE/dist-legacy"
|
|
33
|
+
|
|
34
|
+
- name: Verify distribution metadata
|
|
35
|
+
run: uvx --from twine==6.2.0 twine check dist/* dist-legacy/*
|
|
36
|
+
|
|
37
|
+
- name: Store primary distributions
|
|
38
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
39
|
+
with:
|
|
40
|
+
name: python-package-distributions
|
|
41
|
+
path: dist/
|
|
42
|
+
if-no-files-found: error
|
|
43
|
+
|
|
44
|
+
- name: Store legacy compatibility distributions
|
|
45
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
46
|
+
with:
|
|
47
|
+
name: python-legacy-compat-distributions
|
|
48
|
+
path: dist-legacy/
|
|
49
|
+
if-no-files-found: error
|
|
50
|
+
|
|
51
|
+
publish:
|
|
52
|
+
name: Publish people-context
|
|
53
|
+
needs: build
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
environment:
|
|
56
|
+
name: pypi
|
|
57
|
+
url: https://pypi.org/p/people-context
|
|
58
|
+
permissions:
|
|
59
|
+
contents: read
|
|
60
|
+
id-token: write
|
|
61
|
+
steps:
|
|
62
|
+
- name: Download primary distributions
|
|
63
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
64
|
+
with:
|
|
65
|
+
name: python-package-distributions
|
|
66
|
+
path: dist/
|
|
67
|
+
|
|
68
|
+
- name: Publish primary distribution
|
|
69
|
+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
|
|
70
|
+
|
|
71
|
+
publish-legacy:
|
|
72
|
+
name: Publish people-context-mcp compatibility package
|
|
73
|
+
needs: build
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
environment:
|
|
76
|
+
name: pypi
|
|
77
|
+
url: https://pypi.org/p/people-context-mcp
|
|
78
|
+
permissions:
|
|
79
|
+
contents: read
|
|
80
|
+
id-token: write
|
|
81
|
+
steps:
|
|
82
|
+
- name: Download legacy compatibility distributions
|
|
83
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
84
|
+
with:
|
|
85
|
+
name: python-legacy-compat-distributions
|
|
86
|
+
path: dist/
|
|
87
|
+
|
|
88
|
+
- name: Publish compatibility distribution once
|
|
89
|
+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
|
|
90
|
+
with:
|
|
91
|
+
skip-existing: true
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: Scorecard analysis
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
# Only the default branch is supported for published results.
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
schedule:
|
|
9
|
+
# Weekly on Saturdays at 01:30 UTC.
|
|
10
|
+
- cron: "30 1 * * 6"
|
|
11
|
+
|
|
12
|
+
# Keep the workflow read-only by default. The analysis job receives only the
|
|
13
|
+
# two write permissions required to publish and upload its results.
|
|
14
|
+
permissions: read-all
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
analysis:
|
|
18
|
+
name: Scorecard analysis
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
permissions:
|
|
21
|
+
# Upload SARIF results to GitHub's code-scanning dashboard.
|
|
22
|
+
security-events: write
|
|
23
|
+
# Obtain an OIDC token to publish authenticated results for the badge/API.
|
|
24
|
+
id-token: write
|
|
25
|
+
steps:
|
|
26
|
+
- name: Checkout code
|
|
27
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
28
|
+
with:
|
|
29
|
+
persist-credentials: false
|
|
30
|
+
|
|
31
|
+
- name: Run analysis
|
|
32
|
+
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
|
|
33
|
+
with:
|
|
34
|
+
results_file: results.sarif
|
|
35
|
+
results_format: sarif
|
|
36
|
+
publish_results: true
|
|
37
|
+
|
|
38
|
+
- name: Upload SARIF artifact
|
|
39
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
40
|
+
with:
|
|
41
|
+
name: scorecard-sarif
|
|
42
|
+
path: results.sarif
|
|
43
|
+
retention-days: 5
|
|
44
|
+
|
|
45
|
+
- name: Upload to code scanning
|
|
46
|
+
uses: github/codeql-action/upload-sarif@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1
|
|
47
|
+
with:
|
|
48
|
+
sarif_file: results.sarif
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.venv/
|
|
5
|
+
venv/
|
|
6
|
+
dist/
|
|
7
|
+
!openclaw-plugin/dist/
|
|
8
|
+
!openclaw-plugin/dist/**
|
|
9
|
+
build/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
.pytest_cache/
|
|
12
|
+
.ruff_cache/
|
|
13
|
+
.coverage
|
|
14
|
+
htmlcov/
|
|
15
|
+
|
|
16
|
+
# Node
|
|
17
|
+
node_modules/
|
|
18
|
+
|
|
19
|
+
# Data (local SQLite store — never commit user data)
|
|
20
|
+
*.db
|
|
21
|
+
*.db-wal
|
|
22
|
+
*.db-shm
|
|
23
|
+
|
|
24
|
+
# OS / editor
|
|
25
|
+
.DS_Store
|
|
26
|
+
.idea/
|
|
27
|
+
.vscode/
|
|
28
|
+
|
|
29
|
+
tmp/
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Repository Guidelines
|
|
2
|
+
|
|
3
|
+
## Project Structure & Module Organization
|
|
4
|
+
|
|
5
|
+
Application code lives under `src/people_context/` and follows a hexagonal architecture:
|
|
6
|
+
|
|
7
|
+
- `domain/` contains Pydantic entities and dependency-free business rules.
|
|
8
|
+
- `app/` contains one use case per module and depends only on `domain/` and narrow protocols in `ports/`.
|
|
9
|
+
- `adapters/` contains SQLite persistence, MCP transports/tools, importers, and optional semantic integrations.
|
|
10
|
+
- `cli.py`, `config.py`, and `adapters/mcp/server.py` are composition and process-boundary entry points.
|
|
11
|
+
|
|
12
|
+
Tests mirror these layers under `tests/domain/`, `tests/app/`, and `tests/adapters/`. Design documentation, interface contracts, privacy rules, and ADRs live in `docs/`.
|
|
13
|
+
|
|
14
|
+
## Build, Test, and Development Commands
|
|
15
|
+
|
|
16
|
+
- `uv sync` installs the project and development dependencies.
|
|
17
|
+
- `uv sync --extra semantic` explicitly installs optional Model2Vec and sqlite-vec support.
|
|
18
|
+
- `uv run people-context-mcp` starts the default stdio MCP server.
|
|
19
|
+
- `uv run people-context-mcp --http --host 127.0.0.1 --port 8765` starts loopback HTTP.
|
|
20
|
+
- `uv run people-context db-path` shows the active SQLite database.
|
|
21
|
+
- `uv run pytest -q` runs the complete test suite.
|
|
22
|
+
- `uv run ruff check .` checks formatting-independent style and imports.
|
|
23
|
+
- `uv build` creates source and wheel distributions.
|
|
24
|
+
|
|
25
|
+
## Coding Style & Naming Conventions
|
|
26
|
+
|
|
27
|
+
Use four-space indentation, complete type hints, and a 120-character line limit. Ruff enforces `E`, `F`, `I`, `UP`, `B`, and `SIM` rules. Name modules and functions with `snake_case`, classes with `PascalCase`, and constants with `UPPER_CASE`. Keep functions focused and prefer explicit dependency injection through `typing.Protocol` ports. Never import `adapters`, `mcp`, or `sqlite3` from `domain/` or `app/`.
|
|
28
|
+
|
|
29
|
+
## Testing Guidelines
|
|
30
|
+
|
|
31
|
+
Use pytest and name files `test_<subject>.py` and tests `test_<behavior>()`. Test application policy against in-memory fakes in `tests/app/fakes.py`; test persistence and transport behavior separately with SQLite and subprocess/E2E tests. Add a regression test for every bug and run focused tests before the full suite.
|
|
32
|
+
|
|
33
|
+
## Commit & Pull Request Guidelines
|
|
34
|
+
|
|
35
|
+
Use concise imperative Conventional Commit subjects, matching history: `feat: add ...`, `fix: report ...`, or `docs: mark ...`. Keep commits green and narrowly scoped. Pull requests should explain behavior and privacy impact, list verification commands, link relevant issues, and update interface or architecture documentation when contracts change.
|
|
36
|
+
|
|
37
|
+
## Security & Configuration
|
|
38
|
+
|
|
39
|
+
This repository stores sensitive personal data locally. Never persist raw import content or log private values. Keep HTTP loopback-only and unauthenticated; remote access is out of scope. Ordinary commands must not access the network—only explicit `people-context reindex --semantic` may download the pinned model.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jinyang Wang
|
|
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.
|