aiwcli 0.10.2 → 0.11.0
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.
- package/bin/run.js +1 -1
- package/dist/commands/clear.d.ts +11 -6
- package/dist/commands/clear.js +229 -381
- package/dist/commands/init/index.d.ts +1 -17
- package/dist/commands/init/index.js +22 -107
- package/dist/lib/gitignore-manager.d.ts +32 -0
- package/dist/lib/gitignore-manager.js +141 -2
- package/dist/lib/template-installer.d.ts +7 -12
- package/dist/lib/template-installer.js +69 -193
- package/dist/lib/template-settings-reconstructor.d.ts +35 -0
- package/dist/lib/template-settings-reconstructor.js +130 -0
- package/dist/templates/CLAUDE.md +8 -8
- package/dist/templates/_shared/.claude/commands/handoff-resume.md +64 -0
- package/dist/templates/_shared/.claude/commands/handoff.md +16 -10
- package/dist/templates/_shared/.claude/settings.json +7 -7
- package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +2 -0
- package/dist/templates/_shared/hooks-ts/archive_plan.ts +159 -0
- package/dist/templates/_shared/hooks-ts/context_monitor.ts +147 -0
- package/dist/templates/_shared/hooks-ts/file-suggestion.ts +130 -0
- package/dist/templates/_shared/hooks-ts/pre_compact.ts +49 -0
- package/dist/templates/_shared/hooks-ts/session_end.ts +104 -0
- package/dist/templates/_shared/hooks-ts/session_start.ts +144 -0
- package/dist/templates/_shared/hooks-ts/task_create_capture.ts +48 -0
- package/dist/templates/_shared/hooks-ts/task_update_capture.ts +74 -0
- package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +83 -0
- package/dist/templates/_shared/lib-ts/CLAUDE.md +318 -0
- package/dist/templates/_shared/lib-ts/base/atomic-write.ts +138 -0
- package/dist/templates/_shared/lib-ts/base/constants.ts +306 -0
- package/dist/templates/_shared/lib-ts/base/git-state.ts +58 -0
- package/dist/templates/_shared/lib-ts/base/hook-utils.ts +439 -0
- package/dist/templates/_shared/lib-ts/base/inference.ts +252 -0
- package/dist/templates/_shared/lib-ts/base/logger.ts +250 -0
- package/dist/templates/_shared/lib-ts/base/state-io.ts +116 -0
- package/dist/templates/_shared/lib-ts/base/stop-words.ts +184 -0
- package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +162 -0
- package/dist/templates/_shared/lib-ts/base/utils.ts +184 -0
- package/dist/templates/_shared/lib-ts/context/context-formatter.ts +438 -0
- package/dist/templates/_shared/lib-ts/context/context-selector.ts +515 -0
- package/dist/templates/_shared/lib-ts/context/context-store.ts +707 -0
- package/dist/templates/_shared/lib-ts/context/plan-manager.ts +316 -0
- package/dist/templates/_shared/lib-ts/context/task-tracker.ts +185 -0
- package/dist/templates/_shared/lib-ts/handoff/document-generator.ts +216 -0
- package/dist/templates/_shared/lib-ts/handoff/handoff-reader.ts +159 -0
- package/dist/templates/_shared/lib-ts/package.json +21 -0
- package/dist/templates/_shared/lib-ts/templates/formatters.ts +104 -0
- package/dist/templates/_shared/{lib/templates/plan_context.py → lib-ts/templates/plan-context.ts} +14 -22
- package/dist/templates/_shared/lib-ts/tsconfig.json +13 -0
- package/dist/templates/_shared/lib-ts/types.ts +164 -0
- package/dist/templates/_shared/scripts/resolve_context.ts +24 -0
- package/dist/templates/_shared/scripts/resume_handoff.ts +321 -0
- package/dist/templates/_shared/scripts/save_handoff.ts +359 -0
- package/dist/templates/_shared/scripts/status_line.ts +733 -0
- package/dist/templates/cc-native/.claude/settings.json +175 -185
- package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +15 -17
- package/dist/templates/cc-native/_cc-native/agents/ARCH-EVOLUTION.md +63 -0
- package/dist/templates/cc-native/_cc-native/agents/ARCH-PATTERNS.md +62 -0
- package/dist/templates/cc-native/_cc-native/agents/ARCH-STRUCTURE.md +63 -0
- package/dist/templates/cc-native/_cc-native/agents/{ASSUMPTION-CHAIN-TRACER.md → ASSUMPTION-TRACER.md} +6 -10
- package/dist/templates/cc-native/_cc-native/agents/CLARITY-AUDITOR.md +6 -10
- package/dist/templates/cc-native/_cc-native/agents/CLAUDE.md +74 -3
- package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-FEASIBILITY.md +67 -0
- package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-GAPS.md +71 -0
- package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-ORDERING.md +63 -0
- package/dist/templates/cc-native/_cc-native/agents/CONSTRAINT-VALIDATOR.md +73 -0
- package/dist/templates/cc-native/_cc-native/agents/DESIGN-ADR-VALIDATOR.md +62 -0
- package/dist/templates/cc-native/_cc-native/agents/DESIGN-SCALE-MATCHER.md +65 -0
- package/dist/templates/cc-native/_cc-native/agents/DEVILS-ADVOCATE.md +6 -9
- package/dist/templates/cc-native/_cc-native/agents/DOCUMENTATION-PHILOSOPHY.md +87 -0
- package/dist/templates/cc-native/_cc-native/agents/HANDOFF-READINESS.md +5 -9
- package/dist/templates/cc-native/_cc-native/agents/{HIDDEN-COMPLEXITY-DETECTOR.md → HIDDEN-COMPLEXITY.md} +6 -10
- package/dist/templates/cc-native/_cc-native/agents/INCREMENTAL-DELIVERY.md +67 -0
- package/dist/templates/cc-native/_cc-native/agents/PLAN-ORCHESTRATOR.md +91 -18
- package/dist/templates/cc-native/_cc-native/agents/RISK-DEPENDENCY.md +63 -0
- package/dist/templates/cc-native/_cc-native/agents/RISK-FMEA.md +67 -0
- package/dist/templates/cc-native/_cc-native/agents/RISK-PREMORTEM.md +72 -0
- package/dist/templates/cc-native/_cc-native/agents/RISK-REVERSIBILITY.md +75 -0
- package/dist/templates/cc-native/_cc-native/agents/SCOPE-BOUNDARY.md +78 -0
- package/dist/templates/cc-native/_cc-native/agents/SIMPLICITY-GUARDIAN.md +5 -9
- package/dist/templates/cc-native/_cc-native/agents/SKEPTIC.md +16 -12
- package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-BEHAVIOR-AUDITOR.md +62 -0
- package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-CHARACTERIZATION.md +72 -0
- package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-FIRST-VALIDATOR.md +62 -0
- package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-PYRAMID-ANALYZER.md +62 -0
- package/dist/templates/cc-native/_cc-native/agents/TRADEOFF-COSTS.md +68 -0
- package/dist/templates/cc-native/_cc-native/agents/TRADEOFF-STAKEHOLDERS.md +66 -0
- package/dist/templates/cc-native/_cc-native/agents/VERIFY-COVERAGE.md +75 -0
- package/dist/templates/cc-native/_cc-native/agents/VERIFY-STRENGTH.md +70 -0
- package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +109 -135
- package/dist/templates/cc-native/_cc-native/hooks/add_plan_context.ts +119 -0
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +921 -0
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +61 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +157 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +709 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +199 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +124 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +57 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +83 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +80 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +119 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +162 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/nul +3 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/orchestrator.ts +249 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/agent.ts +155 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/codex.ts +130 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/gemini.ts +106 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/index.ts +10 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/types.ts +23 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +243 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +18 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +310 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/verdict.ts +72 -0
- package/dist/templates/cc-native/_cc-native/plan-review.config.json +12 -16
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
- package/dist/lib/template-merger.d.ts +0 -47
- package/dist/lib/template-merger.js +0 -162
- package/dist/templates/_shared/hooks/__init__.py +0 -16
- package/dist/templates/_shared/hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/archive_plan.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/context_enforcer.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/context_monitor.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/file-suggestion.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/pre_compact.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/session_end.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/session_start.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/task_create_atomicity.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/task_create_capture.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/task_update_capture.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/__pycache__/user_prompt_submit.cpython-313.pyc +0 -0
- package/dist/templates/_shared/hooks/archive_plan.py +0 -169
- package/dist/templates/_shared/hooks/context_monitor.py +0 -270
- package/dist/templates/_shared/hooks/file-suggestion.py +0 -215
- package/dist/templates/_shared/hooks/pre_compact.py +0 -104
- package/dist/templates/_shared/hooks/session_end.py +0 -173
- package/dist/templates/_shared/hooks/session_start.py +0 -206
- package/dist/templates/_shared/hooks/task_create_capture.py +0 -108
- package/dist/templates/_shared/hooks/task_update_capture.py +0 -145
- package/dist/templates/_shared/hooks/user_prompt_submit.py +0 -139
- package/dist/templates/_shared/lib/__init__.py +0 -1
- package/dist/templates/_shared/lib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__init__.py +0 -65
- package/dist/templates/_shared/lib/base/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/atomic_write.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/constants.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/hook_utils.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/inference.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/logger.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/stop_words.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/subprocess_utils.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/__pycache__/utils.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/base/atomic_write.py +0 -180
- package/dist/templates/_shared/lib/base/constants.py +0 -358
- package/dist/templates/_shared/lib/base/hook_utils.py +0 -341
- package/dist/templates/_shared/lib/base/inference.py +0 -318
- package/dist/templates/_shared/lib/base/logger.py +0 -291
- package/dist/templates/_shared/lib/base/stop_words.py +0 -213
- package/dist/templates/_shared/lib/base/subprocess_utils.py +0 -46
- package/dist/templates/_shared/lib/base/utils.py +0 -242
- package/dist/templates/_shared/lib/context/__init__.py +0 -102
- package/dist/templates/_shared/lib/context/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/cache.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/context_extractor.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/context_formatter.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/context_manager.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/context_selector.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/context_store.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/discovery.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/event_log.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/plan_archive.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/plan_manager.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/task_sync.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/__pycache__/task_tracker.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/context/context_formatter.py +0 -317
- package/dist/templates/_shared/lib/context/context_selector.py +0 -508
- package/dist/templates/_shared/lib/context/context_store.py +0 -653
- package/dist/templates/_shared/lib/context/plan_manager.py +0 -204
- package/dist/templates/_shared/lib/context/task_tracker.py +0 -188
- package/dist/templates/_shared/lib/handoff/__init__.py +0 -22
- package/dist/templates/_shared/lib/handoff/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/handoff/__pycache__/document_generator.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/handoff/document_generator.py +0 -278
- package/dist/templates/_shared/lib/templates/README.md +0 -206
- package/dist/templates/_shared/lib/templates/__init__.py +0 -36
- package/dist/templates/_shared/lib/templates/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/templates/__pycache__/formatters.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/templates/__pycache__/persona_questions.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/templates/__pycache__/plan_context.cpython-313.pyc +0 -0
- package/dist/templates/_shared/lib/templates/formatters.py +0 -146
- package/dist/templates/_shared/scripts/__pycache__/save_handoff.cpython-313.pyc +0 -0
- package/dist/templates/_shared/scripts/__pycache__/status_line.cpython-313.pyc +0 -0
- package/dist/templates/_shared/scripts/save_handoff.py +0 -357
- package/dist/templates/_shared/scripts/status_line.py +0 -701
- package/dist/templates/cc-native/.claude/commands/cc-native/fresh-perspective.md +0 -8
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/fresh-perspective.md +0 -8
- package/dist/templates/cc-native/MIGRATION.md +0 -86
- package/dist/templates/cc-native/_cc-native/agents/ACCESSIBILITY-TESTER.md +0 -79
- package/dist/templates/cc-native/_cc-native/agents/ARCHITECT-REVIEWER.md +0 -48
- package/dist/templates/cc-native/_cc-native/agents/CODE-REVIEWER.md +0 -70
- package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-CHECKER.md +0 -59
- package/dist/templates/cc-native/_cc-native/agents/CONTEXT-EXTRACTOR.md +0 -92
- package/dist/templates/cc-native/_cc-native/agents/DOCUMENTATION-REVIEWER.md +0 -51
- package/dist/templates/cc-native/_cc-native/agents/FEASIBILITY-ANALYST.md +0 -57
- package/dist/templates/cc-native/_cc-native/agents/FRESH-PERSPECTIVE.md +0 -54
- package/dist/templates/cc-native/_cc-native/agents/INCENTIVE-MAPPER.md +0 -61
- package/dist/templates/cc-native/_cc-native/agents/PENETRATION-TESTER.md +0 -79
- package/dist/templates/cc-native/_cc-native/agents/PERFORMANCE-ENGINEER.md +0 -75
- package/dist/templates/cc-native/_cc-native/agents/PRECEDENT-FINDER.md +0 -70
- package/dist/templates/cc-native/_cc-native/agents/REVERSIBILITY-ANALYST.md +0 -61
- package/dist/templates/cc-native/_cc-native/agents/RISK-ASSESSOR.md +0 -58
- package/dist/templates/cc-native/_cc-native/agents/SECOND-ORDER-ANALYST.md +0 -61
- package/dist/templates/cc-native/_cc-native/agents/STAKEHOLDER-ADVOCATE.md +0 -55
- package/dist/templates/cc-native/_cc-native/agents/TRADE-OFF-ILLUMINATOR.md +0 -204
- package/dist/templates/cc-native/_cc-native/hooks/__pycache__/add_plan_context.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/hooks/__pycache__/cc-native-plan-review.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/hooks/__pycache__/mark_questions_asked.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/hooks/__pycache__/plan_accepted.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/hooks/__pycache__/plan_questions_early.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/hooks/__pycache__/suggest-fresh-perspective.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/hooks/add_plan_context.py +0 -130
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.py +0 -869
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.py +0 -81
- package/dist/templates/cc-native/_cc-native/hooks/suggest-fresh-perspective.py +0 -340
- package/dist/templates/cc-native/_cc-native/lib/CLAUDE.md +0 -265
- package/dist/templates/cc-native/_cc-native/lib/__init__.py +0 -53
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/atomic_write.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/constants.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/debug.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/orchestrator.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/state.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/__pycache__/utils.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/constants.py +0 -45
- package/dist/templates/cc-native/_cc-native/lib/debug.py +0 -139
- package/dist/templates/cc-native/_cc-native/lib/orchestrator.py +0 -362
- package/dist/templates/cc-native/_cc-native/lib/reviewers/__init__.py +0 -28
- package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/agent.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/base.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/codex.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/gemini.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/lib/reviewers/agent.py +0 -215
- package/dist/templates/cc-native/_cc-native/lib/reviewers/base.py +0 -88
- package/dist/templates/cc-native/_cc-native/lib/reviewers/codex.py +0 -124
- package/dist/templates/cc-native/_cc-native/lib/reviewers/gemini.py +0 -108
- package/dist/templates/cc-native/_cc-native/lib/state.py +0 -268
- package/dist/templates/cc-native/_cc-native/lib/utils.py +0 -1027
- package/dist/templates/cc-native/_cc-native/scripts/__pycache__/aggregate_agents.cpython-313.pyc +0 -0
- package/dist/templates/cc-native/_cc-native/scripts/aggregate_agents.py +0 -168
- package/dist/templates/cc-native/_cc-native/workflows/fresh-perspective.md +0 -134
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
"""Stop words for context ID generation.
|
|
2
|
-
|
|
3
|
-
Generated from analysis of 1,424 prompts, context summaries, and plan files.
|
|
4
|
-
Words that appear frequently but don't help identify the specific task.
|
|
5
|
-
|
|
6
|
-
Categories organized for maintainability. Add new corpus-derived words to
|
|
7
|
-
the appropriate category or to "Corpus-derived additions" at the end.
|
|
8
|
-
|
|
9
|
-
ACTION VERBS ARE INTENTIONALLY EXCLUDED from this list:
|
|
10
|
-
add, fix, update, create, implement, refactor, migrate, debug, remove, change,
|
|
11
|
-
move, rename, delete, build, test, deploy, verify, analyze, modify, write, run,
|
|
12
|
-
check, replace, save, sync, load, extract, install, refactor, clean, merge, etc.
|
|
13
|
-
|
|
14
|
-
These action verbs should REMAIN in context IDs as they identify the task type.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
STOP_WORDS = {
|
|
18
|
-
# ========================================================================
|
|
19
|
-
# ARTICLES
|
|
20
|
-
# ========================================================================
|
|
21
|
-
'a', 'an', 'the',
|
|
22
|
-
|
|
23
|
-
# ========================================================================
|
|
24
|
-
# PREPOSITIONS
|
|
25
|
-
# ========================================================================
|
|
26
|
-
'to', 'for', 'in', 'on', 'at', 'by', 'with', 'from', 'of', 'about',
|
|
27
|
-
'into', 'over', 'under', 'between', 'through', 'during', 'before', 'after',
|
|
28
|
-
'above', 'below', 'against', 'among', 'around', 'behind', 'beside', 'besides',
|
|
29
|
-
'beyond', 'down', 'inside', 'outside', 'near', 'off', 'onto', 'out',
|
|
30
|
-
'since', 'toward', 'towards', 'until', 'upon', 'within', 'without',
|
|
31
|
-
'across', 'along', 'via', 'per',
|
|
32
|
-
|
|
33
|
-
# ========================================================================
|
|
34
|
-
# PRONOUNS
|
|
35
|
-
# ========================================================================
|
|
36
|
-
# Personal pronouns
|
|
37
|
-
'i', 'you', 'he', 'she', 'it', 'we', 'they',
|
|
38
|
-
'me', 'him', 'her', 'us', 'them',
|
|
39
|
-
'myself', 'yourself', 'himself', 'herself', 'itself', 'ourselves', 'themselves',
|
|
40
|
-
|
|
41
|
-
# Possessive pronouns
|
|
42
|
-
'my', 'your', 'his', 'her', 'its', 'our', 'their',
|
|
43
|
-
'mine', 'yours', 'hers', 'ours', 'theirs',
|
|
44
|
-
|
|
45
|
-
# Demonstrative pronouns
|
|
46
|
-
'this', 'that', 'these', 'those',
|
|
47
|
-
|
|
48
|
-
# Relative pronouns
|
|
49
|
-
'who', 'whom', 'whose', 'which', 'that',
|
|
50
|
-
|
|
51
|
-
# Indefinite pronouns
|
|
52
|
-
'someone', 'somebody', 'something', 'anyone', 'anybody', 'anything',
|
|
53
|
-
'everyone', 'everybody', 'everything', 'no one', 'nobody', 'nothing',
|
|
54
|
-
'one', 'ones',
|
|
55
|
-
|
|
56
|
-
# ========================================================================
|
|
57
|
-
# AUXILIARY/MODAL VERBS
|
|
58
|
-
# ========================================================================
|
|
59
|
-
'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
60
|
-
'have', 'has', 'had', 'having',
|
|
61
|
-
'do', 'does', 'did', 'doing', 'done',
|
|
62
|
-
'can', 'could', 'will', 'would', 'shall', 'should', 'may', 'might', 'must',
|
|
63
|
-
|
|
64
|
-
# ========================================================================
|
|
65
|
-
# CONJUNCTIONS
|
|
66
|
-
# ========================================================================
|
|
67
|
-
'and', 'or', 'but', 'nor', 'so', 'yet', 'for',
|
|
68
|
-
'if', 'then', 'else', 'whether', 'unless', 'although', 'though',
|
|
69
|
-
'because', 'since', 'while', 'whereas', 'whenever', 'wherever',
|
|
70
|
-
|
|
71
|
-
# ========================================================================
|
|
72
|
-
# QUESTION WORDS
|
|
73
|
-
# ========================================================================
|
|
74
|
-
'what', 'when', 'where', 'why', 'how',
|
|
75
|
-
|
|
76
|
-
# ========================================================================
|
|
77
|
-
# ADVERBS OF PLACE/TIME
|
|
78
|
-
# ========================================================================
|
|
79
|
-
'here', 'there', 'now', 'then', 'always', 'never', 'often', 'sometimes',
|
|
80
|
-
'already', 'still', 'yet', 'soon', 'later', 'ago', 'today', 'tomorrow',
|
|
81
|
-
'yesterday', 'currently', 'previously', 'recently', 'immediately',
|
|
82
|
-
'finally', 'eventually', 'meanwhile', 'afterwards',
|
|
83
|
-
|
|
84
|
-
# ========================================================================
|
|
85
|
-
# NEGATION
|
|
86
|
-
# ========================================================================
|
|
87
|
-
'no', 'not', 'none', 'never', 'neither', 'nor',
|
|
88
|
-
'don', 'doesn', 'didn', 'won', 'wouldn', 'couldn', 'shouldn',
|
|
89
|
-
'isn', 'aren', 'wasn', 'weren', 'hasn', 'haven', 'hadn',
|
|
90
|
-
|
|
91
|
-
# ========================================================================
|
|
92
|
-
# QUANTIFIERS
|
|
93
|
-
# ========================================================================
|
|
94
|
-
'some', 'any', 'all', 'each', 'every', 'both', 'few', 'more', 'most',
|
|
95
|
-
'many', 'much', 'several', 'other', 'another', 'enough', 'less', 'least',
|
|
96
|
-
'either', 'neither', 'such',
|
|
97
|
-
|
|
98
|
-
# ========================================================================
|
|
99
|
-
# FILLER/HEDGE WORDS
|
|
100
|
-
# ========================================================================
|
|
101
|
-
'just', 'also', 'only', 'really', 'actually', 'basically', 'simply',
|
|
102
|
-
'very', 'quite', 'rather', 'pretty', 'somewhat', 'almost', 'nearly',
|
|
103
|
-
'exactly', 'completely', 'entirely', 'totally', 'absolutely',
|
|
104
|
-
'probably', 'possibly', 'maybe', 'perhaps', 'definitely', 'certainly',
|
|
105
|
-
'apparently', 'obviously', 'clearly', 'literally', 'essentially',
|
|
106
|
-
|
|
107
|
-
# ========================================================================
|
|
108
|
-
# COMMON REQUEST PHRASES (from corpus: high frequency in prompts)
|
|
109
|
-
# ========================================================================
|
|
110
|
-
'want', 'need', 'help', 'please', 'like', 'let', 'get',
|
|
111
|
-
'think', 'know', 'see', 'try', 'make', 'give', 'take',
|
|
112
|
-
'look', 'looking', 'trying', 'going', 'getting', 'making',
|
|
113
|
-
|
|
114
|
-
# ========================================================================
|
|
115
|
-
# COMMON NON-ACTION VERBS
|
|
116
|
-
# ========================================================================
|
|
117
|
-
'go', 'come', 'put', 'say', 'tell', 'ask', 'find', 'keep',
|
|
118
|
-
'seem', 'appear', 'become', 'remain', 'stay', 'feel', 'show', 'mean',
|
|
119
|
-
'include', 'provide', 'require', 'allow', 'expect', 'cause',
|
|
120
|
-
'follow', 'consider', 'continue', 'start', 'begin', 'end',
|
|
121
|
-
'contain', 'contain', 'contains',
|
|
122
|
-
|
|
123
|
-
# ========================================================================
|
|
124
|
-
# LINKING/TRANSITION WORDS
|
|
125
|
-
# ========================================================================
|
|
126
|
-
'however', 'therefore', 'thus', 'hence', 'otherwise', 'instead',
|
|
127
|
-
'moreover', 'furthermore', 'nevertheless', 'nonetheless', 'accordingly',
|
|
128
|
-
'consequently', 'similarly', 'likewise', 'conversely', 'alternatively',
|
|
129
|
-
|
|
130
|
-
# ========================================================================
|
|
131
|
-
# CORPUS-DERIVED HIGH-FREQUENCY NOISE (from 1,424 docs analysis)
|
|
132
|
-
# ========================================================================
|
|
133
|
-
# Words appearing in >10% of documents that don't identify the task
|
|
134
|
-
|
|
135
|
-
# File extensions/technical noise (appear in paths, not task descriptors)
|
|
136
|
-
'py', 'md', 'ts', 'json', 'js', 'yaml', 'toml', 'exe', 'bat',
|
|
137
|
-
|
|
138
|
-
# Common Claude/coding terms that don't identify specific tasks
|
|
139
|
-
'using', 'used', 'uses',
|
|
140
|
-
'based', 'following',
|
|
141
|
-
'same', 'different', 'specific', 'existing', 'new', 'current', 'first',
|
|
142
|
-
'full', 'complete', 'single', 'multiple', 'simple',
|
|
143
|
-
'needed', 'required', 'provided', 'expected', 'correctly',
|
|
144
|
-
'works', 'working', 'work',
|
|
145
|
-
|
|
146
|
-
# Common structural words from plan files
|
|
147
|
-
'step', 'steps', 'phase', 'below', 'above',
|
|
148
|
-
|
|
149
|
-
# Query/clarification language (high frequency in prompts)
|
|
150
|
-
'questions', 'question', 'clarification',
|
|
151
|
-
|
|
152
|
-
# Overly generic terms
|
|
153
|
-
'thing', 'things', 'way', 'ways', 'kind', 'type', 'types',
|
|
154
|
-
'example', 'examples', 'case', 'cases',
|
|
155
|
-
'part', 'parts', 'point', 'points',
|
|
156
|
-
'time', 'times', 'next', 'last', 'end',
|
|
157
|
-
'set', 'list', 'group', 'item', 'items',
|
|
158
|
-
|
|
159
|
-
# ========================================================================
|
|
160
|
-
# PROGRAMMING KEYWORDS (code tokens that leak from pasted code)
|
|
161
|
-
# ========================================================================
|
|
162
|
-
'self', 'def', 'return', 'import', 'true', 'false', 'none', 'str',
|
|
163
|
-
'const', 'async', 'class', 'assert', 'except', 'dict', 'len', 'args',
|
|
164
|
-
'sys', 'eprint', 'elif', 'lambda', 'yield', 'pass',
|
|
165
|
-
|
|
166
|
-
# ========================================================================
|
|
167
|
-
# GENERIC ADJECTIVES (non-specific modifiers)
|
|
168
|
-
# ========================================================================
|
|
169
|
-
'high', 'low', 'important', 'critical', 'optional', 'manual',
|
|
170
|
-
'real', 'empty', 'stable', 'active', 'proper', 'correct',
|
|
171
|
-
'basic', 'main', 'primary', 'secondary', 'general', 'overall',
|
|
172
|
-
|
|
173
|
-
# ========================================================================
|
|
174
|
-
# GENERIC TECHNICAL NOUNS (common but non-specific)
|
|
175
|
-
# ========================================================================
|
|
176
|
-
'information', 'format', 'status', 'method', 'purpose', 'result',
|
|
177
|
-
'source', 'value', 'option', 'options', 'feature', 'features', 'issue',
|
|
178
|
-
'process', 'version', 'mode', 'state',
|
|
179
|
-
|
|
180
|
-
# ========================================================================
|
|
181
|
-
# DOCUMENT/CODE STRUCTURE (generic structural terms)
|
|
182
|
-
# ========================================================================
|
|
183
|
-
'section', 'lines', 'line', 'folder', 'directory', 'index',
|
|
184
|
-
'level', 'block', 'chunk', 'region', 'header', 'footer',
|
|
185
|
-
|
|
186
|
-
# ========================================================================
|
|
187
|
-
# FRAGMENT WORDS (artifacts from contractions/tokenization)
|
|
188
|
-
# ========================================================================
|
|
189
|
-
're', 'pl', 'aiw', 've', 'll', 'doesn', 't', 's',
|
|
190
|
-
|
|
191
|
-
# ========================================================================
|
|
192
|
-
# CORPUS-DERIVED SHORT NOISE (2026-02 analysis of 131 docs)
|
|
193
|
-
# ========================================================================
|
|
194
|
-
# Contractions with punctuation stripped (I'm -> im, etc.)
|
|
195
|
-
'im', 'ive', 'id', 'ill', 'youre', 'youve', 'youll',
|
|
196
|
-
'hes', 'shes', 'weve', 'theyre', 'theyve', 'dont', 'doesnt',
|
|
197
|
-
'didnt', 'wont', 'wouldnt', 'cant', 'couldnt', 'shouldnt', 'isnt',
|
|
198
|
-
'arent', 'wasnt', 'werent', 'hasnt', 'havent', 'hadnt', 'lets',
|
|
199
|
-
'thats', 'whats', 'heres', 'theres', 'whos',
|
|
200
|
-
|
|
201
|
-
# Filler/noise from corpus (>10% frequency, non-action)
|
|
202
|
-
'etc', 'up', 'as', 'cc',
|
|
203
|
-
|
|
204
|
-
# Number words (common in plans but don't identify task)
|
|
205
|
-
'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten',
|
|
206
|
-
|
|
207
|
-
# Single letters (artifacts from lists, paths, variables)
|
|
208
|
-
'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
|
|
209
|
-
'q', 'r', 'u', 'v', 'w', 'x', 'y', 'z',
|
|
210
|
-
|
|
211
|
-
# Short adverbs/fillers from review
|
|
212
|
-
'too', 'yes', 'ok', 'okay',
|
|
213
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"""Utilities for subprocess calls that invoke Claude Code CLI.
|
|
2
|
-
|
|
3
|
-
Provides centralized management of environment flags for internal subprocess calls
|
|
4
|
-
(orchestrator, agents, inference) to prevent recursion and unnecessary hook overhead.
|
|
5
|
-
"""
|
|
6
|
-
import os
|
|
7
|
-
from typing import Dict
|
|
8
|
-
|
|
9
|
-
# Environment variable names - single source of truth
|
|
10
|
-
ENV_INTERNAL_CALL = "AIWCLI_INTERNAL_CALL"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def get_internal_subprocess_env() -> Dict[str, str]:
|
|
14
|
-
"""Get environment dict for internal Claude Code subprocess calls.
|
|
15
|
-
|
|
16
|
-
This prevents internal subprocess calls (orchestrator, agents, inference)
|
|
17
|
-
from triggering hooks that would cause recursion or unnecessary overhead.
|
|
18
|
-
|
|
19
|
-
All hooks should check is_internal_call() and return early if True.
|
|
20
|
-
|
|
21
|
-
Returns:
|
|
22
|
-
Environment dict with AIWCLI_INTERNAL_CALL flag set
|
|
23
|
-
|
|
24
|
-
Example:
|
|
25
|
-
>>> env = get_internal_subprocess_env()
|
|
26
|
-
>>> subprocess.run(['claude', '--agent', 'my-agent'], env=env)
|
|
27
|
-
"""
|
|
28
|
-
env = os.environ.copy()
|
|
29
|
-
env[ENV_INTERNAL_CALL] = 'true'
|
|
30
|
-
return env
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def is_internal_call() -> bool:
|
|
34
|
-
"""Check if current process is an internal subprocess call.
|
|
35
|
-
|
|
36
|
-
Hooks should check this at the beginning and return early to avoid
|
|
37
|
-
recursion and unnecessary processing for internal subprocess calls.
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
True if this is an internal call that should skip hooks
|
|
41
|
-
|
|
42
|
-
Example:
|
|
43
|
-
>>> if is_internal_call():
|
|
44
|
-
... return # Skip hook processing
|
|
45
|
-
"""
|
|
46
|
-
return os.environ.get(ENV_INTERNAL_CALL) == 'true'
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
"""Core utilities for shared context management.
|
|
2
|
-
|
|
3
|
-
Provides common functions used across all shared modules:
|
|
4
|
-
- eprint: Print to stderr
|
|
5
|
-
- now_local: Get current local datetime
|
|
6
|
-
- project_dir: Get project directory from environment
|
|
7
|
-
- sanitize_filename: Sanitize string for use in filenames
|
|
8
|
-
- generate_context_id: Generate a slug from summary text
|
|
9
|
-
"""
|
|
10
|
-
import os
|
|
11
|
-
import re
|
|
12
|
-
import sys
|
|
13
|
-
from datetime import datetime
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from typing import Any, Dict, Optional
|
|
16
|
-
|
|
17
|
-
from .logger import log_debug, log_info, log_warn, log_error
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def eprint(*args: Any) -> None:
|
|
21
|
-
"""Print to stderr."""
|
|
22
|
-
print(*args, file=sys.stderr)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def now_local() -> datetime:
|
|
26
|
-
"""Get current local datetime."""
|
|
27
|
-
return datetime.now()
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def now_iso() -> str:
|
|
31
|
-
"""Get current time as ISO 8601 string."""
|
|
32
|
-
return datetime.now().isoformat()
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def project_dir(payload: Optional[Dict[str, Any]] = None) -> Path:
|
|
36
|
-
"""
|
|
37
|
-
Get project directory from payload or environment.
|
|
38
|
-
|
|
39
|
-
Priority:
|
|
40
|
-
1. CLAUDE_PROJECT_DIR environment variable
|
|
41
|
-
2. 'cwd' from payload (if provided)
|
|
42
|
-
3. Current working directory
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
payload: Optional hook payload with 'cwd' field
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
Path to project directory
|
|
49
|
-
|
|
50
|
-
Note:
|
|
51
|
-
CLAUDE_PROJECT_DIR is validated to be an absolute path when provided.
|
|
52
|
-
"""
|
|
53
|
-
p = os.environ.get("CLAUDE_PROJECT_DIR")
|
|
54
|
-
if p:
|
|
55
|
-
# Validate that CLAUDE_PROJECT_DIR is an absolute path
|
|
56
|
-
path = Path(p)
|
|
57
|
-
if not path.is_absolute():
|
|
58
|
-
log_warn("utils", "CLAUDE_PROJECT_DIR is not absolute, using cwd instead")
|
|
59
|
-
p = None
|
|
60
|
-
else:
|
|
61
|
-
# Check for suspicious patterns
|
|
62
|
-
if '..' in str(path):
|
|
63
|
-
log_warn("utils", "CLAUDE_PROJECT_DIR contains '..' pattern, using cwd instead")
|
|
64
|
-
p = None
|
|
65
|
-
|
|
66
|
-
if not p and payload:
|
|
67
|
-
p = payload.get("cwd")
|
|
68
|
-
if not p:
|
|
69
|
-
p = os.getcwd()
|
|
70
|
-
return Path(p)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
# Windows reserved filenames that should be blocked
|
|
74
|
-
_WINDOWS_RESERVED = frozenset([
|
|
75
|
-
'CON', 'PRN', 'AUX', 'NUL',
|
|
76
|
-
'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
|
|
77
|
-
'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9',
|
|
78
|
-
])
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def sanitize_filename(s: str, max_len: int = 32, allow_leading_dot: bool = False) -> str:
|
|
82
|
-
"""
|
|
83
|
-
Sanitize string for use in filename.
|
|
84
|
-
|
|
85
|
-
Replaces non-alphanumeric characters (except ._-) with underscores,
|
|
86
|
-
strips leading/trailing special characters, and truncates.
|
|
87
|
-
|
|
88
|
-
Args:
|
|
89
|
-
s: Input string
|
|
90
|
-
max_len: Maximum length (default: 32)
|
|
91
|
-
allow_leading_dot: Whether to allow leading dots (default: False for security)
|
|
92
|
-
|
|
93
|
-
Returns:
|
|
94
|
-
Sanitized filename-safe string
|
|
95
|
-
"""
|
|
96
|
-
s = re.sub(r"[^A-Za-z0-9._-]+", "_", s)
|
|
97
|
-
result = s.strip("._-")[:max_len] or "unknown"
|
|
98
|
-
|
|
99
|
-
# Remove leading dots unless explicitly allowed (prevents hidden files)
|
|
100
|
-
if not allow_leading_dot:
|
|
101
|
-
result = result.lstrip('.')
|
|
102
|
-
|
|
103
|
-
# Check for Windows reserved names
|
|
104
|
-
base_name = result.split('.')[0].upper()
|
|
105
|
-
if base_name in _WINDOWS_RESERVED:
|
|
106
|
-
result = f"_{result}"
|
|
107
|
-
|
|
108
|
-
return result or "unknown"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def sanitize_title(s: str, max_len: int = 50) -> str:
|
|
112
|
-
"""
|
|
113
|
-
Sanitize title for use in context ID or filename.
|
|
114
|
-
|
|
115
|
-
Converts spaces to hyphens, replaces special characters,
|
|
116
|
-
and normalizes to lowercase.
|
|
117
|
-
|
|
118
|
-
Args:
|
|
119
|
-
s: Input string
|
|
120
|
-
max_len: Maximum length (default: 50)
|
|
121
|
-
|
|
122
|
-
Returns:
|
|
123
|
-
Sanitized slug-like string
|
|
124
|
-
"""
|
|
125
|
-
s = s.lower().strip()
|
|
126
|
-
s = s.replace(' ', '-')
|
|
127
|
-
s = re.sub(r"[^a-z0-9._-]+", "_", s)
|
|
128
|
-
s = re.sub(r"[-_]+", "-", s)
|
|
129
|
-
result = s.strip("._-")[:max_len] or "unknown"
|
|
130
|
-
|
|
131
|
-
# Check for Windows reserved names
|
|
132
|
-
base_name = result.split('.')[0].upper()
|
|
133
|
-
if base_name in _WINDOWS_RESERVED:
|
|
134
|
-
result = f"_{result}"
|
|
135
|
-
|
|
136
|
-
return result or "unknown"
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def generate_context_id(summary: str, existing_ids: Optional[set] = None) -> str:
|
|
140
|
-
"""
|
|
141
|
-
Generate a context ID from a summary string.
|
|
142
|
-
|
|
143
|
-
Prepends a YYMMDD-HHMM local-time timestamp for visual
|
|
144
|
-
distinguishability, then filters stop words and slugifies.
|
|
145
|
-
|
|
146
|
-
Args:
|
|
147
|
-
summary: Context summary text
|
|
148
|
-
existing_ids: Optional set of existing context IDs to avoid
|
|
149
|
-
|
|
150
|
-
Returns:
|
|
151
|
-
Unique context ID string (e.g. '260205-1700-add-user-auth')
|
|
152
|
-
"""
|
|
153
|
-
# Timestamp prefix using local time, to the minute
|
|
154
|
-
timestamp = datetime.now().strftime("%y%m%d-%H%M")
|
|
155
|
-
|
|
156
|
-
try:
|
|
157
|
-
if not summary or not summary.strip():
|
|
158
|
-
base_id = f"{timestamp}-context"
|
|
159
|
-
else:
|
|
160
|
-
slug = None
|
|
161
|
-
|
|
162
|
-
# Tier 1: AI inference for high-quality keyword slugs
|
|
163
|
-
try:
|
|
164
|
-
from .inference import generate_context_id_slug
|
|
165
|
-
ai_slug = generate_context_id_slug(summary)
|
|
166
|
-
if ai_slug:
|
|
167
|
-
# Post-inference stop-word filter: remove generic words the AI included
|
|
168
|
-
from .stop_words import STOP_WORDS
|
|
169
|
-
filtered_words = [w for w in ai_slug.split() if w.lower() not in STOP_WORDS and len(w) > 1]
|
|
170
|
-
if len(filtered_words) >= 3:
|
|
171
|
-
slug = sanitize_title(' '.join(filtered_words), max_len=100)
|
|
172
|
-
else:
|
|
173
|
-
log_debug("utils", f"AI slug too generic after stop-word filter ({len(filtered_words)} words remain), using fallback")
|
|
174
|
-
except Exception as e:
|
|
175
|
-
log_warn("utils", f"AI context ID slug failed, using fallback: {e}")
|
|
176
|
-
|
|
177
|
-
# Tier 2: Stop-word filtering
|
|
178
|
-
if not slug:
|
|
179
|
-
try:
|
|
180
|
-
from .stop_words import STOP_WORDS
|
|
181
|
-
words = [w for w in summary.lower().split() if w not in STOP_WORDS and len(w) > 1][:12]
|
|
182
|
-
slug = sanitize_title(' '.join(words), max_len=50)
|
|
183
|
-
except Exception as e:
|
|
184
|
-
log_warn("utils", f"Stop-word fallback failed: {e}")
|
|
185
|
-
|
|
186
|
-
# Tier 3: Simple word-length filter (no imports needed)
|
|
187
|
-
if not slug or slug == "unknown":
|
|
188
|
-
words = [w for w in summary.lower().split() if len(w) > 2][:6]
|
|
189
|
-
slug = sanitize_title(' '.join(words), max_len=50) if words else "context"
|
|
190
|
-
|
|
191
|
-
base_id = f"{timestamp}-{slug}"
|
|
192
|
-
except Exception as e:
|
|
193
|
-
log_error("utils", f"Context ID generation failed entirely, using timestamp: {e}")
|
|
194
|
-
base_id = f"{timestamp}-context"
|
|
195
|
-
|
|
196
|
-
if not existing_ids:
|
|
197
|
-
return base_id
|
|
198
|
-
|
|
199
|
-
# Ensure uniqueness by appending counter if needed
|
|
200
|
-
if base_id not in existing_ids:
|
|
201
|
-
return base_id
|
|
202
|
-
|
|
203
|
-
counter = 2
|
|
204
|
-
while f"{base_id}-{counter}" in existing_ids:
|
|
205
|
-
counter += 1
|
|
206
|
-
|
|
207
|
-
return f"{base_id}-{counter}"
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
def format_timestamp(dt: Optional[datetime] = None) -> str:
|
|
211
|
-
"""
|
|
212
|
-
Format datetime for display.
|
|
213
|
-
|
|
214
|
-
Args:
|
|
215
|
-
dt: Datetime to format (default: now)
|
|
216
|
-
|
|
217
|
-
Returns:
|
|
218
|
-
Formatted string like "2026-01-25 10:30:00"
|
|
219
|
-
"""
|
|
220
|
-
if dt is None:
|
|
221
|
-
dt = now_local()
|
|
222
|
-
return dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
def parse_iso_timestamp(iso_str: str) -> Optional[datetime]:
|
|
226
|
-
"""
|
|
227
|
-
Parse ISO 8601 timestamp string.
|
|
228
|
-
|
|
229
|
-
Args:
|
|
230
|
-
iso_str: ISO format timestamp
|
|
231
|
-
|
|
232
|
-
Returns:
|
|
233
|
-
datetime object or None if parsing fails
|
|
234
|
-
"""
|
|
235
|
-
try:
|
|
236
|
-
# Handle both with and without microseconds
|
|
237
|
-
if '.' in iso_str:
|
|
238
|
-
return datetime.fromisoformat(iso_str)
|
|
239
|
-
else:
|
|
240
|
-
return datetime.fromisoformat(iso_str.replace('Z', '+00:00'))
|
|
241
|
-
except (ValueError, TypeError):
|
|
242
|
-
return None
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
"""Context management for AIW CLI templates.
|
|
2
|
-
|
|
3
|
-
New 2-layer architecture:
|
|
4
|
-
context_store.py — CRUD for state.json + index.json
|
|
5
|
-
context_selector.py — 5-case context selection (session match, caret, plan match, default)
|
|
6
|
-
context_formatter.py — All display formatting
|
|
7
|
-
plan_manager.py — Plan archival, lookup, path extraction
|
|
8
|
-
task_tracker.py — Direct state.json task CRUD
|
|
9
|
-
"""
|
|
10
|
-
from .context_store import (
|
|
11
|
-
ContextState,
|
|
12
|
-
get_all_contexts,
|
|
13
|
-
get_context,
|
|
14
|
-
get_context_by_session_id,
|
|
15
|
-
create_context,
|
|
16
|
-
create_context_from_prompt,
|
|
17
|
-
update_context,
|
|
18
|
-
complete_context,
|
|
19
|
-
reopen_context,
|
|
20
|
-
archive_context,
|
|
21
|
-
bind_session,
|
|
22
|
-
update_mode,
|
|
23
|
-
maybe_activate,
|
|
24
|
-
load_state,
|
|
25
|
-
save_state,
|
|
26
|
-
)
|
|
27
|
-
from .context_selector import (
|
|
28
|
-
determine_context,
|
|
29
|
-
BlockRequest,
|
|
30
|
-
parse_chained_caret,
|
|
31
|
-
resolve_context_by_prefix,
|
|
32
|
-
)
|
|
33
|
-
from .context_formatter import (
|
|
34
|
-
format_context_list,
|
|
35
|
-
format_context_created,
|
|
36
|
-
format_context_picker_stderr,
|
|
37
|
-
format_active_context_reminder,
|
|
38
|
-
format_handoff_continuation,
|
|
39
|
-
format_plan_continuation,
|
|
40
|
-
format_active_continuation,
|
|
41
|
-
format_command_feedback,
|
|
42
|
-
format_relative_time,
|
|
43
|
-
)
|
|
44
|
-
from .plan_manager import (
|
|
45
|
-
archive_plan,
|
|
46
|
-
find_latest_plan,
|
|
47
|
-
extract_plan_path_from_result,
|
|
48
|
-
)
|
|
49
|
-
from .task_tracker import (
|
|
50
|
-
add_task,
|
|
51
|
-
update_task,
|
|
52
|
-
delete_task,
|
|
53
|
-
get_tasks,
|
|
54
|
-
generate_task_summary,
|
|
55
|
-
generate_next_task_id,
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
__all__ = [
|
|
59
|
-
# Data model
|
|
60
|
-
"ContextState",
|
|
61
|
-
# Context store (CRUD)
|
|
62
|
-
"get_all_contexts",
|
|
63
|
-
"get_context",
|
|
64
|
-
"get_context_by_session_id",
|
|
65
|
-
"create_context",
|
|
66
|
-
"create_context_from_prompt",
|
|
67
|
-
"update_context",
|
|
68
|
-
"complete_context",
|
|
69
|
-
"reopen_context",
|
|
70
|
-
"archive_context",
|
|
71
|
-
"bind_session",
|
|
72
|
-
"update_mode",
|
|
73
|
-
"maybe_activate",
|
|
74
|
-
"load_state",
|
|
75
|
-
"save_state",
|
|
76
|
-
# Context selector
|
|
77
|
-
"determine_context",
|
|
78
|
-
"BlockRequest",
|
|
79
|
-
"parse_chained_caret",
|
|
80
|
-
"resolve_context_by_prefix",
|
|
81
|
-
# Formatting
|
|
82
|
-
"format_context_list",
|
|
83
|
-
"format_context_created",
|
|
84
|
-
"format_context_picker_stderr",
|
|
85
|
-
"format_active_context_reminder",
|
|
86
|
-
"format_handoff_continuation",
|
|
87
|
-
"format_plan_continuation",
|
|
88
|
-
"format_active_continuation",
|
|
89
|
-
"format_command_feedback",
|
|
90
|
-
"format_relative_time",
|
|
91
|
-
# Plan manager
|
|
92
|
-
"archive_plan",
|
|
93
|
-
"find_latest_plan",
|
|
94
|
-
"extract_plan_path_from_result",
|
|
95
|
-
# Task tracker
|
|
96
|
-
"add_task",
|
|
97
|
-
"update_task",
|
|
98
|
-
"delete_task",
|
|
99
|
-
"get_tasks",
|
|
100
|
-
"generate_task_summary",
|
|
101
|
-
"generate_next_task_id",
|
|
102
|
-
]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|